aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/CodeGen/CGBlocks.cpp12
-rw-r--r--lib/CodeGen/CGBlocks.h63
-rw-r--r--lib/CodeGen/CodeGenFunction.h2
-rw-r--r--lib/CodeGen/CodeGenModule.cpp9
-rw-r--r--lib/CodeGen/CodeGenModule.h25
5 files changed, 73 insertions, 38 deletions
diff --git a/lib/CodeGen/CGBlocks.cpp b/lib/CodeGen/CGBlocks.cpp
index 2f1fba02c7..8aabada259 100644
--- a/lib/CodeGen/CGBlocks.cpp
+++ b/lib/CodeGen/CGBlocks.cpp
@@ -74,7 +74,7 @@ llvm::Constant *CodeGenFunction::BuildDescriptorBlockDecl(uint64_t Size) {
return C;
}
-llvm::Constant *CodeGenModule::getNSConcreteGlobalBlock() {
+llvm::Constant *BlockModule::getNSConcreteGlobalBlock() {
if (NSConcreteGlobalBlock)
return NSConcreteGlobalBlock;
@@ -92,7 +92,7 @@ llvm::Constant *CodeGenModule::getNSConcreteGlobalBlock() {
return NSConcreteGlobalBlock;
}
-llvm::Constant *CodeGenModule::getNSConcreteStackBlock() {
+llvm::Constant *BlockModule::getNSConcreteStackBlock() {
if (NSConcreteStackBlock)
return NSConcreteStackBlock;
@@ -297,7 +297,7 @@ llvm::Value *CodeGenFunction::BuildBlockLiteralTmp(const BlockExpr *BE) {
}
-const llvm::Type *CodeGenModule::getBlockDescriptorType() {
+const llvm::Type *BlockModule::getBlockDescriptorType() {
if (BlockDescriptorType)
return BlockDescriptorType;
@@ -318,8 +318,7 @@ const llvm::Type *CodeGenModule::getBlockDescriptorType() {
return BlockDescriptorType;
}
-const llvm::Type *
-CodeGenModule::getGenericBlockLiteralType() {
+const llvm::Type *BlockModule::getGenericBlockLiteralType() {
if (GenericBlockLiteralType)
return GenericBlockLiteralType;
@@ -352,8 +351,7 @@ CodeGenModule::getGenericBlockLiteralType() {
return GenericBlockLiteralType;
}
-const llvm::Type *
-CodeGenModule::getGenericExtendedBlockLiteralType() {
+const llvm::Type *BlockModule::getGenericExtendedBlockLiteralType() {
if (GenericExtendedBlockLiteralType)
return GenericExtendedBlockLiteralType;
diff --git a/lib/CodeGen/CGBlocks.h b/lib/CodeGen/CGBlocks.h
index 4ba699b7da..a55c578c0e 100644
--- a/lib/CodeGen/CGBlocks.h
+++ b/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 {
diff --git a/lib/CodeGen/CodeGenFunction.h b/lib/CodeGen/CodeGenFunction.h
index b724b72a39..caf50d35b2 100644
--- a/lib/CodeGen/CodeGenFunction.h
+++ b/lib/CodeGen/CodeGenFunction.h
@@ -62,7 +62,7 @@ namespace CodeGen {
/// CodeGenFunction - This class organizes the per-function state that is used
/// while generating LLVM code.
- class CodeGenFunction : public BlockFunction {
+class CodeGenFunction : public BlockFunction {
CodeGenFunction(const CodeGenFunction&); // DO NOT IMPLEMENT
void operator=(const CodeGenFunction&); // DO NOT IMPLEMENT
public:
diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp
index 33aff2553f..c0dba74ad0 100644
--- a/lib/CodeGen/CodeGenModule.cpp
+++ b/lib/CodeGen/CodeGenModule.cpp
@@ -34,10 +34,9 @@ using namespace CodeGen;
CodeGenModule::CodeGenModule(ASTContext &C, const LangOptions &LO,
llvm::Module &M, const llvm::TargetData &TD,
Diagnostic &diags, bool GenerateDebugInfo)
- : Context(C), Features(LO), TheModule(M), TheTargetData(TD), Diags(diags),
- Types(C, M, TD), Runtime(0), MemCpyFn(0), MemMoveFn(0), MemSetFn(0),
- CFConstantStringClassRef(0), NSConcreteGlobalBlock(0),
- NSConcreteStackBlock(0),BlockDescriptorType(0), GenericBlockLiteralType(0) {
+ : BlockModule(C, M, Types), Context(C), Features(LO), TheModule(M),
+ TheTargetData(TD), Diags(diags), Types(C, M, TD), Runtime(0),
+ MemCpyFn(0), MemMoveFn(0), MemSetFn(0), CFConstantStringClassRef(0) {
if (Features.ObjC1) {
if (Features.NeXTRuntime) {
@@ -50,8 +49,6 @@ CodeGenModule::CodeGenModule(ASTContext &C, const LangOptions &LO,
// If debug info generation is enabled, create the CGDebugInfo object.
DebugInfo = GenerateDebugInfo ? new CGDebugInfo(this) : 0;
-
- Block.GlobalUniqueCount = 0;
}
CodeGenModule::~CodeGenModule() {
diff --git a/lib/CodeGen/CodeGenModule.h b/lib/CodeGen/CodeGenModule.h
index 05591a5112..d20d22bc09 100644
--- a/lib/CodeGen/CodeGenModule.h
+++ b/lib/CodeGen/CodeGenModule.h
@@ -63,7 +63,7 @@ namespace CodeGen {
/// CodeGenModule - This class organizes the cross-function state that is used
/// while generating LLVM code.
- class CodeGenModule : public BlockModule {
+class CodeGenModule : public BlockModule {
CodeGenModule(const CodeGenModule&); // DO NOT IMPLEMENT
void operator=(const CodeGenModule&); // DO NOT IMPLEMENT
@@ -140,21 +140,6 @@ namespace CodeGen {
/// strings. This value has type int * but is actually an Obj-C class pointer.
llvm::Constant *CFConstantStringClassRef;
- /// 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;
-
std::vector<llvm::Value *> BuiltinFunctions;
public:
CodeGenModule(ASTContext &C, const LangOptions &Features, llvm::Module &M,
@@ -166,14 +151,6 @@ public:
/// Release - Finalize LLVM code generation.
void Release();
- llvm::Constant *getNSConcreteGlobalBlock();
- llvm::Constant *getNSConcreteStackBlock();
- int getGlobalUniqueCount() { return ++Block.GlobalUniqueCount; }
- const llvm::Type *getBlockDescriptorType();
-
- const llvm::Type *getGenericBlockLiteralType();
- const llvm::Type *getGenericExtendedBlockLiteralType();
-
/// getObjCRuntime() - Return a reference to the configured
/// Objective-C runtime.
CGObjCRuntime &getObjCRuntime() {