[PATCH 1/2] libdw: Use correct CU to resolve file names in dwarf_decl_file.

Mark Wielaard mark@klomp.org
Fri May 8 16:50:33 GMT 2020


dwarf_decl_file uses dwarf_attr_integrate to get the DW_AT_decl_file
attribute. This means the attribute might come from a different DIE
in a different CU. If so, we need to use the CU associated with the
attribute, not the original DIE, to resolve the file name.

Also add a bit more documentation to dwarf_attr_integrate explaining
that the attribute returned might come from a different CU (and even
different Dwarf).

Signed-off-by: Mark Wielaard <mark@klomp.org>
---
 libdw/ChangeLog              |   7 +++++
 libdw/dwarf_decl_file.c      |   2 +-
 libdw/dwarf_ranges.c         |   5 ++++
 libdw/libdw.h                |   9 +++++-
 tests/ChangeLog              |   6 ++++
 tests/Makefile.am            |   1 +
 tests/run-allfcts.sh         |  52 +++++++++++++++++++++++++++++++++++
 tests/testfile-lto-gcc10.bz2 | Bin 0 -> 4319 bytes
 8 files changed, 80 insertions(+), 2 deletions(-)
 create mode 100755 tests/testfile-lto-gcc10.bz2

diff --git a/libdw/ChangeLog b/libdw/ChangeLog
index 75fc8f06..34def10d 100644
--- a/libdw/ChangeLog
+++ b/libdw/ChangeLog
@@ -1,3 +1,10 @@
+2020-05-08  Mark Wielaard  <mark@klomp.org>
+
+	* dwarf_decl_file.c (dwarf_decl_file): Use attr CU instead of DIE
+	CU to resolve file name.
+	* dwarf_ranges.c(dwarf_ranges): Document which CU we use when.
+	* libdw.h (dwarf_attr_integrate): Extend documentation.
+
 2020-04-25  Mark Wielaard  <mark@klomp.org>
 
 	* libdw_alloc.c (__libdw_alloc_tail): Call Dwarf oom_handler()
diff --git a/libdw/dwarf_decl_file.c b/libdw/dwarf_decl_file.c
index 5657132f..d4aa0a18 100644
--- a/libdw/dwarf_decl_file.c
+++ b/libdw/dwarf_decl_file.c
@@ -55,7 +55,7 @@ dwarf_decl_file (Dwarf_Die *die)
     }
 
   /* Get the array of source files for the CU.  */
