mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-16 08:29:08 +00:00
Fix a nasty bug that Nate ran into. In particular, instead of emitting a 2+MB
error message, print out: llvm-link: error linking in 'g.2.rbc': Global Variable Collision on ' %struct.D_Reduction* %d_reduction_10_gram' - External linkage globals have different initializers That's a bit more concise, huh? llvm-svn: 15958
This commit is contained in:
parent
8a881d2717
commit
aa175129ea
@ -24,6 +24,7 @@
|
||||
#include "llvm/Instructions.h"
|
||||
#include "llvm/Assembly/Writer.h"
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
using namespace llvm;
|
||||
|
||||
// Error - Simple wrapper function to conditionally assign to E and return true.
|
||||
@ -34,6 +35,12 @@ static inline bool Error(std::string *E, const std::string &Message) {
|
||||
return true;
|
||||
}
|
||||
|
||||
static std::string ToStr(const Type *Ty, const Module *M) {
|
||||
std::ostringstream OS;
|
||||
WriteTypeSymbolic(OS, Ty, M);
|
||||
return OS.str();
|
||||
}
|
||||
|
||||
//
|
||||
// Function: ResolveTypes()
|
||||
//
|
||||
@ -461,7 +468,7 @@ static bool LinkGlobals(Module *Dest, const Module *Src,
|
||||
|
||||
if (SGV->isConstant() != DGV->isConstant())
|
||||
return Error(Err, "Global Variable Collision on '" +
|
||||
SGV->getType()->getDescription() + " %" + SGV->getName() +
|
||||
ToStr(SGV->getType(), Src) + " %" + SGV->getName() +
|
||||
"' - Global variables differ in const'ness");
|
||||
|
||||
// Otherwise, just perform the link.
|
||||
@ -480,7 +487,7 @@ static bool LinkGlobals(Module *Dest, const Module *Src,
|
||||
|
||||
if (SGV->isConstant() != DGV->isConstant())
|
||||
return Error(Err, "Global Variable Collision on '" +
|
||||
SGV->getType()->getDescription() + " %" + SGV->getName() +
|
||||
ToStr(SGV->getType(), Src) + " %" + SGV->getName() +
|
||||
"' - Global variables differ in const'ness");
|
||||
|
||||
if (!SGV->hasLinkOnceLinkage())
|
||||
@ -494,12 +501,12 @@ static bool LinkGlobals(Module *Dest, const Module *Src,
|
||||
// Allow linking two exactly identical external global variables...
|
||||
if (SGV->isConstant() != DGV->isConstant())
|
||||
return Error(Err, "Global Variable Collision on '" +
|
||||
SGV->getType()->getDescription() + " %" + SGV->getName() +
|
||||
ToStr(SGV->getType(), Src) + " %" + SGV->getName() +
|
||||
"' - Global variables differ in const'ness");
|
||||
|
||||
if (SGV->getInitializer() != DGV->getInitializer())
|
||||
return Error(Err, "Global Variable Collision on '" +
|
||||
SGV->getType()->getDescription() + " %" + SGV->getName() +
|
||||
ToStr(SGV->getType(), Src) + " %" + SGV->getName() +
|
||||
"' - External linkage globals have different initializers");
|
||||
|
||||
ValueMap.insert(std::make_pair(SGV, DGV));
|
||||
@ -548,7 +555,7 @@ static bool LinkGlobalInits(Module *Dest, const Module *Src,
|
||||
if (SGV->hasExternalLinkage()) {
|
||||
if (DGV->getInitializer() != SInit)
|
||||
return Error(Err, "Global Variable Collision on '" +
|
||||
SGV->getType()->getDescription() +"':%"+SGV->getName()+
|
||||
ToStr(SGV->getType(), Src) +"':%"+SGV->getName()+
|
||||
" - Global variables have different initializers");
|
||||
} else if (DGV->hasLinkOnceLinkage() || DGV->hasWeakLinkage()) {
|
||||
// Nothing is required, mapped values will take the new global
|
||||
@ -641,7 +648,7 @@ static bool LinkFunctionProtos(Module *Dest, const Module *Src,
|
||||
} else if (SF->hasExternalLinkage()) {
|
||||
// The function is defined in both modules!!
|
||||
return Error(Err, "Function '" +
|
||||
SF->getFunctionType()->getDescription() + "':\"" +
|
||||
ToStr(SF->getFunctionType(), Src) + "':\"" +
|
||||
SF->getName() + "\" - Function is already defined!");
|
||||
} else {
|
||||
assert(0 && "Unknown linkage configuration found!");
|
||||
|
Loading…
x
Reference in New Issue
Block a user