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. llvm-svn: 102833
This commit is contained in:
parent
8a855e1f7f
commit
9eecafa480
|
@ -869,7 +869,9 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
|
||||||
llvm::Value *Callee,
|
llvm::Value *Callee,
|
||||||
ReturnValueSlot ReturnValue,
|
ReturnValueSlot ReturnValue,
|
||||||
const CallArgList &CallArgs,
|
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.
|
// FIXME: We no longer need the types from CallArgs; lift up and simplify.
|
||||||
llvm::SmallVector<llvm::Value*, 16> Args;
|
llvm::SmallVector<llvm::Value*, 16> Args;
|
||||||
|
|
||||||
|
@ -995,6 +997,9 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
|
||||||
Args.data(), Args.data()+Args.size());
|
Args.data(), Args.data()+Args.size());
|
||||||
EmitBlock(Cont);
|
EmitBlock(Cont);
|
||||||
}
|
}
|
||||||
|
if (Metadata) {
|
||||||
|
CS->setMetadata(MDKind, Metadata);
|
||||||
|
}
|
||||||
|
|
||||||
CS.setAttributes(Attrs);
|
CS.setAttributes(Attrs);
|
||||||
CS.setCallingConv(static_cast<llvm::CallingConv::ID>(CallingConv));
|
CS.setCallingConv(static_cast<llvm::CallingConv::ID>(CallingConv));
|
||||||
|
|
|
@ -539,7 +539,15 @@ CGObjCGNU::GenerateMessageSendSuper(CodeGen::CodeGenFunction &CGF,
|
||||||
llvm::Value *imp = CGF.Builder.CreateCall(lookupFunction, lookupArgs,
|
llvm::Value *imp = CGF.Builder.CreateCall(lookupFunction, lookupArgs,
|
||||||
lookupArgs+2);
|
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.
|
/// Generate code for a message send expression.
|
||||||
|
@ -653,12 +661,6 @@ CGObjCGNU::GenerateMessageSend(CodeGen::CodeGenFunction &CGF,
|
||||||
slot->setOnlyReadsMemory();
|
slot->setOnlyReadsMemory();
|
||||||
|
|
||||||
imp = Builder.CreateLoad(Builder.CreateStructGEP(slot, 4));
|
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 lookup function may have changed the receiver, so make sure we use
|
||||||
// the new one.
|
// the new one.
|
||||||
|
@ -675,8 +677,15 @@ CGObjCGNU::GenerateMessageSend(CodeGen::CodeGenFunction &CGF,
|
||||||
|
|
||||||
imp = Builder.CreateCall2(lookupFunction, Receiver, cmd);
|
imp = Builder.CreateCall2(lookupFunction, Receiver, cmd);
|
||||||
}
|
}
|
||||||
RValue msgRet =
|
llvm::Value *impMD[] = {
|
||||||
CGF.EmitCall(FnInfo, imp, ReturnValueSlot(), ActualArgs);
|
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) {
|
if (!isPointerSizedReturn) {
|
||||||
CGF.EmitBlock(contiueBB);
|
CGF.EmitBlock(contiueBB);
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
namespace llvm {
|
namespace llvm {
|
||||||
class BasicBlock;
|
class BasicBlock;
|
||||||
class LLVMContext;
|
class LLVMContext;
|
||||||
|
class MDNode;
|
||||||
class Module;
|
class Module;
|
||||||
class SwitchInst;
|
class SwitchInst;
|
||||||
class Twine;
|
class Twine;
|
||||||
|
@ -1116,7 +1117,9 @@ public:
|
||||||
llvm::Value *Callee,
|
llvm::Value *Callee,
|
||||||
ReturnValueSlot ReturnValue,
|
ReturnValueSlot ReturnValue,
|
||||||
const CallArgList &Args,
|
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,
|
RValue EmitCall(QualType FnType, llvm::Value *Callee,
|
||||||
ReturnValueSlot ReturnValue,
|
ReturnValueSlot ReturnValue,
|
||||||
|
|
Loading…
Reference in New Issue