DebugInfo: Pass MCSymbolRefExprs for labels instead of MCSymbols

This is a precursor to adding debug info support for TLS which requires
non-default relocations applied to TLS symbols.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@185202 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
David Blaikie
2013-06-28 20:05:04 +00:00
parent 2c77a625b7
commit 95e72c90e4
5 changed files with 26 additions and 13 deletions

View File

@ -253,7 +253,7 @@ void DIEInteger::print(raw_ostream &O) const {
/// EmitValue - Emit label value. /// EmitValue - Emit label value.
/// ///
void DIELabel::EmitValue(AsmPrinter *AP, unsigned Form) const { void DIELabel::EmitValue(AsmPrinter *AP, unsigned Form) const {
AP->OutStreamer.EmitSymbolValue(Label, SizeOf(AP, Form)); AP->OutStreamer.EmitValue(Label, SizeOf(AP, Form));
} }
/// SizeOf - Determine size of label value in bytes. /// SizeOf - Determine size of label value in bytes.
@ -267,7 +267,7 @@ unsigned DIELabel::SizeOf(AsmPrinter *AP, unsigned Form) const {
#ifndef NDEBUG #ifndef NDEBUG
void DIELabel::print(raw_ostream &O) const { void DIELabel::print(raw_ostream &O) const {
O << "Lbl: " << Label->getName(); O << "Lbl: " << Label->getSymbol().getName();
} }
#endif #endif

View File

@ -18,11 +18,13 @@
#include "llvm/ADT/SmallVector.h" #include "llvm/ADT/SmallVector.h"
#include "llvm/Support/Compiler.h" #include "llvm/Support/Compiler.h"
#include "llvm/Support/Dwarf.h" #include "llvm/Support/Dwarf.h"
#include "llvm/MC/MCExpr.h"
#include <vector> #include <vector>
namespace llvm { namespace llvm {
class AsmPrinter; class AsmPrinter;
class MCSymbol; class MCSymbol;
class MCSymbolRefExpr;
class raw_ostream; class raw_ostream;
//===--------------------------------------------------------------------===// //===--------------------------------------------------------------------===//
@ -264,9 +266,11 @@ namespace llvm {
/// DIELabel - A label expression DIE. /// DIELabel - A label expression DIE.
// //
class DIELabel : public DIEValue { class DIELabel : public DIEValue {
const MCSymbol *Label; const MCSymbolRefExpr *Label;
public: public:
explicit DIELabel(const MCSymbol *L) : DIEValue(isLabel), Label(L) {} explicit DIELabel(const MCSymbolRefExpr *L) : DIEValue(isLabel), Label(L) {}
explicit DIELabel(const MCSymbol *Sym, MCContext &Ctxt)
: DIEValue(isLabel), Label(MCSymbolRefExpr::Create(Sym, Ctxt)) {}
/// EmitValue - Emit label value. /// EmitValue - Emit label value.
/// ///
@ -274,7 +278,7 @@ namespace llvm {
/// getValue - Get MCSymbol. /// getValue - Get MCSymbol.
/// ///
const MCSymbol *getValue() const { return Label; } const MCSymbolRefExpr *getValue() const { return Label; }
/// SizeOf - Determine size of label value in bytes. /// SizeOf - Determine size of label value in bytes.
/// ///

View File

@ -135,7 +135,7 @@ void CompileUnit::addString(DIE *Die, unsigned Attribute, StringRef String) {
MCSymbol *Symb = DU->getStringPoolEntry(String); MCSymbol *Symb = DU->getStringPoolEntry(String);
DIEValue *Value; DIEValue *Value;
if (Asm->needsRelocationsForDwarfStringPool()) if (Asm->needsRelocationsForDwarfStringPool())
Value = new (DIEValueAllocator) DIELabel(Symb); Value = new (DIEValueAllocator) DIELabel(Symb, Asm->OutContext);
else { else {
MCSymbol *StringPool = DU->getStringPoolSym(); MCSymbol *StringPool = DU->getStringPoolSym();
Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool); Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
@ -155,7 +155,7 @@ void CompileUnit::addLocalString(DIE *Die, unsigned Attribute,
MCSymbol *Symb = DU->getStringPoolEntry(String); MCSymbol *Symb = DU->getStringPoolEntry(String);
DIEValue *Value; DIEValue *Value;
if (Asm->needsRelocationsForDwarfStringPool()) if (Asm->needsRelocationsForDwarfStringPool())
Value = new (DIEValueAllocator) DIELabel(Symb); Value = new (DIEValueAllocator) DIELabel(Symb, Asm->OutContext);
else { else {
MCSymbol *StringPool = DU->getStringPoolSym(); MCSymbol *StringPool = DU->getStringPoolSym();
Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool); Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
@ -166,11 +166,16 @@ void CompileUnit::addLocalString(DIE *Die, unsigned Attribute,
/// addLabel - Add a Dwarf label attribute data and value. /// addLabel - Add a Dwarf label attribute data and value.
/// ///
void CompileUnit::addLabel(DIE *Die, unsigned Attribute, unsigned Form, void CompileUnit::addLabel(DIE *Die, unsigned Attribute, unsigned Form,
const MCSymbol *Label) { const MCSymbolRefExpr *Label) {
DIEValue *Value = new (DIEValueAllocator) DIELabel(Label); DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
Die->addValue(Attribute, Form, Value); Die->addValue(Attribute, Form, Value);
} }
void CompileUnit::addLabel(DIE *Die, unsigned Attribute, unsigned Form,
const MCSymbol *Label) {
addLabel(Die, Attribute, Form, MCSymbolRefExpr::Create(Label, Asm->OutContext));
}
/// addLabelAddress - Add a dwarf label attribute data and value using /// addLabelAddress - Add a dwarf label attribute data and value using
/// DW_FORM_addr or DW_FORM_GNU_addr_index. /// DW_FORM_addr or DW_FORM_GNU_addr_index.
/// ///
@ -178,7 +183,7 @@ void CompileUnit::addLabelAddress(DIE *Die, unsigned Attribute,
MCSymbol *Label) { MCSymbol *Label) {
if (!DD->useSplitDwarf()) { if (!DD->useSplitDwarf()) {
if (Label != NULL) { if (Label != NULL) {
DIEValue *Value = new (DIEValueAllocator) DIELabel(Label); DIEValue *Value = new (DIEValueAllocator) DIELabel(Label, Asm->OutContext);
Die->addValue(Attribute, dwarf::DW_FORM_addr, Value); Die->addValue(Attribute, dwarf::DW_FORM_addr, Value);
} else { } else {
DIEValue *Value = new (DIEValueAllocator) DIEInteger(0); DIEValue *Value = new (DIEValueAllocator) DIEInteger(0);
@ -194,7 +199,7 @@ void CompileUnit::addLabelAddress(DIE *Die, unsigned Attribute,
/// addOpAddress - Add a dwarf op address data and value using the /// addOpAddress - Add a dwarf op address data and value using the
/// form given and an op of either DW_FORM_addr or DW_FORM_GNU_addr_index. /// form given and an op of either DW_FORM_addr or DW_FORM_GNU_addr_index.
/// ///
void CompileUnit::addOpAddress(DIE *Die, MCSymbol *Sym) { void CompileUnit::addOpAddress(DIE *Die, const MCSymbol *Sym) {
if (!DD->useSplitDwarf()) { if (!DD->useSplitDwarf()) {
addUInt(Die, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr); addUInt(Die, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);

View File

@ -19,6 +19,7 @@
#include "llvm/ADT/OwningPtr.h" #include "llvm/ADT/OwningPtr.h"
#include "llvm/ADT/StringMap.h" #include "llvm/ADT/StringMap.h"
#include "llvm/DebugInfo.h" #include "llvm/DebugInfo.h"
#include "llvm/MC/MCExpr.h"
namespace llvm { namespace llvm {
@ -219,6 +220,8 @@ public:
/// addLabel - Add a Dwarf label attribute data and value. /// 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, void addLabel(DIE *Die, unsigned Attribute, unsigned Form,
const MCSymbol *Label); const MCSymbol *Label);
@ -230,7 +233,8 @@ public:
/// addOpAddress - Add a dwarf op address data and value using the /// addOpAddress - Add a dwarf op address data and value using the
/// form given and an op of either DW_FORM_addr or DW_FORM_GNU_addr_index. /// form given and an op of either DW_FORM_addr or DW_FORM_GNU_addr_index.
/// ///
void addOpAddress(DIE *Die, MCSymbol *Label); void addOpAddress(DIE *Die, const MCSymbol *Label);
void addOpAddress(DIE *Die, const MCSymbolRefExpr *Label);
/// addDelta - Add a label delta attribute data and value. /// addDelta - Add a label delta attribute data and value.
/// ///

View File

@ -1918,9 +1918,9 @@ void DwarfDebug::emitDIE(DIE *Die, std::vector<DIEAbbrev *> *Abbrevs) {
case dwarf::DW_AT_location: { case dwarf::DW_AT_location: {
if (DIELabel *L = dyn_cast<DIELabel>(Values[i])) { if (DIELabel *L = dyn_cast<DIELabel>(Values[i])) {
if (Asm->MAI->doesDwarfUseRelocationsAcrossSections()) if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
Asm->EmitLabelReference(L->getValue(), 4); Asm->EmitLabelReference(&L->getValue()->getSymbol(), 4);
else else
Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4); Asm->EmitLabelDifference(&L->getValue()->getSymbol(), DwarfDebugLocSectionSym, 4);
} else { } else {
Values[i]->EmitValue(Asm, Form); Values[i]->EmitValue(Asm, Form);
} }