-  struct Dwarf_CU *cu = die->cu;
+  struct Dwarf_CU *cu = attr_mem.cu;
   if (cu->lines == NULL)
     {
       Dwarf_Lines *lines;
diff --git a/libdw/dwarf_ranges.c b/libdw/dwarf_ranges.c
index f67d8a5a..520f9ffe 100644
--- a/libdw/dwarf_ranges.c
+++ b/libdw/dwarf_ranges.c
@@ -506,6 +506,11 @@ dwarf_ranges (Dwarf_Die *die, ptrdiff_t offset, Dwarf_Addr *basep,
       Dwarf_Attribute attr_mem;
       Dwarf_Attribute *attr = INTUSE(dwarf_attr) (die, DW_AT_ranges,
 						  &attr_mem);
+      /* Note that above we use dwarf_attr, not dwarf_attr_integrate.
+	 The only case where the ranges can come from another DIE
+	 attribute are the split CU case. In that case we also have a
+	 different CU to check against. But that is already set up
+	 above using __libdw_find_split_unit.  */
       if (attr == NULL
 	  && is_cudie (die)
 	  && die->cu->unit_type == DW_UT_split_compile)
diff --git a/libdw/libdw.h b/libdw/libdw.h
index e20961be..1a4e15a1 100644
--- a/libdw/libdw.h
+++ b/libdw/libdw.h
@@ -474,7 +474,14 @@ extern Dwarf_Attribute *dwarf_attr (Dwarf_Die *die, unsigned int search_name,
 extern int dwarf_hasattr (Dwarf_Die *die, unsigned int search_name);
 
 /* These are the same as dwarf_attr and dwarf_hasattr, respectively,
-   but they resolve an indirect attribute through DW_AT_abstract_origin.  */
+   but they resolve an indirect attribute through
+   DW_AT_abstract_origin, DW_AT_specification or, if the DIE is a
+   top-level split CU, the skeleton DIE.  Note that the attribute
+   might come from a DIE in a different CU (possibly from a different
+   Dwarf file).  In that case all attribute information needs to be
+   resolved through the CU associated with the returned
+   Dwarf_Attribute.  The dwarf_form functions already do this
+   automatically.  */
 extern Dwarf_Attribute *dwarf_attr_integrate (Dwarf_Die *die,
 					      unsigned int search_name,
 					      Dwarf_Attribute *result)
diff --git a/tests/ChangeLog b/tests/ChangeLog
index 301b0fb6..b59ebc9f 100644
--- a/tests/ChangeLog
+++ b/tests/ChangeLog
@@ -1,3 +1,9 @@
+2020-05-05  Mark Wielaard  <mark@klomp.org>
+
+	* testfile-lto-gcc10.bz2: New test file.
+	* Makefile.am (EXTRA_DIST): Add testfile-lto-gcc10.bz2.
+	* run-allfcts.sh: Add testfile-lto-gcc10 test.
+
 2020-04-17  Mark Wielaard  <mark@klomp.org>
 
 	* test-subr.sh (testrun_on_self_obj): New function.
diff --git a/tests/Makefile.am b/tests/Makefile.am
index d173d547..2fed12e1 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -218,6 +218,7 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh run-ar.sh \
 	     testfile9.bz2 testfile10.bz2 testfile11.bz2 testfile12.bz2 \
 	     testfile13.bz2 run-strip-test3.sh run-allfcts.sh \
 	     testfile_class_func.bz2 testfile_nested_funcs.bz2 \
+	     testfile-lto-gcc10.bz2 \
 	     run-line2addr.sh run-elflint-test.sh testfile14.bz2 \
 	     run-strip-test4.sh run-strip-test5.sh run-strip-test6.sh \
 	     run-strip-test7.sh run-strip-test8.sh run-strip-groups.sh \
diff --git a/tests/run-allfcts.sh b/tests/run-allfcts.sh
index 6eaf13c8..f8c1ce78 100755
--- a/tests/run-allfcts.sh
+++ b/tests/run-allfcts.sh
@@ -91,4 +91,56 @@ testrun_compare ${abs_builddir}/allfcts testfile_nested_funcs testfile_class_fun
 /home/mark/src/tests/nested/class_func.cxx:13:main
 EOF
 
+# = testfile-lto.h =
+# struct t
+# {
+#   int *p;
+#   int c;
+# };
+#
+# extern int foo (int i, struct t *t);
+
+# = testfile-lto-func.c =
+# #include "testfile-lto.h"
+#
+# int
+# foo (int i, struct t *t)
+# {
+#   int j, res = 0;
+#   for (j = 0; j < i && j < t->c; j++)
+#     res += t->p[j];
+#
+#   return res;
+# }
+
+# = testfile-lto-main.c =
+# #include "testfile-lto.h"
+#
+# static struct t g;
+#
+# int
+# main (int argc, char **argv)
+# {
+#   int i;
+#   int j[argc];
+#   g.c = argc;
+#   g.p = j;
+#   for (i = 0; i < argc; i++)
+#     j[i] = (int) argv[i][0];
+#   return foo (3, &g);
+# }
+
+# Using gcc (GCC) 10.0.1 20200430 (Red Hat 10.0.1-0.13)
+# gcc -g -O2 -flto -c testfile-lto-func.c
+# gcc -g -O2 -flto -c testfile-lto-main.c
+# gcc -g -O2 -flto -o testfile-lto-gcc10 testfile-lto-func.o testfile-lto-main.o
+
+testfiles testfile-lto-gcc10
+
+testrun_compare ${abs_builddir}/allfcts testfile-lto-gcc10 <<\EOF
+/home/mark/src/tests/testfile-lto-main.c:6:main
+/home/mark/src/tests/testfile-lto-func.c:4:foo
+/home/mark/src/tests/testfile-lto-main.c:6:main
+EOF
+
 exit 0
diff --git a/tests/testfile-lto-gcc10.bz2 b/tests/testfile-lto-gcc10.bz2
new file mode 100755
index 0000000000000000000000000000000000000000..e8ef621f2ef7da5c6d65caa4b66e625ec324454c
GIT binary patch
literal 4319
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

literal 0
HcmV?d00001

-- 
2.18.4



More information about the Elfutils-devel mailing list