Mercurial > projects > ldc
diff ir/irtypefunction.cpp @ 1364:46f6365a50d7
Added IrTypeFunction and IrTypeDelegate and eliminated IrDType. This means the Type::ir field can be removed. It's the final part needed for the move to a slightly more sane type system. Now the whole thing just needs to be cleaned up :P
Added -v-cg switch, which right now just prints "codegen: module.name (module/name.d)" to stdout, this can really help figuring out where, in some complex build command, things go wrong.
author | Tomas Lindquist Olsen <tomas.l.olsen gmail com> |
---|---|
date | Sat, 16 May 2009 18:19:52 +0200 |
parents | |
children | 755abafbf25d |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ir/irtypefunction.cpp Sat May 16 18:19:52 2009 +0200 @@ -0,0 +1,47 @@ +#include "llvm/DerivedTypes.h" +#include "mtype.h" + +#include "gen/irstate.h" +#include "gen/tollvm.h" +#include "gen/functions.h" + +#include "ir/irtypefunction.h" + +IrTypeFunction::IrTypeFunction(Type * dt) +: IrType(dt, llvm::OpaqueType::get()) +{ + irfty = NULL; +} + +const llvm::Type * IrTypeFunction::buildType() +{ + const llvm::Type* T; + TypeFunction* tf = (TypeFunction*)dtype; + if (tf->funcdecl) + T = DtoFunctionType(tf->funcdecl); + else + T = DtoFunctionType(tf,NULL,NULL); + + llvm::cast<llvm::OpaqueType>(pa.get())->refineAbstractTypeTo(T); + return pa.get(); +} + +////////////////////////////////////////////////////////////////////////////// + +IrTypeDelegate::IrTypeDelegate(Type * dt) +: IrType(dt, llvm::OpaqueType::get()) +{ +} + +const llvm::Type * IrTypeDelegate::buildType() +{ + assert(dtype->ty == Tdelegate); + const LLType* i8ptr = getVoidPtrType(); + const LLType* func = DtoFunctionType(dtype->nextOf(), NULL, Type::tvoid->pointerTo()); + const LLType* funcptr = getPtrToType(func); + const LLStructType* dgtype = LLStructType::get(i8ptr, funcptr, NULL); + gIR->module->addTypeName(dtype->toChars(), dgtype); + + llvm::cast<llvm::OpaqueType>(pa.get())->refineAbstractTypeTo(dgtype); + return pa.get(); +}