]> granicus.if.org Git - clang/commitdiff
Tweaked EmitCall() to permit the caller to provide some metadata to attach to the...
authorDavid Chisnall <csdavec@swan.ac.uk>
Sat, 1 May 2010 11:15:56 +0000 (11:15 +0000)
committerDavid Chisnall <csdavec@swan.ac.uk>
Sat, 1 May 2010 11:15:56 +0000 (11:15 +0000)
Used this in CGObjCGNU to attach metadata about message sends to permit speculative inlining.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@102833 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGCall.cpp
lib/CodeGen/CGObjCGNU.cpp
lib/CodeGen/CodeGenFunction.h

index 8b5c3a0f6c46de0d6d20d8b62b8aceabff6b8c2d..f7db0d19a2a91a6eeecf5d2770f7ad574c8ca178 100644 (file)
@@ -869,7 +869,9 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
                                  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 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
                               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));
index 9e999ace1609b35aa2a2cc0ee1779d6fb1450802..8173aa04252e5de2fa888aa84136fc274ec12791 100644 (file)
@@ -539,7 +539,15 @@ CGObjCGNU::GenerateMessageSendSuper(CodeGen::CodeGenFunction &CGF,
   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 @@ CGObjCGNU::GenerateMessageSend(CodeGen::CodeGenFunction &CGF,
     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 @@ CGObjCGNU::GenerateMessageSend(CodeGen::CodeGenFunction &CGF,
 
     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);
index f164cf5b84ecb8fabc7804267065a6a5c52428bd..c62d19a7abbf4249c2c5fb4bb34bad7f8c7018c4 100644 (file)
@@ -32,6 +32,7 @@
 namespace llvm {
   class BasicBlock;
   class LLVMContext;
+  class MDNode;
   class Module;
   class SwitchInst;
   class Twine;
@@ -1116,7 +1117,9 @@ public:
                   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,