Skip to content

Commit

Permalink
[DebugInfo] Introduce DIEExpr variant of DIEValue to hold MCExpr values
Browse files Browse the repository at this point in the history
This partially reverts r185202 and restores DIELabel to hold plain
MCSymbol references.  Instead, we add a new subclass DIEExpr of
DIEValue that can hold generic MCExpr references.

This is in preparation for supporting debug info for TLS variables
on PowerPC, where we need to describe the variable location using
a more complex expression than just MCSymbolRefExpr.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@185458 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
uweigand committed Jul 2, 2013
1 parent 88328d2 commit 1f8aacd
Show file tree
Hide file tree
Showing 5 changed files with 80 additions and 21 deletions.
30 changes: 28 additions & 2 deletions lib/CodeGen/AsmPrinter/DIE.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -246,14 +246,40 @@ void DIEInteger::print(raw_ostream &O) const {
}
#endif

//===----------------------------------------------------------------------===//
// DIEExpr Implementation
//===----------------------------------------------------------------------===//

/// EmitValue - Emit expression value.
///
void DIEExpr::EmitValue(AsmPrinter *AP, unsigned Form) const {
AP->OutStreamer.EmitValue(Expr, SizeOf(AP, Form));
}

/// SizeOf - Determine size of expression value in bytes.
///
unsigned DIEExpr::SizeOf(AsmPrinter *AP, unsigned Form) const {
if (Form == dwarf::DW_FORM_data4) return 4;
if (Form == dwarf::DW_FORM_sec_offset) return 4;
if (Form == dwarf::DW_FORM_strp) return 4;
return AP->getDataLayout().getPointerSize();
}

#ifndef NDEBUG
void DIEExpr::print(raw_ostream &O) const {
O << "Expr: ";
Expr->print(O);
}
#endif

//===----------------------------------------------------------------------===//
// DIELabel Implementation
//===----------------------------------------------------------------------===//

/// EmitValue - Emit label value.
///
void DIELabel::EmitValue(AsmPrinter *AP, unsigned Form) const {
AP->OutStreamer.EmitValue(Label, SizeOf(AP, Form));
AP->EmitLabelReference(Label, SizeOf(AP, Form));
}

