summaryrefslogtreecommitdiffstats
path: root/dwflpp.h
diff options
context:
space:
mode:
Diffstat (limited to 'dwflpp.h')
-rw-r--r--dwflpp.h25
1 files changed, 17 insertions, 8 deletions
diff --git a/dwflpp.h b/dwflpp.h
index 74a3ae00..d379b265 100644
--- a/dwflpp.h
+++ b/dwflpp.h
@@ -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;
@@ -245,7 +255,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 +302,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 +331,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 +388,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);