diff options
author | Chris Lattner <sabre@nondot.org> | 2003-10-22 23:03:38 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2003-10-22 23:03:38 +0000 |
commit | 9e8fe49c374015ce82f4fc50999aeb9fa6300535 (patch) | |
tree | 4d9e2a855192036aacefeb43d1dd9b4e34fccd69 /llvm/lib/Transforms | |
parent | b7c3faabcd9f93157709d5b169ea6183d5ae49a2 (diff) | |
download | bcm5719-llvm-9e8fe49c374015ce82f4fc50999aeb9fa6300535.tar.gz bcm5719-llvm-9e8fe49c374015ce82f4fc50999aeb9fa6300535.zip |
This important patch fixes two warnings in the linker which can occur from linking
valid pieces of code
llvm-svn: 9390
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r-- | llvm/lib/Transforms/IPO/FunctionResolution.cpp | 37 |
1 files changed, 33 insertions, 4 deletions
diff --git a/llvm/lib/Transforms/IPO/FunctionResolution.cpp b/llvm/lib/Transforms/IPO/FunctionResolution.cpp index b8af50269de..a21853d207e 100644 --- a/llvm/lib/Transforms/IPO/FunctionResolution.cpp +++ b/llvm/lib/Transforms/IPO/FunctionResolution.cpp @@ -194,11 +194,40 @@ static bool ProcessGlobalsWithSameName(Module &M, TargetData &TD, if (!HasExternal && NumInstancesWithExternalLinkage <= 1) return false; // Nothing to do? Must have multiple internal definitions. + // There are a couple of special cases we don't want to print the warning + // for, check them now. + bool DontPrintWarning = false; + if (Concrete && Globals.size() == 2) { + GlobalValue *Other = Globals[Globals[0] == Concrete]; + // If the non-concrete global is a function which takes (...) arguments, + // and the return values match, do not warn. + if (Function *ConcreteF = dyn_cast<Function>(Concrete)) + if (Function *OtherF = dyn_cast<Function>(Other)) + if (ConcreteF->getReturnType() == OtherF->getReturnType() && + OtherF->getFunctionType()->isVarArg() && + OtherF->getFunctionType()->getParamTypes().empty()) + DontPrintWarning = true; + + // Otherwise, if the non-concrete global is a global array variable with a + // size of 0, and the concrete global is an array with a real size, don't + // warn. This occurs due to declaring 'extern int A[];'. + if (GlobalVariable *ConcreteGV = dyn_cast<GlobalVariable>(Concrete)) + if (GlobalVariable *OtherGV = dyn_cast<GlobalVariable>(Other)) + if (const ArrayType *OtherAT = + dyn_cast<ArrayType>(OtherGV->getType()->getElementType())) + if (const ArrayType *ConcreteAT = + dyn_cast<ArrayType>(ConcreteGV->getType()->getElementType())) + if (OtherAT->getElementType() == ConcreteAT->getElementType() && + OtherAT->getNumElements() == 0) + DontPrintWarning = true; + } - std::cerr << "WARNING: Found global types that are not compatible:\n"; - for (unsigned i = 0; i < Globals.size(); ++i) { - std::cerr << "\t" << *Globals[i]->getType() << " %" - << Globals[i]->getName() << "\n"; + if (!DontPrintWarning) { + std::cerr << "WARNING: Found global types that are not compatible:\n"; + for (unsigned i = 0; i < Globals.size(); ++i) { + std::cerr << "\t" << *Globals[i]->getType() << " %" + << Globals[i]->getName() << "\n"; + } } if (!Concrete) |