summaryrefslogtreecommitdiff
path: root/lib/Transforms
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2002-02-18 19:05:15 +0000
committerChris Lattner <sabre@nondot.org>2002-02-18 19:05:15 +0000
commite0f2753bb87f97fbbfc0f6820715156dc4d45b90 (patch)
treed0524ebedd3dca8806e9b5894cea3bf0f6a3b37d /lib/Transforms
parent6374a522532eca81f4bc038cc4c5e36c3e5fd5be (diff)
downloadllvm-e0f2753bb87f97fbbfc0f6820715156dc4d45b90.tar.gz
llvm-e0f2753bb87f97fbbfc0f6820715156dc4d45b90.tar.bz2
llvm-e0f2753bb87f97fbbfc0f6820715156dc4d45b90.tar.xz
Handle more cases in the linker
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1771 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms')
-rw-r--r--lib/Transforms/IPO/DeadTypeElimination.cpp26
1 files changed, 21 insertions, 5 deletions
diff --git a/lib/Transforms/IPO/DeadTypeElimination.cpp b/lib/Transforms/IPO/DeadTypeElimination.cpp
index 7ec2b6faa8..09d8db4eb8 100644
--- a/lib/Transforms/IPO/DeadTypeElimination.cpp
+++ b/lib/Transforms/IPO/DeadTypeElimination.cpp
@@ -130,8 +130,7 @@ bool CleanupGCCOutput::PatchUpMethodReferences(Module *M) {
}
}
- if (Methods[i] && (!Methods[i]->getMethodType()->isVarArg() ||
- Methods[i]->getMethodType()->getParamTypes().size())) {
+ if (Methods[i] && (!Methods[i]->getMethodType()->isVarArg())) {
if (Concrete) { // Found two different methods types. Can't choose
Concrete = 0;
break;
@@ -158,11 +157,28 @@ bool CleanupGCCOutput::PatchUpMethodReferences(Module *M) {
for (unsigned i = 0; i < Methods.size(); ++i)
if (Methods[i] != Concrete) {
Method *Old = Methods[i];
+ const MethodType *OldMT = Old->getMethodType();
+ const MethodType *ConcreteMT = Concrete->getMethodType();
+ bool Broken = false;
+
assert(Old->getReturnType() == Concrete->getReturnType() &&
"Differing return types not handled yet!");
- assert(Old->getMethodType()->getParamTypes().size() == 0 &&
- "Cannot handle varargs fn's with specified element types!");
-
+ assert(OldMT->getParamTypes().size() <=
+ ConcreteMT->getParamTypes().size() &&
+ "Concrete type must have more specified parameters!");
+
+ // Check to make sure that if there are specified types, that they
+ // match...
+ //
+ for (unsigned i = 0; i < OldMT->getParamTypes().size(); ++i)
+ if (OldMT->getParamTypes()[i] != ConcreteMT->getParamTypes()[i]) {
+ cerr << "Parameter types conflict for" << OldMT
+ << " and " << ConcreteMT;
+ Broken = true;
+ }
+ if (Broken) break; // Can't process this one!
+
+
// Attempt to convert all of the uses of the old method to the
// concrete form of the method. If there is a use of the method
// that we don't understand here we punt to avoid making a bad