From 7728669d4b058aa3e66163a89ebbf22e5cd49cc1 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Mon, 28 May 2018 09:06:02 +0000 Subject: [PATCH] DWARF: Handle expressions containing "-1" in dw2_asm_output_delta_uleb128. In dwarf2out.c dwarf2out_var_location () we create loclabels that might contain -1 (for example ".LVL5-1"). Technically those are expressions, not just plain labels. But they work fine everywhere we use them, except when calculating an uleb128 delta between two labels. For example we might create the following DWARF5 location list entry: .byte 0x3 # DW_LLE_startx_length (*.LLST0) .uleb128 0x6 # Location list range start index (*.LVL5-1) .uleb128 .LFE1-.LVL5-1 # Location list length (*.LLST0) .uleb128 0x1 # Location expression size .byte 0x54 # DW_OP_reg4 .byte 0 # DW_LLE_end_of_list (*.LLST0) Note the length is calculated using .uleb128 .LFE1-.LVL5-1. This is wrong, since both .LVL5 and 1 are substracted from .LFE1, instead of 1 being subtracted from .LVL5 first, before substracting from .LFE1. This happens because dw2_asm_output_delta_uleb128 expects two plain labels and simply inserts a minus sign between them. To fix this we simply look if the second label is actually an expression containing a minus sign and then add brackets around it. That will emit the correct .uleb128 expression: .uleb128 .LFE1-(.LVL5-1) # Location list length (*.LLST0) We cannot simply generate the loclabel containing brackets directly because we do use them also in contexts that don't take a full expression (for example we use them with .quad too). gcc/ * dwarf2asm.c (dw2_asm_output_delta_uleb128): Add brackets around lab2 if it is an expression containing a minus sign. From-SVN: r260845 --- gcc/ChangeLog | 5 +++++ gcc/dwarf2asm.c | 12 +++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 10972e2a52b..9ea908606be 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2018-05-28 Mark Wielaard + + * dwarf2asm.c (dw2_asm_output_delta_uleb128): Add brackets around lab2 + if it is an expression containing a minus sign. + 2018-05-27 John David Anglin * config/pa/pa-linux.h (NEED_INDICATE_EXEC_STACK): Define to 0. diff --git a/gcc/dwarf2asm.c b/gcc/dwarf2asm.c index 93577d141ab..c6f11c7468a 100644 --- a/gcc/dwarf2asm.c +++ b/gcc/dwarf2asm.c @@ -811,7 +811,17 @@ dw2_asm_output_delta_uleb128 (const char *lab1 ATTRIBUTE_UNUSED, fputs ("\t.uleb128 ", asm_out_file); assemble_name (asm_out_file, lab1); putc ('-', asm_out_file); - assemble_name (asm_out_file, lab2); + /* dwarf2out.c might give us a label expression (e.g. .LVL548-1) + as second argument. If so, make it a subexpression, to make + sure the substraction is done in the right order. */ + if (strchr (lab2, '-') != NULL) + { + putc ('(', asm_out_file); + assemble_name (asm_out_file, lab2); + putc (')', asm_out_file); + } + else + assemble_name (asm_out_file, lab2); if (flag_debug_asm && comment) { -- 2.30.2