Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/dotnet/llvm-project.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZoltan Varga <vargaz@gmail.com>2016-02-20 02:39:55 +0300
committerImran Hameed <imhameed@microsoft.com>2021-06-02 23:28:11 +0300
commita387562b322ecb41bdd523a0a61ca108ede199ca (patch)
tree0fb83c64c2d5b1a59fc11ae58b6ab48c4513fbd0
parent355bb852bc3ff1cf6ab5ea43ac17d07a65b5fd5d (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.h2
-rw-r--r--llvm/include/llvm/MC/MCStreamer.h3
-rw-r--r--llvm/lib/MC/MCAsmStreamer.cpp32
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) {