diff options
| author | Vlad Tsyrklevich <vlad@tsyrklevich.net> | 2018-04-27 20:32:34 +0000 |
|---|---|---|
| committer | Vlad Tsyrklevich <vlad@tsyrklevich.net> | 2018-04-27 20:32:34 +0000 |
| commit | 201a1086cf3ca3dfa949b26087a5b05610e66f8e (patch) | |
| tree | 4821ea85de03f3633fb45af323e96c2732e9cbd4 | |
| parent | 6bc635ef56b9589a70e87737e788d9895e3cd0e4 (diff) | |
| download | bcm5719-llvm-201a1086cf3ca3dfa949b26087a5b05610e66f8e.tar.gz bcm5719-llvm-201a1086cf3ca3dfa949b26087a5b05610e66f8e.zip | |
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
| -rw-r--r-- | llvm/lib/MC/ELFObjectWriter.cpp | 4 | ||||
| -rw-r--r-- | llvm/test/MC/ELF/multiple-different-symver.s | 6 | ||||
| -rw-r--r-- | llvm/test/MC/ELF/multiple-equiv-symver.s | 6 |
3 files changed, 16 insertions, 0 deletions
diff --git a/llvm/lib/MC/ELFObjectWriter.cpp b/llvm/lib/MC/ELFObjectWriter.cpp index 989d4bb4eb9..85bbcab8264 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 00000000000..d7706f89f41 --- /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 00000000000..0ab48f0992d --- /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 |

