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:
parent
fe24354d38
commit
74516b6dba
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user