diff options
| author | Devang Patel <dpatel@apple.com> | 2011-05-24 00:22:25 +0000 | 
|---|---|---|
| committer | Devang Patel <dpatel@apple.com> | 2011-05-24 00:22:25 +0000 | 
| commit | 354fa0798fe4023b98ba33d556925d895431afbd (patch) | |
| tree | 4a88145192ac3c40359620200ffaf40fc81bd8d1 /llvm/lib/CodeGen/AsmPrinter | |
| parent | 1ea0243bd03c93ed29061f9d03393c647aa3d6c0 (diff) | |
| download | bcm5719-llvm-354fa0798fe4023b98ba33d556925d895431afbd.tar.gz bcm5719-llvm-354fa0798fe4023b98ba33d556925d895431afbd.zip | |
Fix debug info for blocks' variable.
llvm-svn: 131940
Diffstat (limited to 'llvm/lib/CodeGen/AsmPrinter')
| -rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 27 | 
1 files changed, 21 insertions, 6 deletions
| diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index e6e3979fc1d..f0ba6757238 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -2590,12 +2590,27 @@ void DwarfDebug::emitDebugLoc() {          unsigned i = 0;          Asm->OutStreamer.AddComment("Loc expr size");          if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) { -          // If first address element is OpPlus then emit -          // DW_OP_breg + Offset instead of DW_OP_reg + Offset. -          MachineLocation Loc(Entry.Loc.getReg(), DV.getAddrElement(1)); -          Asm->EmitInt16(Asm->getDwarfRegOpSize(Loc) + N - 2); -          Asm->EmitDwarfRegOp(Loc); -          i = 2; +          if (Entry.Loc.getOffset()) { +            unsigned Size = Asm->getDwarfRegOpSize(Entry.Loc); +            unsigned OffsetSize =  +              MCAsmInfo::getSLEB128Size(DV.getAddrElement(1)); +            // breg + deref + plus + offset +            Asm->EmitInt16(Size + 1 + 1 + OffsetSize + N - 2); +            i = 2; +            Asm->EmitDwarfRegOp(Entry.Loc); +            Asm->OutStreamer.AddComment("DW_OP_deref"); +            Asm->EmitInt8(dwarf::DW_OP_deref); +            Asm->OutStreamer.AddComment("DW_OP_plus_uconst"); +            Asm->EmitInt8(dwarf::DW_OP_plus_uconst); +            Asm->EmitSLEB128(DV.getAddrElement(1)); +          } else { +            // If first address element is OpPlus then emit +            // DW_OP_breg + Offset instead of DW_OP_reg + Offset. +            MachineLocation Loc(Entry.Loc.getReg(), DV.getAddrElement(1)); +            Asm->EmitInt16(Asm->getDwarfRegOpSize(Loc) + N - 2); +            Asm->EmitDwarfRegOp(Loc); +            i = 2; +          }          } else {            Asm->EmitInt16(Asm->getDwarfRegOpSize(Entry.Loc) + N);            Asm->EmitDwarfRegOp(Entry.Loc); | 

