From fd4234eb94e29294081a0732440e5868e561d78b Mon Sep 17 00:00:00 2001 From: Gabriel Corona Date: Tue, 23 Feb 2016 16:01:56 +0100 Subject: [PATCH 1/1] [mc] Cleanup/documentation for simgrid::mc::Frame --- src/mc/Frame.hpp | 27 +++++++++++++++++++++++---- src/mc/mc_dwarf.cpp | 10 ++++------ 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/src/mc/Frame.hpp b/src/mc/Frame.hpp index 2d3e6d6376..2e269d3e39 100644 --- a/src/mc/Frame.hpp +++ b/src/mc/Frame.hpp @@ -25,16 +25,35 @@ class Frame { public: Frame(); - int tag; + /** Kind of scope (DW_TAG_subprogram, DW_TAG_inlined_subroutine, etc.) */ + int tag = DW_TAG_invalid; + + /** Name of the function (if it is a function) */ std::string name; + /** Range of instruction addresses for which this scope is valid */ simgrid::xbt::range range; + simgrid::dwarf::LocationList frame_base_location; + + /** List of the variables (sorted by name) */ std::vector variables; - unsigned long int id; /* DWARF offset of the subprogram */ + + /* Unique identifier for this scope (in the object_info) + * + * This is the global DWARF offset of the DIE. */ + unsigned long int id = 0; + std::vector scopes; - unsigned long int abstract_origin_id; - simgrid::mc::ObjectInformation* object_info; + + /** Value of `DW_AT_abstract_origin` + * + * For inlined subprograms, this is the ID of the + * parent function. + */ + unsigned long int abstract_origin_id = 0; + + simgrid::mc::ObjectInformation* object_info = nullptr; void* frame_base(unw_cursor_t& unw_cursor) const; void remove_variable(char* name); diff --git a/src/mc/mc_dwarf.cpp b/src/mc/mc_dwarf.cpp index a6fb2187a5..d5afe09700 100644 --- a/src/mc/mc_dwarf.cpp +++ b/src/mc/mc_dwarf.cpp @@ -844,19 +844,16 @@ static void MC_dwarf_handle_scope_die(simgrid::mc::ObjectInformation* info, Dwar xbt_assert(parent_frame, "No parent scope for this scope"); simgrid::mc::Frame frame; - frame.tag = tag; frame.id = dwarf_dieoffset(die); frame.object_info = info; if (klass == simgrid::dwarf::TagClass::Subprogram) { const char *name = MC_dwarf_attr_integrate_string(die, DW_AT_name); - if(ns) + if (ns) frame.name = std::string(ns) + "::" + name; else if (name) frame.name = name; - else - frame.name.clear(); } frame.abstract_origin_id = @@ -913,13 +910,14 @@ static void MC_dwarf_handle_scope_die(simgrid::mc::ObjectInformation* info, Dwar // Handle children: MC_dwarf_handle_children(info, die, unit, &frame, ns); - // Someone needs this to be sorted but who? + // We sort them in order to have an (somewhat) efficient by name + // lookup: std::sort(frame.variables.begin(), frame.variables.end(), MC_compare_variable); // Register it: if (klass == simgrid::dwarf::TagClass::Subprogram) - info->subprograms[frame.id] = frame; + info->subprograms[frame.id] = std::move(frame); else if (klass == simgrid::dwarf::TagClass::Scope) parent_frame->scopes.push_back(std::move(frame)); } -- 2.20.1