00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef COMMA_CODEGEN_CODEGENROUTINE_HDR_GUARD
00010 #define COMMA_CODEGEN_CODEGENROUTINE_HDR_GUARD
00011
00012 #include "comma/ast/AstBase.h"
00013 #include "comma/codegen/CodeGen.h"
00014
00015 #include "llvm/DerivedTypes.h"
00016 #include "llvm/ADT/DenseMap.h"
00017 #include "llvm/Support/IRBuilder.h"
00018
00019 namespace llvm {
00020
00021 class BasicBlock;
00022 class Function;
00023
00024 }
00025
00026 namespace comma {
00027
00028
00029 class CodeGenRoutine {
00030
00031 CodeGenCapsule &CGC;
00032 CodeGen &CG;
00033 CodeGenTypes &CGTypes;
00034 const CommaRT &CRT;
00035
00036
00037 llvm::IRBuilder<> Builder;
00038
00039
00040 SubroutineDecl *SRDecl;
00041
00042
00043 llvm::Function *SRFn;
00044
00045
00046 llvm::Value *percent;
00047
00048
00049 llvm::BasicBlock *entryBB;
00050
00051
00052 llvm::BasicBlock *returnBB;
00053
00054
00055
00056 llvm::Value *returnValue;
00057
00058
00059 typedef llvm::DenseMap<Decl *, llvm::Value *> DeclMap;
00060 DeclMap declTable;
00061
00062 public:
00063 CodeGenRoutine(CodeGenCapsule &CGC);
00064
00065 void declareSubroutine(SubroutineDecl *srDecl);
00066 void emitSubroutine(SubroutineDecl *srDecl);
00067
00068 private:
00069
00070
00071 void emitPrologue(llvm::BasicBlock *body);
00072
00073
00074 void emitEpilogue();
00075
00081 void injectSubroutineArgs();
00082
00084 void emitSubroutineBody();
00085
00086 void emitObjectDecl(ObjectDecl *objDecl);
00087
00088 void emitStmt(Stmt *stmt);
00089 void emitIfStmt(IfStmt *ite);
00090 void emitReturnStmt(ReturnStmt *ret);
00091 void emitStmtSequence(StmtSequence *seq);
00092 void emitProcedureCallStmt(ProcedureCallStmt *stmt);
00093 void emitAssignmentStmt(AssignmentStmt *stmt);
00094
00102 llvm::BasicBlock *emitBlockStmt(BlockStmt *block,
00103 llvm::BasicBlock *predecessor = 0);
00104
00105 llvm::Value *emitExpr(Expr *expr);
00106 llvm::Value *emitDeclRefExpr(DeclRefExpr *expr);
00107 llvm::Value *emitPrjExpr(PrjExpr *expr);
00108 llvm::Value *emitInjExpr(InjExpr *expr);
00109 llvm::Value *emitIntegerLiteral(IntegerLiteral *expr);
00110
00111 llvm::Value *emitFunctionCall(FunctionCallExpr *expr);
00112
00113 llvm::Value *emitPrimitiveCall(FunctionCallExpr *expr,
00114 std::vector<llvm::Value *> &args);
00115
00116 llvm::Value *emitLocalCall(SubroutineDecl *srDecl,
00117 std::vector<llvm::Value *> &args);
00118
00119 llvm::Value *emitDirectCall(SubroutineDecl *srDecl,
00120 std::vector<llvm::Value *> &args);
00121
00122 llvm::Value *emitCallArgument(SubroutineDecl *srDecl, Expr *arg,
00123 unsigned argPosition);
00124
00125 llvm::Value *lookupDecl(Decl *decl);
00126
00129 static bool isDirectCall(const FunctionCallExpr *expr);
00130
00133 static bool isDirectCall(const ProcedureCallStmt *stmt);
00134
00137 static bool isLocalCall(const FunctionCallExpr *expr);
00138
00141 static bool isLocalCall(const ProcedureCallStmt *stmt);
00142
00143 llvm::Function *getOrCreateSubroutineDeclaration(SubroutineDecl *srDecl);
00144
00145 llvm::Value *emitScalarLoad(llvm::Value *ptr);
00146
00147 llvm::Value *getStackSlot(Decl *decl);
00148
00149 llvm::Value *emitVariableReference(Expr *expr);
00150
00151 llvm::Value *emitValue(Expr *expr);
00152
00153 llvm::Value *createStackSlot(Decl *decl);
00154
00155 llvm::Value *getOrCreateStackSlot(Decl *decl);
00156 };
00157
00158 }
00159
00160 #endif