On May 1, 2010, at 4:15 AM, David Chisnall wrote: > Author: theraven > Date: Sat May 1 06:15:56 2010 > New Revision: 102833 > > URL: http://llvm.org/viewvc/llvm-project?rev=102833&view=rev > Log: > Tweaked EmitCall() to permit the caller to provide some metadata to attach to > the call site. > > Used this in CGObjCGNU to attach metadata about message sends to permit > speculative inlining.
Would it make sense to return the created Instruction* by reference, and let the client install the metadata? If the client wanted to install multiple pieces of metadata or do other things with the call, this would be a more natural interface. I think this would also simplify some debug info stuff. -Chris > > > Modified: > cfe/trunk/lib/CodeGen/CGCall.cpp > cfe/trunk/lib/CodeGen/CGObjCGNU.cpp > cfe/trunk/lib/CodeGen/CodeGenFunction.h > > Modified: cfe/trunk/lib/CodeGen/CGCall.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCall.cpp?rev=102833&r1=102832&r2=102833&view=diff > ============================================================================== > --- cfe/trunk/lib/CodeGen/CGCall.cpp (original) > +++ cfe/trunk/lib/CodeGen/CGCall.cpp Sat May 1 06:15:56 2010 > @@ -869,7 +869,9 @@ > llvm::Value *Callee, > ReturnValueSlot ReturnValue, > const CallArgList &CallArgs, > - const Decl *TargetDecl) { > + const Decl *TargetDecl, > + unsigned MDKind, > + llvm::MDNode *Metadata) { > // FIXME: We no longer need the types from CallArgs; lift up and simplify. > llvm::SmallVector<llvm::Value*, 16> Args; > > @@ -995,6 +997,9 @@ > Args.data(), Args.data()+Args.size()); > EmitBlock(Cont); > } > + if (Metadata) { > + CS->setMetadata(MDKind, Metadata); > + } > > CS.setAttributes(Attrs); > CS.setCallingConv(static_cast<llvm::CallingConv::ID>(CallingConv)); > > Modified: cfe/trunk/lib/CodeGen/CGObjCGNU.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjCGNU.cpp?rev=102833&r1=102832&r2=102833&view=diff > ============================================================================== > --- cfe/trunk/lib/CodeGen/CGObjCGNU.cpp (original) > +++ cfe/trunk/lib/CodeGen/CGObjCGNU.cpp Sat May 1 06:15:56 2010 > @@ -539,7 +539,15 @@ > llvm::Value *imp = CGF.Builder.CreateCall(lookupFunction, lookupArgs, > lookupArgs+2); > > - return CGF.EmitCall(FnInfo, imp, ReturnValueSlot(), ActualArgs); > + llvm::Value *impMD[] = { > + llvm::MDString::get(VMContext, Sel.getAsString()), > + llvm::MDString::get(VMContext, > Class->getSuperClass()->getNameAsString()), > + llvm::ConstantInt::get(llvm::Type::getInt1Ty(VMContext), > IsClassMessage) > + }; > + llvm::MDNode *node = llvm::MDNode::get(VMContext, impMD, 3); > + > + return CGF.EmitCall(FnInfo, imp, ReturnValueSlot(), ActualArgs, > + 0, msgSendMDKind, node); > } > > /// Generate code for a message send expression. > @@ -653,12 +661,6 @@ > slot->setOnlyReadsMemory(); > > imp = Builder.CreateLoad(Builder.CreateStructGEP(slot, 4)); > - llvm::Value *impMD[] = { > - llvm::MDString::get(VMContext, Sel.getAsString()), > - llvm::MDString::get(VMContext, Class ? Class->getNameAsString() > :""), > - }; > - llvm::MDNode *node = llvm::MDNode::get(VMContext, impMD, 2); > - cast<llvm::Instruction>(imp)->setMetadata(msgSendMDKind, node); > > // The lookup function may have changed the receiver, so make sure we use > // the new one. > @@ -675,8 +677,15 @@ > > imp = Builder.CreateCall2(lookupFunction, Receiver, cmd); > } > - RValue msgRet = > - CGF.EmitCall(FnInfo, imp, ReturnValueSlot(), ActualArgs); > + llvm::Value *impMD[] = { > + llvm::MDString::get(VMContext, Sel.getAsString()), > + llvm::MDString::get(VMContext, Class ? Class->getNameAsString() :""), > + llvm::ConstantInt::get(llvm::Type::getInt1Ty(VMContext), Class!=0) > + }; > + llvm::MDNode *node = llvm::MDNode::get(VMContext, impMD, 3); > + > + RValue msgRet = CGF.EmitCall(FnInfo, imp, ReturnValueSlot(), ActualArgs, > + 0, msgSendMDKind, node); > > if (!isPointerSizedReturn) { > CGF.EmitBlock(contiueBB); > > Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.h?rev=102833&r1=102832&r2=102833&view=diff > ============================================================================== > --- cfe/trunk/lib/CodeGen/CodeGenFunction.h (original) > +++ cfe/trunk/lib/CodeGen/CodeGenFunction.h Sat May 1 06:15:56 2010 > @@ -32,6 +32,7 @@ > namespace llvm { > class BasicBlock; > class LLVMContext; > + class MDNode; > class Module; > class SwitchInst; > class Twine; > @@ -1116,7 +1117,9 @@ > llvm::Value *Callee, > ReturnValueSlot ReturnValue, > const CallArgList &Args, > - const Decl *TargetDecl = 0); > + const Decl *TargetDecl = 0, > + unsigned MDKind = 0, > + llvm::MDNode *Metadata = 0); > > RValue EmitCall(QualType FnType, llvm::Value *Callee, > ReturnValueSlot ReturnValue, > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
