Index: llvm/trunk/lib/MC/ELFObjectWriter.cpp =================================================================== --- llvm/trunk/lib/MC/ELFObjectWriter.cpp +++ llvm/trunk/lib/MC/ELFObjectWriter.cpp @@ -420,6 +420,10 @@ !Rest.startswith("@@@")) report_fatal_error("A @@ version cannot be undefined"); + if (Renames.count(&Symbol) && Renames[&Symbol] != Alias) + report_fatal_error(llvm::Twine("Multiple symbol versions defined for ") + + Symbol.getName()); + Renames.insert(std::make_pair(&Symbol, Alias)); } } Index: llvm/trunk/test/MC/ELF/multiple-different-symver.s =================================================================== --- llvm/trunk/test/MC/ELF/multiple-different-symver.s +++ llvm/trunk/test/MC/ELF/multiple-different-symver.s @@ -0,0 +1,6 @@ +// RUN: not llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o %t 2>&1 | FileCheck %s + +// CHECK: Multiple symbol versions defined for foo + +.symver foo, foo@1 +.symver foo, foo@2 Index: llvm/trunk/test/MC/ELF/multiple-equiv-symver.s =================================================================== --- llvm/trunk/test/MC/ELF/multiple-equiv-symver.s +++ llvm/trunk/test/MC/ELF/multiple-equiv-symver.s @@ -0,0 +1,6 @@ +// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - 2>&1 | FileCheck %s + +// CHECK-NOT: Multiple symbol versions defined for foo + +.symver foo, foo@1 +.symver foo, foo@1