[cfe-commits] r102833 - in /cfe/trunk/lib/CodeGen: CGCall.cpp CGObjCGNU.cpp CodeGenFunction.h

David Chisnall csdavec at swan.ac.uk
Sat May 1 04:15:56 PDT 2010


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.


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,





More information about the cfe-commits mailing list