From: Alexandre Oliva Date: Fri, 25 Feb 2022 01:03:34 +0000 (-0300) Subject: Cope with NULL dw_cfi_cfa_loc X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a026b67f8f70d6cf35daf42a4b0909f78c9d7f40;p=test_jj.git 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. --- 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); +}