diff options
author | Adrian Prantl <aprantl@apple.com> | 2014-08-01 22:11:58 +0000 |
---|---|---|
committer | Adrian Prantl <aprantl@apple.com> | 2014-08-01 22:11:58 +0000 |
commit | b1416837f97cd1ec212673fb90fab0fb7df6c442 (patch) | |
tree | 22c532dbd53626600d03903704c6911f00e3d9af /llvm/lib/CodeGen/AsmPrinter/DebugLocEntry.h | |
parent | 4184c79975256bbb9d3eec1622b99361770a6644 (diff) | |
download | bcm5719-llvm-b1416837f97cd1ec212673fb90fab0fb7df6c442.tar.gz bcm5719-llvm-b1416837f97cd1ec212673fb90fab0fb7df6c442.zip |
Debug info: Infrastructure to support debug locations for fragmented
variables (for example, by-value struct arguments passed in registers, or
large integer values split across several smaller registers).
On the IR level, this adds a new type of complex address operation OpPiece
to DIVariable that describes size and offset of a variable fragment.
On the DWARF emitter level, all pieces describing the same variable are
collected, sorted and emitted as DWARF expressions using the DW_OP_piece
and DW_OP_bit_piece operators.
http://reviews.llvm.org/D3373
rdar://problem/15928306
What this patch doesn't do / Future work:
- This patch only adds the backend machinery to make this work, patches
that change SROA and SelectionDAG's type legalizer to actually create
such debug info will follow. (http://reviews.llvm.org/D2680)
- Making the DIVariable complex expressions into an argument of dbg.value
will reduce the memory footprint of the debug metadata.
- The sorting/uniquing of pieces should be moved into DebugLocEntry,
to facilitate the merging of multi-piece entries.
llvm-svn: 214576
Diffstat (limited to 'llvm/lib/CodeGen/AsmPrinter/DebugLocEntry.h')
-rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/DebugLocEntry.h | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/DebugLocEntry.h b/llvm/lib/CodeGen/AsmPrinter/DebugLocEntry.h index 3beb799203b..8cfe39d2ca3 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DebugLocEntry.h +++ b/llvm/lib/CodeGen/AsmPrinter/DebugLocEntry.h @@ -10,6 +10,7 @@ #ifndef CODEGEN_ASMPRINTER_DEBUGLOCENTRY_H__ #define CODEGEN_ASMPRINTER_DEBUGLOCENTRY_H__ #include "llvm/IR/Constants.h" +#include "llvm/IR/DebugInfo.h" #include "llvm/MC/MachineLocation.h" #include "llvm/MC/MCSymbol.h" @@ -106,17 +107,36 @@ public: /// share the same Loc/Constant and if Next immediately follows this /// Entry. bool Merge(const DebugLocEntry &Next) { + // If this and Next are describing different pieces of the same + // variable, merge them by appending next's values to the current + // list of values. + if (Begin == Next.Begin && Values.size() > 0 && Next.Values.size() > 0) { + DIVariable Var(Values[0].Variable); + DIVariable NextVar(Next.Values[0].Variable); + if (Var.getName() == NextVar.getName() && + Var.isVariablePiece() && NextVar.isVariablePiece()) { + Values.append(Next.Values.begin(), Next.Values.end()); + End = Next.End; + return true; + } + } + // If this and Next are describing the same variable, merge them. if ((End == Next.Begin && Values == Next.Values)) { End = Next.End; return true; } return false; } + const MCSymbol *getBeginSym() const { return Begin; } const MCSymbol *getEndSym() const { return End; } const DwarfCompileUnit *getCU() const { return Unit; } const ArrayRef<Value> getValues() const { return Values; } - void addValue(Value Val) { Values.push_back(Val); } + void addValue(Value Val) { + assert(DIVariable(Val.Variable).isVariablePiece() && + "multi-value DebugLocEntries must be pieces"); + Values.push_back(Val); + } }; } |