diff options
author | Chris Lattner <sabre@nondot.org> | 2004-10-05 02:28:11 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2004-10-05 02:28:11 +0000 |
commit | d4984cca0ec95b3602955b8e41260d0d8b882129 (patch) | |
tree | ea51cb4fc72dfc13854c4261fe497f2137a3c2fa /lib/VMCore | |
parent | 5e4f2991a05d276a1f81f0e04418df1e82ac358c (diff) | |
download | external_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.cpp | 16 |
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()) |