00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef COMMA_CODEGEN_CODEGEN_HDR_GUARD
00010 #define COMMA_CODEGEN_CODEGEN_HDR_GUARD
00011
00012 #include "comma/ast/AstBase.h"
00013
00014 #include "llvm/GlobalValue.h"
00015 #include "llvm/Module.h"
00016 #include "llvm/Constants.h"
00017 #include "llvm/ADT/DenseMap.h"
00018 #include "llvm/ADT/StringMap.h"
00019 #include "llvm/Target/TargetData.h"
00020
00021 #include <string>
00022
00023 namespace comma {
00024
00025 class CodeGenCapsule;
00026 class CodeGenTypes;
00027 class CommaRT;
00028 class ExportMap;
00029
00030 class CodeGen {
00031
00032 public:
00033 ~CodeGen();
00034
00035 CodeGen(llvm::Module *M, const llvm::TargetData &data);
00036
00039 const CodeGenTypes &getTypeGenerator() const;
00040
00043 CodeGenTypes &getTypeGenerator();
00044
00046 const CommaRT &getRuntime() const { return *CRT; }
00047
00049 llvm::Module *getModule() { return M; }
00050
00052 const llvm::TargetData &getTargetData() const { return TD; }
00053
00055 void emitToplevelDecl(Decl *decl);
00056
00062 bool insertGlobal(const std::string &linkName, llvm::GlobalValue *GV);
00063
00066 llvm::GlobalValue *lookupGlobal(const std::string &linkName) const;
00067
00071 llvm::GlobalValue *lookupCapsuleInfo(Domoid *domoid) const;
00072
00075 llvm::Constant *emitStringLiteral(const std::string &str,
00076 bool isConstant = true,
00077 const std::string &name = "");
00078
00081 static std::string getLinkPrefix(const Decl *decl);
00082
00096 static std::string getLinkName(const SubroutineDecl *sr);
00097
00100 static std::string getLinkName(const Domoid *domoid);
00101
00103 llvm::Constant *getNullPointer(const llvm::PointerType *Ty) const;
00104
00114 llvm::GlobalVariable *makeExternGlobal(llvm::Constant *init,
00115 bool isConstant = false,
00116 const std::string &name = "");
00117
00118
00128 llvm::GlobalVariable *makeInternGlobal(llvm::Constant *init,
00129 bool isConstant = false,
00130 const std::string &name = "");
00131
00134 llvm::Function *makeFunction(const llvm::FunctionType *Ty,
00135 const std::string &name = "");
00136
00139 llvm::Function *makeInternFunction(const llvm::FunctionType *Ty,
00140 const std::string &name = "");
00141
00143 llvm::Constant *getPointerCast(llvm::Constant *constant,
00144 const llvm::PointerType *Ty) const;
00145
00147 llvm::PointerType *getPointerType(const llvm::Type *Ty) const;
00148
00149
00152 llvm::Constant *getConstantArray(const llvm::Type *elementType,
00153 std::vector<llvm::Constant*> &elems) const;
00154
00155
00156 private:
00158 llvm::Module *M;
00159
00161 const llvm::TargetData &TD;
00162
00164 CodeGenTypes *CGTypes;
00165
00167 CommaRT *CRT;
00168
00170 typedef llvm::StringMap<llvm::GlobalValue *> StringGlobalMap;
00171
00173 StringGlobalMap capsuleInfoTable;
00174
00176 StringGlobalMap globalTable;
00177
00186 static int getDeclIndex(const Decl *decl, const DeclRegion *region);
00187
00193 static std::string getSubroutineName(const SubroutineDecl *srd);
00194 };
00195
00196 };
00197
00198 #endif