aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/MC/MCObjectStreamer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/MC/MCObjectStreamer.cpp')
-rw-r--r--llvm/lib/MC/MCObjectStreamer.cpp25
1 files changed, 25 insertions, 0 deletions
diff --git a/llvm/lib/MC/MCObjectStreamer.cpp b/llvm/lib/MC/MCObjectStreamer.cpp
index 9c86fcc86bcb..6604d7988c4c 100644
--- a/llvm/lib/MC/MCObjectStreamer.cpp
+++ b/llvm/lib/MC/MCObjectStreamer.cpp
@@ -281,6 +281,18 @@ void MCObjectStreamer::emitLabel(MCSymbol *Symbol, SMLoc Loc) {
Symbol->setOffset(0);
addPendingLabel(Symbol);
}
+
+ emitPendingAssignments(Symbol);
+}
+
+void MCObjectStreamer::emitPendingAssignments(MCSymbol *Symbol) {
+ auto Assignments = pendingAssignments.find(Symbol);
+ if (Assignments != pendingAssignments.end()) {
+ for (const PendingAssignment &A : Assignments->second)
+ emitAssignment(A.Symbol, A.Value);
+
+ pendingAssignments.erase(Assignments);
+ }
}
// Emit a label at a previously emitted fragment/offset position. This must be
@@ -353,6 +365,19 @@ bool MCObjectStreamer::changeSectionImpl(MCSection *Section,
void MCObjectStreamer::emitAssignment(MCSymbol *Symbol, const MCExpr *Value) {
getAssembler().registerSymbol(*Symbol);
MCStreamer::emitAssignment(Symbol, Value);
+ emitPendingAssignments(Symbol);
+}
+
+void MCObjectStreamer::emitConditionalAssignment(MCSymbol *Symbol,
+ const MCExpr *Value) {
+ const MCSymbol *Target = &cast<MCSymbolRefExpr>(*Value).getSymbol();
+
+ // If the symbol already exists, emit the assignment. Otherwise, emit it
+ // later only if the symbol is also emitted.
+ if (Target->isRegistered())
+ emitAssignment(Symbol, Value);
+ else
+ pendingAssignments[Target].push_back({Symbol, Value});
}
bool MCObjectStreamer::mayHaveInstructions(MCSection &Sec) const {