diff --git a/libs/libarchfpga/src/physical_types.h b/libs/libarchfpga/src/physical_types.h index 153fd981e..c72a57378 100644 --- a/libs/libarchfpga/src/physical_types.h +++ b/libs/libarchfpga/src/physical_types.h @@ -163,9 +163,10 @@ enum e_interconnect { COMPLETE_INTERC = 1, DIRECT_INTERC = 2, MUX_INTERC = 3, - NUM_INTERC_TYPES + NUM_INTERC_TYPES /* Xifan Tang - Invalid types for interconnect */ }; -constexpr std::array INTERCONNECT_TYPE_STRING = {{"complete", "direct", "mux"}}; //String versions of interconnection type +/* Xifan Tang - String versions of interconnection type */ +constexpr std::array INTERCONNECT_TYPE_STRING = {{"complete", "direct", "mux"}}; /* Orientations. */ enum e_side : unsigned char { diff --git a/openfpga/test_script/s298_k6_frac.openfpga b/openfpga/test_script/s298_k6_frac.openfpga index 22e74cdb1..fa3dcf993 100644 --- a/openfpga/test_script/s298_k6_frac.openfpga +++ b/openfpga/test_script/s298_k6_frac.openfpga @@ -1,5 +1,5 @@ # Run VPR for the s298 design -vpr ./test_vpr_arch/k6_frac_N10_40nm.xml ./test_blif/s298.blif +vpr ./test_vpr_arch/k6_frac_N10_40nm.xml ./test_blif/s298.blif --write_rr_graph example_rr_graph.xml # Read OpenFPGA architecture definition read_openfpga_arch -f ./test_openfpga_arch/k6_frac_N10_40nm_openfpga.xml diff --git a/vpr/src/base/vpr_context.h b/vpr/src/base/vpr_context.h index b6a1f9859..2a99e9351 100644 --- a/vpr/src/base/vpr_context.h +++ b/vpr/src/base/vpr_context.h @@ -22,6 +22,8 @@ #include "place_macro.h" #include "compressed_grid.h" +#include "rr_graph_obj.h" + //A Context is collection of state relating to a particular part of VPR // //This is a base class who's only purpose is to disable copying of contexts. @@ -143,6 +145,9 @@ struct DeviceContext : public Context { /* chan_width is for x|y-directed channels; i.e. between rows */ t_chan_width chan_width; + /* RRGraph object */ + RRGraph rr_graph; + /* Structures to define the routing architecture of the FPGA. */ std::vector rr_nodes; /* autogenerated in build_rr_graph */ diff --git a/vpr/src/device/create_rr_graph.cpp b/vpr/src/device/create_rr_graph.cpp new file mode 100644 index 000000000..4ec054a52 --- /dev/null +++ b/vpr/src/device/create_rr_graph.cpp @@ -0,0 +1,138 @@ +/* Standard header files required go first */ +#include + +/* EXTERNAL library header files go second*/ +#include "vtr_assert.h" +#include "vtr_time.h" +#include "vtr_memory.h" + +/* VPR header files go then */ +#include "vpr_types.h" +#include "rr_graph_obj.h" +#include "check_rr_graph_obj.h" +#include "create_rr_graph.h" + +/* Finally we include global variables */ +#include "globals.h" + +/******************************************************************** + * TODO: remove when this conversion (from traditional to new data structure) + * is no longer needed + * This function will convert an existing rr_graph in device_ctx to the RRGraph + *object + * This function is used to test our RRGraph if it is acceptable in downstream + *routers + ********************************************************************/ +void convert_rr_graph(std::vector& vpr_segments) { + /* Release freed memory before start building rr_graph */ + vtr::malloc_trim(0); + + vtr::ScopedStartFinishTimer timer("Conversion to routing resource graph object"); + + /* IMPORTANT: to build clock tree, + * vpr added segments to the original arch segments + * This is why to use vpr_segments as an inputs!!! + */ + auto& device_ctx = g_vpr_ctx.mutable_device(); + + /* The number of switches are in general small, + * reserve switches may not bring significant memory efficiency + * So, we just use create_switch to push_back each time + */ + device_ctx.rr_graph.reserve_switches(device_ctx.rr_switch_inf.size()); + // Create the switches + for (size_t iswitch = 0; iswitch < device_ctx.rr_switch_inf.size(); ++iswitch) { + device_ctx.rr_graph.create_switch(device_ctx.rr_switch_inf[iswitch]); + } + + /* The number of segments are in general small, reserve segments may not bring + * significant memory efficiency */ + device_ctx.rr_graph.reserve_segments(vpr_segments.size()); + // Create the segments + for (size_t iseg = 0; iseg < vpr_segments.size(); ++iseg) { + device_ctx.rr_graph.create_segment(vpr_segments[iseg]); + } + + /* Reserve list of nodes to be memory efficient */ + device_ctx.rr_graph.reserve_nodes((unsigned long)device_ctx.rr_nodes.size()); + + // Create the nodes + for (size_t inode = 0; inode < device_ctx.rr_nodes.size(); ++inode) { + auto& node = device_ctx.rr_nodes[inode]; + RRNodeId rr_node = device_ctx.rr_graph.create_node(node.type()); + + device_ctx.rr_graph.set_node_xlow(rr_node, node.xlow()); + device_ctx.rr_graph.set_node_ylow(rr_node, node.ylow()); + device_ctx.rr_graph.set_node_xhigh(rr_node, node.xhigh()); + device_ctx.rr_graph.set_node_yhigh(rr_node, node.yhigh()); + + device_ctx.rr_graph.set_node_capacity(rr_node, node.capacity()); + + device_ctx.rr_graph.set_node_ptc_num(rr_node, node.ptc_num()); + + device_ctx.rr_graph.set_node_cost_index(rr_node, node.cost_index()); + + if (CHANX == node.type() || CHANY == node.type()) { + device_ctx.rr_graph.set_node_direction(rr_node, node.direction()); + } + if (IPIN == node.type() || OPIN == node.type()) { + device_ctx.rr_graph.set_node_side(rr_node, node.side()); + } + device_ctx.rr_graph.set_node_R(rr_node, node.R()); + device_ctx.rr_graph.set_node_C(rr_node, node.C()); + + /* Set up segment id */ + short irc_data = node.cost_index(); + short iseg = device_ctx.rr_indexed_data[irc_data].seg_index; + device_ctx.rr_graph.set_node_segment(rr_node, RRSegmentId(iseg)); + } + + /* Reserve list of edges to be memory efficient */ + unsigned long num_edges_to_reserve = 0; + for (size_t inode = 0; inode < device_ctx.rr_nodes.size(); ++inode) { + const auto& node = device_ctx.rr_nodes[inode]; + num_edges_to_reserve += node.num_edges(); + } + device_ctx.rr_graph.reserve_edges(num_edges_to_reserve); + + /* Add edges for each node */ + for (size_t inode = 0; inode < device_ctx.rr_nodes.size(); ++inode) { + const auto& node = device_ctx.rr_nodes[inode]; + for (int iedge = 0; iedge < node.num_edges(); ++iedge) { + size_t isink_node = node.edge_sink_node(iedge); + int iswitch = node.edge_switch(iedge); + + device_ctx.rr_graph.create_edge(RRNodeId(inode), + RRNodeId(isink_node), + RRSwitchId(iswitch)); + } + } + + /* Ensure that we reserved what we want */ + VTR_ASSERT(num_edges_to_reserve == (unsigned long)device_ctx.rr_graph.edges().size()); + + /* Partition edges to be two class: configurable (1st part) and + * non-configurable (2nd part) + * See how the router will use the edges and determine the strategy + * if we want to partition the edges first or depends on the routing needs + */ + device_ctx.rr_graph.rebuild_node_edges(); + + /* Essential check for rr_graph, build look-up and */ + if (false == device_ctx.rr_graph.validate()) { + /* Error out if built-in validator of rr_graph fails */ + vpr_throw(VPR_ERROR_ROUTE, + __FILE__, + __LINE__, + "Fundamental errors occurred when validating rr_graph object!\n"); + } + + /* Error out if advanced checker of rr_graph fails */ + if (false == check_rr_graph(device_ctx.rr_graph)) { + vpr_throw(VPR_ERROR_ROUTE, + __FILE__, + __LINE__, + "Advanced checking rr_graph object fails! Routing may still work " + "but not smooth\n"); + } +} diff --git a/vpr/src/device/create_rr_graph.h b/vpr/src/device/create_rr_graph.h new file mode 100644 index 000000000..5cc57ec92 --- /dev/null +++ b/vpr/src/device/create_rr_graph.h @@ -0,0 +1,17 @@ +#ifndef CREATE_RR_GRAPH_H +#define CREATE_RR_GRAPH_H + +/* + * Notes in include header files in a head file + * Only include the neccessary header files + * that is required by the data types in the function/class declarations! + */ +#include "rr_graph_obj.h" + +/* IMPORTANT: to build clock tree, + * vpr added segments to the original arch segments + * This is why to use vpr_segments as an inputs!!! + */ +void convert_rr_graph(std::vector& vpr_segments); + +#endif diff --git a/vpr/src/device/write_xml_rr_graph_obj.cpp b/vpr/src/device/write_xml_rr_graph_obj.cpp index 375d1ba52..10cdb273e 100644 --- a/vpr/src/device/write_xml_rr_graph_obj.cpp +++ b/vpr/src/device/write_xml_rr_graph_obj.cpp @@ -27,62 +27,36 @@ using namespace std; constexpr int FLOAT_PRECISION = std::numeric_limits::max_digits10; /*********************** External Subroutines to this module *******************/ -void add_metadata_to_xml(fstream &fp, const char *tab_prefix, const t_metadata_dict & meta); void write_rr_channel(fstream &fp); void write_rr_grid(fstream &fp); void write_rr_block_types(fstream &fp); -/*********************** Subroutines local to this module *******************/ -void write_rr_graph_node(fstream &fp, const RRGraph& rr_graph); -void write_rr_graph_switches(fstream &fp, const RRGraph& rr_graph); -void write_rr_graph_edges(fstream &fp, const RRGraph& rr_graph); -void write_rr_graph_segments(fstream &fp, const RRGraph& rr_graph); - /************************ Subroutine definitions ****************************/ +static +void add_metadata_to_xml(std::fstream& fp, const char* tab_prefix, const t_metadata_dict& meta) { + fp << tab_prefix << "" << std::endl; -/* This function is used to write the rr_graph into xml format into a a file with name: file_name */ -void write_xml_rr_graph_obj(const char *file_name, const RRGraph& rr_graph) { - fstream fp; - fp.open(file_name, fstream::out | fstream::trunc); - - /* Prints out general info for easy error checking*/ - if (!fp.is_open() || !fp.good()) { - vpr_throw(VPR_ERROR_OTHER, __FILE__, __LINE__, - "couldn't open file \"%s\" for generating RR graph file\n", file_name); + for (const auto& meta_elem : meta) { + const std::string& key = meta_elem.first; + const std::vector& values = meta_elem.second; + for (const auto& value : values) { + fp << tab_prefix << "\t" << value.as_string() << "" << std::endl; + } } - cout << "Writing RR graph" << endl; - fp << "" << endl; - - /* Write out each individual component - * Use existing write_rr_* functions as much as possible - * 1. For those using external data structures outside RRGraph, - * leave as it is. - * 2. For those using RRGraph internal data, - * write new functions - */ - write_rr_channel(fp); - write_rr_graph_switches(fp, rr_graph); - write_rr_graph_segments(fp, rr_graph); - write_rr_block_types(fp); - write_rr_grid(fp); - write_rr_graph_node(fp, rr_graph); - write_rr_graph_edges(fp, rr_graph); - fp << ""; - - fp.close(); - - cout << "Finished generating RR graph file named " << file_name << endl << endl; + fp << tab_prefix << "" << std::endl; } /* All relevant rr node info is written out to the graph. * This includes location, timing, and segment info */ +static void write_rr_graph_node(fstream &fp, const RRGraph& rr_graph) { /* TODO: we should make it function full independent from device_ctx !!! */ auto& device_ctx = g_vpr_ctx.device(); + std::array DIRECTION_STRING_WRITE_XML = {{"INC_DIR", "DEC_DIR", "BI_DIR", "NO_DIR"}}; + fp << "\t" << endl; for (auto node : rr_graph.nodes()) { @@ -90,7 +64,7 @@ void write_rr_graph_node(fstream &fp, const RRGraph& rr_graph) { fp << " id=\"" << rr_graph.node_index(node); fp << "\" type=\"" << rr_node_typename[rr_graph.node_type(node)]; if (CHANX == rr_graph.node_type(node) || CHANY == rr_graph.node_type(node)) { - fp << "\" direction=\"" << DIRECTION_STRING[rr_graph.node_direction(node)]; + fp << "\" direction=\"" << DIRECTION_STRING_WRITE_XML[rr_graph.node_direction(node)]; } fp << "\" capacity=\"" << rr_graph.node_capacity(node); fp << "\">" << endl; @@ -128,6 +102,7 @@ void write_rr_graph_node(fstream &fp, const RRGraph& rr_graph) { /* Segment information in the t_segment_inf data structure is written out. * Information includes segment id, name, and optional timing parameters */ +static void write_rr_graph_segments(fstream &fp, const RRGraph& rr_graph) { fp << "\t" << endl; @@ -146,6 +121,7 @@ void write_rr_graph_segments(fstream &fp, const RRGraph& rr_graph) { /* Switch info is written out into xml format. This includes * general, sizing, and optional timing information */ +static void write_rr_graph_switches(fstream &fp, const RRGraph& rr_graph) { fp << "\t" << endl; @@ -176,6 +152,7 @@ void write_rr_graph_switches(fstream &fp, const RRGraph& rr_graph) { fp << "\t\t\t" << endl; fp << "\t\t\t" << endl; @@ -189,6 +166,7 @@ void write_rr_graph_switches(fstream &fp, const RRGraph& rr_graph) { /* Edges connecting to each rr node is printed out. The two nodes * it connects to are also printed */ +static void write_rr_graph_edges(fstream &fp, const RRGraph& rr_graph) { auto& device_ctx = g_vpr_ctx.device(); fp << "\t" << endl; @@ -220,3 +198,40 @@ void write_rr_graph_edges(fstream &fp, const RRGraph& rr_graph) { } fp << "\t" << endl << endl; } + +/* This function is used to write the rr_graph into xml format into a a file with name: file_name */ +void write_xml_rr_graph_obj(const char *file_name, const RRGraph& rr_graph) { + fstream fp; + fp.open(file_name, fstream::out | fstream::trunc); + + /* Prints out general info for easy error checking*/ + if (!fp.is_open() || !fp.good()) { + vpr_throw(VPR_ERROR_OTHER, __FILE__, __LINE__, + "couldn't open file \"%s\" for generating RR graph file\n", file_name); + } + cout << "Writing RR graph" << endl; + fp << "" << endl; + + /* Write out each individual component + * Use existing write_rr_* functions as much as possible + * 1. For those using external data structures outside RRGraph, + * leave as it is. + * 2. For those using RRGraph internal data, + * write new functions + */ + write_rr_channel(fp); + write_rr_graph_switches(fp, rr_graph); + write_rr_graph_segments(fp, rr_graph); + write_rr_block_types(fp); + write_rr_grid(fp); + write_rr_graph_node(fp, rr_graph); + write_rr_graph_edges(fp, rr_graph); + fp << ""; + + fp.close(); + + cout << "Finished generating RR graph file named " << file_name << endl << endl; +} + diff --git a/vpr/src/route/rr_graph.cpp b/vpr/src/route/rr_graph.cpp index df1bb8b09..6bb9892ed 100644 --- a/vpr/src/route/rr_graph.cpp +++ b/vpr/src/route/rr_graph.cpp @@ -36,6 +36,9 @@ #include "rr_types.h" +#include "create_rr_graph.h" +#include "write_xml_rr_graph_obj.h" + //#define VERBOSE struct t_mux { @@ -331,6 +334,9 @@ void create_rr_graph(const t_graph_type graph_type, base_cost_type, &det_routing_arch->wire_to_rr_ipin_switch, det_routing_arch->read_rr_graph_filename.c_str()); + + /* Xifan Tang - Create rr_graph object: load rr_nodes to the object */ + convert_rr_graph(segment_inf); } } else { if (channel_widths_unchanged(device_ctx.chan_width, nodes_per_chan) && !device_ctx.rr_nodes.empty()) { @@ -369,6 +375,9 @@ void create_rr_graph(const t_graph_type graph_type, det_routing_arch->wire_to_rr_ipin_switch, base_cost_type); } + + /* Xifan Tang - Create rr_graph object: load rr_nodes to the object */ + convert_rr_graph(segment_inf); } process_non_config_sets(); @@ -378,6 +387,11 @@ void create_rr_graph(const t_graph_type graph_type, //Write out rr graph file if needed if (!det_routing_arch->write_rr_graph_filename.empty()) { write_rr_graph(det_routing_arch->write_rr_graph_filename.c_str(), segment_inf); + + /* Just to test the writer of rr_graph_obj, give a filename in a fixed style*/ + std::string rr_graph_obj_filename(det_routing_arch->write_rr_graph_filename); + rr_graph_obj_filename += std::string(".obj"); + write_xml_rr_graph_obj(rr_graph_obj_filename.c_str(), device_ctx.rr_graph); } } @@ -1391,6 +1405,9 @@ void free_rr_graph() { device_ctx.rr_edge_metadata.clear(); invalidate_router_lookahead_cache(); + + /* Xifan Tang - Clear the rr_graph object */ + device_ctx.rr_graph.clear(); } static void build_rr_sinks_sources(const int i, diff --git a/vpr/valgrind.supp b/vpr/valgrind.supp new file mode 100644 index 000000000..6bd7272c4 --- /dev/null +++ b/vpr/valgrind.supp @@ -0,0 +1,711 @@ +# +# Valgrind suppression file for EZGL +# + +#pango +{ + libpango + Memcheck:Leak + ... + obj:/usr/lib*/libpango* +} + +#GTK +{ + g_type_register + Memcheck:Leak + fun:*alloc + ... + fun:g_type_register_* + ... + fun:_dl_init + ... +} + +{ + g_quark_from_static_string + Memcheck:Leak + fun:*alloc + ... + fun:g_quark_from_static_string + ... + fun:_dl_init + ... +} + +{ + g_main_thread + Memcheck:Leak + fun:*alloc + ... + fun:g_main* + ... + fun:start_thread + fun:clone +} + +{ + g_closure + Memcheck:Leak + match-leak-kinds:possible + fun:*alloc + ... + fun:g_cclosure_new + fun:g_signal_connect_data + ... +} + +# +{ + g_object + Memcheck:Leak + match-leak-kinds:possible + ... + fun:g_object_new + ... +} + +{ + g_type_register_static + Memcheck:Leak + match-leak-kinds:possible + ... + fun:g_type_register_static + ... +} + +{ + g_signal_connect_closure + Memcheck:Leak + match-leak-kinds:possible + ... + fun:g_signal_connect_closure + fun:gtk_*group* + ... +} + +{ + gtk_module_init + Memcheck:Leak + + fun:*alloc + ... + fun:gtk_module_init + ... +} + +{ + g_closure_invoke + Memcheck:Leak + + fun:*alloc + ... + fun:g_closure_invoke + ... +} + +{ + gtk_style_context_set_state + Memcheck:Leak + + fun:*alloc + ... + fun:gtk_style_context_set_state + ... +} + +# +{ + call_init + Memcheck:Leak + + fun:*alloc + ... + fun:call_init + fun:_dl_init + ... +} + +{ + XML_ParseBuffer + Memcheck:Leak + fun:*alloc + ... + fun:XML_ParseBuffer + ... +} + +{ + FcConfigParseAndLoad + Memcheck:Leak + fun:*alloc + ... + fun:FcConfigParseAndLoad + ... +} + +# +{ + g_objectv + Memcheck:Leak + + ... + fun:g_object_newv + ... +} + +{ + g_type_add_interface_static + Memcheck:Leak + match-leak-kinds:possible + ... + fun:g_type_add_interface_static + ... +} + +{ + gtk_container_get_children + Memcheck:Leak + fun:*alloc + ... + fun:gtk_container_get_children + ... +} + +{ + cairo_select_font_face + Memcheck:Leak + fun:*alloc + ... + fun:cairo_select_font_face + ... +} + +{ + libfontconfig + Memcheck:Leak + fun:*alloc + ... + obj:*libfontconfig.so.* + ... +} + +{ + X11_XGetDefault + Memcheck:Leak + fun:realloc + obj:*libX11.so.6.3.0 + obj:*libX11.so.6.3.0 + obj:*libX11.so.6.3.0 + fun:_XlcCreateLC + fun:_XlcDefaultLoader + fun:_XOpenLC + fun:_XrmInitParseInfo + obj:*libX11.so.6.3.0 + fun:XrmGetStringDatabase + obj:*libX11.so.6.3.0 + fun:XGetDefault +} + +{ + XInternAtom_via_event_loop + Memcheck:Leak + fun:*alloc + fun:_XEnq + obj:*libX11.so.6.3.0 + fun:_XReply + fun:XInternAtom + ... +} + +{ + cairo_deep_*alloc + Memcheck:Leak + fun:*alloc + obj:*libcairo.* + ... +} + +#openmp +{ + GOMP_parallel + Memcheck:Leak + + fun:*alloc + fun:allocate_dtv + fun:_dl_allocate_tls + fun:allocate_stack + fun:pthread_create@@GLIBC_2.2.5 + ... +} + + +#GTK engines +{ + engines + Memcheck:Leak + fun:*alloc + ... + obj:/usr/lib*/gtk*/*/engines* + ... + obj:/usr/lib*/libgtk* +} + +#nvidia +{ + libGL + Memcheck:Leak + ... + obj:/usr/lib*/libGL.so* +} +{ + + Memcheck:Leak + fun:*alloc + ... + fun:g_socket_create_source + ... + fun:g_main_context_dispatch +} +{ + + Memcheck:Leak + fun:*alloc + ... + fun:g_type_class_ref + ... + fun:gtk_init_check + fun:gtk_init + obj:*libgtk-3* +} +{ + + Memcheck:Leak + fun:*alloc + ... + fun:g_markup_parse_context_parse + obj:*libgtk-3* +} +{ + + Memcheck:Leak + fun:*alloc + ... + fun:g_socket_new + obj:*libgio-2* + fun:g_socket_client_connect + obj:*libgio-2* +} +{ + + Memcheck:Leak + fun:*alloc + ... + fun:atk_add_focus_tracker + obj:*libgtk-3* + ... + fun:gtk_parse_args + fun:gtk_init_check +} +{ + + Memcheck:Leak + fun:m*alloc + ... + fun:g_bus_get_sync + ... + fun:g_application_register + obj:*libgio-2* + fun:g_application_run +} +{ + + Memcheck:Leak + fun:*alloc + ... + obj:*libgtk-3* + fun:g_closure_invoke + ... + fun:g_signal_emit_valist + fun:g_signal_emit +} +{ + + Memcheck:Leak + fun:*alloc + ... + fun:g_simple_async_result_complete + ... + fun:g_main_context_dispatch + ... +} +{ + + Memcheck:Leak + fun:*alloc + ... + fun:g_type_class_ref + ... + fun:atk_add_focus_tracker + obj:*libgtk-3* + ... + fun:g_option_context_parse +} +{ + + Memcheck:Leak + fun:*alloc + ... + fun:g_type_class_ref + obj:*libgtk-3* + fun:atk_add_focus_tracker + obj:*libgtk-3* +} +{ + + Memcheck:Leak + fun:*alloc + ... + fun:g_type_class_ref + obj:*libgtk-3* +} +{ + + Memcheck:Leak + fun:*alloc + ... + fun:g_dbus_proxy_new_sync + obj:*libgtk-3* +} +{ + + Memcheck:Leak + fun:*alloc + ... + fun:g_signal_new + ... + obj:*libgobject-2* + fun:g_type_class_ref + fun:g_object_new_valist + fun:g_initable_new_valist + fun:g_initable_new +} +{ + + Memcheck:Leak + fun:*alloc + ... + fun:g_signal_new + obj:*libgtk-3* + fun:g_type_class_ref + obj:*libgtk-3* + ... +} +{ + + Memcheck:Leak + fun:*alloc + ... + fun:g_signal_new + obj:*libgtk-3* + ... + fun:g_type_class_ref + obj:*libgtk-3* + ... +} +{ + + Memcheck:Leak + + fun:*alloc + ... + fun:g_type_class_ref + obj:*libgtk-3* + fun:atk_add_focus_tracker + obj:*libgtk-3* + ... + fun:g_option_context_parse +} +{ + + Memcheck:Leak + + fun:*alloc + ... + fun:g_signal_new_class_handler + obj:*libgtk-3* + ... + fun:g_type_class_ref + obj:*libgtk-3* + ... +} +{ + + Memcheck:Leak + fun:*alloc + ... + fun:g_signal_connect_data + obj:*libgtk-3* + ... + fun:gtk_widget_show + obj:*libgtk-3* + ... +} +{ + + Memcheck:Leak + fun:*alloc + ... + fun:g_type_class_ref + fun:g_object_new_valist + fun:g_initable_new_valist + fun:g_initable_new + fun:gvfs_dbus_mount_tracker_proxy_new_for_bus_sync + ... + fun:g_type_create_instance +} +{ + + Memcheck:Leak + fun:*alloc + fun:g_*alloc + ... + fun:g_type_class_ref + obj:*libgtk-3* + ... + fun:g_markup_parse_context_parse +} +{ + + Memcheck:Leak + fun:*alloc + ... + fun:g_type_class_ref + obj:*libgtk-3* + ... + fun:g_option_context_parse + fun:gtk_parse_args + fun:gtk_init_check +} +{ + + Memcheck:Leak + fun:*alloc + ... + fun:g_type_class_ref + fun:atk_bridge_adaptor_init + obj:*libgtk-3* + ... + fun:g_option_context_parse + fun:gtk_parse_args + fun:gtk_init_check + fun:gtk_init +} +{ + + Memcheck:Leak + fun:*alloc + ... + fun:g_signal_new + ... + fun:g_type_class_ref + obj:*libgtk-3* + fun:atk_add_focus_tracker + obj:*libgtk-3* +} +{ + + Memcheck:Leak + + fun:*alloc + ... + fun:g_signal_new + ... + fun:g_type_class_ref + obj:*libgtk-3* +} +{ + + Memcheck:Leak + fun:*alloc + ... + fun:g_signal_new + ... + fun:g_initable_new +} +{ + + Memcheck:Leak + fun:*alloc + ... + fun:g_signal_new + obj:*libgtk-3* + fun:g_type_class_ref + obj:*libgtk-3* + ... +} +{ + + Memcheck:Leak + fun:*alloc + ... + fun:g_signal_new + ... + fun:g_type_class_ref + obj:*libgtk-3* + ... +} +{ + + Memcheck:Leak + fun:*alloc + ... + fun:g_signal_new + ... + fun:g_type_class_ref + obj:*libgtk-3* + ... +} +{ + + Memcheck:Leak + fun:*alloc + ... + fun:g_signal_new + ... + fun:g_type_class_ref + obj:*libgtk-3* + ... +} +{ + + Memcheck:Leak + fun:*alloc + ... + fun:g_signal_new + ... + fun:g_type_class_ref + obj:*libgio-2.0.so.0.4002.0 + ... +} +{ + + Memcheck:Leak + fun:*alloc + ... + fun:g_signal_new_class_handler + ... + fun:g_type_class_ref + obj:*libgtk-3* + ... +} +{ + + Memcheck:Leak + fun:*alloc + ... + fun:g_signal_connect_data + ... + fun:gtk_widget_show + obj:*libgtk-3* + ... +} +{ + + Memcheck:Leak + fun:*alloc + ... + fun:g_initable_new + ... + fun:g_type_create_instance +} +{ + + Memcheck:Leak + fun:*alloc + ... + fun:g_type_class_ref + obj:*libgtk-3* + ... + fun:g_markup_parse_context_parse +} +{ + + Memcheck:Leak + fun:malloc + ... + fun:g_type_class_ref + obj:*libgtk-3* + ... + fun:gtk_init_check +} +{ + + Memcheck:Leak + fun:malloc + ... + fun:atk_bridge_adaptor_init + obj:*libgtk-3* + ... + fun:gtk_init +} +{ + + Memcheck:Leak + fun:*alloc + ... + fun:g_application_register + obj:*libgio-2* +} +{ + + Memcheck:Leak + fun:*alloc + ... + fun:g_thread_new + obj:*libgio-2* +} +{ + + Memcheck:Leak + fun:*alloc + ... + fun:g_thread_pool_push + ... + fun:g_bus_get + fun:g_bus_watch_name +} +{ + + Memcheck:Leak + match-leak-kinds: possible + fun:*alloc + ... + fun:g_param_spec_enum + ... + fun:g_bus_get_sync + obj:*libgio-* + fun:g_application_register +} +{ + + Memcheck:Leak + match-leak-kinds: possible + fun:*alloc + fun:g_realloc + ... + fun:gtk_button_set_image_position + fun:g_object_setv + ... + obj:*libgtk-3* +} +{ + + Memcheck:Leak + match-leak-kinds: possible + fun:*alloc + ... + fun:gtk_cell_renderer_render + ... + obj:*libgtk-3* +} \ No newline at end of file