summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRui Ueyama <ruiu@google.com>2014-09-19 21:58:54 +0000
committerRui Ueyama <ruiu@google.com>2014-09-19 21:58:54 +0000
commit44a7c7f1aa34c725d65aad46fe33b4a8247e71a0 (patch)
tree9b83a85367b3ee62ed8e0872108f357d5df878f5
parent16ebdd6c1bd35d2661bd51b0cf89aa4d01215d0c (diff)
downloadbcm5719-llvm-44a7c7f1aa34c725d65aad46fe33b4a8247e71a0.tar.gz
bcm5719-llvm-44a7c7f1aa34c725d65aad46fe33b4a8247e71a0.zip
[PECOFF] Set ordinal to alias atoms
Atoms are ordered in the output file by ordinal. File has file ordinal, and atom has atom ordinal which is unique within the file. No two atoms should have the same combination of ordinals. However that contract was not satisifed for alias atoms. Alias atom is defined by /alternatename:sym1=sym2. In this case sym1 is defined as an alias for sym2. sym1 always got ordinal 0. As a result LLD failed with an assertion failure. This patch assigns ordinal to alias atoms. llvm-svn: 218158
-rw-r--r--lld/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp7
-rw-r--r--lld/test/pecoff/alternatename.test10
2 files changed, 14 insertions, 3 deletions
diff --git a/lld/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp b/lld/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp
index 353f52cc59a..0b829d745eb 100644
--- a/lld/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp
+++ b/lld/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp
@@ -88,7 +88,8 @@ public:
return _absoluteAtoms;
}
- void addDefinedAtom(const DefinedAtom *atom) {
+ void addDefinedAtom(AliasAtom *atom) {
+ atom->setOrdinal(_ordinal++);
_definedAtoms._atoms.push_back(atom);
}
@@ -1068,13 +1069,13 @@ private:
// Iterates over defined atoms and create alias atoms if needed.
void createAlternateNameAtoms(FileCOFF &file) const {
- std::vector<const DefinedAtom *> aliases;
+ std::vector<AliasAtom *> aliases;
for (const DefinedAtom *atom : file.defined()) {
auto it = _ctx.alternateNames().find(atom->name());
if (it != _ctx.alternateNames().end())
aliases.push_back(createAlias(file, it->second, atom));
}
- for (const DefinedAtom *alias : aliases) {
+ for (AliasAtom *alias : aliases) {
file.addDefinedAtom(alias);
}
}
diff --git a/lld/test/pecoff/alternatename.test b/lld/test/pecoff/alternatename.test
index ff6617ebdd6..56cd57de00a 100644
--- a/lld/test/pecoff/alternatename.test
+++ b/lld/test/pecoff/alternatename.test
@@ -10,6 +10,10 @@
#
# RUN: lld -flavor link /force /out:%t3.exe -- %t3.obj
# RUN: llvm-objdump -d %t3.exe | FileCheck -check-prefix=CHECK3 %s
+#
+# RUN: lld -flavor link /force /out:%t4.exe /alternatename:_main=_foo \
+# RUN: /alternatename:_xyz=_foo -- %t1.obj
+# RUN: llvm-objdump -d %t4.exe | FileCheck -check-prefix=CHECK4 %s
CHECK1: nop
CHECK1-NEXT: nop
@@ -28,3 +32,9 @@ CHECK3-NEXT: nop
CHECK3-NEXT: nop
CHECK3-NEXT: nop
CHECK3-NOT: int3
+
+CHECK4: nop
+CHECK4-NEXT: nop
+CHECK4-NEXT: nop
+CHECK4-NEXT: nop
+CHECK4-NOT: int3
OpenPOWER on IntegriCloud