summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen/AsmPrinter/DebugLocEntry.h
diff options
context:
space:
mode:
authorAdrian Prantl <aprantl@apple.com>2014-08-01 22:11:58 +0000
committerAdrian Prantl <aprantl@apple.com>2014-08-01 22:11:58 +0000
commitb1416837f97cd1ec212673fb90fab0fb7df6c442 (patch)
tree22c532dbd53626600d03903704c6911f00e3d9af /llvm/lib/CodeGen/AsmPrinter/DebugLocEntry.h
parent4184c79975256bbb9d3eec1622b99361770a6644 (diff)
downloadbcm5719-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.h22
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);
+ }
};
}
OpenPOWER on IntegriCloud