zcov: / lib/CodeGen/CGObjCRuntime.h


Files: 1 Branches Taken: 0.0% 0 / 0
Generated: 2010-02-10 01:31 Branches Executed: 0.0% 0 / 0
Line Coverage: 100.0% 1 / 1


Programs: 2 Runs 5794


       1                 : //===----- CGObjCRuntime.h - Interface to ObjC Runtimes ---------*- C++ -*-===//
       2                 : //
       3                 : //                     The LLVM Compiler Infrastructure
       4                 : //
       5                 : // This file is distributed under the University of Illinois Open Source
       6                 : // License. See LICENSE.TXT for details.
       7                 : //
       8                 : //===----------------------------------------------------------------------===//
       9                 : //
      10                 : // This provides an abstract class for Objective-C code generation.  Concrete
      11                 : // subclasses of this implement code generation for specific Objective-C
      12                 : // runtime libraries.
      13                 : //
      14                 : //===----------------------------------------------------------------------===//
      15                 : 
      16                 : #ifndef CLANG_CODEGEN_OBCJRUNTIME_H
      17                 : #define CLANG_CODEGEN_OBCJRUNTIME_H
      18                 : #include "clang/Basic/IdentifierTable.h" // Selector
      19                 : #include "llvm/ADT/SmallVector.h"
      20                 : #include "clang/AST/DeclObjC.h"
      21                 : #include <string>
      22                 : 
      23                 : #include "CGBuilder.h"
      24                 : #include "CGCall.h"
      25                 : #include "CGValue.h"
      26                 : 
      27                 : namespace llvm {
      28                 :   class Constant;
      29                 :   class Function;
      30                 :   class Module;
      31                 :   class StructLayout;
      32                 :   class StructType;
      33                 :   class Type;
      34                 :   class Value;
      35                 : }
      36                 : 
      37                 : namespace clang {
      38                 : namespace CodeGen {
      39                 :   class CodeGenFunction;
      40                 : }
      41                 : 
      42                 :   class FieldDecl;
      43                 :   class ObjCAtTryStmt;
      44                 :   class ObjCAtThrowStmt;
      45                 :   class ObjCAtSynchronizedStmt;
      46                 :   class ObjCContainerDecl;
      47                 :   class ObjCCategoryImplDecl;
      48                 :   class ObjCImplementationDecl;
      49                 :   class ObjCInterfaceDecl;
      50                 :   class ObjCMessageExpr;
      51                 :   class ObjCMethodDecl;
      52                 :   class ObjCProtocolDecl;
      53                 :   class Selector;
      54                 :   class ObjCIvarDecl;
      55                 :   class ObjCStringLiteral;
      56                 : 
      57                 : namespace CodeGen {
      58                 :   class CodeGenModule;
      59                 : 
      60                 : // FIXME: Several methods should be pure virtual but aren't to avoid the
      61                 : // partially-implemented subclass breaking.
      62                 : 
      63                 : /// Implements runtime-specific code generation functions.
      64              137: class CGObjCRuntime {
      65                 : public:
      66                 :   // Utility functions for unified ivar access. These need to
      67                 :   // eventually be folded into other places (the structure layout
      68                 :   // code).
      69                 : 
      70                 : protected:
      71                 :   /// Compute an offset to the given ivar, suitable for passing to
      72                 :   /// EmitValueForIvarAtOffset.  Note that the correct handling of
      73                 :   /// bit-fields is carefully coordinated by these two, use caution!
      74                 :   ///
      75                 :   /// The latter overload is suitable for computing the offset of a
      76                 :   /// sythesized ivar.
      77                 :   uint64_t ComputeIvarBaseOffset(CodeGen::CodeGenModule &CGM,
      78                 :                                  const ObjCInterfaceDecl *OID,
      79                 :                                  const ObjCIvarDecl *Ivar);
      80                 :   uint64_t ComputeIvarBaseOffset(CodeGen::CodeGenModule &CGM,
      81                 :                                  const ObjCImplementationDecl *OID,
      82                 :                                  const ObjCIvarDecl *Ivar);
      83                 : 
      84                 :   LValue EmitValueForIvarAtOffset(CodeGen::CodeGenFunction &CGF,
      85                 :                                   const ObjCInterfaceDecl *OID,
      86                 :                                   llvm::Value *BaseValue,
      87                 :                                   const ObjCIvarDecl *Ivar,
      88                 :                                   unsigned CVRQualifiers,
      89                 :                                   llvm::Value *Offset);
      90                 : 
      91                 : public:
      92                 :   virtual ~CGObjCRuntime();
      93                 : 
      94                 :   /// Generate the function required to register all Objective-C components in
      95                 :   /// this compilation unit with the runtime library.
      96                 :   virtual llvm::Function *ModuleInitFunction() = 0;
      97                 : 
      98                 :   /// Get a selector for the specified name and type values. The
      99                 :   /// return value should have the LLVM type for pointer-to
     100                 :   /// ASTContext::getObjCSelType().
     101                 :   virtual llvm::Value *GetSelector(CGBuilderTy &Builder,
     102                 :                                    Selector Sel) = 0;
     103                 : 
     104                 :   /// Get a typed selector.
     105                 :   virtual llvm::Value *GetSelector(CGBuilderTy &Builder,
     106                 :                                    const ObjCMethodDecl *Method) = 0;
     107                 : 
     108                 :   /// Generate a constant string object.
     109                 :   virtual llvm::Constant *GenerateConstantString(const StringLiteral *) = 0;
     110                 : 
     111                 :   /// Generate a category.  A category contains a list of methods (and
     112                 :   /// accompanying metadata) and a list of protocols.
     113                 :   virtual void GenerateCategory(const ObjCCategoryImplDecl *OCD) = 0;
     114                 : 
     115                 :   /// Generate a class stucture for this class.
     116                 :   virtual void GenerateClass(const ObjCImplementationDecl *OID) = 0;
     117                 : 
     118                 :   /// Generate an Objective-C message send operation.
     119                 :   ///
     120                 :   /// \param Method - The method being called, this may be null if synthesizing
     121                 :   /// a property setter or getter.
     122                 :   virtual CodeGen::RValue
     123                 :   GenerateMessageSend(CodeGen::CodeGenFunction &CGF,
     124                 :                       QualType ResultType,
     125                 :                       Selector Sel,
     126                 :                       llvm::Value *Receiver,
     127                 :                       bool IsClassMessage,
     128                 :                       const CallArgList &CallArgs,
     129                 :                       const ObjCMethodDecl *Method = 0) = 0;
     130                 : 
     131                 :   /// Generate an Objective-C message send operation to the super
     132                 :   /// class initiated in a method for Class and with the given Self
     133                 :   /// object.
     134                 :   ///
     135                 :   /// \param Method - The method being called, this may be null if synthesizing
     136                 :   /// a property setter or getter.
     137                 :   virtual CodeGen::RValue
     138                 :   GenerateMessageSendSuper(CodeGen::CodeGenFunction &CGF,
     139                 :                            QualType ResultType,
     140                 :                            Selector Sel,
     141                 :                            const ObjCInterfaceDecl *Class,
     142                 :                            bool isCategoryImpl,
     143                 :                            llvm::Value *Self,
     144                 :                            bool IsClassMessage,
     145                 :                            const CallArgList &CallArgs,
     146                 :                            const ObjCMethodDecl *Method = 0) = 0;
     147                 : 
     148                 :   /// Emit the code to return the named protocol as an object, as in a
     149                 :   /// @protocol expression.
     150                 :   virtual llvm::Value *GenerateProtocolRef(CGBuilderTy &Builder,
     151                 :                                            const ObjCProtocolDecl *OPD) = 0;
     152                 : 
     153                 :   /// Generate the named protocol.  Protocols contain method metadata but no
     154                 :   /// implementations.
     155                 :   virtual void GenerateProtocol(const ObjCProtocolDecl *OPD) = 0;
     156                 : 
     157                 :   /// Generate a function preamble for a method with the specified
     158                 :   /// types.
     159                 : 
     160                 :   // FIXME: Current this just generates the Function definition, but really this
     161                 :   // should also be generating the loads of the parameters, as the runtime
     162                 :   // should have full control over how parameters are passed.
     163                 :   virtual llvm::Function *GenerateMethod(const ObjCMethodDecl *OMD,
     164                 :                                          const ObjCContainerDecl *CD) = 0;
     165                 : 
     166                 :   /// Return the runtime function for getting properties.
     167                 :   virtual llvm::Constant *GetPropertyGetFunction() = 0;
     168                 : 
     169                 :   /// Return the runtime function for setting properties.
     170                 :   virtual llvm::Constant *GetPropertySetFunction() = 0;
     171                 : 
     172                 :   /// GetClass - Return a reference to the class for the given
     173                 :   /// interface decl.
     174                 :   virtual llvm::Value *GetClass(CGBuilderTy &Builder,
     175                 :                                 const ObjCInterfaceDecl *OID) = 0;
     176                 : 
     177                 :   /// EnumerationMutationFunction - Return the function that's called by the
     178                 :   /// compiler when a mutation is detected during foreach iteration.
     179                 :   virtual llvm::Constant *EnumerationMutationFunction() = 0;
     180                 : 
     181                 :   virtual void EmitTryOrSynchronizedStmt(CodeGen::CodeGenFunction &CGF,
     182                 :                                          const Stmt &S) = 0;
     183                 :   virtual void EmitThrowStmt(CodeGen::CodeGenFunction &CGF,
     184                 :                              const ObjCAtThrowStmt &S) = 0;
     185                 :   virtual llvm::Value *EmitObjCWeakRead(CodeGen::CodeGenFunction &CGF,
     186                 :                                         llvm::Value *AddrWeakObj) = 0;
     187                 :   virtual void EmitObjCWeakAssign(CodeGen::CodeGenFunction &CGF,
     188                 :                                   llvm::Value *src, llvm::Value *dest) = 0;
     189                 :   virtual void EmitObjCGlobalAssign(CodeGen::CodeGenFunction &CGF,
     190                 :                                     llvm::Value *src, llvm::Value *dest) = 0;
     191                 :   virtual void EmitObjCIvarAssign(CodeGen::CodeGenFunction &CGF,
     192                 :                                   llvm::Value *src, llvm::Value *dest,
     193                 :                                   llvm::Value *ivarOffset) = 0;
     194                 :   virtual void EmitObjCStrongCastAssign(CodeGen::CodeGenFunction &CGF,
     195                 :                                         llvm::Value *src, llvm::Value *dest) = 0;
     196                 : 
     197                 :   virtual LValue EmitObjCValueForIvar(CodeGen::CodeGenFunction &CGF,
     198                 :                                       QualType ObjectTy,
     199                 :                                       llvm::Value *BaseValue,
     200                 :                                       const ObjCIvarDecl *Ivar,
     201                 :                                       unsigned CVRQualifiers) = 0;
     202                 :   virtual llvm::Value *EmitIvarOffset(CodeGen::CodeGenFunction &CGF,
     203                 :                                       const ObjCInterfaceDecl *Interface,
     204                 :                                       const ObjCIvarDecl *Ivar) = 0;
     205                 :   virtual void EmitGCMemmoveCollectable(CodeGen::CodeGenFunction &CGF,
     206                 :                                         llvm::Value *DestPtr,
     207                 :                                         llvm::Value *SrcPtr,
     208                 :                                         QualType Ty) = 0;
     209                 : };
     210                 : 
     211                 : /// Creates an instance of an Objective-C runtime class.
     212                 : //TODO: This should include some way of selecting which runtime to target.
     213                 : CGObjCRuntime *CreateGNUObjCRuntime(CodeGenModule &CGM);
     214                 : CGObjCRuntime *CreateMacObjCRuntime(CodeGenModule &CGM);
     215                 : CGObjCRuntime *CreateMacNonFragileABIObjCRuntime(CodeGenModule &CGM);
     216                 : }
     217                 : }
     218                 : #endif

Generated: 2010-02-10 01:31 by zcov