diff options
author | Zoltan Varga <vargaz@gmail.com> | 2016-02-20 02:39:55 +0300 |
---|---|---|
committer | Imran Hameed <imhameed@microsoft.com> | 2021-06-02 23:28:11 +0300 |
commit | a387562b322ecb41bdd523a0a61ca108ede199ca (patch) | |
tree | 0fb83c64c2d5b1a59fc11ae58b6ab48c4513fbd0 | |
parent | 355bb852bc3ff1cf6ab5ea43ac17d07a65b5fd5d (diff) |
Put back the emitDwarfAdvanceFrameAddr () method into MCStreamer which was moved into MCObjectStreamer so it can be used whhen emitting assembly as well.
-rw-r--r-- | llvm/include/llvm/MC/MCObjectStreamer.h | 2 | ||||
-rw-r--r-- | llvm/include/llvm/MC/MCStreamer.h | 3 | ||||
-rw-r--r-- | llvm/lib/MC/MCAsmStreamer.cpp | 32 |
3 files changed, 36 insertions, 1 deletions
diff --git a/llvm/include/llvm/MC/MCObjectStreamer.h b/llvm/include/llvm/MC/MCObjectStreamer.h index c3f3ae5de921..ebcb744708de 100644 --- a/llvm/include/llvm/MC/MCObjectStreamer.h +++ b/llvm/include/llvm/MC/MCObjectStreamer.h @@ -148,7 +148,7 @@ public: void emitDwarfAdvanceLineAddr(int64_t LineDelta, const MCSymbol *LastLabel, const MCSymbol *Label, unsigned PointerSize); void emitDwarfAdvanceFrameAddr(const MCSymbol *LastLabel, - const MCSymbol *Label); + const MCSymbol *Label) override; void emitCVLocDirective(unsigned FunctionId, unsigned FileNo, unsigned Line, unsigned Column, bool PrologueEnd, bool IsStmt, StringRef FileName, SMLoc Loc) override; diff --git a/llvm/include/llvm/MC/MCStreamer.h b/llvm/include/llvm/MC/MCStreamer.h index 484c62538366..f4d3e993745a 100644 --- a/llvm/include/llvm/MC/MCStreamer.h +++ b/llvm/include/llvm/MC/MCStreamer.h @@ -930,6 +930,9 @@ public: ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges, codeview::DefRangeFramePointerRelHeader DRHdr); + virtual void emitDwarfAdvanceFrameAddr(const MCSymbol *LastLabel, + const MCSymbol *Label) {} + /// This implements the CodeView '.cv_stringtable' assembler directive. virtual void emitCVStringTableDirective() {} diff --git a/llvm/lib/MC/MCAsmStreamer.cpp b/llvm/lib/MC/MCAsmStreamer.cpp index 6a8572e57922..5485fe6349e3 100644 --- a/llvm/lib/MC/MCAsmStreamer.cpp +++ b/llvm/lib/MC/MCAsmStreamer.cpp @@ -158,6 +158,8 @@ public: void emitAssignment(MCSymbol *Symbol, const MCExpr *Value) override; void emitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) override; bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override; + void emitDwarfAdvanceFrameAddr(const MCSymbol *LastLabel, + const MCSymbol *Label) override; void emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) override; void BeginCOFFSymbolDef(const MCSymbol *Symbol) override; @@ -633,6 +635,36 @@ void MCAsmStreamer::emitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) { EmitEOL(); } +static const MCExpr *buildSymbolDiff(MCContext &Context, + const MCSymbol *A, + const MCSymbol *B) { + MCSymbolRefExpr::VariantKind Variant = MCSymbolRefExpr::VK_None; + const MCExpr *ARef = MCSymbolRefExpr::create(A, Variant, Context); + const MCExpr *BRef = MCSymbolRefExpr::create(B, Variant, Context); + const MCExpr *AddrDelta = + MCBinaryExpr::create(MCBinaryExpr::Sub, ARef, BRef, Context); + return AddrDelta; +} + +static const MCExpr *forceExpAbs(MCStreamer &Streamer, const MCExpr* Expr) { + MCContext &Context = Streamer.getContext(); + assert(!isa<MCSymbolRefExpr>(Expr)); + if (Context.getAsmInfo()->hasAggressiveSymbolFolding()) + return Expr; + + MCSymbol *ABS = Context.createTempSymbol(); + Streamer.emitAssignment(ABS, Expr); + return MCSymbolRefExpr::create(ABS, Context); + } + +void MCAsmStreamer::emitDwarfAdvanceFrameAddr(const MCSymbol *LastLabel, + const MCSymbol *Label) { + emitIntValue(dwarf::DW_CFA_advance_loc4, 1); + const MCExpr *AddrDelta = buildSymbolDiff(getContext(), Label, LastLabel); + AddrDelta = forceExpAbs(*this, AddrDelta); + emitValue(AddrDelta, 4); +} + bool MCAsmStreamer::emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) { switch (Attribute) { |