blob: bef745945fe74141f75d547271c882cf63f6cc7c [file] [log] [blame]
Mike Stumpd883d842009-03-04 15:35:22 +00001//===-- CGBlocks.h - state for LLVM CodeGen for blocks ----------*- 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 is the internal state used for llvm translation for block literals.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef CLANG_CODEGEN_CGBLOCKS_H
15#define CLANG_CODEGEN_CGBLOCKS_H
16
Mike Stump2a998142009-03-04 18:17:45 +000017#include "CodeGenTypes.h"
18#include "clang/AST/Type.h"
19#include "llvm/ADT/DenseMap.h"
20#include "llvm/ADT/SmallVector.h"
21#include "clang/Basic/TargetInfo.h"
22#include "clang/AST/Expr.h"
23#include "clang/AST/ExprCXX.h"
24#include "clang/AST/ExprObjC.h"
25
26#include <vector>
27#include <map>
28
29#include "CGBuilder.h"
30#include "CGCall.h"
31#include "CGValue.h"
32
33namespace llvm {
34 class Module;
35 class Constant;
36 class Function;
37 class GlobalValue;
38 class TargetData;
39 class FunctionType;
40 class Value;
41}
42
Mike Stumpd883d842009-03-04 15:35:22 +000043namespace clang {
44
45namespace CodeGen {
Mike Stump90a90432009-03-04 18:47:42 +000046class CodeGenModule;
Mike Stumpd883d842009-03-04 15:35:22 +000047
48class BlockBase {
49public:
50 enum {
51 BLOCK_NEEDS_FREE = (1 << 24),
52 BLOCK_HAS_COPY_DISPOSE = (1 << 25),
53 BLOCK_HAS_CXX_OBJ = (1 << 26),
54 BLOCK_IS_GC = (1 << 27),
55 BLOCK_IS_GLOBAL = (1 << 28),
56 BLOCK_HAS_DESCRIPTOR = (1 << 29)
57 };
58};
59
60class BlockModule : public BlockBase {
Mike Stump2a998142009-03-04 18:17:45 +000061 ASTContext &Context;
62 llvm::Module &TheModule;
Mike Stump90a90432009-03-04 18:47:42 +000063 const llvm::TargetData &TheTargetData;
Mike Stump2a998142009-03-04 18:17:45 +000064 CodeGenTypes &Types;
Mike Stump90a90432009-03-04 18:47:42 +000065 CodeGenModule &CGM;
Mike Stump2a998142009-03-04 18:17:45 +000066
67 ASTContext &getContext() const { return Context; }
68 llvm::Module &getModule() const { return TheModule; }
69 CodeGenTypes &getTypes() { return Types; }
Mike Stump90a90432009-03-04 18:47:42 +000070 const llvm::TargetData &getTargetData() const { return TheTargetData; }
Mike Stump2a998142009-03-04 18:17:45 +000071public:
72 llvm::Constant *getNSConcreteGlobalBlock();
73 llvm::Constant *getNSConcreteStackBlock();
74 int getGlobalUniqueCount() { return ++Block.GlobalUniqueCount; }
75 const llvm::Type *getBlockDescriptorType();
76
77 const llvm::Type *getGenericBlockLiteralType();
78 const llvm::Type *getGenericExtendedBlockLiteralType();
79
Mike Stump90a90432009-03-04 18:47:42 +000080 llvm::Constant *GetAddrOfGlobalBlock(const BlockExpr *BE, const char *);
81
Mike Stump2a998142009-03-04 18:17:45 +000082 /// NSConcreteGlobalBlock - Cached reference to the class pointer for global
83 /// blocks.
84 llvm::Constant *NSConcreteGlobalBlock;
85
86 /// NSConcreteStackBlock - Cached reference to the class poinnter for stack
87 /// blocks.
88 llvm::Constant *NSConcreteStackBlock;
89
90 const llvm::Type *BlockDescriptorType;
91 const llvm::Type *GenericBlockLiteralType;
92 const llvm::Type *GenericExtendedBlockLiteralType;
93 struct {
94 int GlobalUniqueCount;
95 } Block;
96
Mike Stump90a90432009-03-04 18:47:42 +000097 BlockModule(ASTContext &C, llvm::Module &M, const llvm::TargetData &TD,
98 CodeGenTypes &T, CodeGenModule &CodeGen)
99 : Context(C), TheModule(M), TheTargetData(TD), Types(T),
100 CGM(CodeGen),
101 NSConcreteGlobalBlock(0), NSConcreteStackBlock(0), BlockDescriptorType(0),
Mike Stump2a998142009-03-04 18:17:45 +0000102 GenericBlockLiteralType(0) {
103 Block.GlobalUniqueCount = 0;
104 }
Mike Stumpd883d842009-03-04 15:35:22 +0000105};
106
107class BlockFunction : public BlockBase {
108public:
109 enum {
110 BLOCK_FIELD_IS_OBJECT = 3, /* id, NSObject, __attribute__((NSObject)),
111 block, ... */
112 BLOCK_FIELD_IS_BLOCK = 7, /* a block variable */
113 BLOCK_FIELD_IS_BYREF = 8, /* the on stack structure holding the __block
114 variable */
115 BLOCK_FIELD_IS_WEAK = 16, /* declared __weak, only used in byref copy
116 helpers */
117 BLOCK_BYREF_CALLER = 128 /* called from __block (byref) copy/dispose
118 support routines */
119 };
Mike Stump3947de52009-03-04 18:57:26 +0000120
Mike Stumpad75ab42009-03-04 19:03:44 +0000121 /// BlockInfo - Information to generate a block literal.
122 struct BlockInfo {
123 /// BlockLiteralTy - The type of the block literal.
124 const llvm::Type *BlockLiteralTy;
125
126 /// Name - the name of the function this block was created for, if any
127 const char *Name;
128
129 /// ByCopyDeclRefs - Variables from parent scopes that have been imported
130 /// into this block.
131 llvm::SmallVector<const BlockDeclRefExpr *, 8> ByCopyDeclRefs;
132
133 // ByRefDeclRefs - __block variables from parent scopes that have been
134 // imported into this block.
135 llvm::SmallVector<const BlockDeclRefExpr *, 8> ByRefDeclRefs;
136
137 BlockInfo(const llvm::Type *blt, const char *n)
138 : BlockLiteralTy(blt), Name(n) {}
139 };
140
Mike Stump3947de52009-03-04 18:57:26 +0000141 CGBuilderTy &Builder;
142
143 BlockFunction(CGBuilderTy &B) : Builder(B) { }
144
Mike Stumpad75ab42009-03-04 19:03:44 +0000145 ImplicitParamDecl *BlockStructDecl;
146 ImplicitParamDecl *getBlockStructDecl() { return BlockStructDecl; }
147
Mike Stump3947de52009-03-04 18:57:26 +0000148 llvm::Value *BuildCopyHelper(int flag);
149 llvm::Value *BuildDestroyHelper(int flag);
150
Mike Stumpd883d842009-03-04 15:35:22 +0000151};
152
153} // end namespace CodeGen
154} // end namespace clang
155
156#endif