Change how we keep track of which types are in the dest module.

Instead of keeping an explicit set, just drop the names of types we choose
to map to some other type.

This has the advantage that the name of the unused will not cause the context
to rename types on module read.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@222986 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rafael Espindola 2014-12-01 04:15:59 +00:00
parent 805b8166cf
commit 7a551b7c6d
3 changed files with 14 additions and 15 deletions

View File

@ -46,7 +46,6 @@ public:
private: private:
void init(Module *M, DiagnosticHandlerFunction DiagnosticHandler); void init(Module *M, DiagnosticHandlerFunction DiagnosticHandler);
Module *Composite; Module *Composite;
SmallPtrSet<StructType *, 32> IdentifiedStructTypes;
DiagnosticHandlerFunction DiagnosticHandler; DiagnosticHandlerFunction DiagnosticHandler;
}; };

View File

@ -58,9 +58,8 @@ class TypeMapTy : public ValueMapTypeRemapper {
SmallPtrSet<StructType*, 16> DstResolvedOpaqueTypes; SmallPtrSet<StructType*, 16> DstResolvedOpaqueTypes;
public: public:
TypeMapTy(TypeSet &Set) : DstStructTypesSet(Set) {} TypeMapTy() {}
TypeSet &DstStructTypesSet;
/// Indicate that the specified type in the destination module is conceptually /// Indicate that the specified type in the destination module is conceptually
/// equivalent to the specified type in the source module. /// equivalent to the specified type in the source module.
void addTypeMapping(Type *DstTy, Type *SrcTy); void addTypeMapping(Type *DstTy, Type *SrcTy);
@ -111,6 +110,11 @@ void TypeMapTy::addTypeMapping(Type *DstTy, Type *SrcTy) {
SpeculativeDstOpaqueTypes.size()); SpeculativeDstOpaqueTypes.size());
for (StructType *Ty : SpeculativeDstOpaqueTypes) for (StructType *Ty : SpeculativeDstOpaqueTypes)
DstResolvedOpaqueTypes.erase(Ty); DstResolvedOpaqueTypes.erase(Ty);
} else {
for (Type *Ty : SpeculativeTypes)
if (auto *STy = dyn_cast<StructType>(Ty))
if (STy->hasName())
STy->setName("");
} }
SpeculativeTypes.clear(); SpeculativeTypes.clear();
SpeculativeDstOpaqueTypes.clear(); SpeculativeDstOpaqueTypes.clear();
@ -306,7 +310,6 @@ Type *TypeMapTy::get(Type *Ty) {
if (STy->isOpaque()) { if (STy->isOpaque()) {
// A named structure type from src module is used. Add it to the Set of // A named structure type from src module is used. Add it to the Set of
// identified structs in the destination module. // identified structs in the destination module.
DstStructTypesSet.insert(STy);
return *Entry = STy; return *Entry = STy;
} }
@ -314,7 +317,6 @@ Type *TypeMapTy::get(Type *Ty) {
StructType *DTy = StructType::create(STy->getContext()); StructType *DTy = StructType::create(STy->getContext());
// A new identified structure type was created. Add it to the set of // A new identified structure type was created. Add it to the set of
// identified structs in the destination module. // identified structs in the destination module.
DstStructTypesSet.insert(DTy);
*Entry = DTy; *Entry = DTy;
SmallVector<Type*, 4> ElementTypes; SmallVector<Type*, 4> ElementTypes;
@ -400,9 +402,9 @@ class ModuleLinker {
Linker::DiagnosticHandlerFunction DiagnosticHandler; Linker::DiagnosticHandlerFunction DiagnosticHandler;
public: public:
ModuleLinker(Module *dstM, TypeSet &Set, Module *srcM, ModuleLinker(Module *dstM, Module *srcM,
Linker::DiagnosticHandlerFunction DiagnosticHandler) Linker::DiagnosticHandlerFunction DiagnosticHandler)
: DstM(dstM), SrcM(srcM), TypeMap(Set), : DstM(dstM), SrcM(srcM),
ValMaterializer(TypeMap, DstM, LazilyLinkFunctions), ValMaterializer(TypeMap, DstM, LazilyLinkFunctions),
DiagnosticHandler(DiagnosticHandler) {} DiagnosticHandler(DiagnosticHandler) {}
@ -814,7 +816,7 @@ void ModuleLinker::computeTypeMapping() {
// we prefer to take the '%C' version. So we are then left with both // we prefer to take the '%C' version. So we are then left with both
// '%C.1' and '%C' being used for the same types. This leads to some // '%C.1' and '%C' being used for the same types. This leads to some
// variables using one type and some using the other. // variables using one type and some using the other.
if (!SrcStructTypesSet.count(DST) && TypeMap.DstStructTypesSet.count(DST)) if (!SrcStructTypesSet.count(DST))
TypeMap.addTypeMapping(DST, ST); TypeMap.addTypeMapping(DST, ST);
} }
@ -1576,10 +1578,6 @@ bool ModuleLinker::run() {
void Linker::init(Module *M, DiagnosticHandlerFunction DiagnosticHandler) { void Linker::init(Module *M, DiagnosticHandlerFunction DiagnosticHandler) {
this->Composite = M; this->Composite = M;
this->DiagnosticHandler = DiagnosticHandler; this->DiagnosticHandler = DiagnosticHandler;
TypeFinder StructTypes;
StructTypes.run(*M, true);
IdentifiedStructTypes.insert(StructTypes.begin(), StructTypes.end());
} }
Linker::Linker(Module *M, DiagnosticHandlerFunction DiagnosticHandler) { Linker::Linker(Module *M, DiagnosticHandlerFunction DiagnosticHandler) {
@ -1601,8 +1599,7 @@ void Linker::deleteModule() {
} }
bool Linker::linkInModule(Module *Src) { bool Linker::linkInModule(Module *Src) {
ModuleLinker TheLinker(Composite, IdentifiedStructTypes, Src, ModuleLinker TheLinker(Composite, Src, DiagnosticHandler);
DiagnosticHandler);
return TheLinker.run(); return TheLinker.run();
} }

View File

@ -9,7 +9,10 @@
; CHECK: %A = type { %B } ; CHECK: %A = type { %B }
; CHECK-NEXT: %B = type { i8 } ; CHECK-NEXT: %B = type { i8 }
; CHECK-NEXT: %A.11.1 = type opaque
; CHECK: @g3 = external global %A
; CHECK: @g1 = external global %A
; CHECK: @g2 = external global %A
%A = type { %B } %A = type { %B }
%B = type { i8 } %B = type { i8 }