Index: include/llvm/MC/MCELFStreamer.h =================================================================== --- include/llvm/MC/MCELFStreamer.h +++ include/llvm/MC/MCELFStreamer.h @@ -51,6 +51,8 @@ unsigned ByteAlignment) override; void emitELFSize(MCSymbol *Symbol, const MCExpr *Value) override; + void emitELFSymverDirective(MCSymbol *Alias, + const MCSymbol *Aliasee) override; void EmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size, unsigned ByteAlignment) override; Index: lib/MC/MCAsmStreamer.cpp =================================================================== --- lib/MC/MCAsmStreamer.cpp +++ lib/MC/MCAsmStreamer.cpp @@ -130,6 +130,9 @@ void ChangeSection(MCSection *Section, const MCExpr *Subsection) override; + void emitELFSymverDirective(MCSymbol *Alias, + const MCSymbol *Aliasee) override; + void EmitLOHDirective(MCLOHType Kind, const MCLOHArgs &Args) override; void EmitLabel(MCSymbol *Symbol, SMLoc Loc = SMLoc()) override; @@ -414,6 +417,15 @@ } } +void MCAsmStreamer::emitELFSymverDirective(MCSymbol *Alias, + const MCSymbol *Aliasee) { + OS << ".symver "; + Aliasee->print(OS, MAI); + OS << ", "; + Alias->print(OS, MAI); + EmitEOL(); +} + void MCAsmStreamer::EmitLabel(MCSymbol *Symbol, SMLoc Loc) { MCStreamer::EmitLabel(Symbol, Loc); Index: lib/MC/MCELFStreamer.cpp =================================================================== --- lib/MC/MCELFStreamer.cpp +++ lib/MC/MCELFStreamer.cpp @@ -337,6 +337,12 @@ cast(Symbol)->setSize(Value); } +void MCELFStreamer::emitELFSymverDirective(MCSymbol *Alias, + const MCSymbol *Aliasee) { + const MCExpr *Value = MCSymbolRefExpr::create(Aliasee, getContext()); + EmitAssignment(Alias, Value); +} + void MCELFStreamer::EmitLocalCommonSymbol(MCSymbol *S, uint64_t Size, unsigned ByteAlignment) { auto *Symbol = cast(S); Index: lib/MC/MCParser/ELFAsmParser.cpp =================================================================== --- lib/MC/MCParser/ELFAsmParser.cpp +++ lib/MC/MCParser/ELFAsmParser.cpp @@ -771,9 +771,6 @@ MCSymbol *Alias = getContext().getOrCreateSymbol(AliasName); MCSymbol *Sym = getContext().getOrCreateSymbol(Name); - const MCExpr *Value = MCSymbolRefExpr::create(Sym, getContext()); - - getStreamer().EmitAssignment(Alias, Value); getStreamer().emitELFSymverDirective(Alias, Sym); return false; } Index: lib/Object/RecordStreamer.cpp =================================================================== --- lib/Object/RecordStreamer.cpp +++ lib/Object/RecordStreamer.cpp @@ -114,5 +114,7 @@ void RecordStreamer::emitELFSymverDirective(MCSymbol *Alias, const MCSymbol *Aliasee) { + const MCExpr *Value = MCSymbolRefExpr::create(Aliasee, getContext()); + EmitAssignment(Alias, Value); SymverAliasMap[Aliasee].push_back(Alias); } Index: test/MC/ARM/comment.s =================================================================== --- test/MC/ARM/comment.s +++ test/MC/ARM/comment.s @@ -34,9 +34,9 @@ @CHECK-NOT: @ @CHECK-LABEL: bar: -@CHECK: bar1@zed = defined1 -@CHECK: bar3@@zed = defined2 -@CHECK: bar5@@@zed = defined3 +@CHECK: .symver defined1, bar1@zed +@CHECK: .symver defined2, bar3@@zed +@CHECK: .symver defined3, bar5@@@zed @ Make sure we did not mess up the parser state and it still lexes @ comments correctly by excluding the @ in normal symbols