+2017-11-09 Jakub Jelinek <jakub@redhat.com>
+
+ PR debug/82837
+ * dwarf2out.c (const_ok_for_output_1): Reject NEG in addition to NOT.
+ (mem_loc_descriptor): Handle (const (neg (...))) as (neg (const (...)))
+ and similarly for not instead of neg.
+
2017-11-08 Andi Kleen <ak@linux.intel.com>
* config/i386/i386.opt: Add -mforce-indirect-call.
We should really identify / validate expressions
enclosed in CONST that can be handled by assemblers on various
targets and only handle legitimate cases here. */
- if (GET_CODE (rtl) != SYMBOL_REF)
+ switch (GET_CODE (rtl))
{
- if (GET_CODE (rtl) == NOT)
- return false;
+ case SYMBOL_REF:
+ break;
+ case NOT:
+ case NEG:
+ return false;
+ default:
return true;
}
if (!const_ok_for_output (rtl))
{
if (GET_CODE (rtl) == CONST)
- mem_loc_result = mem_loc_descriptor (XEXP (rtl, 0), int_mode,
- mem_mode, initialized);
+ switch (GET_CODE (XEXP (rtl, 0)))
+ {
+ case NOT:
+ op = DW_OP_not;
+ goto try_const_unop;
+ case NEG:
+ op = DW_OP_neg;
+ goto try_const_unop;
+ try_const_unop:
+ rtx arg;
+ arg = XEXP (XEXP (rtl, 0), 0);
+ if (!CONSTANT_P (arg))
+ arg = gen_rtx_CONST (int_mode, arg);
+ op0 = mem_loc_descriptor (arg, int_mode, mem_mode,
+ initialized);
+ if (op0)
+ {
+ mem_loc_result = op0;
+ add_loc_descr (&mem_loc_result, new_loc_descr (op, 0, 0));
+ }
+ break;
+ default:
+ mem_loc_result = mem_loc_descriptor (XEXP (rtl, 0), int_mode,
+ mem_mode, initialized);
+ break;
+ }
break;
}
--- /dev/null
+/* PR debug/82837 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -g" } */
+/* { dg-additional-options "-march=athlon" { target ia32 } } */
+/* { dg-additional-options "-fPIE" { target pie } } */
+
+static char b[100];
+static int *c;
+char *e;
+void a(char *f, char *i) {
+ int d = __builtin_object_size(f, 1);
+ __builtin___strcpy_chk(f, i, d);
+}
+void g(void) {
+ int h;
+ switch (*c) {
+ case 8:
+ e = "swapgs";
+ break;
+ case 9:
+ e = "rdtscp";
+ break;
+ default:
+ return;
+ }
+ h = __builtin_strlen(b);
+ a(b + h - 6, e);
+ c++;
+}