[llvm] r254347 - This reverts commit r254336 and r254344.
Rafael Espindola via llvm-commits
llvm-commits at lists.llvm.org
Mon Nov 30 15:54:19 PST 2015
Author: rafael
Date: Mon Nov 30 17:54:19 2015
New Revision: 254347
URL: http://llvm.org/viewvc/llvm-project?rev=254347&view=rev
Log:
This reverts commit r254336 and r254344.
They broke a bot and I am debugging why.
Removed:
llvm/trunk/test/Linker/Inputs/comdat11.ll
llvm/trunk/test/Linker/comdat11.ll
llvm/trunk/test/Linker/comdat12.ll
Modified:
llvm/trunk/lib/Linker/LinkModules.cpp
llvm/trunk/lib/Transforms/Utils/ValueMapper.cpp
llvm/trunk/test/Linker/comdat9.ll
Modified: llvm/trunk/lib/Linker/LinkModules.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Linker/LinkModules.cpp?rev=254347&r1=254346&r2=254347&view=diff
==============================================================================
--- llvm/trunk/lib/Linker/LinkModules.cpp (original)
+++ llvm/trunk/lib/Linker/LinkModules.cpp Mon Nov 30 17:54:19 2015
@@ -436,8 +436,6 @@ class ModuleLinker {
/// references.
bool DoneLinkingBodies;
- bool HasError = false;
-
public:
ModuleLinker(Module *dstM, Linker::IdentifiedStructTypeSet &Set, Module *srcM,
DiagnosticHandlerFunction DiagnosticHandler, unsigned Flags,
@@ -485,7 +483,6 @@ private:
/// Helper method for setting a message and returning an error code.
bool emitError(const Twine &Message) {
DiagnosticHandler(LinkDiagnosticInfo(DS_Error, Message));
- HasError = true;
return true;
}
@@ -534,7 +531,6 @@ private:
void upgradeMismatchedGlobalArray(StringRef Name);
void upgradeMismatchedGlobals();
- bool linkIfNeeded(GlobalValue &GV);
bool linkAppendingVarProto(GlobalVariable *DstGV,
const GlobalVariable *SrcGV);
@@ -908,12 +904,16 @@ Value *ModuleLinker::materializeDeclFor(
if (doneLinkingBodies())
return nullptr;
- linkGlobalValueProto(SGV);
- if (HasError)
- return nullptr;
- Value *Ret = ValueMap[SGV];
- assert(Ret);
- return Ret;
+ GlobalValue *DGV = copyGlobalValueProto(TypeMap, SGV);
+
+ if (Comdat *SC = SGV->getComdat()) {
+ if (auto *DGO = dyn_cast<GlobalObject>(DGV)) {
+ Comdat *DC = DstM->getOrInsertComdat(SC->getName());
+ DGO->setComdat(DC);
+ }
+ }
+
+ return DGV;
}
void ValueMaterializerTy::materializeInitFor(GlobalValue *New,
@@ -922,27 +922,15 @@ void ValueMaterializerTy::materializeIni
}
void ModuleLinker::materializeInitFor(GlobalValue *New, GlobalValue *Old) {
- if (auto *F = dyn_cast<Function>(New)) {
- if (!F->isDeclaration())
- return;
- } else if (auto *V = dyn_cast<GlobalVariable>(New)) {
- if (V->hasInitializer())
- return;
- } else {
- auto *A = cast<GlobalAlias>(New);
- if (A->getAliasee())
- return;
- }
-
- if (Old->isDeclaration())
- return;
-
if (isPerformingImport() && !doImportAsDefinition(Old))
return;
- if (DoNotLinkFromSource.count(Old))
+ // Skip declarations that ValueMaterializer may have created in
+ // case we link in only some of SrcM.
+ if (shouldLinkOnlyNeeded() && Old->isDeclaration())
return;
+ assert(!Old->isDeclaration() && "users should not pass down decls");
linkGlobalValueBody(*Old);
}
@@ -1417,6 +1405,7 @@ bool ModuleLinker::linkGlobalValueProto(
std::tie(SK, LinkFromSrc) = ComdatsChosen[SC];
C = DstM->getOrInsertComdat(SC->getName());
C->setSelectionKind(SK);
+ ComdatMembers[SC].push_back(SGV);
} else if (DGV) {
if (shouldLinkFromSource(LinkFromSrc, *DGV, *SGV))
return true;
@@ -1436,12 +1425,31 @@ bool ModuleLinker::linkGlobalValueProto(
if (DGV)
HasUnnamedAddr = HasUnnamedAddr && DGV->hasUnnamedAddr();
+ if (!LinkFromSrc && !DGV)
+ return false;
+
GlobalValue *NewGV;
- if (!LinkFromSrc && DGV) {
+ if (!LinkFromSrc) {
NewGV = DGV;
// When linking from source we setVisibility from copyGlobalValueProto.
setVisibility(NewGV, SGV, DGV);
} else {
+ // If the GV is to be lazily linked, don't create it just yet.
+ // The ValueMaterializerTy will deal with creating it if it's used.
+ if (!DGV && !shouldOverrideFromSrc() && SGV != ImportFunction &&
+ (SGV->hasLocalLinkage() || SGV->hasLinkOnceLinkage() ||
+ SGV->hasAvailableExternallyLinkage())) {
+ DoNotLinkFromSource.insert(SGV);
+ return false;
+ }
+
+ // When we only want to link in unresolved dependencies, blacklist
+ // the symbol unless unless DestM has a matching declaration (DGV).
+ if (shouldLinkOnlyNeeded() && !(DGV && DGV->isDeclaration())) {
+ DoNotLinkFromSource.insert(SGV);
+ return false;
+ }
+
NewGV = copyGlobalValueProto(TypeMap, SGV, DGV);
if (isPerformingImport() && !doImportAsDefinition(SGV))
@@ -1451,7 +1459,7 @@ bool ModuleLinker::linkGlobalValueProto(
NewGV->setUnnamedAddr(HasUnnamedAddr);
if (auto *NewGO = dyn_cast<GlobalObject>(NewGV)) {
- if (C && LinkFromSrc)
+ if (C)
NewGO->setComdat(C);
if (DGV && DGV->hasCommonLinkage() && SGV->hasCommonLinkage())
@@ -1834,38 +1842,6 @@ static std::string mergeTriples(const Tr
return DstTriple.str();
}
-bool ModuleLinker::linkIfNeeded(GlobalValue &GV) {
- GlobalValue *DGV = getLinkedToGlobal(&GV);
-
- if (shouldLinkOnlyNeeded() && !(DGV && DGV->isDeclaration()))
- return false;
-
- if (DGV && !GV.hasLocalLinkage()) {
- GlobalValue::VisibilityTypes Visibility =
- getMinVisibility(DGV->getVisibility(), GV.getVisibility());
- DGV->setVisibility(Visibility);
- GV.setVisibility(Visibility);
- }
-
- if (const Comdat *SC = GV.getComdat()) {
- bool LinkFromSrc;
- Comdat::SelectionKind SK;
- std::tie(SK, LinkFromSrc) = ComdatsChosen[SC];
- if (!LinkFromSrc) {
- DoNotLinkFromSource.insert(&GV);
- return false;
- }
- }
-
- if (!DGV && !shouldOverrideFromSrc() &&
- (GV.hasLocalLinkage() || GV.hasLinkOnceLinkage() ||
- GV.hasAvailableExternallyLinkage())) {
- return false;
- }
- MapValue(&GV, ValueMap, RF_MoveDistinctMDs, &TypeMap, &ValMaterializer);
- return HasError;
-}
-
bool ModuleLinker::run() {
assert(DstM && "Null destination module");
assert(SrcM && "Null source module");
@@ -1925,30 +1901,24 @@ bool ModuleLinker::run() {
// Upgrade mismatched global arrays.
upgradeMismatchedGlobals();
- for (GlobalVariable &GV : SrcM->globals())
- if (const Comdat *SC = GV.getComdat())
- ComdatMembers[SC].push_back(&GV);
-
- for (Function &SF : *SrcM)
- if (const Comdat *SC = SF.getComdat())
- ComdatMembers[SC].push_back(&SF);
-
- for (GlobalAlias &GA : SrcM->aliases())
- if (const Comdat *SC = GA.getComdat())
- ComdatMembers[SC].push_back(&GA);
-
// Insert all of the globals in src into the DstM module... without linking
// initializers (which could refer to functions not yet mapped over).
for (GlobalVariable &GV : SrcM->globals())
- if (linkIfNeeded(GV))
+ if (linkGlobalValueProto(&GV))
return true;
- for (Function &SF : *SrcM)
- if (linkIfNeeded(SF))
+ // Link the functions together between the two modules, without doing function
+ // bodies... this just adds external function prototypes to the DstM
+ // function... We do this so that when we begin processing function bodies,
+ // all of the global values that may be referenced are available in our
+ // ValueMap.
+ for (Function &F :*SrcM)
+ if (linkGlobalValueProto(&F))
return true;
+ // If there were any aliases, link them now.
for (GlobalAlias &GA : SrcM->aliases())
- if (linkIfNeeded(GA))
+ if (linkGlobalValueProto(&GA))
return true;
for (AppendingVarInfo &AppendingVar : AppendingVars)
@@ -1963,6 +1933,37 @@ bool ModuleLinker::run() {
MapValue(GV, ValueMap, RF_MoveDistinctMDs, &TypeMap, &ValMaterializer);
}
+ // Link in the function bodies that are defined in the source module into
+ // DstM.
+ for (Function &SF : *SrcM) {
+ // Skip if no body (function is external).
+ if (SF.isDeclaration())
+ continue;
+
+ // Skip if not linking from source.
+ if (DoNotLinkFromSource.count(&SF))
+ continue;
+
+ if (linkGlobalValueBody(SF))
+ return true;
+ }
+
+ // Resolve all uses of aliases with aliasees.
+ for (GlobalAlias &Src : SrcM->aliases()) {
+ if (DoNotLinkFromSource.count(&Src))
+ continue;
+ linkGlobalValueBody(Src);
+ }
+
+ // Update the initializers in the DstM module now that all globals that may
+ // be referenced are in DstM.
+ for (GlobalVariable &Src : SrcM->globals()) {
+ // Only process initialized GV's or ones not already in dest.
+ if (!Src.hasInitializer() || DoNotLinkFromSource.count(&Src))
+ continue;
+ linkGlobalValueBody(Src);
+ }
+
// Note that we are done linking global value bodies. This prevents
// metadata linking from creating new references.
DoneLinkingBodies = true;
Modified: llvm/trunk/lib/Transforms/Utils/ValueMapper.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/ValueMapper.cpp?rev=254347&r1=254346&r2=254347&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Utils/ValueMapper.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/ValueMapper.cpp Mon Nov 30 17:54:19 2015
@@ -41,9 +41,9 @@ Value *llvm::MapValue(const Value *V, Va
if (Value *NewV =
Materializer->materializeDeclFor(const_cast<Value *>(V))) {
VM[V] = NewV;
- if (auto *NewGV = dyn_cast<GlobalValue>(NewV))
- Materializer->materializeInitFor(
- NewGV, const_cast<GlobalValue *>(cast<GlobalValue>(V)));
+ if (auto *GV = dyn_cast<GlobalValue>(V))
+ Materializer->materializeInitFor(cast<GlobalValue>(NewV),
+ const_cast<GlobalValue *>(GV));
return NewV;
}
}
Removed: llvm/trunk/test/Linker/Inputs/comdat11.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Linker/Inputs/comdat11.ll?rev=254346&view=auto
==============================================================================
--- llvm/trunk/test/Linker/Inputs/comdat11.ll (original)
+++ llvm/trunk/test/Linker/Inputs/comdat11.ll (removed)
@@ -1,9 +0,0 @@
-$foo = comdat any
- at foo = global i8 1, comdat
-define void @zed() {
- call void @bar()
- ret void
-}
-define void @bar() comdat($foo) {
- ret void
-}
Removed: llvm/trunk/test/Linker/comdat11.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Linker/comdat11.ll?rev=254346&view=auto
==============================================================================
--- llvm/trunk/test/Linker/comdat11.ll (original)
+++ llvm/trunk/test/Linker/comdat11.ll (removed)
@@ -1,13 +0,0 @@
-; RUN: llvm-link -S %s %p/Inputs/comdat11.ll -o - | FileCheck %s
-
-$foo = comdat any
- at foo = global i8 0, comdat
-
-; CHECK: @foo = global i8 0, comdat
-
-; CHECK: define void @zed() {
-; CHECK: call void @bar()
-; CHECK: ret void
-; CHECK: }
-
-; CHECK: declare void @bar()
Removed: llvm/trunk/test/Linker/comdat12.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Linker/comdat12.ll?rev=254346&view=auto
==============================================================================
--- llvm/trunk/test/Linker/comdat12.ll (original)
+++ llvm/trunk/test/Linker/comdat12.ll (removed)
@@ -1,8 +0,0 @@
-; RUN: llvm-link %s -S -o - | FileCheck %s
-
-$foo = comdat largest
-define internal void @foo() comdat($foo) {
- ret void
-}
-
-; CHECK-NOT: foo
Modified: llvm/trunk/test/Linker/comdat9.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Linker/comdat9.ll?rev=254347&r1=254346&r2=254347&view=diff
==============================================================================
--- llvm/trunk/test/Linker/comdat9.ll (original)
+++ llvm/trunk/test/Linker/comdat9.ll Mon Nov 30 17:54:19 2015
@@ -14,9 +14,6 @@ $f2 = comdat largest
define internal void @f2() comdat($f2) {
ret void
}
-define void @f3() comdat($f2) {
- ret void
-}
; CHECK-DAG: $f2 = comdat largest
; CHECK-DAG: define internal void @f2() comdat {
More information about the llvm-commits
mailing list