Try to resolve symbol differences early, and if successful create a plain

data fragment. This reduces the time to assemble the test in 8711 from 60s to
54s.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@120767 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rafael Espindola 2010-12-03 00:55:40 +00:00
parent 0bdf0c05b9
commit 32a006e606
14 changed files with 144 additions and 88 deletions

View File

@ -209,7 +209,6 @@ namespace llvm {
// This emits the Dwarf file and the line tables. // This emits the Dwarf file and the line tables.
// //
static void Emit(MCStreamer *MCOS, const MCSection *DwarfLineSection, static void Emit(MCStreamer *MCOS, const MCSection *DwarfLineSection,
MCSectionData *DLS, int PointerSize,
const MCSection *TextSection = NULL); const MCSection *TextSection = NULL);
}; };

View File

@ -16,6 +16,7 @@
namespace llvm { namespace llvm {
class MCAsmInfo; class MCAsmInfo;
class MCAsmLayout; class MCAsmLayout;
class MCAssembler;
class MCContext; class MCContext;
class MCSymbol; class MCSymbol;
class MCValue; class MCValue;
@ -43,7 +44,8 @@ private:
protected: protected:
explicit MCExpr(ExprKind _Kind) : Kind(_Kind) {} explicit MCExpr(ExprKind _Kind) : Kind(_Kind) {}
bool EvaluateAsRelocatableImpl(MCValue &Res, const MCAsmLayout *Layout, bool EvaluateAsRelocatableImpl(MCValue &Res, const MCAssembler *Asm,
const MCAsmLayout *Layout,
bool InSet) const; bool InSet) const;
public: public:
/// @name Accessors /// @name Accessors
@ -69,7 +71,11 @@ public:
/// values. If not given, then only non-symbolic expressions will be /// values. If not given, then only non-symbolic expressions will be
/// evaluated. /// evaluated.
/// @result - True on success. /// @result - True on success.
bool EvaluateAsAbsolute(int64_t &Res, const MCAsmLayout *Layout = 0) const; bool EvaluateAsAbsolute(int64_t &Res) const;
bool EvaluateAsAbsolute(int64_t &Res, const MCAssembler *Asm) const;
bool EvaluateAsAbsolute(int64_t &Res, const MCAsmLayout *Layout) const;
bool EvaluateAsAbsolute(int64_t &Res, const MCAssembler *Asm,
const MCAsmLayout *Layout) const;
/// EvaluateAsRelocatable - Try to evaluate the expression to a relocatable /// EvaluateAsRelocatable - Try to evaluate the expression to a relocatable
/// value, i.e. an expression of the fixed form (a - b + constant). /// value, i.e. an expression of the fixed form (a - b + constant).

View File

@ -69,6 +69,9 @@ public:
virtual void EmitInstruction(const MCInst &Inst); virtual void EmitInstruction(const MCInst &Inst);
virtual void EmitInstToFragment(const MCInst &Inst); virtual void EmitInstToFragment(const MCInst &Inst);
virtual void EmitValueToOffset(const MCExpr *Offset, unsigned char Value); virtual void EmitValueToOffset(const MCExpr *Offset, unsigned char Value);
virtual void EmitDwarfAdvanceLineAddr(int64_t LineDelta,
const MCSymbol *LastLabel,
const MCSymbol *Label);
virtual void Finish(); virtual void Finish();
/// @} /// @}

View File

@ -351,6 +351,13 @@ namespace llvm {
unsigned Isa, unsigned Isa,
unsigned Discriminator); unsigned Discriminator);
virtual void EmitDwarfAdvanceLineAddr(int64_t LineDelta,
const MCSymbol *LastLabel,
const MCSymbol *Label) = 0;
void EmitDwarfSetLineAddr(int64_t LineDelta, const MCSymbol *Label,
int PointerSize);
virtual bool EmitCFIStartProc(); virtual bool EmitCFIStartProc();
virtual bool EmitCFIEndProc(); virtual bool EmitCFIEndProc();
virtual bool EmitCFIDefCfaOffset(int64_t Offset); virtual bool EmitCFIDefCfaOffset(int64_t Offset);

View File

@ -121,6 +121,9 @@ public:
virtual void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value); virtual void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value);
virtual void EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol); virtual void EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol);
virtual void EmitDwarfAdvanceLineAddr(int64_t LineDelta,
const MCSymbol *LastLabel,
const MCSymbol *Label);
virtual void EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute); virtual void EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute);
@ -298,6 +301,12 @@ void MCAsmStreamer::EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) {
EmitEOL(); EmitEOL();
} }
void MCAsmStreamer::EmitDwarfAdvanceLineAddr(int64_t LineDelta,
const MCSymbol *LastLabel,
const MCSymbol *Label) {
EmitDwarfSetLineAddr(LineDelta, Label, PointerSize);
}
void MCAsmStreamer::EmitSymbolAttribute(MCSymbol *Symbol, void MCAsmStreamer::EmitSymbolAttribute(MCSymbol *Symbol,
MCSymbolAttr Attribute) { MCSymbolAttr Attribute) {
switch (Attribute) { switch (Attribute) {
@ -885,10 +894,9 @@ void MCAsmStreamer::EmitRawText(StringRef String) {
void MCAsmStreamer::Finish() { void MCAsmStreamer::Finish() {
// Dump out the dwarf file & directory tables and line tables. // Dump out the dwarf file & directory tables and line tables.
if (getContext().hasDwarfFiles() && TLOF) { if (getContext().hasDwarfFiles() && TLOF)
MCDwarfFileTable::Emit(this, TLOF->getDwarfLineSection(), NULL, MCDwarfFileTable::Emit(this, TLOF->getDwarfLineSection(),
PointerSize, TLOF->getTextSection()); TLOF->getTextSection());
}
} }
MCStreamer *llvm::createAsmStreamer(MCContext &Context, MCStreamer *llvm::createAsmStreamer(MCContext &Context,

View File

@ -117,21 +117,6 @@ static inline const MCExpr *MakeStartMinusEndExpr(MCStreamer *MCOS,
return Res3; return Res3;
} }
//
// This emits an "absolute" address used in the start of a dwarf line number
// table. This will result in a relocatation entry for the address.
//
static inline void EmitDwarfSetAddress(MCStreamer *MCOS,
MCSymbol *Symbol,
int PointerSize) {
MCOS->EmitIntValue(dwarf::DW_LNS_extended_op, 1);
MCOS->EmitULEB128IntValue(PointerSize + 1);
MCOS->EmitIntValue(dwarf::DW_LNE_set_address, 1);
MCOS->EmitSymbolValue(Symbol, PointerSize);
}
// //
// This emits the Dwarf line table for the specified section from the entries // This emits the Dwarf line table for the specified section from the entries
// in the LineSection. // in the LineSection.
@ -139,9 +124,7 @@ static inline void EmitDwarfSetAddress(MCStreamer *MCOS,
static inline void EmitDwarfLineTable(MCStreamer *MCOS, static inline void EmitDwarfLineTable(MCStreamer *MCOS,
const MCSection *Section, const MCSection *Section,
const MCLineSection *LineSection, const MCLineSection *LineSection,
const MCSection *DwarfLineSection, const MCSection *DwarfLineSection) {
MCSectionData *DLS,
int PointerSize) {
unsigned FileNum = 1; unsigned FileNum = 1;
unsigned LastLine = 1; unsigned LastLine = 1;
unsigned Column = 0; unsigned Column = 0;
@ -186,19 +169,7 @@ static inline void EmitDwarfLineTable(MCStreamer *MCOS,
// At this point we want to emit/create the sequence to encode the delta in // At this point we want to emit/create the sequence to encode the delta in
// line numbers and the increment of the address from the previous Label // line numbers and the increment of the address from the previous Label
// and the current Label. // and the current Label.
if (LastLabel == NULL || DLS == NULL) { MCOS->EmitDwarfAdvanceLineAddr(LineDelta, LastLabel, Label);
// emit the sequence to set the address
EmitDwarfSetAddress(MCOS, Label, PointerSize);
// emit the sequence for the LineDelta (from 1) and a zero address delta.
MCDwarfLineAddr::Emit(MCOS, LineDelta, 0);
}
else {
// Create an expression for the address delta from the LastLabel and
// this Label (plus 0).
const MCExpr *AddrDelta = MakeStartMinusEndExpr(MCOS, LastLabel, Label,0);
// Create a Dwarf Line fragment for the LineDelta and AddrDelta.
new MCDwarfLineAddrFragment(LineDelta, *AddrDelta, DLS);
}
LastLine = it->getLine(); LastLine = it->getLine();
LastLabel = Label; LastLabel = Label;
@ -220,19 +191,7 @@ static inline void EmitDwarfLineTable(MCStreamer *MCOS,
// Switch back the the dwarf line section. // Switch back the the dwarf line section.
MCOS->SwitchSection(DwarfLineSection); MCOS->SwitchSection(DwarfLineSection);
if (DLS == NULL) { MCOS->EmitDwarfAdvanceLineAddr(INT64_MAX, LastLabel, SectionEnd);
// emit the sequence to set the address
EmitDwarfSetAddress(MCOS, SectionEnd, PointerSize);
// emit the sequence for the LineDelta (from 1) and a zero address delta.
MCDwarfLineAddr::Emit(MCOS, INT64_MAX, 0);
} else {
// Create an expression for the address delta from the LastLabel and this
// SectionEnd label.
const MCExpr *AddrDelta = MakeStartMinusEndExpr(MCOS, LastLabel, SectionEnd,
0);
// Create a Dwarf Line fragment for the LineDelta and AddrDelta.
new MCDwarfLineAddrFragment(INT64_MAX, *AddrDelta, DLS);
}
} }
// //
@ -240,8 +199,6 @@ static inline void EmitDwarfLineTable(MCStreamer *MCOS,
// //
void MCDwarfFileTable::Emit(MCStreamer *MCOS, void MCDwarfFileTable::Emit(MCStreamer *MCOS,
const MCSection *DwarfLineSection, const MCSection *DwarfLineSection,
MCSectionData *DLS,
int PointerSize,
const MCSection *TextSection) { const MCSection *TextSection) {
// Switch to the section where the table will be emitted into. // Switch to the section where the table will be emitted into.
MCOS->SwitchSection(DwarfLineSection); MCOS->SwitchSection(DwarfLineSection);
@ -332,8 +289,7 @@ void MCDwarfFileTable::Emit(MCStreamer *MCOS,
++it) { ++it) {
const MCSection *Sec = *it; const MCSection *Sec = *it;
const MCLineSection *Line = MCLineSections.lookup(Sec); const MCLineSection *Line = MCLineSections.lookup(Sec);
EmitDwarfLineTable(MCOS, Sec, Line, DwarfLineSection, DLS, EmitDwarfLineTable(MCOS, Sec, Line, DwarfLineSection);
PointerSize);
// Now delete the MCLineSections that were created in MCLineEntry::Make() // Now delete the MCLineSections that were created in MCLineEntry::Make()
// and used to emit the line table. // and used to emit the line table.
@ -351,10 +307,7 @@ void MCDwarfFileTable::Emit(MCStreamer *MCOS,
// Switch back the the dwarf line section. // Switch back the the dwarf line section.
MCOS->SwitchSection(DwarfLineSection); MCOS->SwitchSection(DwarfLineSection);
// emit the sequence to set the address MCOS->EmitDwarfAdvanceLineAddr(INT64_MAX, NULL, SectionEnd);
EmitDwarfSetAddress(MCOS, SectionEnd, PointerSize);
// emit the sequence for the LineDelta (from 1) and a zero address delta.
MCDwarfLineAddr::Emit(MCOS, INT64_MAX, 0);
} }
// This is the end of the section, so set the value of the symbol at the end // This is the end of the section, so set the value of the symbol at the end

View File

@ -484,10 +484,7 @@ void MCELFStreamer::Finish() {
const MCSection *DwarfLineSection = const MCSection *DwarfLineSection =
getContext().getELFSection(".debug_line", 0, 0, getContext().getELFSection(".debug_line", 0, 0,
SectionKind::getDataRelLocal()); SectionKind::getDataRelLocal());
MCSectionData &DLS = MCDwarfFileTable::Emit(this, DwarfLineSection);
getAssembler().getOrCreateSectionData(*DwarfLineSection);
int PointerSize = getAssembler().getBackend().getPointerSize();
MCDwarfFileTable::Emit(this, DwarfLineSection, &DLS, PointerSize);
} }
for (std::vector<LocalCommon>::const_iterator i = LocalCommons.begin(), for (std::vector<LocalCommon>::const_iterator i = LocalCommons.begin(),

View File

@ -237,7 +237,24 @@ void MCTargetExpr::Anchor() {}
/* *** */ /* *** */
bool MCExpr::EvaluateAsAbsolute(int64_t &Res, const MCAsmLayout *Layout) const { bool MCExpr::EvaluateAsAbsolute(int64_t &Res) const {
return EvaluateAsAbsolute(Res, 0, 0);
}
bool MCExpr::EvaluateAsAbsolute(int64_t &Res,
const MCAsmLayout *Layout) const {
if (Layout)
return EvaluateAsAbsolute(Res, &Layout->getAssembler(), Layout);
else
return EvaluateAsAbsolute(Res, 0, 0);
}
bool MCExpr::EvaluateAsAbsolute(int64_t &Res, const MCAssembler *Asm) const {
return EvaluateAsAbsolute(Res, Asm, 0);
}
bool MCExpr::EvaluateAsAbsolute(int64_t &Res, const MCAssembler *Asm,
const MCAsmLayout *Layout) const {
MCValue Value; MCValue Value;
// Fast path constants. // Fast path constants.
@ -246,7 +263,8 @@ bool MCExpr::EvaluateAsAbsolute(int64_t &Res, const MCAsmLayout *Layout) const {
return true; return true;
} }
if (!EvaluateAsRelocatable(Value, Layout) || !Value.isAbsolute()) { if (!EvaluateAsRelocatableImpl(Value, Asm, Layout, false) ||
!Value.isAbsolute()) {
// EvaluateAsAbsolute is defined to return the "current value" of // EvaluateAsAbsolute is defined to return the "current value" of
// the expression if we are given a Layout object, even in cases // the expression if we are given a Layout object, even in cases
// when the value is not fixed. // when the value is not fixed.
@ -268,7 +286,9 @@ bool MCExpr::EvaluateAsAbsolute(int64_t &Res, const MCAsmLayout *Layout) const {
return true; return true;
} }
static bool EvaluateSymbolicAdd(const MCAsmLayout *Layout, bool InSet, static bool EvaluateSymbolicAdd(const MCAsmLayout *Layout,
const MCAssembler *Asm,
bool InSet,
const MCValue &LHS,const MCSymbolRefExpr *RHS_A, const MCValue &LHS,const MCSymbolRefExpr *RHS_A,
const MCSymbolRefExpr *RHS_B, int64_t RHS_Cst, const MCSymbolRefExpr *RHS_B, int64_t RHS_Cst,
MCValue &Res) { MCValue &Res) {
@ -291,14 +311,15 @@ static bool EvaluateSymbolicAdd(const MCAsmLayout *Layout, bool InSet,
// Absolutize symbol differences between defined symbols when we have a // Absolutize symbol differences between defined symbols when we have a
// layout object and the target requests it. // layout object and the target requests it.
if (Layout && A && B) { assert(!(Layout && !Asm));
if ((Layout || Asm) && A && B) {
const MCSymbol &SA = A->getSymbol(); const MCSymbol &SA = A->getSymbol();
const MCSymbol &SB = B->getSymbol(); const MCSymbol &SB = B->getSymbol();
const MCAssembler &Asm = Layout->getAssembler(); const MCObjectFormat &F = Asm->getBackend().getObjectFormat();
const MCObjectFormat &F = Asm.getBackend().getObjectFormat();
if (SA.isDefined() && SB.isDefined() && F.isAbsolute(InSet, SA, SB)) { if (SA.isDefined() && SB.isDefined() && F.isAbsolute(InSet, SA, SB)) {
MCSymbolData &AD = Asm.getSymbolData(A->getSymbol()); MCSymbolData &AD = Asm->getSymbolData(A->getSymbol());
MCSymbolData &BD = Asm.getSymbolData(B->getSymbol()); MCSymbolData &BD = Asm->getSymbolData(B->getSymbol());
if (AD.getFragment() == BD.getFragment()) { if (AD.getFragment() == BD.getFragment()) {
Res = MCValue::get(+ AD.getOffset() Res = MCValue::get(+ AD.getOffset()
@ -308,25 +329,31 @@ static bool EvaluateSymbolicAdd(const MCAsmLayout *Layout, bool InSet,
return true; return true;
} }
Res = MCValue::get(+ Layout->getSymbolAddress(&AD) if (Layout) {
- Layout->getSymbolAddress(&BD) Res = MCValue::get(+ Layout->getSymbolAddress(&AD)
+ LHS.getConstant() - Layout->getSymbolAddress(&BD)
+ RHS_Cst); + LHS.getConstant()
return true; + RHS_Cst);
return true;
}
} }
} }
Res = MCValue::get(A, B, LHS.getConstant() + RHS_Cst); Res = MCValue::get(A, B, LHS.getConstant() + RHS_Cst);
return true; return true;
} }
bool MCExpr::EvaluateAsRelocatable(MCValue &Res, bool MCExpr::EvaluateAsRelocatable(MCValue &Res,
const MCAsmLayout *Layout) const { const MCAsmLayout *Layout) const {
return EvaluateAsRelocatableImpl(Res, Layout, false); if (Layout)
return EvaluateAsRelocatableImpl(Res, &Layout->getAssembler(), Layout,
false);
else
return EvaluateAsRelocatableImpl(Res, 0, 0, false);
} }
bool MCExpr::EvaluateAsRelocatableImpl(MCValue &Res, bool MCExpr::EvaluateAsRelocatableImpl(MCValue &Res,
const MCAssembler *Asm,
const MCAsmLayout *Layout, const MCAsmLayout *Layout,
bool InSet) const { bool InSet) const {
++stats::MCExprEvaluate; ++stats::MCExprEvaluate;
@ -345,7 +372,8 @@ bool MCExpr::EvaluateAsRelocatableImpl(MCValue &Res,
// Evaluate recursively if this is a variable. // Evaluate recursively if this is a variable.
if (Sym.isVariable() && SRE->getKind() == MCSymbolRefExpr::VK_None) { if (Sym.isVariable() && SRE->getKind() == MCSymbolRefExpr::VK_None) {
bool Ret = Sym.getVariableValue()->EvaluateAsRelocatableImpl(Res, Layout, bool Ret = Sym.getVariableValue()->EvaluateAsRelocatableImpl(Res, Asm,
Layout,
true); true);
// If we failed to simplify this to a constant, let the target // If we failed to simplify this to a constant, let the target
// handle it. // handle it.
@ -361,7 +389,8 @@ bool MCExpr::EvaluateAsRelocatableImpl(MCValue &Res,
const MCUnaryExpr *AUE = cast<MCUnaryExpr>(this); const MCUnaryExpr *AUE = cast<MCUnaryExpr>(this);
MCValue Value; MCValue Value;
if (!AUE->getSubExpr()->EvaluateAsRelocatableImpl(Value, Layout, InSet)) if (!AUE->getSubExpr()->EvaluateAsRelocatableImpl(Value, Asm, Layout,
InSet))
return false; return false;
switch (AUE->getOpcode()) { switch (AUE->getOpcode()) {
@ -394,8 +423,10 @@ bool MCExpr::EvaluateAsRelocatableImpl(MCValue &Res,
const MCBinaryExpr *ABE = cast<MCBinaryExpr>(this); const MCBinaryExpr *ABE = cast<MCBinaryExpr>(this);
MCValue LHSValue, RHSValue; MCValue LHSValue, RHSValue;
if (!ABE->getLHS()->EvaluateAsRelocatableImpl(LHSValue, Layout, InSet) || if (!ABE->getLHS()->EvaluateAsRelocatableImpl(LHSValue, Asm, Layout,
!ABE->getRHS()->EvaluateAsRelocatableImpl(RHSValue, Layout, InSet)) InSet) ||
!ABE->getRHS()->EvaluateAsRelocatableImpl(RHSValue, Asm, Layout,
InSet))
return false; return false;
// We only support a few operations on non-constant expressions, handle // We only support a few operations on non-constant expressions, handle
@ -406,13 +437,13 @@ bool MCExpr::EvaluateAsRelocatableImpl(MCValue &Res,
return false; return false;
case MCBinaryExpr::Sub: case MCBinaryExpr::Sub:
// Negate RHS and add. // Negate RHS and add.
return EvaluateSymbolicAdd(Layout, InSet, LHSValue, return EvaluateSymbolicAdd(Layout, Asm, InSet, LHSValue,
RHSValue.getSymB(), RHSValue.getSymA(), RHSValue.getSymB(), RHSValue.getSymA(),
-RHSValue.getConstant(), -RHSValue.getConstant(),
Res); Res);
case MCBinaryExpr::Add: case MCBinaryExpr::Add:
return EvaluateSymbolicAdd(Layout, InSet, LHSValue, return EvaluateSymbolicAdd(Layout, Asm, InSet, LHSValue,
RHSValue.getSymA(), RHSValue.getSymB(), RHSValue.getSymA(), RHSValue.getSymB(),
RHSValue.getConstant(), RHSValue.getConstant(),
Res); Res);

View File

@ -84,6 +84,13 @@ public:
return Child->EmitWeakReference(Alias, Symbol); return Child->EmitWeakReference(Alias, Symbol);
} }
virtual void EmitDwarfAdvanceLineAddr(int64_t LineDelta,
const MCSymbol *LastLabel,
const MCSymbol *Label) {
LogCall("EmitDwarfAdvanceLineAddr");
return Child->EmitDwarfAdvanceLineAddr(LineDelta, LastLabel, Label);
}
virtual void EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) { virtual void EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) {
LogCall("EmitSymbolAttribute"); LogCall("EmitSymbolAttribute");
return Child->EmitSymbolAttribute(Symbol, Attribute); return Child->EmitSymbolAttribute(Symbol, Attribute);

View File

@ -357,10 +357,7 @@ void MCMachOStreamer::Finish() {
"__debug_line", "__debug_line",
MCSectionMachO::S_ATTR_DEBUG, MCSectionMachO::S_ATTR_DEBUG,
0, SectionKind::getDataRelLocal()); 0, SectionKind::getDataRelLocal());
MCSectionData &DLS = MCDwarfFileTable::Emit(this, DwarfLineSection);
getAssembler().getOrCreateSectionData(*DwarfLineSection);
int PointerSize = getAssembler().getBackend().getPointerSize();
MCDwarfFileTable::Emit(this, DwarfLineSection, &DLS, PointerSize);
} }
// We have to set the fragment atom associations so we can relax properly for // We have to set the fragment atom associations so we can relax properly for

View File

@ -44,6 +44,9 @@ namespace {
virtual void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) {} virtual void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) {}
virtual void EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol){} virtual void EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol){}
virtual void EmitDwarfAdvanceLineAddr(int64_t LineDelta,
const MCSymbol *LastLabel,
const MCSymbol *Label) {}
virtual void EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute){} virtual void EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute){}

View File

@ -179,6 +179,30 @@ void MCObjectStreamer::EmitInstToFragment(const MCInst &Inst) {
getAssembler().getEmitter().EncodeInstruction(Inst, VecOS, IF->getFixups()); getAssembler().getEmitter().EncodeInstruction(Inst, VecOS, IF->getFixups());
} }
void MCObjectStreamer::EmitDwarfAdvanceLineAddr(int64_t LineDelta,
const MCSymbol *LastLabel,
const MCSymbol *Label) {
if (!LastLabel) {
int PointerSize = getAssembler().getBackend().getPointerSize();
EmitDwarfSetLineAddr(LineDelta, Label, PointerSize);
return;
}
MCSymbolRefExpr::VariantKind Variant = MCSymbolRefExpr::VK_None;
const MCExpr *LabelRef =
MCSymbolRefExpr::Create(Label, Variant, getContext());
const MCExpr *LastLabelRef =
MCSymbolRefExpr::Create(LastLabel, Variant, getContext());
const MCExpr *AddrDelta =
MCBinaryExpr::Create(MCBinaryExpr::Sub, LabelRef, LastLabelRef,
getContext());
int64_t Res;
if (AddrDelta->EvaluateAsAbsolute(Res, &getAssembler())) {
MCDwarfLineAddr::Emit(this, LineDelta, Res);
return;
}
new MCDwarfLineAddrFragment(LineDelta, *AddrDelta, getCurrentSectionData());
}
void MCObjectStreamer::EmitValueToOffset(const MCExpr *Offset, void MCObjectStreamer::EmitValueToOffset(const MCExpr *Offset,
unsigned char Value) { unsigned char Value) {
new MCOrgFragment(*Offset, Value, getCurrentSectionData()); new MCOrgFragment(*Offset, Value, getCurrentSectionData());

View File

@ -30,6 +30,17 @@ raw_ostream &MCStreamer::GetCommentOS() {
return nulls(); return nulls();
} }
void MCStreamer::EmitDwarfSetLineAddr(int64_t LineDelta,
const MCSymbol *Label, int PointerSize) {
// emit the sequence to set the address
EmitIntValue(dwarf::DW_LNS_extended_op, 1);
EmitULEB128IntValue(PointerSize + 1);
EmitIntValue(dwarf::DW_LNE_set_address, 1);
EmitSymbolValue(Label, PointerSize);
// emit the sequence for the LineDelta (from 1) and a zero address delta.
MCDwarfLineAddr::Emit(this, LineDelta, 0);
}
/// EmitIntValue - Special case of EmitValue that avoids the client having to /// EmitIntValue - Special case of EmitValue that avoids the client having to
/// pass in a MCExpr for constant integers. /// pass in a MCExpr for constant integers.

View File

@ -118,6 +118,10 @@ public:
virtual void EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol); virtual void EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol);
virtual void EmitDwarfAdvanceLineAddr(int64_t LineDelta,
const MCSymbol *LastLabel,
const MCSymbol *Label);
virtual void EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute); virtual void EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute);
virtual void EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue); virtual void EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue);
@ -263,6 +267,12 @@ void PTXMCAsmStreamer::EmitWeakReference(MCSymbol *Alias,
EmitEOL(); EmitEOL();
} }
void PTXMCAsmStreamer::EmitDwarfAdvanceLineAddr(int64_t LineDelta,
const MCSymbol *LastLabel,
const MCSymbol *Label) {
report_fatal_error("Unimplemented.");
}
void PTXMCAsmStreamer::EmitSymbolAttribute(MCSymbol *Symbol, void PTXMCAsmStreamer::EmitSymbolAttribute(MCSymbol *Symbol,
MCSymbolAttr Attribute) {} MCSymbolAttr Attribute) {}