summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Linker
diff options
context:
space:
mode:
authorDuncan P. N. Exon Smith <dexonsmith@apple.com>2014-11-27 17:01:10 +0000
committerDuncan P. N. Exon Smith <dexonsmith@apple.com>2014-11-27 17:01:10 +0000
commitc586eaa1f15e21b08c799148860d400cd3d1d002 (patch)
treee8979dfa95fb3ef698f9ec4ae7081915e860219f /llvm/lib/Linker
parentc7d4b8dceca8d896299b16a52efbc2d4bb4d22ae (diff)
downloadbcm5719-llvm-c586eaa1f15e21b08c799148860d400cd3d1d002.tar.gz
bcm5719-llvm-c586eaa1f15e21b08c799148860d400cd3d1d002.zip
Revert "Fix overly aggressive type merging."
This reverts commit r222727, which causes LTO bootstrap failures. Last passing @ r222698: http://lab.llvm.org:8080/green/job/clang-Rlto_master_build/532/ First failing @ r222843: http://lab.llvm.org:8080/green/job/clang-Rlto_master_build/533/ Internal bootstraps pointed at a much narrower range: r222725 is passing, and r222731 is failing. LTO crashes while handling libclang.dylib: http://lab.llvm.org:8080/green/job/clang-Rlto_master_build/533/consoleFull#-158682280549ba4694-19c4-4d7e-bec5-911270d8a58c GEP is not of right type for indices! %InfoObj.i.i = getelementptr inbounds %"class.llvm::OnDiskIterableChainedHashTable"* %.lcssa, i64 0, i32 0, i32 4, !dbg !123627 %"class.clang::serialization::reader::ASTIdentifierLookupTrait" = type { %"class.clang::ASTReader.31859"*, %"class.clang::serialization::ModuleFile.31870"*, %"class.clang::IdentifierInfo"* }LLVM ERROR: Broken function found, compilation aborted! clang: error: linker command failed with exit code 1 (use -v to see invocation) Looks like the new algorithm doesn't merge types aggressively enough. llvm-svn: 222895
Diffstat (limited to 'llvm/lib/Linker')
-rw-r--r--llvm/lib/Linker/LinkModules.cpp27
1 files changed, 8 insertions, 19 deletions
diff --git a/llvm/lib/Linker/LinkModules.cpp b/llvm/lib/Linker/LinkModules.cpp
index 76daed250d3..f1f4a51f78c 100644
--- a/llvm/lib/Linker/LinkModules.cpp
+++ b/llvm/lib/Linker/LinkModules.cpp
@@ -96,23 +96,12 @@ private:
void TypeMapTy::addTypeMapping(Type *DstTy, Type *SrcTy) {
// Check to see if these types are recursively isomorphic and establish a
// mapping between them if so.
- if (areTypesIsomorphic(DstTy, SrcTy)) {
- SpeculativeTypes.clear();
- return;
- }
-
- // Oops, they aren't isomorphic. Just discard this request by rolling out
- // any speculative mappings we've established.
- unsigned Removed = 0;
- for (unsigned I = 0, E = SpeculativeTypes.size(); I != E; ++I) {
- Type *SrcTy = SpeculativeTypes[I];
- auto Iter = MappedTypes.find(SrcTy);
- auto *DstTy = dyn_cast<StructType>(Iter->second);
- if (DstTy && DstResolvedOpaqueTypes.erase(DstTy))
- Removed++;
- MappedTypes.erase(Iter);
+ if (!areTypesIsomorphic(DstTy, SrcTy)) {
+ // Oops, they aren't isomorphic. Just discard this request by rolling out
+ // any speculative mappings we've established.
+ for (unsigned i = 0, e = SpeculativeTypes.size(); i != e; ++i)
+ MappedTypes.erase(SpeculativeTypes[i]);
}
- SrcDefinitionsToResolve.resize(SrcDefinitionsToResolve.size() - Removed);
SpeculativeTypes.clear();
}
@@ -148,14 +137,14 @@ bool TypeMapTy::areTypesIsomorphic(Type *DstTy, Type *SrcTy) {
// Mapping a non-opaque source type to an opaque dest. If this is the first
// type that we're mapping onto this destination type then we succeed. Keep
- // the dest, but fill it in later. If this is the second (different) type
- // that we're trying to map onto the same opaque type then we fail.
+ // the dest, but fill it in later. This doesn't need to be speculative. If
+ // this is the second (different) type that we're trying to map onto the
+ // same opaque type then we fail.
if (cast<StructType>(DstTy)->isOpaque()) {
// We can only map one source type onto the opaque destination type.
if (!DstResolvedOpaqueTypes.insert(cast<StructType>(DstTy)).second)
return false;
SrcDefinitionsToResolve.push_back(SSTy);
- SpeculativeTypes.push_back(SrcTy);
Entry = DstTy;
return true;
}
OpenPOWER on IntegriCloud