forked from OSchip/llvm-project
For PR1187:
Always rename, never give a redef error. We could check for collapsed type planes and generate an error if that's not the cause, but the 99.9999 percentile case will be that its the result of collapsed type planes. So, rather than doing an expensive check, just rename. llvm-svn: 34047
This commit is contained in:
parent
c10e463ea7
commit
47b6d12ef1
|
@ -2626,10 +2626,24 @@ FunctionHeaderH
|
||||||
if (Conflict && PFT == Conflict->getType()) {
|
if (Conflict && PFT == Conflict->getType()) {
|
||||||
if (!CurFun.isDeclare && !Conflict->isDeclaration()) {
|
if (!CurFun.isDeclare && !Conflict->isDeclaration()) {
|
||||||
// We have two function definitions that conflict, same type, same
|
// We have two function definitions that conflict, same type, same
|
||||||
// name. This wasn't allowed in 1.9, its not allowed here either
|
// name. We should really check to make sure that this is the result
|
||||||
error("Redefinition of function '" + FunctionName + "' of type '" +
|
// of integer type planes collapsing and generate an error if it is
|
||||||
PFT->getDescription() + "'");
|
// not, but we'll just rename on the assumption that it is. However,
|
||||||
|
// let's do it intelligently and rename the internal linkage one
|
||||||
|
// if there is one.
|
||||||
|
std::string NewName(makeNameUnique(FunctionName));
|
||||||
|
if (Conflict->hasInternalLinkage()) {
|
||||||
|
Conflict->setName(NewName);
|
||||||
|
RenameMapKey Key = std::make_pair(FunctionName,Conflict->getType());
|
||||||
|
CurModule.RenameMap[Key] = NewName;
|
||||||
|
Fn = new Function(FT, CurFun.Linkage, FunctionName, M);
|
||||||
|
InsertValue(Fn, CurModule.Values);
|
||||||
|
} else {
|
||||||
|
Fn = new Function(FT, CurFun.Linkage, NewName, M);
|
||||||
|
InsertValue(Fn, CurModule.Values);
|
||||||
|
RenameMapKey Key = std::make_pair(FunctionName,PFT);
|
||||||
|
CurModule.RenameMap[Key] = NewName;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// If they are not both definitions, then just use the function we
|
// If they are not both definitions, then just use the function we
|
||||||
// found since the types are the same.
|
// found since the types are the same.
|
||||||
|
|
Loading…
Reference in New Issue