diff --git a/lib/MC/MCAsmStreamer.cpp b/lib/MC/MCAsmStreamer.cpp index 43ce04ffdfd..41f88334e2b 100644 --- a/lib/MC/MCAsmStreamer.cpp +++ b/lib/MC/MCAsmStreamer.cpp @@ -136,11 +136,18 @@ void MCAsmStreamer::EmitAssignment(MCSymbol *Symbol, const MCValue &Value, 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, diff --git a/test/MC/AsmParser/labels.s b/test/MC/AsmParser/labels.s index c9cb44eaf0f..f3066852568 100644 --- a/test/MC/AsmParser/labels.s +++ b/test/MC/AsmParser/labels.s @@ -23,9 +23,9 @@ foo: // CHECK: addl $10, %eax addl "b$c", %eax - // CHECK: set "a 0", 11 -.set "a 0", 11 + .set "a 0", 11 + // CHECK: .long 11 .long "a 0" @@ -49,3 +49,9 @@ foo: // CHECK: .lsym "a 8",1 .lsym "a 8", 1 + +// CHECK: set "a 9", a - b + .set "a 9", a - b + +// CHECK: .long "a 9" + .long "a 9"