diff options
author | Eugene Leviant <eleviant@accesssoftek.com> | 2018-02-21 15:13:48 +0000 |
---|---|---|
committer | Eugene Leviant <eleviant@accesssoftek.com> | 2018-02-21 15:13:48 +0000 |
commit | c556974f720ddfc31793f312e4024c6045ce5140 (patch) | |
tree | 29a5a3fe2c75171cb6bcfcd36fdda7da3eccc1b2 /llvm/lib/Linker | |
parent | 9c669e13c9ce0eb5a835e897699cfefc14e3ed4a (diff) | |
download | bcm5719-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.cpp | 21 |
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) { |