summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Linker
diff options
context:
space:
mode:
authorEugene Leviant <eleviant@accesssoftek.com>2018-02-21 15:13:48 +0000
committerEugene Leviant <eleviant@accesssoftek.com>2018-02-21 15:13:48 +0000
commitc556974f720ddfc31793f312e4024c6045ce5140 (patch)
tree29a5a3fe2c75171cb6bcfcd36fdda7da3eccc1b2 /llvm/lib/Linker
parent9c669e13c9ce0eb5a835e897699cfefc14e3ed4a (diff)
downloadbcm5719-llvm-c556974f720ddfc31793f312e4024c6045ce5140.tar.gz
bcm5719-llvm-c556974f720ddfc31793f312e4024c6045ce5140.zip
[IRMover] Implement name based structure type mapping
Differential revision: https://reviews.llvm.org/D43199 llvm-svn: 325686
Diffstat (limited to 'llvm/lib/Linker')
-rw-r--r--llvm/lib/Linker/IRMover.cpp21
1 files changed, 14 insertions, 7 deletions
diff --git a/llvm/lib/Linker/IRMover.cpp b/llvm/lib/Linker/IRMover.cpp
index 42081442db7..03539f393cb 100644
--- a/llvm/lib/Linker/IRMover.cpp
+++ b/llvm/lib/Linker/IRMover.cpp
@@ -318,8 +318,8 @@ Type *TypeMapTy::get(Type *Ty, SmallPtrSet<StructType *, 8> &Visited) {
return *Entry = Ty;
}
- if (StructType *OldT =
- DstStructTypesSet.findNonOpaque(ElementTypes, IsPacked)) {
+ if (StructType *OldT = DstStructTypesSet.findNonOpaque(
+ ElementTypes, IsPacked, STy->getName())) {
STy->setName("");
return *Entry = OldT;
}
@@ -906,7 +906,6 @@ bool IRLinker::shouldLink(GlobalValue *DGV, GlobalValue &SGV) {
Expected<Constant *> IRLinker::linkGlobalValueProto(GlobalValue *SGV,
bool ForAlias) {
GlobalValue *DGV = getLinkedToGlobal(SGV);
-
bool ShouldLink = shouldLink(DGV, *SGV);
// just missing from map
@@ -1410,12 +1409,14 @@ bool IRMover::StructTypeKeyInfo::isEqual(const StructType *LHS,
void IRMover::IdentifiedStructTypeSet::addNonOpaque(StructType *Ty) {
assert(!Ty->isOpaque());
+ if (Ty->hasName())
+ NonOpaqueStructNameMap.insert({getTypeNamePrefix(Ty->getName()), Ty});
+
NonOpaqueStructTypes.insert(Ty);
}
void IRMover::IdentifiedStructTypeSet::switchToNonOpaque(StructType *Ty) {
- assert(!Ty->isOpaque());
- NonOpaqueStructTypes.insert(Ty);
+ addNonOpaque(Ty);
bool Removed = OpaqueStructTypes.erase(Ty);
(void)Removed;
assert(Removed);
@@ -1428,10 +1429,16 @@ void IRMover::IdentifiedStructTypeSet::addOpaque(StructType *Ty) {
StructType *
IRMover::IdentifiedStructTypeSet::findNonOpaque(ArrayRef<Type *> ETypes,
- bool IsPacked) {
+ bool IsPacked, StringRef Name) {
IRMover::StructTypeKeyInfo::KeyTy Key(ETypes, IsPacked);
auto I = NonOpaqueStructTypes.find_as(Key);
- return I == NonOpaqueStructTypes.end() ? nullptr : *I;
+ if (I == NonOpaqueStructTypes.end())
+ return nullptr;
+ auto NI = NonOpaqueStructNameMap.find(getTypeNamePrefix(Name));
+ if (NI != NonOpaqueStructNameMap.end() &&
+ IRMover::StructTypeKeyInfo::KeyTy((*NI).second) == Key)
+ return (*NI).second;
+ return *I;
}
bool IRMover::IdentifiedStructTypeSet::hasType(StructType *Ty) {
OpenPOWER on IntegriCloud