summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVlad Tsyrklevich <vlad@tsyrklevich.net>2018-04-27 20:32:34 +0000
committerVlad Tsyrklevich <vlad@tsyrklevich.net>2018-04-27 20:32:34 +0000
commit201a1086cf3ca3dfa949b26087a5b05610e66f8e (patch)
tree4821ea85de03f3633fb45af323e96c2732e9cbd4
parent6bc635ef56b9589a70e87737e788d9895e3cd0e4 (diff)
downloadbcm5719-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.cpp4
-rw-r--r--llvm/test/MC/ELF/multiple-different-symver.s6
-rw-r--r--llvm/test/MC/ELF/multiple-equiv-symver.s6
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
OpenPOWER on IntegriCloud