Commit 6a448327 authored by Bill Wendling's avatar Bill Wendling
Browse files

Fixes an intermittent bug that I finally got a good test case for in GNU ObjC.

Patch by David Chisnall.

llvm-svn: 143270
parent 8e7812f6
Loading
Loading
Loading
Loading
+14 −12
Original line number Diff line number Diff line
@@ -538,11 +538,12 @@ protected:
                                 llvm::Value *cmd,
                                 llvm::MDNode *node) {
    CGBuilderTy &Builder = CGF.Builder;
    llvm::Value *imp = Builder.CreateCall2(MsgLookupFn, 
    llvm::Value *args[] = {
      EnforceType(Builder, Receiver, IdTy),
            EnforceType(Builder, cmd, SelectorTy));
    cast<llvm::CallInst>(imp)->setMetadata(msgSendMDKind, node);
    return imp;
      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,
      llvm::Value *args[] = {
        EnforceType(Builder, ReceiverPtr, PtrToIdTy),
        EnforceType(Builder, cmd, SelectorTy),
              EnforceType(Builder, self, IdTy));
      slot->setOnlyReadsMemory();
        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.