diff options
-rw-r--r-- | lib/CodeGen/CGBlocks.cpp | 12 | ||||
-rw-r--r-- | lib/CodeGen/CGBlocks.h | 63 | ||||
-rw-r--r-- | lib/CodeGen/CodeGenFunction.h | 2 | ||||
-rw-r--r-- | lib/CodeGen/CodeGenModule.cpp | 9 | ||||
-rw-r--r-- | lib/CodeGen/CodeGenModule.h | 25 |
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() { |