From 201a1086cf3ca3dfa949b26087a5b05610e66f8e Mon Sep 17 00:00:00 2001 From: Vlad Tsyrklevich Date: Fri, 27 Apr 2018 20:32:34 +0000 Subject: [PATCH] ELFObjectWriter: Allow one unique symver per symbol Summary: Only allow a single unique .symver alias per symbol. This matches the behavior of gas. I noticed that we ignored multiple mismatched symver directives looking at https://reviews.llvm.org/D45798 Reviewers: pcc, tejohnson, espindola Reviewed By: pcc Subscribers: emaste, arichardson, llvm-commits, kcc Differential Revision: https://reviews.llvm.org/D45845 llvm-svn: 331078 --- llvm/lib/MC/ELFObjectWriter.cpp | 4 ++++ llvm/test/MC/ELF/multiple-different-symver.s | 6 ++++++ llvm/test/MC/ELF/multiple-equiv-symver.s | 6 ++++++ 3 files changed, 16 insertions(+) create mode 100644 llvm/test/MC/ELF/multiple-different-symver.s create mode 100644 llvm/test/MC/ELF/multiple-equiv-symver.s diff --git a/llvm/lib/MC/ELFObjectWriter.cpp b/llvm/lib/MC/ELFObjectWriter.cpp index 989d4bb..85bbcab 100644 --- a/llvm/lib/MC/ELFObjectWriter.cpp +++ b/llvm/lib/MC/ELFObjectWriter.cpp @@ -420,6 +420,10 @@ void ELFObjectWriter::executePostLayoutBinding(MCAssembler &Asm, !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)); } } diff --git a/llvm/test/MC/ELF/multiple-different-symver.s b/llvm/test/MC/ELF/multiple-different-symver.s new file mode 100644 index 0000000..d7706f8 --- /dev/null +++ b/llvm/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 diff --git a/llvm/test/MC/ELF/multiple-equiv-symver.s b/llvm/test/MC/ELF/multiple-equiv-symver.s new file mode 100644 index 0000000..0ab48f0 --- /dev/null +++ b/llvm/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 -- 2.7.4