diff options
Diffstat (limited to 'dwflpp.h')
-rw-r--r-- | dwflpp.h | 30 |
1 files changed, 19 insertions, 11 deletions
@@ -65,6 +65,12 @@ typedef unordered_map<void*, cu_function_cache_t*> mod_cu_function_cache_t; // inline function die -> instance die[] typedef unordered_map<void*, std::vector<Dwarf_Die>*> cu_inl_function_cache_t; +// die -> parent die +typedef unordered_map<void*, Dwarf_Die> cu_die_parent_cache_t; + +// cu die -> (die -> parent die) +typedef unordered_map<void*, cu_die_parent_cache_t*> mod_cu_die_parent_cache_t; + typedef std::vector<func_info> func_info_map_t; typedef std::vector<inline_instance_info> inline_instance_map_t; @@ -201,6 +207,10 @@ struct dwflpp void iterate_over_inline_instances (int (* callback)(Dwarf_Die * die, void * arg), void * data); + std::vector<Dwarf_Die> getscopes_die(Dwarf_Die* die); + std::vector<Dwarf_Die> getscopes(Dwarf_Die* die); + std::vector<Dwarf_Die> getscopes(Dwarf_Addr pc); + Dwarf_Die *declaration_resolve(const char *name); mod_cu_function_cache_t cu_function_cache; @@ -220,7 +230,7 @@ struct dwflpp void iterate_over_labels (Dwarf_Die *begin_die, const std::string& sym, - const std::string& symfunction, + const std::string& function, dwarf_query *q, void (* callback)(const std::string &, const char *, @@ -228,8 +238,7 @@ struct dwflpp int, Dwarf_Die *, Dwarf_Addr, - dwarf_query *), - const std::string& current_function); + dwarf_query *)); void collect_srcfiles_matching (std::string const & pattern, std::set<std::string> & filtered_srcfiles); @@ -245,7 +254,7 @@ struct dwflpp bool die_has_pc (Dwarf_Die & die, Dwarf_Addr pc); - std::string literal_stmt_for_local (Dwarf_Die *scope_die, + std::string literal_stmt_for_local (std::vector<Dwarf_Die>& scopes, Dwarf_Addr pc, std::string const & local, const target_symbol *e, @@ -292,6 +301,10 @@ private: cu_inl_function_cache_t cu_inl_function_cache; void cache_inline_instances (Dwarf_Die* die); + mod_cu_die_parent_cache_t cu_die_parent_cache; + void cache_die_parents(cu_die_parent_cache_t* parents, Dwarf_Die* die); + cu_die_parent_cache_t *get_die_parents(); + /* The global alias cache is used to resolve any DIE found in a * module that is stubbed out with DW_AT_declaration with a defining * DIE found in a different module. The current assumption is that @@ -317,10 +330,10 @@ private: static void loc2c_emit_address (void *arg, struct obstack *pool, Dwarf_Addr address); - void print_locals(Dwarf_Die *die, std::ostream &o); + void print_locals(std::vector<Dwarf_Die>& scopes, std::ostream &o); void print_members(Dwarf_Die *vardie, std::ostream &o); - Dwarf_Attribute *find_variable_and_frame_base (Dwarf_Die *scope_die, + Dwarf_Attribute *find_variable_and_frame_base (std::vector<Dwarf_Die>& scopes, Dwarf_Addr pc, std::string const & local, const target_symbol *e, @@ -374,11 +387,6 @@ private: void build_blacklist(); std::string get_blacklist_section(Dwarf_Addr addr); - Dwarf_Addr pc_cached_scopes; - int num_cached_scopes; - Dwarf_Die *cached_scopes; - int dwarf_getscopes_cached (Dwarf_Addr pc, Dwarf_Die **scopes); - // Returns the call frame address operations for the given program counter. Dwarf_Op *get_cfa_ops (Dwarf_Addr pc); |