From c55cb498c9d312438610eda59ecb8c531a12ee2e Mon Sep 17 00:00:00 2001 From: Eric Christopher Date: Wed, 29 Jan 2014 22:22:56 +0000 Subject: [PATCH] If we use DW_AT_ranges we need to specify a base address that ranges are relative to in the compile unit. Currently let's just use 0... Thanks to Greg Clayton for the catch! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@200425 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 10 ++++++++-- test/DebugInfo/X86/stmt-list-multiple-compile-units.ll | 4 ++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index d557f403480..326c4482d2e 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -1054,11 +1054,17 @@ void DwarfDebug::finalizeModuleInfo() { // FIXME: We should use ranges if we have multiple compile units or // allow reordering of code ala .subsections_via_symbols in mach-o. DwarfCompileUnit *U = SkCU ? SkCU : static_cast(TheU); - if (useCURanges() && TheU->getRanges().size()) + if (useCURanges() && TheU->getRanges().size()) { addSectionLabel(Asm, U, U->getUnitDie(), dwarf::DW_AT_ranges, Asm->GetTempSymbol("cu_ranges", U->getUniqueID()), DwarfDebugRangeSectionSym); - else + + // A DW_AT_low_pc attribute may also be specified in combination with + // DW_AT_ranges to specify the default base address for use in location + // lists (see Section 2.6.2) and range lists (see Section 2.17.3). + U->addUInt(U->getUnitDie(), dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, + 0); + } else U->addUInt(U->getUnitDie(), dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, 0); } diff --git a/test/DebugInfo/X86/stmt-list-multiple-compile-units.ll b/test/DebugInfo/X86/stmt-list-multiple-compile-units.ll index 5cb8f613a34..4e14e6099a1 100644 --- a/test/DebugInfo/X86/stmt-list-multiple-compile-units.ll +++ b/test/DebugInfo/X86/stmt-list-multiple-compile-units.ll @@ -9,10 +9,12 @@ ; CHECK: DW_TAG_compile_unit ; CHECK: DW_AT_stmt_list [DW_FORM_sec_offset] (0x00000000) ; CHECK: DW_AT_ranges [DW_FORM_sec_offset] (0x00000000) +; CHECK: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000) ; CHECK: DW_TAG_compile_unit ; CHECK: DW_AT_stmt_list [DW_FORM_sec_offset] (0x0000003c) ; CHECK: DW_AT_ranges [DW_FORM_sec_offset] (0x00000020) +; CHECK: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000) ; CHECK: .debug_line contents: ; CHECK-NEXT: Line table prologue: @@ -27,10 +29,12 @@ ; DWARF3: DW_TAG_compile_unit ; DWARF3: DW_AT_stmt_list [DW_FORM_data4] (0x00000000) ; DWARF3: DW_AT_ranges [DW_FORM_data4] (0x00000000) +; DWARF3: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000) ; DWARF3: DW_TAG_compile_unit ; DWARF3: DW_AT_stmt_list [DW_FORM_data4] (0x0000003c) ; DWARF3: DW_AT_ranges [DW_FORM_data4] (0x00000020) +; DWARF3: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000) ; DWARF3: .debug_line contents: ; DWARF3-NEXT: Line table prologue: -- 2.34.1