diff options
author | nitachra <Nitika.Achra@amd.com> | 2020-09-20 23:22:59 +0530 |
---|---|---|
committer | Alok Kumar Sharma <AlokKumar.Sharma@amd.com> | 2020-10-02 12:27:45 +0530 |
commit | 048fde1ef43843aa67e9ac30829e0d30f019a7dd (patch) | |
tree | 7a65a5b65ca05872df345d9ceb62d37db0668659 /gdb/dwarf2/read.c | |
parent | 71a74ee72d18c89730d42236b212257dab8325c3 (diff) | |
download | binutils-048fde1ef43843aa67e9ac30829e0d30f019a7dd.zip binutils-048fde1ef43843aa67e9ac30829e0d30f019a7dd.tar.gz binutils-048fde1ef43843aa67e9ac30829e0d30f019a7dd.tar.bz2 |
DWARFv5: Handle DW_MACRO_define_strx and DW_MACRO_undef_strx macro entries.
GDB complaints "During symbol reading: unrecognized DW_MACFINO
opcode 0xb" with the testcase given below. Clang is emitting
DW_MACRO_define_strx and DW_MACRO_undef_strx entries in .debug_macro
section which are not supported in GDB. This patch handles them.
DW_MACRO_define_strx and DW_MACRO_undef_strx are added in DWARFv5.
They have two operands. The first operand encodes the line number of
the #define or #undef macro directive. The second operand identifies
a string; it is represented using an unsigned LEB128 encoded value,
which is interpreted as a zero-based index into an array of offsets
in the .debug_str_offsets section. This is as per the section 6.3.2.1
of Dwarf Debugging Information Format Version 5.
Test case used:
#define MAX_SIZE 10
int main(void)
{
int size = 0;
size = size + MAX_SIZE;
printf("\n The value of size is [%d]\n",size);
return 0;
}
clang -gdwarf-5 -fdebug-macro macro.c -o macro.out
Before the patch:
gdb/new_gdb/binutils-gdb/build/bin/gdb -q macro.out -ex "set complaints 1" -ex "start"
Reading symbols from macro.out...
During symbol reading: unrecognized DW_MACFINO opcode 0xb
Temporary breakpoint 1 at 0x4004df: file macro.c, line 7.
Starting program: /home/nitika/workspace/macro.out
Temporary breakpoint 1, main () at macro.c:7
7 int size = 0;
(gdb)
Tested by running the testsuite before and after the patch with
-gdwarf-5 and there is no increase in the number of test cases
that fails. Used clang 11.0.0.
gdb/ChangeLog:
* dwarf2/macro.c (dwarf_decode_macro_bytes): Handle DW_MACRO_define_strx
and DW_MACRO_undef_strx.
(dwarf_decode_macros): Likewise
* dwarf2/read.c (dwarf_decode_macros): Pass str_offsets_base in the parameters
which is the value of DW_AT_str_offsets_base.
* dwarf2/macro.h (dwarf_decode_macros): Modify the definition to include
str_offsets_base.
Diffstat (limited to 'gdb/dwarf2/read.c')
-rw-r--r-- | gdb/dwarf2/read.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index 973a375..eedfea1 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -23900,8 +23900,27 @@ dwarf_decode_macros (struct dwarf2_cu *cu, unsigned int offset, buildsym_compunit *builder = cu->get_builder (); + struct dwarf2_section_info *str_offsets_section; + struct dwarf2_section_info *str_section; + ULONGEST str_offsets_base; + + if (cu->dwo_unit != nullptr) + { + str_offsets_section = &cu->dwo_unit->dwo_file + ->sections.str_offsets; + str_section = &cu->dwo_unit->dwo_file->sections.str; + str_offsets_base = cu->header.addr_size; + } + else + { + str_offsets_section = &per_objfile->per_bfd->str_offsets; + str_section = &per_objfile->per_bfd->str; + str_offsets_base = *cu->str_offsets_base; + } + dwarf_decode_macros (per_objfile, builder, section, lh, - offset_size, offset, section_is_gnu); + offset_size, offset, str_section, str_offsets_section, + str_offsets_base, section_is_gnu); } /* Return the .debug_loc section to use for CU. |