diff options
author | Chris Lattner <sabre@nondot.org> | 2002-02-18 19:05:15 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2002-02-18 19:05:15 +0000 |
commit | e0f2753bb87f97fbbfc0f6820715156dc4d45b90 (patch) | |
tree | d0524ebedd3dca8806e9b5894cea3bf0f6a3b37d /lib/Transforms | |
parent | 6374a522532eca81f4bc038cc4c5e36c3e5fd5be (diff) | |
download | external_llvm-e0f2753bb87f97fbbfc0f6820715156dc4d45b90.zip external_llvm-e0f2753bb87f97fbbfc0f6820715156dc4d45b90.tar.gz external_llvm-e0f2753bb87f97fbbfc0f6820715156dc4d45b90.tar.bz2 |
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.cpp | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/lib/Transforms/IPO/DeadTypeElimination.cpp b/lib/Transforms/IPO/DeadTypeElimination.cpp index 7ec2b6f..09d8db4 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 |