Revert "[IRMover] Implement name based structure type mapping"

This reverts commit r325686.

There was a misunderstanding and this has not been approved yet.

llvm-svn: 325715
This commit is contained in:
Rafael Espindola 2018-02-21 20:12:18 +00:00
parent 9060b57e70
commit 9a2bf413a0
5 changed files with 19 additions and 55 deletions

View File

@ -49,23 +49,17 @@ public:
// The set of opaque types is the composite module.
DenseSet<StructType *> OpaqueStructTypes;
// The set of identified but non opaque structures in the composite module.
DenseSet<StructType *, StructTypeKeyInfo> NonOpaqueStructTypes;
// Map between structure type name and instance. Used in findNonOpaque
// to correctly map imported global variable type during ThinLTO import
// phase.
DenseMap<StringRef, StructType *> NonOpaqueStructNameMap;
public:
void addNonOpaque(StructType *Ty);
void switchToNonOpaque(StructType *Ty);
void addOpaque(StructType *Ty);
StructType *findNonOpaque(ArrayRef<Type *> ETypes, bool IsPacked,
StringRef Name);
bool hasType(StructType *Ty);
};
// The set of identified but non opaque structures in the composite module.
DenseSet<StructType *, StructTypeKeyInfo> NonOpaqueStructTypes;
public:
void addNonOpaque(StructType *Ty);
void switchToNonOpaque(StructType *Ty);
void addOpaque(StructType *Ty);
StructType *findNonOpaque(ArrayRef<Type *> ETypes, bool IsPacked);
bool hasType(StructType *Ty);
};
IRMover(Module &M);
typedef std::function<void(GlobalValue &)> ValueAdder;

View File

@ -318,8 +318,8 @@ Type *TypeMapTy::get(Type *Ty, SmallPtrSet<StructType *, 8> &Visited) {
return *Entry = Ty;
}
if (StructType *OldT = DstStructTypesSet.findNonOpaque(
ElementTypes, IsPacked, STy->getName())) {
if (StructType *OldT =
DstStructTypesSet.findNonOpaque(ElementTypes, IsPacked)) {
STy->setName("");
return *Entry = OldT;
}
@ -906,6 +906,7 @@ 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
@ -1409,14 +1410,12 @@ 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) {
addNonOpaque(Ty);
assert(!Ty->isOpaque());
NonOpaqueStructTypes.insert(Ty);
bool Removed = OpaqueStructTypes.erase(Ty);
(void)Removed;
assert(Removed);
@ -1429,16 +1428,10 @@ void IRMover::IdentifiedStructTypeSet::addOpaque(StructType *Ty) {
StructType *
IRMover::IdentifiedStructTypeSet::findNonOpaque(ArrayRef<Type *> ETypes,
bool IsPacked, StringRef Name) {
bool IsPacked) {
IRMover::StructTypeKeyInfo::KeyTy Key(ETypes, IsPacked);
auto I = NonOpaqueStructTypes.find_as(Key);
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;
return I == NonOpaqueStructTypes.end() ? nullptr : *I;
}
bool IRMover::IdentifiedStructTypeSet::hasType(StructType *Ty) {

View File

@ -1,4 +0,0 @@
%struct.Baz = type { i64, i64, %struct.Foo }
%struct.Foo = type { i64, i64 }
@baz = global %struct.Baz zeroinitializer

View File

@ -1,12 +0,0 @@
; RUN: llvm-link --initial-module=%s %p/Inputs/struct-mapping.ll -S -o - | FileCheck %s
; Here we check that new type mapping algorithm correctly mapped type of internal
; member of struct.Baz to struct.Foo. Without it we'd map that type to struct.Bar, because
; it is recursively isomorphic to struct.Foo and is defined first in source file.
; CHECK: %struct.Baz = type { i64, i64, %struct.Foo }
%struct.Bar = type { i64, i64 }
%struct.Foo = type { i64, i64 }
@bar = global %struct.Bar zeroinitializer
@foo = global %struct.Foo zeroinitializer

View File

@ -70,11 +70,6 @@ static cl::opt<std::string>
OutputFilename("o", cl::desc("Override output filename"), cl::init("-"),
cl::value_desc("filename"));
static cl::opt<std::string>
InitialModule("initial-module",
cl::desc("Link to existing destination module"), cl::init(""),
cl::value_desc("filename"));
static cl::opt<bool>
Internalize("internalize", cl::desc("Internalize linked symbols"));
@ -365,9 +360,7 @@ int main(int argc, char **argv) {
if (!DisableDITypeMap)
Context.enableDebugTypeODRUniquing();
auto Composite = InitialModule.empty()
? make_unique<Module>("llvm-link", Context)
: loadFile(argv[0], InitialModule, Context);
auto Composite = make_unique<Module>("llvm-link", Context);
Linker L(*Composite);
unsigned Flags = Linker::Flags::None;