summaryrefslogtreecommitdiffstats
path: root/lld/lib/Core/SymbolTable.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lld/lib/Core/SymbolTable.cpp')
-rw-r--r--lld/lib/Core/SymbolTable.cpp42
1 files changed, 22 insertions, 20 deletions
diff --git a/lld/lib/Core/SymbolTable.cpp b/lld/lib/Core/SymbolTable.cpp
index 1208f52c1b7..a6089116da5 100644
--- a/lld/lib/Core/SymbolTable.cpp
+++ b/lld/lib/Core/SymbolTable.cpp
@@ -98,27 +98,17 @@ enum MergeResolution {
MCR_First,
MCR_Second,
MCR_Largest,
+ MCR_SameSize,
MCR_Error
};
-static MergeResolution mergeCases[4][4] = {
- // no tentative weak weakAddressUsed
- {
- // first is no
- MCR_Error, MCR_First, MCR_First, MCR_First
- },
- {
- // first is tentative
- MCR_Second, MCR_Largest, MCR_Second, MCR_Second
- },
- {
- // first is weak
- MCR_Second, MCR_First, MCR_First, MCR_Second
- },
- {
- // first is weakAddressUsed
- MCR_Second, MCR_First, MCR_First, MCR_First
- }
+static MergeResolution mergeCases[][5] = {
+ // no tentative weak weakAddress sameNameAndSize
+ {MCR_Error, MCR_First, MCR_First, MCR_First, MCR_SameSize}, // no
+ {MCR_Second, MCR_Largest, MCR_Second, MCR_Second, MCR_SameSize}, // tentative
+ {MCR_Second, MCR_First, MCR_First, MCR_Second, MCR_SameSize}, // weak
+ {MCR_Second, MCR_First, MCR_First, MCR_First, MCR_SameSize}, // weakAddress
+ {MCR_SameSize, MCR_SameSize, MCR_SameSize, MCR_SameSize, MCR_SameSize}, // sameSize
};
static MergeResolution mergeSelect(DefinedAtom::Merge first,
@@ -126,7 +116,7 @@ static MergeResolution mergeSelect(DefinedAtom::Merge first,
return mergeCases[first][second];
}
-void SymbolTable::addByName(const Atom & newAtom) {
+void SymbolTable::addByName(const Atom &newAtom) {
StringRef name = newAtom.name();
assert(!name.empty());
const Atom *existing = this->findByName(name);
@@ -149,7 +139,7 @@ void SymbolTable::addByName(const Atom & newAtom) {
assert(existing->definition() == Atom::definitionRegular);
assert(newAtom.definition() == Atom::definitionRegular);
switch (mergeSelect(((DefinedAtom*)existing)->merge(),
- ((DefinedAtom*)(&newAtom))->merge())) {
+ ((DefinedAtom*)&newAtom)->merge())) {
case MCR_First:
useNew = false;
break;
@@ -159,6 +149,18 @@ void SymbolTable::addByName(const Atom & newAtom) {
case MCR_Largest:
useNew = true;
break;
+ case MCR_SameSize: {
+ uint64_t sa = ((DefinedAtom*)existing)->size();
+ uint64_t sb = ((DefinedAtom*)&newAtom)->size();
+ if (sa == sb) {
+ useNew = true;
+ break;
+ }
+ llvm::errs() << "Size mismatch: "
+ << existing->name() << " (" << sa << ") "
+ << newAtom.name() << " (" << sb << ")\n";
+ // fallthrough
+ }
case MCR_Error:
llvm::errs() << "Duplicate symbols: "
<< existing->name()
OpenPOWER on IntegriCloud