llvm-mc: When handling a .set, make sure to print subsequent references to the
symbol as the symbol name itself, not the expression it was defined to. These
have different semantics due to the quirky .set behavior (which absolutizes an
expression that would otherwise be treated as a relocation).
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@79025 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/MC/MCAsmStreamer.cpp b/lib/MC/MCAsmStreamer.cpp
index 43ce04f..41f8833 100644
--- a/lib/MC/MCAsmStreamer.cpp
+++ b/lib/MC/MCAsmStreamer.cpp
@@ -136,11 +136,18 @@
if (MakeAbsolute) {
OS << ".set " << Symbol << ", " << Value << '\n';
+
+ // HACK: If the value isn't already absolute, set the symbol value to
+ // itself, we want to use the .set absolute value, not the actual
+ // expression.
+ if (!Value.isAbsolute())
+ getContext().SetSymbolValue(Symbol, MCValue::get(Symbol));
+ else
+ getContext().SetSymbolValue(Symbol, Value);
} else {
OS << Symbol << " = " << Value << '\n';
+ getContext().SetSymbolValue(Symbol, Value);
}
-
- getContext().SetSymbolValue(Symbol, Value);
}
void MCAsmStreamer::EmitSymbolAttribute(MCSymbol *Symbol,