mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-09-07 16:54:48 +00:00
Make sure the const bit gets inherited correctly when linking declarations
of disagreeing constness. This fixes test/Regression/Linker/ConstantGlobals[123].ll git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@16692 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
5e4f2991a0
commit
d4984cca0e
@ -457,15 +457,26 @@ static bool LinkGlobals(Module *Dest, const Module *Src,
|
|||||||
// external globals, we aren't adding anything.
|
// external globals, we aren't adding anything.
|
||||||
ValueMap.insert(std::make_pair(SGV, DGV));
|
ValueMap.insert(std::make_pair(SGV, DGV));
|
||||||
|
|
||||||
|
// Inherit 'const' information.
|
||||||
|
if (SGV->isConstant()) DGV->setConstant(true);
|
||||||
|
|
||||||
} else if (DGV->isExternal()) { // If DGV is external but SGV is not...
|
} else if (DGV->isExternal()) { // If DGV is external but SGV is not...
|
||||||
ValueMap.insert(std::make_pair(SGV, DGV));
|
ValueMap.insert(std::make_pair(SGV, DGV));
|
||||||
DGV->setLinkage(SGV->getLinkage()); // Inherit linkage!
|
DGV->setLinkage(SGV->getLinkage()); // Inherit linkage!
|
||||||
|
|
||||||
|
if (DGV->isConstant() && !SGV->isConstant())
|
||||||
|
return Error(Err, "Linking globals named '" + SGV->getName() +
|
||||||
|
"': declaration is const but definition is not!");
|
||||||
|
|
||||||
|
// Inherit 'const' information.
|
||||||
|
if (SGV->isConstant()) DGV->setConstant(true);
|
||||||
|
|
||||||
} else if (SGV->hasWeakLinkage() || SGV->hasLinkOnceLinkage()) {
|
} else if (SGV->hasWeakLinkage() || SGV->hasLinkOnceLinkage()) {
|
||||||
// At this point we know that DGV has LinkOnce, Appending, Weak, or
|
// At this point we know that DGV has LinkOnce, Appending, Weak, or
|
||||||
// External linkage. If DGV is Appending, this is an error.
|
// External linkage. If DGV is Appending, this is an error.
|
||||||
if (DGV->hasAppendingLinkage())
|
if (DGV->hasAppendingLinkage())
|
||||||
return Error(Err, "Linking globals named '" + SGV->getName() +
|
return Error(Err, "Linking globals named '" + SGV->getName() +
|
||||||
" ' with 'weak' and 'appending' linkage is not allowed!");
|
"' with 'weak' and 'appending' linkage is not allowed!");
|
||||||
|
|
||||||
if (SGV->isConstant() != DGV->isConstant())
|
if (SGV->isConstant() != DGV->isConstant())
|
||||||
return Error(Err, "Global Variable Collision on '" +
|
return Error(Err, "Global Variable Collision on '" +
|
||||||
@ -498,6 +509,9 @@ static bool LinkGlobals(Module *Dest, const Module *Src,
|
|||||||
} else if (SGV->getLinkage() != DGV->getLinkage()) {
|
} else if (SGV->getLinkage() != DGV->getLinkage()) {
|
||||||
return Error(Err, "Global variables named '" + SGV->getName() +
|
return Error(Err, "Global variables named '" + SGV->getName() +
|
||||||
"' have different linkage specifiers!");
|
"' have different linkage specifiers!");
|
||||||
|
// Inherit 'const' information.
|
||||||
|
if (SGV->isConstant()) DGV->setConstant(true);
|
||||||
|
|
||||||
} else if (SGV->hasExternalLinkage()) {
|
} else if (SGV->hasExternalLinkage()) {
|
||||||
// Allow linking two exactly identical external global variables...
|
// Allow linking two exactly identical external global variables...
|
||||||
if (SGV->isConstant() != DGV->isConstant())
|
if (SGV->isConstant() != DGV->isConstant())
|
||||||
|
@ -457,15 +457,26 @@ static bool LinkGlobals(Module *Dest, const Module *Src,
|
|||||||
// external globals, we aren't adding anything.
|
// external globals, we aren't adding anything.
|
||||||
ValueMap.insert(std::make_pair(SGV, DGV));
|
ValueMap.insert(std::make_pair(SGV, DGV));
|
||||||
|
|
||||||
|
// Inherit 'const' information.
|
||||||
|
if (SGV->isConstant()) DGV->setConstant(true);
|
||||||
|
|
||||||
} else if (DGV->isExternal()) { // If DGV is external but SGV is not...
|
} else if (DGV->isExternal()) { // If DGV is external but SGV is not...
|
||||||
ValueMap.insert(std::make_pair(SGV, DGV));
|
ValueMap.insert(std::make_pair(SGV, DGV));
|
||||||
DGV->setLinkage(SGV->getLinkage()); // Inherit linkage!
|
DGV->setLinkage(SGV->getLinkage()); // Inherit linkage!
|
||||||
|
|
||||||
|
if (DGV->isConstant() && !SGV->isConstant())
|
||||||
|
return Error(Err, "Linking globals named '" + SGV->getName() +
|
||||||
|
"': declaration is const but definition is not!");
|
||||||
|
|
||||||
|
// Inherit 'const' information.
|
||||||
|
if (SGV->isConstant()) DGV->setConstant(true);
|
||||||
|
|
||||||
} else if (SGV->hasWeakLinkage() || SGV->hasLinkOnceLinkage()) {
|
} else if (SGV->hasWeakLinkage() || SGV->hasLinkOnceLinkage()) {
|
||||||
// At this point we know that DGV has LinkOnce, Appending, Weak, or
|
// At this point we know that DGV has LinkOnce, Appending, Weak, or
|
||||||
// External linkage. If DGV is Appending, this is an error.
|
// External linkage. If DGV is Appending, this is an error.
|
||||||
if (DGV->hasAppendingLinkage())
|
if (DGV->hasAppendingLinkage())
|
||||||
return Error(Err, "Linking globals named '" + SGV->getName() +
|
return Error(Err, "Linking globals named '" + SGV->getName() +
|
||||||
" ' with 'weak' and 'appending' linkage is not allowed!");
|
"' with 'weak' and 'appending' linkage is not allowed!");
|
||||||
|
|
||||||
if (SGV->isConstant() != DGV->isConstant())
|
if (SGV->isConstant() != DGV->isConstant())
|
||||||
return Error(Err, "Global Variable Collision on '" +
|
return Error(Err, "Global Variable Collision on '" +
|
||||||
@ -498,6 +509,9 @@ static bool LinkGlobals(Module *Dest, const Module *Src,
|
|||||||
} else if (SGV->getLinkage() != DGV->getLinkage()) {
|
} else if (SGV->getLinkage() != DGV->getLinkage()) {
|
||||||
return Error(Err, "Global variables named '" + SGV->getName() +
|
return Error(Err, "Global variables named '" + SGV->getName() +
|
||||||
"' have different linkage specifiers!");
|
"' have different linkage specifiers!");
|
||||||
|
// Inherit 'const' information.
|
||||||
|
if (SGV->isConstant()) DGV->setConstant(true);
|
||||||
|
|
||||||
} else if (SGV->hasExternalLinkage()) {
|
} else if (SGV->hasExternalLinkage()) {
|
||||||
// Allow linking two exactly identical external global variables...
|
// Allow linking two exactly identical external global variables...
|
||||||
if (SGV->isConstant() != DGV->isConstant())
|
if (SGV->isConstant() != DGV->isConstant())
|
||||||
|
Loading…
Reference in New Issue
Block a user