Mercurial > projects > ldc
view gen/irstate.h @ 128:e5fe8521bbfa trunk
[svn r132] Added some tests. some will fail at the moment.
author | lindquist |
---|---|
date | Fri, 30 Nov 2007 17:12:08 +0100 |
parents | fd7ad91fd713 |
children | 0e28624814e8 |
line wrap: on
line source
#ifndef LLVMDC_GEN_IRSTATE_H #define LLVMDC_GEN_IRSTATE_H #include <stack> #include <vector> #include <deque> #include <map> #include <list> #include "root.h" #include "aggregate.h" // global ir state for current module struct IRState; extern IRState* gIR; extern const llvm::TargetData* gTargetData; struct TypeFunction; struct TypeStruct; struct ClassDeclaration; struct FuncDeclaration; struct Module; struct TypeStruct; struct BaseClass; /* struct LLVMValue { std::vector<llvm::Value*> vals; }; */ // represents a scope struct IRScope { llvm::BasicBlock* begin; llvm::BasicBlock* end; LLVMBuilder builder; IRScope(); IRScope(llvm::BasicBlock* b, llvm::BasicBlock* e); }; struct IRInterface : Object { BaseClass* base; ClassDeclaration* decl; const llvm::StructType* vtblTy; llvm::ConstantStruct* vtblInit; llvm::GlobalVariable* vtbl; const llvm::StructType* infoTy; llvm::ConstantStruct* infoInit; llvm::Constant* info; IRInterface(BaseClass* b, const llvm::StructType* vt) { base = b; decl = b->base; vtblTy = vt; vtblInit = NULL; vtbl = NULL; infoTy = NULL; infoInit = NULL; info = NULL; } }; // represents a struct or class struct IRStruct : Object { struct Offset { VarDeclaration* var; const llvm::Type* type; llvm::Constant* init; Offset(VarDeclaration* v, const llvm::Type* ty) : var(v), type(ty), init(NULL) {} }; typedef std::multimap<unsigned, Offset> OffsetMap; typedef std::vector<VarDeclaration*> VarDeclVector; typedef std::map<ClassDeclaration*, IRInterface*> InterfaceMap; typedef InterfaceMap::iterator InterfaceIter; public: IRStruct(Type*); Type* type; llvm::PATypeHolder recty; OffsetMap offsets; VarDeclVector defaultFields; InterfaceMap interfaces; const llvm::ArrayType* interfaceInfosTy; llvm::GlobalVariable* interfaceInfos; bool defined; bool constinited; }; // represents a finally block struct IRFinally { llvm::BasicBlock* bb; llvm::BasicBlock* retbb; IRFinally(); IRFinally(llvm::BasicBlock* b, llvm::BasicBlock* rb); }; // represents a function struct IRFunction : Object { llvm::Function* func; llvm::Instruction* allocapoint; FuncDeclaration* decl; TypeFunction* type; // finally blocks typedef std::vector<IRFinally> FinallyVec; FinallyVec finallys; llvm::Value* finallyretval; bool defined; IRFunction(FuncDeclaration*); }; struct IRBuilderHelper { IRState* state; LLVMBuilder* operator->(); }; struct IRExp { Expression* e1; Expression* e2; DValue* v; IRExp(); IRExp(Expression* l, Expression* r, DValue* val); }; // represents a global variable struct IRGlobal : Object { VarDeclaration* var; llvm::PATypeHolder type; IRGlobal(VarDeclaration* v); }; // represents the module struct IRState { IRState(); // module Module* dmodule; llvm::Module* module; // functions typedef std::vector<IRFunction*> FunctionVector; FunctionVector functions; IRFunction* func(); llvm::Function* topfunc(); TypeFunction* topfunctype(); llvm::Instruction* topallocapoint(); // structs typedef std::vector<IRStruct*> StructVector; StructVector structs; IRStruct* topstruct(); // classes TODO move into IRClass typedef std::vector<ClassDeclaration*> ClassDeclVec; ClassDeclVec classes; // D main function bool emitMain; llvm::Function* mainFunc; // expression l/r value handling typedef std::vector<IRExp> ExpVec; ExpVec exps; IRExp* topexp(); // basic block scopes std::vector<IRScope> scopes; IRScope& scope(); llvm::BasicBlock* scopebb(); llvm::BasicBlock* scopeend(); bool scopereturned(); // loop blocks typedef std::vector<IRScope> BBVec; BBVec loopbbs; // this holds the array being indexed or sliced so $ will work // might be a better way but it works. problem is I only get a // VarDeclaration for __dollar, but I can't see how to get the // array pointer from this :( std::vector<DValue*> arrays; // builder helper IRBuilderHelper ir; typedef std::list<Dsymbol*> DsymbolList; // dsymbols that need to be resolved DsymbolList resolveList; // dsymbols that need to be declared DsymbolList declareList; // dsymbols that need constant initializers constructed DsymbolList constInitList; // dsymbols that need definitions DsymbolList defineList; // static ctors/dtors/unittests typedef std::vector<FuncDeclaration*> FuncDeclVector; FuncDeclVector ctors; FuncDeclVector dtors; FuncDeclVector unitTests; }; #endif // LLVMDC_GEN_IRSTATE_H