From a026b67f8f70d6cf35daf42a4b0909f78c9d7f40 Mon Sep 17 00:00:00 2001 From: Alexandre Oliva Date: Thu, 24 Feb 2022 22:03:34 -0300 Subject: [PATCH] Cope with NULL dw_cfi_cfa_loc In def_cfa_0, we may set the 2nd operand's dw_cfi_cfa_loc to NULL, but then cfi_oprnd_equal_p calls cfa_equal_p with a NULL dw_cfa_location*. This patch aranges for us to tolerate NULL dw_cfi_cfa_loc. for gcc/ChangeLog PR middle-end/104540 * dwarf2cfi.cc (cfi_oprnd_equal_p): Cope with NULL dw_cfi_cfa_loc. for gcc/testsuite/ChangeLog PR middle-end/104540 * g++.dg/pr104540.C: New. --- gcc/dwarf2cfi.cc | 3 +++ gcc/testsuite/g++.dg/pr104540.C | 21 +++++++++++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 gcc/testsuite/g++.dg/pr104540.C diff --git a/gcc/dwarf2cfi.cc b/gcc/dwarf2cfi.cc index 9ca97d7..ab7c5cc 100644 --- a/gcc/dwarf2cfi.cc +++ b/gcc/dwarf2cfi.cc @@ -788,6 +788,9 @@ cfi_oprnd_equal_p (enum dw_cfi_oprnd_type t, dw_cfi_oprnd *a, dw_cfi_oprnd *b) case dw_cfi_oprnd_loc: return loc_descr_equal_p (a->dw_cfi_loc, b->dw_cfi_loc); case dw_cfi_oprnd_cfa_loc: + /* If any of them is NULL, don't dereference either. */ + if (!a->dw_cfi_cfa_loc || !b->dw_cfi_cfa_loc) + return a->dw_cfi_cfa_loc == b->dw_cfi_cfa_loc; return cfa_equal_p (a->dw_cfi_cfa_loc, b->dw_cfi_cfa_loc); } gcc_unreachable (); diff --git a/gcc/testsuite/g++.dg/pr104540.C b/gcc/testsuite/g++.dg/pr104540.C new file mode 100644 index 0000000..a86ecbf --- /dev/null +++ b/gcc/testsuite/g++.dg/pr104540.C @@ -0,0 +1,21 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fharden-conditional-branches -mforce-drap -mstackrealign --param=max-grow-copy-bb-insns=125" } */ + +char c; +int i; + +void bar(int); + +struct S { + int mi; + long ml; + S(int); +}; + + +void foo() { + int s = c == 0 ? 1 : 2; + bar(s); + if (i) + S s(0); +} -- 2.7.4