bring RRGraph object and writer online

This commit is contained in:
tangxifan 2020-01-31 16:39:40 -07:00
parent 9269d7106d
commit 5006a4395d
8 changed files with 948 additions and 44 deletions

View File

@ -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<const char*, NUM_INTERC_TYPES> INTERCONNECT_TYPE_STRING = {{"complete", "direct", "mux"}}; //String versions of interconnection type
/* Xifan Tang - String versions of interconnection type */
constexpr std::array<const char*, NUM_INTERC_TYPES> INTERCONNECT_TYPE_STRING = {{"complete", "direct", "mux"}};
/* Orientations. */
enum e_side : unsigned char {

View File

@ -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

View File

@ -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<t_rr_node> rr_nodes; /* autogenerated in build_rr_graph */

View File

@ -0,0 +1,138 @@
/* Standard header files required go first */
#include <map>
/* 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<t_segment_inf>& 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");
}
}

View File

@ -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<t_segment_inf>& vpr_segments);
#endif

View File

@ -27,62 +27,36 @@ using namespace std;
constexpr int FLOAT_PRECISION = std::numeric_limits<float>::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 << "<metadata>" << 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<t_metadata_value>& values = meta_elem.second;
for (const auto& value : values) {
fp << tab_prefix << "\t<meta name=\"" << key << "\"";
fp << ">" << value.as_string() << "</meta>" << std::endl;
}
}
cout << "Writing RR graph" << endl;
fp << "<rr_graph tool_name=\"vpr\" tool_version=\"" << vtr::VERSION <<
"\" tool_comment=\"Generated from arch file "
<< get_arch_file_name() << "\">" << 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 << "</rr_graph>";
fp.close();
cout << "Finished generating RR graph file named " << file_name << endl << endl;
fp << tab_prefix << "</metadata>" << 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<const char*, NUM_DIRECTIONS> DIRECTION_STRING_WRITE_XML = {{"INC_DIR", "DEC_DIR", "BI_DIR", "NO_DIR"}};
fp << "\t<rr_nodes>" << 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<segments>" << 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<switches>" << endl;
@ -176,6 +152,7 @@ void write_rr_graph_switches(fstream &fp, const RRGraph& rr_graph) {
fp << "\t\t\t<timing R=\"" << setprecision(FLOAT_PRECISION) << cur_switch.R <<
"\" Cin=\"" << setprecision(FLOAT_PRECISION) << cur_switch.Cin <<
"\" Cout=\"" << setprecision(FLOAT_PRECISION) << cur_switch.Cout <<
"\" Cinternal=\"" << setprecision(FLOAT_PRECISION) << cur_switch.Cinternal <<
"\" Tdel=\"" << setprecision(FLOAT_PRECISION) << cur_switch.Tdel << "\"/>" << endl;
fp << "\t\t\t<sizing mux_trans_size=\"" << setprecision(FLOAT_PRECISION) << cur_switch.mux_trans_size <<
"\" buf_size=\"" << setprecision(FLOAT_PRECISION) << cur_switch.buf_size << "\"/>" << 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<rr_edges>" << endl;
@ -220,3 +198,40 @@ void write_rr_graph_edges(fstream &fp, const RRGraph& rr_graph) {
}
fp << "\t</rr_edges>" << 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 << "<rr_graph tool_name=\"vpr\" tool_version=\"" << vtr::VERSION <<
"\" tool_comment=\"Generated from arch file "
<< get_arch_file_name() << "\">" << 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 << "</rr_graph>";
fp.close();
cout << "Finished generating RR graph file named " << file_name << endl << endl;
}

View File

@ -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,

711
vpr/valgrind.supp Normal file
View File

@ -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*
}
{
<insert_a_suppression_name_here>
Memcheck:Leak
fun:*alloc
...
fun:g_socket_create_source
...
fun:g_main_context_dispatch
}
{
<insert_a_suppression_name_here>
Memcheck:Leak
fun:*alloc
...
fun:g_type_class_ref
...
fun:gtk_init_check
fun:gtk_init
obj:*libgtk-3*
}
{
<insert_a_suppression_name_here>
Memcheck:Leak
fun:*alloc
...
fun:g_markup_parse_context_parse
obj:*libgtk-3*
}
{
<insert_a_suppression_name_here>
Memcheck:Leak
fun:*alloc
...
fun:g_socket_new
obj:*libgio-2*
fun:g_socket_client_connect
obj:*libgio-2*
}
{
<insert_a_suppression_name_here>
Memcheck:Leak
fun:*alloc
...
fun:atk_add_focus_tracker
obj:*libgtk-3*
...
fun:gtk_parse_args
fun:gtk_init_check
}
{
<insert_a_suppression_name_here>
Memcheck:Leak
fun:m*alloc
...
fun:g_bus_get_sync
...
fun:g_application_register
obj:*libgio-2*
fun:g_application_run
}
{
<insert_a_suppression_name_here>
Memcheck:Leak
fun:*alloc
...
obj:*libgtk-3*
fun:g_closure_invoke
...
fun:g_signal_emit_valist
fun:g_signal_emit
}
{
<insert_a_suppression_name_here>
Memcheck:Leak
fun:*alloc
...
fun:g_simple_async_result_complete
...
fun:g_main_context_dispatch
...
}
{
<insert_a_suppression_name_here>
Memcheck:Leak
fun:*alloc
...
fun:g_type_class_ref
...
fun:atk_add_focus_tracker
obj:*libgtk-3*
...
fun:g_option_context_parse
}
{
<insert_a_suppression_name_here>
Memcheck:Leak
fun:*alloc
...
fun:g_type_class_ref
obj:*libgtk-3*
fun:atk_add_focus_tracker
obj:*libgtk-3*
}
{
<insert_a_suppression_name_here>
Memcheck:Leak
fun:*alloc
...
fun:g_type_class_ref
obj:*libgtk-3*
}
{
<insert_a_suppression_name_here>
Memcheck:Leak
fun:*alloc
...
fun:g_dbus_proxy_new_sync
obj:*libgtk-3*
}
{
<insert_a_suppression_name_here>
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
}
{
<insert_a_suppression_name_here>
Memcheck:Leak
fun:*alloc
...
fun:g_signal_new
obj:*libgtk-3*
fun:g_type_class_ref
obj:*libgtk-3*
...
}
{
<insert_a_suppression_name_here>
Memcheck:Leak
fun:*alloc
...
fun:g_signal_new
obj:*libgtk-3*
...
fun:g_type_class_ref
obj:*libgtk-3*
...
}
{
<insert_a_suppression_name_here>
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
}
{
<insert_a_suppression_name_here>
Memcheck:Leak
fun:*alloc
...
fun:g_signal_new_class_handler
obj:*libgtk-3*
...
fun:g_type_class_ref
obj:*libgtk-3*
...
}
{
<insert_a_suppression_name_here>
Memcheck:Leak
fun:*alloc
...
fun:g_signal_connect_data
obj:*libgtk-3*
...
fun:gtk_widget_show
obj:*libgtk-3*
...
}
{
<insert_a_suppression_name_here>
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
}
{
<insert_a_suppression_name_here>
Memcheck:Leak
fun:*alloc
fun:g_*alloc
...
fun:g_type_class_ref
obj:*libgtk-3*
...
fun:g_markup_parse_context_parse
}
{
<insert_a_suppression_name_here>
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
}
{
<insert_a_suppression_name_here>
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
}
{
<insert_a_suppression_name_here>
Memcheck:Leak
fun:*alloc
...
fun:g_signal_new
...
fun:g_type_class_ref
obj:*libgtk-3*
fun:atk_add_focus_tracker
obj:*libgtk-3*
}
{
<insert_a_suppression_name_here>
Memcheck:Leak
fun:*alloc
...
fun:g_signal_new
...
fun:g_type_class_ref
obj:*libgtk-3*
}
{
<insert_a_suppression_name_here>
Memcheck:Leak
fun:*alloc
...
fun:g_signal_new
...
fun:g_initable_new
}
{
<insert_a_suppression_name_here>
Memcheck:Leak
fun:*alloc
...
fun:g_signal_new
obj:*libgtk-3*
fun:g_type_class_ref
obj:*libgtk-3*
...
}
{
<insert_a_suppression_name_here>
Memcheck:Leak
fun:*alloc
...
fun:g_signal_new
...
fun:g_type_class_ref
obj:*libgtk-3*
...
}
{
<insert_a_suppression_name_here>
Memcheck:Leak
fun:*alloc
...
fun:g_signal_new
...
fun:g_type_class_ref
obj:*libgtk-3*
...
}
{
<insert_a_suppression_name_here>
Memcheck:Leak
fun:*alloc
...
fun:g_signal_new
...
fun:g_type_class_ref
obj:*libgtk-3*
...
}
{
<insert_a_suppression_name_here>
Memcheck:Leak
fun:*alloc
...
fun:g_signal_new
...
fun:g_type_class_ref
obj:*libgio-2.0.so.0.4002.0
...
}
{
<insert_a_suppression_name_here>
Memcheck:Leak
fun:*alloc
...
fun:g_signal_new_class_handler
...
fun:g_type_class_ref
obj:*libgtk-3*
...
}
{
<insert_a_suppression_name_here>
Memcheck:Leak
fun:*alloc
...
fun:g_signal_connect_data
...
fun:gtk_widget_show
obj:*libgtk-3*
...
}
{
<insert_a_suppression_name_here>
Memcheck:Leak
fun:*alloc
...
fun:g_initable_new
...
fun:g_type_create_instance
}
{
<insert_a_suppression_name_here>
Memcheck:Leak
fun:*alloc
...
fun:g_type_class_ref
obj:*libgtk-3*
...
fun:g_markup_parse_context_parse
}
{
<insert_a_suppression_name_here>
Memcheck:Leak
fun:malloc
...
fun:g_type_class_ref
obj:*libgtk-3*
...
fun:gtk_init_check
}
{
<insert_a_suppression_name_here>
Memcheck:Leak
fun:malloc
...
fun:atk_bridge_adaptor_init
obj:*libgtk-3*
...
fun:gtk_init
}
{
<insert_a_suppression_name_here>
Memcheck:Leak
fun:*alloc
...
fun:g_application_register
obj:*libgio-2*
}
{
<insert_a_suppression_name_here>
Memcheck:Leak
fun:*alloc
...
fun:g_thread_new
obj:*libgio-2*
}
{
<insert_a_suppression_name_here>
Memcheck:Leak
fun:*alloc
...
fun:g_thread_pool_push
...
fun:g_bus_get
fun:g_bus_watch_name
}
{
<insert_a_suppression_name_here>
Memcheck:Leak
match-leak-kinds: possible
fun:*alloc
...
fun:g_param_spec_enum
...
fun:g_bus_get_sync
obj:*libgio-*
fun:g_application_register
}
{
<insert_a_suppression_name_here>
Memcheck:Leak
match-leak-kinds: possible
fun:*alloc
fun:g_realloc
...
fun:gtk_button_set_image_position
fun:g_object_setv
...
obj:*libgtk-3*
}
{
<insert_a_suppression_name_here>
Memcheck:Leak
match-leak-kinds: possible
fun:*alloc
...
fun:gtk_cell_renderer_render
...
obj:*libgtk-3*
}