/// SizeOf - Determine size of label value in bytes.
Expand All @@ -267,7 +293,7 @@ unsigned DIELabel::SizeOf(AsmPrinter *AP, unsigned Form) const {

#ifndef NDEBUG
void DIELabel::print(raw_ostream &O) const {
O << "Lbl: " << Label->getSymbol().getName();
O << "Lbl: " << Label->getName();
}
#endif

Expand Down
39 changes: 33 additions & 6 deletions lib/CodeGen/AsmPrinter/DIE.h
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,7 @@ namespace llvm {
enum {
isInteger,
isString,
isExpr,
isLabel,
isDelta,
isEntry,
Expand Down Expand Up @@ -263,22 +264,48 @@ namespace llvm {
};

//===--------------------------------------------------------------------===//
/// DIELabel - A label expression DIE.
/// DIEExpr - An expression DIE.
//
class DIEExpr : public DIEValue {
const MCExpr *Expr;
public:
explicit DIEExpr(const MCExpr *E) : DIEValue(isExpr), Expr(E) {}

/// EmitValue - Emit expression value.
///
virtual void EmitValue(AsmPrinter *AP, unsigned Form) const;

/// getValue - Get MCExpr.
///
const MCExpr *getValue() const { return Expr; }

/// SizeOf - Determine size of expression value in bytes.
///
virtual unsigned SizeOf(AsmPrinter *AP, unsigned Form) const;

// Implement isa/cast/dyncast.
static bool classof(const DIEValue *E) { return E->getType() == isExpr; }

#ifndef NDEBUG
virtual void print(raw_ostream &O) const;
#endif
};

//===--------------------------------------------------------------------===//
/// DIELabel - A label DIE.
//
class DIELabel : public DIEValue {
const MCSymbolRefExpr *Label;
const MCSymbol *Label;
public:
explicit DIELabel(const MCSymbolRefExpr *L) : DIEValue(isLabel), Label(L) {}
explicit DIELabel(const MCSymbol *Sym, MCContext &Ctxt)
: DIEValue(isLabel), Label(MCSymbolRefExpr::Create(Sym, Ctxt)) {}
explicit DIELabel(const MCSymbol *L) : DIEValue(isLabel), Label(L) {}

/// EmitValue - Emit label value.
///
virtual void EmitValue(AsmPrinter *AP, unsigned Form) const;

/// getValue - Get MCSymbol.
///
const MCSymbolRefExpr *getValue() const { return Label; }
const MCSymbol *getValue() const { return Label; }

/// SizeOf - Determine size of label value in bytes.
///
Expand Down
21 changes: 12 additions & 9 deletions lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ void CompileUnit::addString(DIE *Die, unsigned Attribute, StringRef String) {
MCSymbol *Symb = DU->getStringPoolEntry(String);
DIEValue *Value;
if (Asm->needsRelocationsForDwarfStringPool())
Value = new (DIEValueAllocator) DIELabel(Symb, Asm->OutContext);
Value = new (DIEValueAllocator) DIELabel(Symb);
else {
MCSymbol *StringPool = DU->getStringPoolSym();
Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
Expand All @@ -156,25 +156,28 @@ void CompileUnit::addLocalString(DIE *Die, unsigned Attribute,
MCSymbol *Symb = DU->getStringPoolEntry(String);
DIEValue *Value;
if (Asm->needsRelocationsForDwarfStringPool())
Value = new (DIEValueAllocator) DIELabel(Symb, Asm->OutContext);
Value = new (DIEValueAllocator) DIELabel(Symb);
else {
MCSymbol *StringPool = DU->getStringPoolSym();
Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
}
Die->addValue(Attribute, dwarf::DW_FORM_strp, Value);
}

/// addLabel - Add a Dwarf label attribute data and value.
/// addExpr - Add a Dwarf expression attribute data and value.
///
void CompileUnit::addLabel(DIE *Die, unsigned Attribute, unsigned Form,
const MCSymbolRefExpr *Label) {
DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
void CompileUnit::addExpr(DIE *Die, unsigned Attribute, unsigned Form,
const MCExpr *Expr) {
DIEValue *Value = new (DIEValueAllocator) DIEExpr(Expr);
Die->addValue(Attribute, Form, Value);
}

/// addLabel - Add a Dwarf label attribute data and value.
///
void CompileUnit::addLabel(DIE *Die, unsigned Attribute, unsigned Form,
const MCSymbol *Label) {
addLabel(Die, Attribute, Form, MCSymbolRefExpr::Create(Label, Asm->OutContext));
DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
Die->addValue(Attribute, Form, Value);
}

/// addLabelAddress - Add a dwarf label attribute data and value using
Expand All @@ -184,7 +187,7 @@ void CompileUnit::addLabelAddress(DIE *Die, unsigned Attribute,
MCSymbol *Label) {
if (!DD->useSplitDwarf()) {
if (Label != NULL) {
DIEValue *Value = new (DIEValueAllocator) DIELabel(Label, Asm->OutContext);
DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
Die->addValue(Attribute, dwarf::DW_FORM_addr, Value);
} else {
DIEValue *Value = new (DIEValueAllocator) DIEInteger(0);
Expand Down Expand Up @@ -1363,7 +1366,7 @@ void CompileUnit::createGlobalVariableDIE(const MDNode *N) {
addUInt(Block, 0, dwarf::DW_FORM_data1,
PointerSize == 4 ? dwarf::DW_OP_const4u : dwarf::DW_OP_const8u);
// 2) containing the (relocated) address of the TLS variable
addLabel(Block, 0, dwarf::DW_FORM_udata, Ref);
addExpr(Block, 0, dwarf::DW_FORM_udata, Ref);
} else {
addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_const_index);
addUInt(Block, 0, dwarf::DW_FORM_udata, DU->getAddrPoolIndex(Ref));
Expand Down
7 changes: 5 additions & 2 deletions lib/CodeGen/AsmPrinter/DwarfCompileUnit.h
Original file line number Diff line number Diff line change
Expand Up @@ -218,10 +218,13 @@ class CompileUnit {
///
void addLocalString(DIE *Die, unsigned Attribute, const StringRef Str);

/// addExpr - Add a Dwarf expression attribute data and value.
///
void addExpr(DIE *Die, unsigned Attribute, unsigned Form,
const MCExpr *Expr);

/// addLabel - Add a Dwarf label attribute data and value.
///
void addLabel(DIE *Die, unsigned Attribute, unsigned Form,
const MCSymbolRefExpr *Label);
void addLabel(DIE *Die, unsigned Attribute, unsigned Form,
const MCSymbol *Label);

Expand Down
4 changes: 2 additions & 2 deletions lib/CodeGen/AsmPrinter/DwarfDebug.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1922,9 +1922,9 @@ void DwarfDebug::emitDIE(DIE *Die, std::vector<DIEAbbrev *> *Abbrevs) {
case dwarf::DW_AT_location: {
if (DIELabel *L = dyn_cast<DIELabel>(Values[i])) {
if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
Asm->EmitLabelReference(&L->getValue()->getSymbol(), 4);
Asm->EmitLabelReference(L->getValue(), 4);
else
Asm->EmitLabelDifference(&L->getValue()->getSymbol(), DwarfDebugLocSectionSym, 4);
Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4);
} else {
Values[i]->EmitValue(Asm, Form);
}
Expand Down

0 comments on commit 1f8aacd

Please sign in to comment.