libdw: Search for abstract origin in the correct CU
Commit Message
With gcc -flto the abstract origin of an inlined subroutine
could be in a different CU. dwarf_getscopes might return an
empty scope if it cannot find the abstract origin scope. So
make sure to search in the
We also tried to add the origin match in pc_record directly
in the current inlined scope. This always failed, causing
to do a needless traversal, followed by the full CU scan in
dwarf_getscopes. Just always stop the pc_record search and
then do the CU origin_match in dwarf_getscopes.
Signed-off-by: Mark Wielaard <mark@klomp.org>
---
libdw/ChangeLog | 6 +++++
libdw/dwarf_getscopes.c | 18 ++++++++------
tests/ChangeLog | 6 +++++
tests/Makefile.am | 1 +
tests/run-addr2line-i-test.sh | 43 +++++++++++++++++++++++++++++++++
tests/testfile-inlines-lto.bz2 | Bin 0 -> 2838 bytes
6 files changed, 66 insertions(+), 8 deletions(-)
create mode 100755 tests/testfile-inlines-lto.bz2
Comments
Hi,
On Mon, Jan 23, 2023 at 10:15:20AM +0100, Mark Wielaard wrote:
> With gcc -flto the abstract origin of an inlined subroutine
> could be in a different CU. dwarf_getscopes might return an
> empty scope if it cannot find the abstract origin scope. So
> make sure to search in the
>
> We also tried to add the origin match in pc_record directly
> in the current inlined scope. This always failed, causing
> to do a needless traversal, followed by the full CU scan in
> dwarf_getscopes. Just always stop the pc_record search and
> then do the CU origin_match in dwarf_getscopes.
Pushed.
Cheers,
Mark
@@ -1,3 +1,9 @@
+2023-01-22 Mark Wielaard <mark@klomp.org>
+
+ * dwarf_getscopes.c (pc_record): Return nscopes when done.
+ (dwarf_getscopes): Call __libdw_visit_scopes with
+ inlined_origin CU.
+
2022-12-20 Mark Wielaard <mark@klomp.org>
* Makefile.am (AM_CPPFLAGS): Add -I$(srcdir)/../libebl.
@@ -1,5 +1,6 @@
/* Return scope DIEs containing PC address.
Copyright (C) 2005, 2007, 2015 Red Hat, Inc.
+ Copyright (C) 2023 Mark J. Wielaard <mark@klomp.org>
This file is part of elfutils.
This file is free software; you can redistribute it and/or modify
@@ -173,12 +174,8 @@ pc_record (unsigned int depth, struct Dwarf_Die_Chain *die, void *arg)
/* Not there yet. */
return 0;
- /* Now we are in a scope that contains the concrete inlined instance.
- Search it for the inline function's abstract definition.
- If we don't find it, return to search the containing scope.
- If we do find it, the nonzero return value will bail us out
- of the postorder traversal. */
- return __libdw_visit_scopes (depth, die, NULL, &origin_match, NULL, a);
+ /* This is the innermost inline scope, we are done here. */
+ return a->nscopes;
}
@@ -193,8 +190,13 @@ dwarf_getscopes (Dwarf_Die *cudie, Dwarf_Addr pc, Dwarf_Die **scopes)
int result = __libdw_visit_scopes (0, &cu, NULL, &pc_match, &pc_record, &a);
- if (result == 0 && a.scopes != NULL)
- result = __libdw_visit_scopes (0, &cu, NULL, &origin_match, NULL, &a);
+ if (result >= 0 && a.scopes != NULL && a.inlined > 0)
+ {
+ /* We like the find the inline function's abstract definition
+ scope, but that might be in a different CU. */
+ cu.die = CUDIE (a.inlined_origin.cu);
+ result = __libdw_visit_scopes (0, &cu, NULL, &origin_match, NULL, &a);
+ }
if (result > 0)
*scopes = a.scopes;
@@ -1,3 +1,9 @@
+2023-01-22 Mark Wielaard <mark@klomp.org>
+
+ * testfile-inlines-lto.bz2: New testfile.
+ * run-addr2line-i-test.sh: Add new lto inlines test.
+ * Makefile.am (EXTRA_DIST): Add testfile-inlines-lto.bz2.
+
2023-01-19 Mark Wielaard <mark@klomp.org>
* run-debuginfod-query-retry.sh: Use libdebuginfod.so.1 instead
@@ -426,6 +426,7 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh run-ar.sh \
testfilenolines.bz2 test-core-lib.so.bz2 test-core.core.bz2 \
test-core.exec.bz2 run-addr2line-test.sh \
run-addr2line-i-test.sh testfile-inlines.bz2 \
+ testfile-inlines-lto.bz2 \
run-addr2line-i-lex-test.sh testfile-lex-inlines.bz2 \
run-addr2line-i-demangle-test.sh run-addr2line-alt-debugpath.sh \
testfileppc32.bz2 testfileppc64.bz2 \
@@ -220,4 +220,47 @@ testrun_compare ${abs_top_builddir}/src/addr2line --pretty-print -a -f -i -e tes
(inlined by) _Z2fuv at /tmp/x.cpp:33
EOF
+# == x.cpp ==
+# g++ x.cpp -g -fPIC -olibx.so -shared -O0 -flto
+#
+# __attribute__((always_inline)) inline
+# int foobar(int i)
+# {
+# return i + 1;
+# }
+#
+# __attribute__((always_inline)) inline
+# int fubar(int i)
+# {
+# return i + 1;
+# }
+#
+# __attribute__((always_inline)) inline
+# int bar(int i)
+# {
+# return fubar(i++);
+# }
+#
+# __attribute__((always_inline)) inline
+# int foo(int i)
+# {
+# return foobar(i++);
+# }
+#
+# int fu(int i)
+# {
+# return foo(i++) + bar(i++);
+# }
+
+testfiles testfile-inlines-lto
+
+testrun_compare ${abs_top_builddir}/src/addr2line --pretty -fiC -e testfile-inlines-lto 0x1118 0x1137 <<\EOF
+foobar(int) at /tmp/x.cpp:4:14
+ (inlined by) foo(int) at /tmp/x.cpp:22:16
+ (inlined by) fu(int) at /tmp/x.cpp:27:13
+fubar(int) at /tmp/x.cpp:10:14
+ (inlined by) bar(int) at /tmp/x.cpp:16:15
+ (inlined by) fu(int) at /tmp/x.cpp:27:24
+EOF
+
exit 0
new file mode 100755
GIT binary patch
literal 2838
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
literal 0
HcmV?d00001
--
2.31.1