diff --git a/src/symbols/dwarf/dwarf_resolver.cpp b/src/symbols/dwarf/dwarf_resolver.cpp index 1eadd62..98b9a71 100644 --- a/src/symbols/dwarf/dwarf_resolver.cpp +++ b/src/symbols/dwarf/dwarf_resolver.cpp @@ -34,7 +34,7 @@ namespace detail { namespace libdwarf { // printbugging as we go constexpr bool dump_dwarf = false; - constexpr bool trace_dwarf = true; + constexpr bool trace_dwarf = false; struct subprogram_entry { die_object die; @@ -72,10 +72,8 @@ namespace libdwarf { // used to describe data from an upstream binary to a resolver for the .dwo struct split_info { - // addr_table addresses; - // std::size_t addr_base; rangelist_entries ranges_vec; - Dwarf_Debug executable_dbg; + Dwarf_Debug skeleton_dbg; }; class dwarf_resolver : public symbol_resolver { @@ -95,7 +93,7 @@ namespace libdwarf { // Map from CU -> {srcfiles, count} std::unordered_map> srcfiles_cache; // info for resolving a dwo object - optional parent_info; + optional split; private: // Error handling helper @@ -125,9 +123,9 @@ namespace libdwarf { public: CPPTRACE_FORCE_NO_INLINE_FOR_PROFILING - dwarf_resolver(const std::string& object_path, optional parent_info_ = nullopt) + dwarf_resolver(const std::string& object_path, optional split_ = nullopt) : object_path(object_path), - parent_info(std::move(parent_info_)) + split(std::move(split_)) { // use a buffer when invoking dwarf_init_path, which allows it to automatically find debuglink or dSYM // sources @@ -185,15 +183,14 @@ namespace libdwarf { PANIC("Unknown return code from dwarf_init_path"); } - if(parent_info) { - VERIFY(wrap(dwarf_set_tied_dbg, dbg, parent_info.unwrap().executable_dbg) == DW_DLV_OK); + if(split) { + VERIFY(wrap(dwarf_set_tied_dbg, dbg, split.unwrap().skeleton_dbg) == DW_DLV_OK); } if(ok) { // Check for .debug_aranges for fast lookup wrap(dwarf_get_aranges, dbg, &aranges, &arange_count); } - std::cout< vec; preprocess_subprograms(cu_die, dwversion, vec); std::sort(vec.begin(), vec.end(), [] (const subprogram_entry& a, const subprogram_entry& b) { return a.low < b.low; }); - std::cout<<"---"<die.print(); if(vec_it->die.pc_in_die(dwversion, pc)) { frame.symbol = retrieve_symbol_for_subprogram(cu_die, vec_it->die, pc, dwversion, inlines); } @@ -862,7 +850,7 @@ namespace libdwarf { CPPTRACE_FORCE_NO_INLINE_FOR_PROFILING optional lookup_cu(Dwarf_Addr pc) { // Check for .debug_aranges for fast lookup - if(aranges && !parent_info) { // don't bother under split dwarf + if(aranges && !split) { // don't bother under split dwarf // Try to find pc in aranges Dwarf_Arange arange; if(wrap(dwarf_get_arange, aranges, arange_count, pc, &arange) == DW_DLV_OK) { @@ -880,7 +868,6 @@ namespace libdwarf { std::fprintf(stderr, "Found CU in aranges\n"); cu_die.print(); } - // resolve_pc(cu_die, dwversion, pc, frame, inlines); return cu_info{maybe_owned_die_object::owned(std::move(cu_die)), dwversion}; } } @@ -902,7 +889,7 @@ namespace libdwarf { std::fprintf(stderr, "CU: %d %s\n", dwversion, cu_die.get_name().c_str()); } // TODO: Somewhat hackilly I'm assuming a single CU and the address should be in it - if(parent_info || cu_die.pc_in_die(dwversion, pc)) { + if(split || cu_die.pc_in_die(dwversion, pc)) { if(trace_dwarf) { std::fprintf( stderr, @@ -912,7 +899,6 @@ namespace libdwarf { to_ull(pc) ); } - // resolve_pc(cu_die, dwversion, pc, frame, inlines); info = cu_info{maybe_owned_die_object::owned(cu_die.clone()), dwversion}; return false; } @@ -932,16 +918,12 @@ namespace libdwarf { ); // If the vector has been empty this can happen if(vec_it != cu_cache.end()) { - std::cout<<"Here2"<die.print(); // TODO: Cache the range list? // TODO: Assumption - if(parent_info || vec_it->die.pc_in_die(vec_it->dwversion, pc)) { - // resolve_pc(vec_it->die, vec_it->dwversion, pc, frame, inlines); + if(split || vec_it->die.pc_in_die(vec_it->dwversion, pc)) { return cu_info{maybe_owned_die_object::ref(vec_it->die), vec_it->dwversion}; } } else { - std::cout<<"Here3"< get_dwo_name(const die_object& cu_die) { if(auto dwo_name = cu_die.get_string_attribute(DW_AT_GNU_dwo_name)) { return dwo_name; @@ -1046,14 +963,15 @@ namespace libdwarf { // DW_TAG_skeleton_unit vs ... // TODO: Handle gnu dwarf4 extensions for this // TODO: DWO ID - std::cout<<"------------------------"< cu = lookup_cu(pc); - std::cout<<"Here1 "<::max)(); - std::cout<<1<= 5) { dwarf5_ranges(callback); } else { @@ -520,6 +516,15 @@ namespace libdwarf { } } }; + + inline bool pc_in_rangelist(const rangelist_entries& vec, Dwarf_Addr pc) { + for(const auto& item : vec) { + if(pc >= item.first && pc < item.second) { + return true; + } + } + return false; + } } } }