forked from OSchip/llvm-project
Dwarf: use a single line table to generate assembly when .loc is used.
This is to fix PR15408 where an undefined symbol Lline_table_start1 is used. Since we do not generate the debug_line section when .loc is used, Lline_table_start1 is not emitted and we can't refer to it when calculating at_stmt_list for a compile unit. llvm-svn: 182344
This commit is contained in:
parent
0fed8d4ef7
commit
9d4c735885
|
@ -708,6 +708,12 @@ CompileUnit *DwarfDebug::constructCompileUnit(const MDNode *N) {
|
|||
Asm->OutStreamer.getContext().setMCLineTableSymbol(LineTableStartSym,
|
||||
NewCU->getUniqueID());
|
||||
|
||||
// Use a single line table if we are using .loc and generating assembly.
|
||||
bool UseTheFirstCU =
|
||||
(Asm->TM.hasMCUseLoc() &&
|
||||
Asm->OutStreamer.getKind() == MCStreamer::SK_AsmStreamer) ||
|
||||
(NewCU->getUniqueID() == 0);
|
||||
|
||||
// DW_AT_stmt_list is a offset of line number information for this
|
||||
// compile unit in debug_line section. For split dwarf this is
|
||||
// left in the skeleton CU and so not included.
|
||||
|
@ -716,9 +722,9 @@ CompileUnit *DwarfDebug::constructCompileUnit(const MDNode *N) {
|
|||
if (!useSplitDwarf()) {
|
||||
if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
|
||||
NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4,
|
||||
NewCU->getUniqueID() == 0 ?
|
||||
UseTheFirstCU ?
|
||||
Asm->GetTempSymbol("section_line") : LineTableStartSym);
|
||||
else if (NewCU->getUniqueID() == 0)
|
||||
else if (UseTheFirstCU)
|
||||
NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
|
||||
else
|
||||
NewCU->addDelta(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4,
|
||||
|
@ -1453,7 +1459,12 @@ void DwarfDebug::beginFunction(const MachineFunction *MF) {
|
|||
LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
|
||||
CompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
|
||||
assert(TheCU && "Unable to find compile unit!");
|
||||
Asm->OutStreamer.getContext().setDwarfCompileUnitID(TheCU->getUniqueID());
|
||||
if (Asm->TM.hasMCUseLoc() &&
|
||||
Asm->OutStreamer.getKind() == MCStreamer::SK_AsmStreamer)
|
||||
// Use a single line table if we are using .loc and generating assembly.
|
||||
Asm->OutStreamer.getContext().setDwarfCompileUnitID(0);
|
||||
else
|
||||
Asm->OutStreamer.getContext().setDwarfCompileUnitID(TheCU->getUniqueID());
|
||||
|
||||
FunctionBeginSym = Asm->GetTempSymbol("func_begin",
|
||||
Asm->getFunctionNumber());
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
; RUN: llc -O0 %s -mtriple=x86_64-apple-darwin -filetype=obj -o %t
|
||||
; RUN: llvm-dwarfdump %t | FileCheck %s
|
||||
; RUN: llc < %s -O0 -mtriple=x86_64-apple-macosx10.7 | FileCheck %s -check-prefix=ASM
|
||||
|
||||
; rdar://13067005
|
||||
; CHECK: .debug_info contents:
|
||||
|
@ -20,6 +21,11 @@
|
|||
; CHECK: file_names[ 1] 0 0x00000000 0x00000000 simple2.c
|
||||
; CHECK-NOT: file_names
|
||||
|
||||
; PR15408
|
||||
; ASM: L__DWARF__debug_info_begin0:
|
||||
; ASM: .long 0 ## DW_AT_stmt_list
|
||||
; ASM: L__DWARF__debug_info_begin1:
|
||||
; ASM: .long 0 ## DW_AT_stmt_list
|
||||
define i32 @test(i32 %a) nounwind uwtable ssp {
|
||||
entry:
|
||||
%a.addr = alloca i32, align 4
|
||||
|
|
Loading…
Reference in New Issue