diff --git a/dwz-low-mem-Fix-DW_OP_GNU_parameter_ref-handling-in-read_exprloc.patch b/dwz-low-mem-Fix-DW_OP_GNU_parameter_ref-handling-in-read_exprloc.patch new file mode 100644 index 0000000..f12f1ab --- /dev/null +++ b/dwz-low-mem-Fix-DW_OP_GNU_parameter_ref-handling-in-read_exprloc.patch @@ -0,0 +1,57 @@ +[low-mem] Fix DW_OP_GNU_parameter_ref handling in read_exprloc + +Function read_exprloc contains a loop that marks all parents of a +DW_OP_GNU_parameter_ref reference with CK_BAD. The loop however has no +private loop variable, so the ref variable, initially pointing to the +referenced DIE, ends up after the loop pointing to the root parent of the +reference instead. Consequently, the code after the loop, intended to be +executed for the referenced DIE, is instead executed for the root parent of +the referenced DIE. + +Fix this by moving the loop alap. + +2019-02-14 Tom de Vries + + PR dwz/24195 + * dwz.c (read_exprloc): Move loop marking parents with CK_BAD alap. + +--- + dwz.c | 18 +++++++++--------- + 1 file changed, 9 insertions(+), 9 deletions(-) + +diff --git a/dwz.c b/dwz.c +index d348418..6e6b6fb 100644 +--- a/dwz.c ++++ b/dwz.c +@@ -1492,6 +1492,15 @@ read_exprloc (DSO *dso, dw_die_ref die, unsigned char *ptr, size_t len, + } + if (op == DW_OP_call2) + ref->die_op_call2_referenced = 1; ++ if (unlikely (low_mem)) ++ { ++ ref->die_referenced = 1; ++ /* As .debug_loc adjustment is done after ++ write_info finishes, we need to keep the referenced ++ DIEs around uncollapsed. */ ++ if (need_adjust) ++ ref->die_intercu_referenced = 1; ++ } + if (ref->die_ck_state == CK_KNOWN) + { + ref->die_ck_state = CK_BAD; +@@ -1504,15 +1513,6 @@ read_exprloc (DSO *dso, dw_die_ref die, unsigned char *ptr, size_t len, + } + else + ref->die_ck_state = CK_BAD; +- if (unlikely (low_mem)) +- { +- ref->die_referenced = 1; +- /* As .debug_loc adjustment is done after +- write_info finishes, we need to keep the referenced +- DIEs around uncollapsed. */ +- if (need_adjust) +- ref->die_intercu_referenced = 1; +- } + die->die_ck_state = CK_BAD; + if (need_adjust) + *need_adjust = true; diff --git a/dwz.changes b/dwz.changes index 619b632..656e998 100644 --- a/dwz.changes +++ b/dwz.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Mon Feb 18 14:31:42 UTC 2019 - tdevries@suse.com + +- Add dwz-low-mem-Fix-DW_OP_GNU_parameter_ref-handling-in-read_exprloc.patch + to fix assert on cc1 binary from gcc bootstrap-lto [swo#24195]. + ------------------------------------------------------------------- Wed Apr 11 11:02:06 UTC 2018 - rguenther@suse.com diff --git a/dwz.spec b/dwz.spec index 501fe3e..b4b2238 100644 --- a/dwz.spec +++ b/dwz.spec @@ -1,7 +1,7 @@ # # spec file for package dwz # -# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -27,6 +27,7 @@ Group: Development/Tools/Building Source: %{name}-%{version}.tar.xz Patch0: dwz-0.12-ignore-nobits.patch Patch1: dwz-0.12-DW_OP_GNU_variable_value.patch +Patch2: dwz-low-mem-Fix-DW_OP_GNU_parameter_ref-handling-in-read_exprloc.patch BuildRequires: libelf-devel BuildRequires: xz @@ -52,6 +53,7 @@ is needed. %setup -q -n %{name} %patch0 -p1 %patch1 -p1 +%patch2 -p1 %build make %{?_smp_mflags} CFLAGS="%{optflags}"