Mercurial > projects > ldc
diff gen/irstate.cpp @ 86:fd32135dca3e trunk
[svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
Lots of bugfixes.
Added support for special foreach on strings.
Added std.array, std.utf, std.ctype and std.uni to phobos.
Changed all the .c files in the gen dir to .cpp (it *is* C++ after all)
author | lindquist |
---|---|
date | Sat, 03 Nov 2007 14:44:58 +0100 |
parents | gen/irstate.c@d8dd47ef3973 |
children | 61615fa85940 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gen/irstate.cpp Sat Nov 03 14:44:58 2007 +0100 @@ -0,0 +1,172 @@ +/* DMDFE backend stubs + * This file contains the implementations of the backend routines. + * For dmdfe these do nothing but print a message saying the module + * has been parsed. Substitute your own behaviors for these routimes. + */ + +#include <cstdarg> + +#include "gen/llvm.h" + +#include "mtype.h" +#include "declaration.h" + +#include "gen/irstate.h" +#include "tollvm.h" + +IRState* gIR = 0; +const llvm::TargetData* gTargetData = 0; + +////////////////////////////////////////////////////////////////////////////////////////// +IRScope::IRScope() +{ + begin = end = NULL; +} + +IRScope::IRScope(llvm::BasicBlock* b, llvm::BasicBlock* e) +{ + begin = b; + end = e; + builder.SetInsertPoint(b); +} + +////////////////////////////////////////////////////////////////////////////////////////// +IRState::IRState() +{ + dmodule = 0; + module = 0; + emitMain = false; + mainFunc = 0; + ir.state = this; + dwarfCompileUnit = 0; +} + +IRFunction& IRState::func() +{ + assert(!functions.empty() && "Function stack is empty!"); + return functions.back(); +} + +llvm::Function* IRState::topfunc() +{ + assert(!functions.empty() && "Function stack is empty!"); + return functions.back().func; +} + +TypeFunction* IRState::topfunctype() +{ + assert(!functions.empty() && "Function stack is empty!"); + return functions.back().type; +} + +llvm::Instruction* IRState::topallocapoint() +{ + assert(!functions.empty() && "AllocaPoint stack is empty!"); + return functions.back().allocapoint; +} + +IRStruct& IRState::topstruct() +{ + assert(!structs.empty() && "Struct vector is empty!"); + return structs.back(); +} + +IRExp* IRState::topexp() +{ + return exps.empty() ? NULL : &exps.back(); +} + +IRScope& IRState::scope() +{ + assert(!scopes.empty()); + return scopes.back(); +} + +llvm::BasicBlock* IRState::scopebb() +{ + return scopebegin(); +} +llvm::BasicBlock* IRState::scopebegin() +{ + IRScope& s = scope(); + assert(s.begin); + return s.begin; +} +llvm::BasicBlock* IRState::scopeend() +{ + IRScope& s = scope(); + assert(s.end); + return s.end; +} +bool IRState::scopereturned() +{ + //return scope().returned; + return !scopebb()->empty() && scopebb()->back().isTerminator(); +} + +////////////////////////////////////////////////////////////////////////////////////////// + +IRStruct::IRStruct() + : recty(llvm::OpaqueType::get()) +{ + type = 0; + queueFuncs = true; +} + +IRStruct::IRStruct(Type* t) + : recty(llvm::OpaqueType::get()) +{ + type = t; + queueFuncs = true; +} + +////////////////////////////////////////////////////////////////////////////////////////// + +IRFinally::IRFinally() +{ + bb = 0; + retbb = 0; +} + +IRFinally::IRFinally(llvm::BasicBlock* b, llvm::BasicBlock* rb) +{ + bb = b; + retbb = rb; +} + +////////////////////////////////////////////////////////////////////////////////////////// + +LLVMBuilder* IRBuilderHelper::operator->() +{ + LLVMBuilder& b = state->scope().builder; + assert(b.GetInsertBlock() != NULL); + return &b; +} + +////////////////////////////////////////////////////////////////////////////////////////// + +IRFunction::IRFunction(FuncDeclaration* fd) +{ + decl = fd; + Type* t = DtoDType(fd->type); + assert(t->ty == Tfunction); + type = (TypeFunction*)t; + func = NULL; + allocapoint = NULL; + finallyretval = NULL; +} + +////////////////////////////////////////////////////////////////////////////////////////// + +IRExp::IRExp() +{ + e1 = e2 = NULL; + v = NULL; +} + +IRExp::IRExp(Expression* l, Expression* r, DValue* val) +{ + e1 = l; + e2 = r; + v = val; +}