mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-15 07:59:50 +00:00
For PR1077:
Disallow merging of dupliate global variables. It is now illegal to declare or define two global variables of the same name and same type. llvm-gcc3 is dead in 2.0 and llvm-gcc4 doesn't have that problem nor need the hack. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@32933 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
73d6cf12ad
commit
90e2f63151
@ -635,8 +635,8 @@ static void setValueName(Value *V, char *NameStr) {
|
||||
assert(inFunctionScope() && "Must be in function scope!");
|
||||
SymbolTable &ST = CurFun.CurrentFunction->getSymbolTable();
|
||||
if (ST.lookup(V->getType(), Name)) {
|
||||
GenerateError("Redefinition of value named '" + Name + "' in the '" +
|
||||
V->getType()->getDescription() + "' type plane!");
|
||||
GenerateError("Redefinition of value '" + Name + "' of type '" +
|
||||
V->getType()->getDescription() + "'!");
|
||||
return;
|
||||
}
|
||||
|
||||
@ -687,32 +687,13 @@ ParseGlobalVariable(char *NameStr,GlobalValue::LinkageTypes Linkage,
|
||||
}
|
||||
|
||||
// If this global has a name, check to see if there is already a definition
|
||||
// of this global in the module. If so, merge as appropriate. Note that
|
||||
// this is really just a hack around problems in the CFE. :(
|
||||
// of this global in the module. If so, it is an error.
|
||||
if (!Name.empty()) {
|
||||
// We are a simple redefinition of a value, check to see if it is defined
|
||||
// the same as the old one.
|
||||
if (GlobalVariable *EGV =
|
||||
CurModule.CurrentModule->getGlobalVariable(Name, Ty)) {
|
||||
// We are allowed to redefine a global variable in two circumstances:
|
||||
// 1. If at least one of the globals is uninitialized or
|
||||
// 2. If both initializers have the same value.
|
||||
//
|
||||
if (!EGV->hasInitializer() || !Initializer ||
|
||||
EGV->getInitializer() == Initializer) {
|
||||
|
||||
// Make sure the existing global version gets the initializer! Make
|
||||
// sure that it also gets marked const if the new version is.
|
||||
if (Initializer && !EGV->hasInitializer())
|
||||
EGV->setInitializer(Initializer);
|
||||
if (isConstantGlobal)
|
||||
EGV->setConstant(true);
|
||||
EGV->setLinkage(Linkage);
|
||||
return EGV;
|
||||
}
|
||||
|
||||
if (CurModule.CurrentModule->getGlobalVariable(Name, Ty)) {
|
||||
GenerateError("Redefinition of global variable named '" + Name +
|
||||
"' in the '" + Ty->getDescription() + "' type plane!");
|
||||
"' of type '" + Ty->getDescription() + "'!");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@ -767,8 +748,8 @@ static bool setTypeName(const Type *T, char *NameStr) {
|
||||
if (Existing == T) return true; // Yes, it's equal.
|
||||
|
||||
// Any other kind of (non-equivalent) redefinition is an error.
|
||||
GenerateError("Redefinition of type named '" + Name + "' in the '" +
|
||||
T->getDescription() + "' type plane!");
|
||||
GenerateError("Redefinition of type named '" + Name + "' of type '" +
|
||||
T->getDescription() + "'!");
|
||||
}
|
||||
|
||||
return false;
|
||||
|
Loading…
Reference in New Issue
Block a user