summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen/CGBlocks.h
diff options
context:
space:
mode:
authorMike Stump <mrs@apple.com>2009-03-04 18:17:45 +0000
committerMike Stump <mrs@apple.com>2009-03-04 18:17:45 +0000
commit95435674f9faf01bcbdba7f3af03118149eb1551 (patch)
tree04f56fb60e7071dbda9bea668e16e332bdd10b28 /clang/lib/CodeGen/CGBlocks.h
parent4f4de6c27febe97cc650cdcce65c8ac80dc069d9 (diff)
downloadbcm5719-llvm-95435674f9faf01bcbdba7f3af03118149eb1551.tar.gz
bcm5719-llvm-95435674f9faf01bcbdba7f3af03118149eb1551.zip
Move more of blocks codegen out of CodeGenModule and into the
BlockModule. No functionality change. This should help people that don't want to know anything about blocks not be confused by the overloaded use of the term block or nor want to see all the blocks goop. llvm-svn: 66042
Diffstat (limited to 'clang/lib/CodeGen/CGBlocks.h')
-rw-r--r--clang/lib/CodeGen/CGBlocks.h63
1 files changed, 63 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CGBlocks.h b/clang/lib/CodeGen/CGBlocks.h
index 4ba699b7dac..a55c578c0e1 100644
--- a/clang/lib/CodeGen/CGBlocks.h
+++ b/clang/lib/CodeGen/CGBlocks.h
@@ -14,6 +14,32 @@
#ifndef CLANG_CODEGEN_CGBLOCKS_H
#define CLANG_CODEGEN_CGBLOCKS_H
+#include "CodeGenTypes.h"
+#include "clang/AST/Type.h"
+#include "llvm/ADT/DenseMap.h"
+#include "llvm/ADT/SmallVector.h"
+#include "clang/Basic/TargetInfo.h"
+#include "clang/AST/Expr.h"
+#include "clang/AST/ExprCXX.h"
+#include "clang/AST/ExprObjC.h"
+
+#include <vector>
+#include <map>
+
+#include "CGBuilder.h"
+#include "CGCall.h"
+#include "CGValue.h"
+
+namespace llvm {
+ class Module;
+ class Constant;
+ class Function;
+ class GlobalValue;
+ class TargetData;
+ class FunctionType;
+ class Value;
+}
+
namespace clang {
namespace CodeGen {
@@ -31,6 +57,43 @@ public:
};
class BlockModule : public BlockBase {
+ ASTContext &Context;
+ llvm::Module &TheModule;
+ CodeGenTypes &Types;
+
+ ASTContext &getContext() const { return Context; }
+ llvm::Module &getModule() const { return TheModule; }
+ CodeGenTypes &getTypes() { return Types; }
+public:
+ llvm::Constant *getNSConcreteGlobalBlock();
+ llvm::Constant *getNSConcreteStackBlock();
+ int getGlobalUniqueCount() { return ++Block.GlobalUniqueCount; }
+ const llvm::Type *getBlockDescriptorType();
+
+ const llvm::Type *getGenericBlockLiteralType();
+ const llvm::Type *getGenericExtendedBlockLiteralType();
+
+ /// NSConcreteGlobalBlock - Cached reference to the class pointer for global
+ /// blocks.
+ llvm::Constant *NSConcreteGlobalBlock;
+
+ /// NSConcreteStackBlock - Cached reference to the class poinnter for stack
+ /// blocks.
+ llvm::Constant *NSConcreteStackBlock;
+
+ const llvm::Type *BlockDescriptorType;
+ const llvm::Type *GenericBlockLiteralType;
+ const llvm::Type *GenericExtendedBlockLiteralType;
+ struct {
+ int GlobalUniqueCount;
+ } Block;
+
+ BlockModule(ASTContext &C, llvm::Module &M, CodeGenTypes &T)
+ : Context(C), TheModule(M), Types(T), NSConcreteGlobalBlock(0),
+ NSConcreteStackBlock(0), BlockDescriptorType(0),
+ GenericBlockLiteralType(0) {
+ Block.GlobalUniqueCount = 0;
+ }
};
class BlockFunction : public BlockBase {
OpenPOWER on IntegriCloud