diff options
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Transforms/IPO/GlobalOpt.cpp | 7 | 
1 files changed, 6 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/IPO/GlobalOpt.cpp b/llvm/lib/Transforms/IPO/GlobalOpt.cpp index 6170bfcac64..a3cd8d4f15d 100644 --- a/llvm/lib/Transforms/IPO/GlobalOpt.cpp +++ b/llvm/lib/Transforms/IPO/GlobalOpt.cpp @@ -1239,13 +1239,18 @@ static Constant *getVal(std::map<Value*, Constant*> &ComputedValues,  /// we punt.  We basically just support direct accesses to globals and GEP's of  /// globals.  This should be kept up to date with CommitValueTo.  static bool isSimpleEnoughPointerToCommit(Constant *C) { -  if (GlobalVariable *GV = dyn_cast<GlobalVariable>(C)) +  if (GlobalVariable *GV = dyn_cast<GlobalVariable>(C)) { +    if (!GV->hasExternalLinkage() && !GV->hasInternalLinkage()) +      return false;  // do not allow weak/linkonce linkage.      return !GV->isExternal();  // reject external globals. +  }    if (ConstantExpr *CE = dyn_cast<ConstantExpr>(C))      // Handle a constantexpr gep.      if (CE->getOpcode() == Instruction::GetElementPtr &&          isa<GlobalVariable>(CE->getOperand(0))) {        GlobalVariable *GV = cast<GlobalVariable>(CE->getOperand(0)); +      if (!GV->hasExternalLinkage() && !GV->hasInternalLinkage()) +        return false;  // do not allow weak/linkonce linkage.        return GV->hasInitializer() &&               ConstantFoldLoadThroughGEPConstantExpr(GV->getInitializer(), CE);      }  | 

