1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-23 11:13:28 +01:00

Simplify ValueMap handling.

We now just return values and let ValueMap handle the map.

llvm-svn: 254615
This commit is contained in:
Rafael Espindola 2015-12-03 16:36:16 +00:00
parent fe24354d38
commit 74516b6dba

View File

@ -513,10 +513,10 @@ private:
void upgradeMismatchedGlobals(); void upgradeMismatchedGlobals();
bool linkIfNeeded(GlobalValue &GV); bool linkIfNeeded(GlobalValue &GV);
bool linkAppendingVarProto(GlobalVariable *DstGV, Constant *linkAppendingVarProto(GlobalVariable *DstGV,
const GlobalVariable *SrcGV); const GlobalVariable *SrcGV);
bool linkGlobalValueProto(GlobalValue *GV); Constant *linkGlobalValueProto(GlobalValue *GV);
bool linkModuleFlagsMetadata(); bool linkModuleFlagsMetadata();
void linkGlobalInit(GlobalVariable &Dst, GlobalVariable &Src); void linkGlobalInit(GlobalVariable &Dst, GlobalVariable &Src);
@ -856,8 +856,7 @@ Value *ModuleLinker::materializeDeclFor(Value *V) {
if (!SGV) if (!SGV)
return nullptr; return nullptr;
linkGlobalValueProto(SGV); return linkGlobalValueProto(SGV);
return ValueMap[SGV];
} }
void ValueMaterializerTy::materializeInitFor(GlobalValue *New, void ValueMaterializerTy::materializeInitFor(GlobalValue *New,
@ -1277,7 +1276,7 @@ static void getArrayElements(const Constant *C,
/// If there were any appending global variables, link them together now. /// If there were any appending global variables, link them together now.
/// Return true on error. /// Return true on error.
bool ModuleLinker::linkAppendingVarProto(GlobalVariable *DstGV, Constant *ModuleLinker::linkAppendingVarProto(GlobalVariable *DstGV,
const GlobalVariable *SrcGV) { const GlobalVariable *SrcGV) {
ArrayType *SrcTy = ArrayType *SrcTy =
cast<ArrayType>(TypeMap.get(SrcGV->getType()->getElementType())); cast<ArrayType>(TypeMap.get(SrcGV->getType()->getElementType()));
@ -1286,32 +1285,46 @@ bool ModuleLinker::linkAppendingVarProto(GlobalVariable *DstGV,
if (DstGV) { if (DstGV) {
ArrayType *DstTy = cast<ArrayType>(DstGV->getType()->getElementType()); ArrayType *DstTy = cast<ArrayType>(DstGV->getType()->getElementType());
if (!SrcGV->hasAppendingLinkage() || !DstGV->hasAppendingLinkage()) if (!SrcGV->hasAppendingLinkage() || !DstGV->hasAppendingLinkage()) {
return emitError( emitError(
"Linking globals named '" + SrcGV->getName() + "Linking globals named '" + SrcGV->getName() +
"': can only link appending global with another appending global!"); "': can only link appending global with another appending global!");
return nullptr;
}
// Check to see that they two arrays agree on type. // Check to see that they two arrays agree on type.
if (EltTy != DstTy->getElementType()) if (EltTy != DstTy->getElementType()) {
return emitError("Appending variables with different element types!"); emitError("Appending variables with different element types!");
if (DstGV->isConstant() != SrcGV->isConstant()) return nullptr;
return emitError("Appending variables linked with different const'ness!"); }
if (DstGV->isConstant() != SrcGV->isConstant()) {
emitError("Appending variables linked with different const'ness!");
return nullptr;
}
if (DstGV->getAlignment() != SrcGV->getAlignment()) if (DstGV->getAlignment() != SrcGV->getAlignment()) {
return emitError( emitError(
"Appending variables with different alignment need to be linked!"); "Appending variables with different alignment need to be linked!");
return nullptr;
}
if (DstGV->getVisibility() != SrcGV->getVisibility()) if (DstGV->getVisibility() != SrcGV->getVisibility()) {
return emitError( emitError(
"Appending variables with different visibility need to be linked!"); "Appending variables with different visibility need to be linked!");
return nullptr;
}
if (DstGV->hasUnnamedAddr() != SrcGV->hasUnnamedAddr()) if (DstGV->hasUnnamedAddr() != SrcGV->hasUnnamedAddr()) {
return emitError( emitError(
"Appending variables with different unnamed_addr need to be linked!"); "Appending variables with different unnamed_addr need to be linked!");
return nullptr;
}
if (StringRef(DstGV->getSection()) != SrcGV->getSection()) if (StringRef(DstGV->getSection()) != SrcGV->getSection()) {
return emitError( emitError(
"Appending variables with different section name need to be linked!"); "Appending variables with different section name need to be linked!");
return nullptr;
}
} }
SmallVector<Constant *, 16> DstElements; SmallVector<Constant *, 16> DstElements;
@ -1347,9 +1360,10 @@ bool ModuleLinker::linkAppendingVarProto(GlobalVariable *DstGV,
// Propagate alignment, visibility and section info. // Propagate alignment, visibility and section info.
copyGVAttributes(NG, SrcGV); copyGVAttributes(NG, SrcGV);
// Replace any uses of the two global variables with uses of the new Constant *Ret = ConstantExpr::getBitCast(NG, TypeMap.get(SrcGV->getType()));
// global.
ValueMap[SrcGV] = ConstantExpr::getBitCast(NG, TypeMap.get(SrcGV->getType())); // Stop recursion.
ValueMap[SrcGV] = Ret;
for (auto *V : SrcElements) { for (auto *V : SrcElements) {
DstElements.push_back( DstElements.push_back(
@ -1358,15 +1372,17 @@ bool ModuleLinker::linkAppendingVarProto(GlobalVariable *DstGV,
NG->setInitializer(ConstantArray::get(NewType, DstElements)); NG->setInitializer(ConstantArray::get(NewType, DstElements));
// Replace any uses of the two global variables with uses of the new
// global.
if (DstGV) { if (DstGV) {
DstGV->replaceAllUsesWith(ConstantExpr::getBitCast(NG, DstGV->getType())); DstGV->replaceAllUsesWith(ConstantExpr::getBitCast(NG, DstGV->getType()));
DstGV->eraseFromParent(); DstGV->eraseFromParent();
} }
return false; return Ret;
} }
bool ModuleLinker::linkGlobalValueProto(GlobalValue *SGV) { Constant *ModuleLinker::linkGlobalValueProto(GlobalValue *SGV) {
GlobalValue *DGV = getLinkedToGlobal(SGV); GlobalValue *DGV = getLinkedToGlobal(SGV);
// Handle the ultra special appending linkage case first. // Handle the ultra special appending linkage case first.
@ -1390,12 +1406,7 @@ bool ModuleLinker::linkGlobalValueProto(GlobalValue *SGV) {
LinkFromSrc = true; LinkFromSrc = true;
} else if (DGV) { } else if (DGV) {
if (shouldLinkFromSource(LinkFromSrc, *DGV, *SGV)) if (shouldLinkFromSource(LinkFromSrc, *DGV, *SGV))
return true; return nullptr;
}
if (!LinkFromSrc && DGV) {
// Make sure to remember this mapping.
ValueMap[SGV] = ConstantExpr::getBitCast(DGV, TypeMap.get(SGV->getType()));
} }
if (DGV) if (DGV)
@ -1411,7 +1422,7 @@ bool ModuleLinker::linkGlobalValueProto(GlobalValue *SGV) {
// metadata linking), don't link in the global value due to this // metadata linking), don't link in the global value due to this
// reference, simply map it to null. // reference, simply map it to null.
if (DoneLinkingBodies) if (DoneLinkingBodies)
return false; return nullptr;
NewGV = copyGlobalValueProto(SGV, DGV, LinkFromSrc); NewGV = copyGlobalValueProto(SGV, DGV, LinkFromSrc);
} }
@ -1434,16 +1445,12 @@ bool ModuleLinker::linkGlobalValueProto(GlobalValue *SGV) {
NewGVar->setConstant(false); NewGVar->setConstant(false);
} }
// Make sure to remember this mapping. if (NewGV != DGV && DGV) {
if (NewGV != DGV) {
if (DGV) {
DGV->replaceAllUsesWith(ConstantExpr::getBitCast(NewGV, DGV->getType())); DGV->replaceAllUsesWith(ConstantExpr::getBitCast(NewGV, DGV->getType()));
DGV->eraseFromParent(); DGV->eraseFromParent();
} }
ValueMap[SGV] = NewGV;
}
return false; return ConstantExpr::getBitCast(NewGV, TypeMap.get(SGV->getType()));
} }
/// Update the initializers in the Dest module now that all globals that may be /// Update the initializers in the Dest module now that all globals that may be
@ -1534,7 +1541,7 @@ bool ModuleLinker::linkGlobalValueBody(GlobalValue &Dst, GlobalValue &Src) {
// are linked in. Otherwise, linkonce and other lazy linked GVs will // are linked in. Otherwise, linkonce and other lazy linked GVs will
// not be materialized if they aren't referenced. // not be materialized if they aren't referenced.
for (auto *SGV : ComdatMembers[SC]) { for (auto *SGV : ComdatMembers[SC]) {
auto *DGV = cast_or_null<GlobalValue>(ValueMap[SGV]); auto *DGV = cast_or_null<GlobalValue>(ValueMap.lookup(SGV));
if (DGV && !DGV->isDeclaration()) if (DGV && !DGV->isDeclaration())
continue; continue;
MapValue(SGV, ValueMap, RF_MoveDistinctMDs, &TypeMap, &ValMaterializer); MapValue(SGV, ValueMap, RF_MoveDistinctMDs, &TypeMap, &ValMaterializer);