diff options
author | Josh Stone <jistone@redhat.com> | 2009-08-10 14:48:39 -0700 |
---|---|---|
committer | Josh Stone <jistone@redhat.com> | 2009-08-10 14:48:39 -0700 |
commit | 7f17af5c9ace193eef48246bcadf42ae9650de67 (patch) | |
tree | 327acfe235e67925e3f21b54b5f5f3f798419fb4 /dwarf_wrappers.cxx | |
parent | 6a38401c78a02b9bd14e50966ecdd54a003597b7 (diff) | |
download | systemtap-steved-7f17af5c9ace193eef48246bcadf42ae9650de67.tar.gz systemtap-steved-7f17af5c9ace193eef48246bcadf42ae9650de67.tar.xz systemtap-steved-7f17af5c9ace193eef48246bcadf42ae9650de67.zip |
PR10499: Integrate attributes in dwarf_decl_file/line
Elfutils prior to 0.143 didn't use attr_integrate when looking up the
decl_file or decl_line, so the attributes would sometimes be missed.
For those old versions, we define custom implementations to do the
integration.
* dwarf_wrappers.cxx (dwarf_decl_file_integrate): New.
(dwarf_decl_line_integrate): New.
* dwarf_wrappers.h: Add macros to redirect calls to the above functions.
* dwflpp.cxx (dwflpp::iterate_over_labels): Replace a manual attribute
lookup that is the same as dwarf_decl_line.
Diffstat (limited to 'dwarf_wrappers.cxx')
-rw-r--r-- | dwarf_wrappers.cxx | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/dwarf_wrappers.cxx b/dwarf_wrappers.cxx index 03979ca2..0cb3cc0f 100644 --- a/dwarf_wrappers.cxx +++ b/dwarf_wrappers.cxx @@ -47,4 +47,46 @@ void dwfl_assert(const std::string& desc, bool condition) } +#if !_ELFUTILS_PREREQ(0, 143) +// Elfutils prior to 0.143 didn't use attr_integrate when looking up the +// decl_file or decl_line, so the attributes would sometimes be missed. For +// those old versions, we define custom implementations to do the integration. + +const char * +dwarf_decl_file_integrate (Dwarf_Die *die) +{ + Dwarf_Attribute attr_mem; + Dwarf_Sword idx = 0; + if (dwarf_formsdata (dwarf_attr_integrate (die, DW_AT_decl_file, &attr_mem), + &idx) != 0 + || idx == 0) + return NULL; + + Dwarf_Die cudie; + Dwarf_Files *files = NULL; + if (dwarf_getsrcfiles (dwarf_diecu (die, &cudie, NULL, NULL), + &files, NULL) != 0) + return NULL; + + return dwarf_filesrc(files, idx, NULL, NULL); +} + +int +dwarf_decl_line_integrate (Dwarf_Die *die, int *linep) +{ + Dwarf_Attribute attr_mem; + Dwarf_Sword line; + + int res = dwarf_formsdata (dwarf_attr_integrate + (die, DW_AT_decl_line, &attr_mem), + &line); + if (res == 0) + *linep = line; + + return res; +} + +#endif // !_ELFUTILS_PREREQ(0, 143) + + /* vim: set sw=2 ts=8 cino=>4,n-2,{2,^-2,t0,(0,u0,w1,M1 : */ |