aboutsummaryrefslogtreecommitdiffstats
path: root/lib/VMCore
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2004-10-05 02:28:11 +0000
committerChris Lattner <sabre@nondot.org>2004-10-05 02:28:11 +0000
commitd4984cca0ec95b3602955b8e41260d0d8b882129 (patch)
treeea51cb4fc72dfc13854c4261fe497f2137a3c2fa /lib/VMCore
parent5e4f2991a05d276a1f81f0e04418df1e82ac358c (diff)
downloadexternal_llvm-d4984cca0ec95b3602955b8e41260d0d8b882129.zip
external_llvm-d4984cca0ec95b3602955b8e41260d0d8b882129.tar.gz
external_llvm-d4984cca0ec95b3602955b8e41260d0d8b882129.tar.bz2
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
Diffstat (limited to 'lib/VMCore')
-rw-r--r--lib/VMCore/Linker.cpp16
1 files changed, 15 insertions, 1 deletions
diff --git a/lib/VMCore/Linker.cpp b/lib/VMCore/Linker.cpp
index f75729b..70bd22c 100644
--- a/lib/VMCore/Linker.cpp
+++ b/lib/VMCore/Linker.cpp
@@ -457,15 +457,26 @@ static bool LinkGlobals(Module *Dest, const Module *Src,
// external globals, we aren't adding anything.
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...
ValueMap.insert(std::make_pair(SGV, DGV));
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()) {
// At this point we know that DGV has LinkOnce, Appending, Weak, or
// External linkage. If DGV is Appending, this is an error.
if (DGV->hasAppendingLinkage())
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())
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()) {
return Error(Err, "Global variables named '" + SGV->getName() +
"' have different linkage specifiers!");
+ // Inherit 'const' information.
+ if (SGV->isConstant()) DGV->setConstant(true);
+
} else if (SGV->hasExternalLinkage()) {
// Allow linking two exactly identical external global variables...
if (SGV->isConstant() != DGV->isConstant())