ldc/ir/irtypefunction.cpp
Benjamin Kramer 977fa551ee Push the context through StructType::get.
Requires LLVM >= 78258. Also remove old #if's.
2009-08-06 01:47:39 +02:00

47 lines
1.2 KiB
C++

#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(gIR->context(), i8ptr, funcptr, NULL);
gIR->module->addTypeName(dtype->toChars(), dgtype);
llvm::cast<llvm::OpaqueType>(pa.get())->refineAbstractTypeTo(dgtype);
return pa.get();
}