summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBill Wendling <isanbard@gmail.com>2011-10-29 01:19:11 +0000
committerBill Wendling <isanbard@gmail.com>2011-10-29 01:19:11 +0000
commit5d7e53a09717f8759b5bd48a44ecddbced2ae76e (patch)
treec6d06f75aa47436499bf1db0b8dbbcd1fe86fbf4
parent879c8648476ca364d8a3d5ba0657d0d456935b62 (diff)
Fixes an intermittent bug that I finally got a good test case for in GNU ObjC.
Patch by David Chisnall. git-svn-id: https://llvm.org/svn/llvm-project/cfe/branches/release_30@143270 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/CodeGen/CGObjCGNU.cpp26
1 files changed, 14 insertions, 12 deletions
diff --git a/lib/CodeGen/CGObjCGNU.cpp b/lib/CodeGen/CGObjCGNU.cpp
index f8a01d5e40..688e9924be 100644
--- a/lib/CodeGen/CGObjCGNU.cpp
+++ b/lib/CodeGen/CGObjCGNU.cpp
@@ -538,11 +538,12 @@ protected:
llvm::Value *cmd,
llvm::MDNode *node) {
CGBuilderTy &Builder = CGF.Builder;
- llvm::Value *imp = Builder.CreateCall2(MsgLookupFn,
- EnforceType(Builder, Receiver, IdTy),
- EnforceType(Builder, cmd, SelectorTy));
- cast<llvm::CallInst>(imp)->setMetadata(msgSendMDKind, node);
- return imp;
+ llvm::Value *args[] = {
+ EnforceType(Builder, Receiver, IdTy),
+ EnforceType(Builder, cmd, SelectorTy) };
+ llvm::CallSite imp = CGF.EmitCallOrInvoke(MsgLookupFn, args);
+ imp->setMetadata(msgSendMDKind, node);
+ return imp.getInstruction();
}
virtual llvm::Value *LookupIMPSuper(CodeGenFunction &CGF,
llvm::Value *ObjCSuper,
@@ -597,16 +598,17 @@ class CGObjCGNUstep : public CGObjCGNU {
// The lookup function is guaranteed not to capture the receiver pointer.
LookupFn->setDoesNotCapture(1);
- llvm::CallInst *slot =
- Builder.CreateCall3(LookupFn,
- EnforceType(Builder, ReceiverPtr, PtrToIdTy),
- EnforceType(Builder, cmd, SelectorTy),
- EnforceType(Builder, self, IdTy));
- slot->setOnlyReadsMemory();
+ llvm::Value *args[] = {
+ EnforceType(Builder, ReceiverPtr, PtrToIdTy),
+ EnforceType(Builder, cmd, SelectorTy),
+ EnforceType(Builder, self, IdTy) };
+ llvm::CallSite slot = CGF.EmitCallOrInvoke(LookupFn, args);
+ slot.setOnlyReadsMemory();
slot->setMetadata(msgSendMDKind, node);
// Load the imp from the slot
- llvm::Value *imp = Builder.CreateLoad(Builder.CreateStructGEP(slot, 4));
+ llvm::Value *imp =
+ Builder.CreateLoad(Builder.CreateStructGEP(slot.getInstruction(), 4));
// The lookup function may have changed the receiver, so make sure we use
// the new one.