Mercurial > projects > ldc
changeset 4:e116aa1488e6 trunk
[svn r8] changed backend includes to always use the gen/<foo>.h prefix
fixed passing string literals as array parameters
few other fixes
moved some array routines into gen/arrays
author | lindquist |
---|---|
date | Mon, 03 Sep 2007 17:34:30 +0200 |
parents | 069cf4b0ec67 |
children | 3d60e549b0c2 |
files | gen/arrays.c gen/arrays.h gen/elem.c gen/irstate.c gen/logger.c gen/runtime.c gen/toir.c gen/tollvm.c gen/tollvm.h gen/toobj.c gen/typinf.c premake.lua test/dotproduct.d |
diffstat | 13 files changed, 409 insertions(+), 341 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gen/arrays.c Mon Sep 03 17:34:30 2007 +0200 @@ -0,0 +1,309 @@ +#include "llvm/Constants.h" +#include "llvm/Type.h" +#include "llvm/DerivedTypes.h" +#include "llvm/Instructions.h" +#include "llvm/CallingConv.h" + +#include "mtype.h" +#include "dsymbol.h" +#include "aggregate.h" +#include "declaration.h" +#include "init.h" + +#include "gen/irstate.h" +#include "gen/tollvm.h" +#include "gen/arrays.h" +#include "gen/runtime.h" +#include "gen/logger.h" +#include "gen/elem.h" + +////////////////////////////////////////////////////////////////////////////////////////// + +llvm::StructType* LLVM_DtoArrayType(Type* t) +{ + assert(t->next); + const llvm::Type* at = LLVM_DtoType(t->next); + const llvm::Type* arrty; + + /*if (t->ty == Tsarray) { + TypeSArray* tsa = (TypeSArray*)t; + assert(tsa->dim->type->isintegral()); + arrty = llvm::ArrayType::get(at,tsa->dim->toUInteger()); + } + else { + arrty = llvm::ArrayType::get(at,0); + }*/ + if (at == llvm::Type::VoidTy) { + at = llvm::Type::Int8Ty; + } + arrty = llvm::PointerType::get(at); + + std::vector<const llvm::Type*> members; + if (global.params.is64bit) + members.push_back(llvm::Type::Int64Ty); + else + members.push_back(llvm::Type::Int32Ty); + + members.push_back(arrty); + + return llvm::StructType::get(members); +} + +////////////////////////////////////////////////////////////////////////////////////////// + +llvm::ArrayType* LLVM_DtoStaticArrayType(Type* t) +{ + if (t->llvmType) + return llvm::cast<llvm::ArrayType>(t->llvmType); + + assert(t->ty == Tsarray); + assert(t->next); + + const llvm::Type* at = LLVM_DtoType(t->next); + + TypeSArray* tsa = (TypeSArray*)t; + assert(tsa->dim->type->isintegral()); + llvm::ArrayType* arrty = llvm::ArrayType::get(at,tsa->dim->toUInteger()); + + tsa->llvmType = arrty; + return arrty; +} + +////////////////////////////////////////////////////////////////////////////////////////// + +llvm::Value* LLVM_DtoNullArray(llvm::Value* v) +{ + assert(gIR); + d_uns64 n = (global.params.is64bit) ? 16 : 8; + + llvm::Type* i8p_ty = llvm::PointerType::get(llvm::Type::Int8Ty); + + llvm::Value* arr = new llvm::BitCastInst(v,i8p_ty,"tmp",gIR->scopebb()); + + llvm::Function* fn = LLVM_DeclareMemSet32(); + std::vector<llvm::Value*> llargs; + llargs.resize(4); + llargs[0] = arr; + llargs[1] = llvm::ConstantInt::get(llvm::Type::Int8Ty, 0, false); + llargs[2] = llvm::ConstantInt::get(llvm::Type::Int32Ty, n, false); + llargs[3] = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false); + + //Logger::cout() << *fn << '|' << *fn->getType() << '\n'; + //Logger::cout() << "to null array call: " << *llargs[0] << '|' << *llargs[1] << '|' << *llargs[2] << '|' << *llargs[3] << '\n'; + + llvm::Value* ret = new llvm::CallInst(fn, llargs.begin(), llargs.end(), "", gIR->scopebb()); + + return ret; +} + +////////////////////////////////////////////////////////////////////////////////////////// + +llvm::Value* LLVM_DtoArrayAssign(llvm::Value* dst, llvm::Value* src) +{ + assert(gIR); + if (dst->getType() == src->getType()) + { + d_uns64 n = (global.params.is64bit) ? 16 : 8; + + llvm::Type* arrty = llvm::PointerType::get(llvm::Type::Int8Ty); + + llvm::Value* dstarr = new llvm::BitCastInst(dst,arrty,"tmp",gIR->scopebb()); + llvm::Value* srcarr = new llvm::BitCastInst(src,arrty,"tmp",gIR->scopebb()); + + llvm::Function* fn = LLVM_DeclareMemCpy32(); + std::vector<llvm::Value*> llargs; + llargs.resize(4); + llargs[0] = dstarr; + llargs[1] = srcarr; + llargs[2] = llvm::ConstantInt::get(llvm::Type::Int32Ty, n, false); + llargs[3] = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false); + + return new llvm::CallInst(fn, llargs.begin(), llargs.end(), "", gIR->scopebb()); + } + else + { + if (!llvm::isa<llvm::ArrayType>(src->getType()->getContainedType(0))) + { + Logger::cout() << "invalid: " << *src << '\n'; + assert(0); + } + const llvm::ArrayType* arrty = llvm::cast<llvm::ArrayType>(src->getType()->getContainedType(0)); + llvm::Type* dstty = llvm::PointerType::get(arrty->getElementType()); + + llvm::Value* zero = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false); + llvm::Value* one = llvm::ConstantInt::get(llvm::Type::Int32Ty, 1, false); + + llvm::Value* dstlen = new llvm::GetElementPtrInst(dst,zero,zero,"tmp",gIR->scopebb()); + llvm::Value* srclen = llvm::ConstantInt::get(LLVM_DtoSize_t(), arrty->getNumElements(), false); + new llvm::StoreInst(srclen, dstlen, gIR->scopebb()); + + llvm::Value* dstptr = new llvm::GetElementPtrInst(dst,zero,one,"tmp",gIR->scopebb()); + llvm::Value* srcptr = new llvm::BitCastInst(src,dstty,"tmp",gIR->scopebb()); + new llvm::StoreInst(srcptr, dstptr, gIR->scopebb()); + } +} + +////////////////////////////////////////////////////////////////////////////////////////// + +void LLVM_DtoArrayInit(llvm::Value* l, llvm::Value* r) +{ + const llvm::PointerType* ptrty = llvm::cast<llvm::PointerType>(l->getType()); + if (llvm::isa<llvm::ArrayType>(ptrty->getContainedType(0))) + { + const llvm::ArrayType* arrty = llvm::cast<llvm::ArrayType>(ptrty->getContainedType(0)); + llvm::Value* zero = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false); + + std::vector<llvm::Value*> args; + args.resize(3); + args[0] = new llvm::GetElementPtrInst(l,zero,zero,"tmp",gIR->scopebb()); + args[1] = llvm::ConstantInt::get(LLVM_DtoSize_t(), arrty->getNumElements(), false); + args[2] = r; + + const char* funcname = NULL; + + if (llvm::isa<llvm::PointerType>(arrty->getElementType())) { + funcname = "_d_array_init_pointer"; + + const llvm::Type* dstty = llvm::PointerType::get(llvm::PointerType::get(llvm::Type::Int8Ty)); + if (args[0]->getType() != dstty) + args[0] = new llvm::BitCastInst(args[0],dstty,"tmp",gIR->scopebb()); + + const llvm::Type* valty = llvm::PointerType::get(llvm::Type::Int8Ty); + if (args[2]->getType() != valty) + args[2] = new llvm::BitCastInst(args[2],valty,"tmp",gIR->scopebb()); + } + else if (r->getType() == llvm::Type::Int1Ty) { + funcname = "_d_array_init_i1"; + } + else if (r->getType() == llvm::Type::Int8Ty) { + funcname = "_d_array_init_i8"; + } + else if (r->getType() == llvm::Type::Int16Ty) { + funcname = "_d_array_init_i16"; + } + else if (r->getType() == llvm::Type::Int32Ty) { + funcname = "_d_array_init_i32"; + } + else if (r->getType() == llvm::Type::Int64Ty) { + funcname = "_d_array_init_i64"; + } + else if (r->getType() == llvm::Type::FloatTy) { + funcname = "_d_array_init_float"; + } + else if (r->getType() == llvm::Type::DoubleTy) { + funcname = "_d_array_init_double"; + } + else { + assert(0); + } + + Logger::cout() << *args[0] << '|' << *args[2] << '\n'; + + llvm::Function* fn = LLVM_D_GetRuntimeFunction(gIR->module, funcname); + assert(fn); + llvm::CallInst* call = new llvm::CallInst(fn, args.begin(), args.end(), "", gIR->scopebb()); + call->setCallingConv(llvm::CallingConv::C); + + Logger::println("array init call ok"); + } + else if (llvm::isa<llvm::StructType>(ptrty->getContainedType(0))) + { + assert(0 && "Only static arrays support initialisers atm"); + } + else + assert(0); +} + +////////////////////////////////////////////////////////////////////////////////////////// + +void LLVM_DtoSetArray(llvm::Value* arr, llvm::Value* dim, llvm::Value* ptr) +{ + Logger::cout() << "LLVM_DtoSetArray(" << *arr << ", " << *dim << ", " << *ptr << ")\n"; + const llvm::StructType* st = llvm::cast<llvm::StructType>(arr->getType()->getContainedType(0)); + //const llvm::PointerType* pt = llvm::cast<llvm::PointerType>(r->getType()); + + llvm::Value* zero = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false); + llvm::Value* one = llvm::ConstantInt::get(llvm::Type::Int32Ty, 1, false); + + llvm::Value* arrdim = new llvm::GetElementPtrInst(arr,zero,zero,"tmp",gIR->scopebb()); + new llvm::StoreInst(dim, arrdim, gIR->scopebb()); + + llvm::Value* arrptr = new llvm::GetElementPtrInst(arr,zero,one,"tmp",gIR->scopebb()); + new llvm::StoreInst(ptr, arrptr, gIR->scopebb()); +} + +////////////////////////////////////////////////////////////////////////////////////////// +llvm::Constant* LLVM_DtoArrayInitializer(ArrayInitializer* arrinit) +{ + Logger::println("arr init begin"); + assert(arrinit->type->ty == Tsarray); + TypeSArray* t = (TypeSArray*)arrinit->type; + integer_t tdim = t->dim->toInteger(); + + std::vector<llvm::Constant*> inits(tdim, 0); + + const llvm::Type* elemty = LLVM_DtoType(arrinit->type->next); + + assert(arrinit->index.dim == arrinit->value.dim); + for (int i=0,j=0; i < tdim; ++i) + { + Initializer* init = 0; + Expression* idx = (Expression*)arrinit->index.data[j]; + + if (idx) + { + integer_t k = idx->toInteger(); + if (i == k) + { + init = (Initializer*)arrinit->value.data[j]; + assert(init); + ++j; + } + } + else + { + init = (Initializer*)arrinit->value.data[j]; + ++j; + } + + llvm::Constant* v = 0; + + if (!init) + { + elem* e = t->next->defaultInit()->toElem(gIR); + v = llvm::cast<llvm::Constant>(e->val); + delete e; + } + else if (ExpInitializer* ex = init->isExpInitializer()) + { + elem* e = ex->exp->toElem(gIR); + v = llvm::cast<llvm::Constant>(e->val); + delete e; + } + else if (StructInitializer* si = init->isStructInitializer()) + { + v = LLVM_DtoStructInitializer(si); + } + else if (ArrayInitializer* ai = init->isArrayInitializer()) + { + v = LLVM_DtoArrayInitializer(ai); + } + else if (init->isVoidInitializer()) + { + v = llvm::UndefValue::get(elemty); + } + else + assert(v); + + inits[i] = v; + } + + llvm::ArrayType* arrty = LLVM_DtoStaticArrayType(t); + return llvm::ConstantArray::get(arrty, inits); +} + +////////////////////////////////////////////////////////////////////////////////////////// +void LLVM_DtoArrayCopy(elem* dst, elem* src) +{ + assert(0); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gen/arrays.h Mon Sep 03 17:34:30 2007 +0200 @@ -0,0 +1,20 @@ +#ifndef LLVMC_GEN_ARRAYS_H +#define LLVMC_GEN_ARRAYS_H + +llvm::StructType* LLVM_DtoArrayType(Type* t); + +llvm::ArrayType* LLVM_DtoStaticArrayType(Type* t); + +llvm::Value* LLVM_DtoNullArray(llvm::Value* v); + +llvm::Value* LLVM_DtoArrayAssign(llvm::Value* l, llvm::Value* r); + +void LLVM_DtoSetArray(llvm::Value* arr, llvm::Value* dim, llvm::Value* ptr); + +llvm::Constant* LLVM_DtoArrayInitializer(ArrayInitializer* si); + +void LLVM_DtoArrayCopy(elem* dst, elem* src); + +void LLVM_DtoArrayInit(llvm::Value* l, llvm::Value* r); + +#endif // LLVMC_GEN_ARRAYS_H
--- a/gen/elem.c Sat Sep 01 22:26:33 2007 +0200 +++ b/gen/elem.c Mon Sep 03 17:34:30 2007 +0200 @@ -2,10 +2,9 @@ #include "llvm/Instructions.h" -#include "elem.h" - -#include "irstate.h" -#include "logger.h" +#include "gen/elem.h" +#include "gen/irstate.h" +#include "gen/logger.h" //////////////////////////////////////////////////////////////////////////////////////////
--- a/gen/irstate.c Sat Sep 01 22:26:33 2007 +0200 +++ b/gen/irstate.c Mon Sep 03 17:34:30 2007 +0200 @@ -4,9 +4,8 @@ * has been parsed. Substitute your own behaviors for these routimes. */ -#include "irstate.h" - #include "mtype.h" +#include "gen/irstate.h" IRState* gIR = 0; llvm::TargetData* gTargetData = 0;
--- a/gen/logger.c Sat Sep 01 22:26:33 2007 +0200 +++ b/gen/logger.c Mon Sep 03 17:34:30 2007 +0200 @@ -7,7 +7,7 @@ #include <iostream> #include <string> -#include "logger.h" +#include "gen/logger.h" namespace Logger {
--- a/gen/runtime.c Sat Sep 01 22:26:33 2007 +0200 +++ b/gen/runtime.c Mon Sep 03 17:34:30 2007 +0200 @@ -4,12 +4,12 @@ #include "llvm/Bitcode/ReaderWriter.h" #include "llvm/Support/MemoryBuffer.h" -#include "runtime.h" -#include "logger.h" - #include "root.h" #include "mars.h" +#include "gen/runtime.h" +#include "gen/logger.h" + static llvm::Module* M = NULL; static bool runtime_failed = false;
--- a/gen/toir.c Sat Sep 01 22:26:33 2007 +0200 +++ b/gen/toir.c Mon Sep 03 17:34:30 2007 +0200 @@ -24,13 +24,14 @@ #include "symbol.h" #include "mtype.h" #include "hdrgen.h" -#include "irstate.h" -#include "elem.h" #include "port.h" -#include "logger.h" - -#include "tollvm.h" -#include "runtime.h" + +#include "gen/irstate.h" +#include "gen/elem.h" +#include "gen/logger.h" +#include "gen/tollvm.h" +#include "gen/runtime.h" +#include "gen/arrays.h" ////////////////////////////////////////////////////////////////////////////////////////// @@ -255,8 +256,17 @@ elem* e = new elem; if (type->ty == Tarray) { - llvm::Value* arr = p->toplval(); - LLVM_DtoSetArray(arr, llvm::ConstantInt::get(LLVM_DtoSize_t(),len,false), arrptr); + llvm::Constant* clen = llvm::ConstantInt::get(LLVM_DtoSize_t(),len,false); + if (p->lvals.empty()) { + e->type = elem::SLICE; + e->arg = clen; + e->mem = arrptr; + return e; + } + else { + llvm::Value* arr = p->toplval(); + LLVM_DtoSetArray(arr, clen, arrptr); + } } else if (type->ty == Tpointer) { e->mem = arrptr; @@ -879,16 +889,24 @@ llvm::Value* allocaInst = 0; llvm::BasicBlock* entryblock = &p->topfunc()->front(); const llvm::PointerType* pty = llvm::cast<llvm::PointerType>(arg->mem->getType()); - allocaInst = new llvm::AllocaInst(pty->getElementType(), "tmpparam", p->topallocapoint()); if (argty == Tstruct) { + allocaInst = new llvm::AllocaInst(pty->getElementType(), "tmpparam", p->topallocapoint()); TypeStruct* ts = (TypeStruct*)argexp->type; LLVM_DtoStructCopy(ts,allocaInst,arg->mem); } else if (argty == Tdelegate) { + allocaInst = new llvm::AllocaInst(pty->getElementType(), "tmpparam", p->topallocapoint()); LLVM_DtoDelegateCopy(allocaInst,arg->mem); } else if (argty == Tarray) { - LLVM_DtoArrayAssign(allocaInst,arg->mem); + if (arg->type == elem::SLICE) { + allocaInst = new llvm::AllocaInst(LLVM_DtoType(argexp->type), "tmpparam", p->topallocapoint()); + LLVM_DtoSetArray(allocaInst, arg->arg, arg->mem); + } + else { + allocaInst = new llvm::AllocaInst(pty->getElementType(), "tmpparam", p->topallocapoint()); + LLVM_DtoArrayAssign(allocaInst,arg->mem); + } } else assert(0); @@ -1039,14 +1057,24 @@ } else { llvm::Value* uval = u->getValue(); - llvm::Value* zero = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false); - llvm::Value* one = llvm::ConstantInt::get(llvm::Type::Int32Ty, 1, false); - e->arg = new llvm::GetElementPtrInst(uval,zero,zero,"tmp",p->scopebb()); - e->arg = new llvm::LoadInst(e->arg, "tmp", p->scopebb()); - - e->mem = new llvm::GetElementPtrInst(uval,zero,one,"tmp",p->scopebb()); - e->mem = new llvm::LoadInst(e->mem, "tmp", p->scopebb()); - e->mem = new llvm::BitCastInst(e->mem, ptrty, "tmp", p->scopebb()); + if (from->ty == Tsarray) { + Logger::cout() << "uvalTy = " << *uval->getType() << '\n'; + assert(llvm::isa<llvm::PointerType>(uval->getType())); + const llvm::ArrayType* arrty = llvm::cast<llvm::ArrayType>(uval->getType()->getContainedType(0)); + e->arg = llvm::ConstantInt::get(LLVM_DtoSize_t(), arrty->getNumElements(), false); + e->mem = new llvm::BitCastInst(uval, ptrty, "tmp", p->scopebb()); + } + else { + llvm::Value* zero = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false); + llvm::Value* one = llvm::ConstantInt::get(llvm::Type::Int32Ty, 1, false); + e->arg = new llvm::GetElementPtrInst(uval,zero,zero,"tmp",p->scopebb()); + e->arg = new llvm::LoadInst(e->arg, "tmp", p->scopebb()); + + e->mem = new llvm::GetElementPtrInst(uval,zero,one,"tmp",p->scopebb()); + e->mem = new llvm::LoadInst(e->mem, "tmp", p->scopebb()); + //Logger::cout() << *e->mem->getType() << '|' << *ptrty << '\n'; + e->mem = new llvm::BitCastInst(e->mem, ptrty, "tmp", p->scopebb()); + } } e->type = elem::SLICE; } @@ -1111,7 +1139,9 @@ e->type = elem::VAL; } else if (offset == 0) { - vd->toObjFile(); + /*if (!vd->llvmValue) + vd->toObjFile();*/ + assert(vd->llvmValue); e = new elem; e->mem = vd->llvmValue; //e->vardecl = vd;
--- a/gen/tollvm.c Sat Sep 01 22:26:33 2007 +0200 +++ b/gen/tollvm.c Mon Sep 03 17:34:30 2007 +0200 @@ -13,11 +13,12 @@ #include "declaration.h" #include "init.h" -#include "tollvm.h" -#include "irstate.h" -#include "logger.h" -#include "runtime.h" -#include "elem.h" +#include "gen/tollvm.h" +#include "gen/irstate.h" +#include "gen/logger.h" +#include "gen/runtime.h" +#include "gen/elem.h" +#include "gen/arrays.h" const llvm::Type* LLVM_DtoType(Type* t) { @@ -312,57 +313,6 @@ return llvm::StructType::get(types); } -////////////////////////////////////////////////////////////////////////////////////////// - -llvm::StructType* LLVM_DtoArrayType(Type* t) -{ - assert(t->next); - const llvm::Type* at = LLVM_DtoType(t->next); - const llvm::Type* arrty; - - /*if (t->ty == Tsarray) { - TypeSArray* tsa = (TypeSArray*)t; - assert(tsa->dim->type->isintegral()); - arrty = llvm::ArrayType::get(at,tsa->dim->toUInteger()); - } - else { - arrty = llvm::ArrayType::get(at,0); - }*/ - if (at == llvm::Type::VoidTy) { - at = llvm::Type::Int8Ty; - } - arrty = llvm::PointerType::get(at); - - std::vector<const llvm::Type*> members; - if (global.params.is64bit) - members.push_back(llvm::Type::Int64Ty); - else - members.push_back(llvm::Type::Int32Ty); - - members.push_back(arrty); - - return llvm::StructType::get(members); -} - -////////////////////////////////////////////////////////////////////////////////////////// - -llvm::ArrayType* LLVM_DtoStaticArrayType(Type* t) -{ - if (t->llvmType) - return llvm::cast<llvm::ArrayType>(t->llvmType); - - assert(t->ty == Tsarray); - assert(t->next); - - const llvm::Type* at = LLVM_DtoType(t->next); - - TypeSArray* tsa = (TypeSArray*)t; - assert(tsa->dim->type->isintegral()); - llvm::ArrayType* arrty = llvm::ArrayType::get(at,tsa->dim->toUInteger()); - - tsa->llvmType = arrty; - return arrty; -} ////////////////////////////////////////////////////////////////////////////////////////// @@ -391,7 +341,7 @@ ////////////////////////////////////////////////////////////////////////////////////////// // llvm.memset.i32 -static llvm::Function* LLVM_DeclareMemSet32() +llvm::Function* LLVM_DeclareMemSet32() { static llvm::Function* _func = 0; if (_func == 0) { @@ -402,7 +352,7 @@ ////////////////////////////////////////////////////////////////////////////////////////// -static llvm::Function* LLVM_DeclareMemSet64() +llvm::Function* LLVM_DeclareMemSet64() { static llvm::Function* _func = 0; if (_func == 0) { @@ -414,7 +364,7 @@ ////////////////////////////////////////////////////////////////////////////////////////// // llvm.memcpy.i32 -static llvm::Function* LLVM_DeclareMemCpy32() +llvm::Function* LLVM_DeclareMemCpy32() { static llvm::Function* _func = 0; if (_func == 0) { @@ -426,7 +376,7 @@ ////////////////////////////////////////////////////////////////////////////////////////// // llvm.memcpy.i64 -static llvm::Function* LLVM_DeclareMemCpy64() +llvm::Function* LLVM_DeclareMemCpy64() { static llvm::Function* _func = 0; if (_func == 0) { @@ -556,32 +506,7 @@ return llvm::ConstantStruct::get(structtype, inits); } -////////////////////////////////////////////////////////////////////////////////////////// -llvm::Value* LLVM_DtoNullArray(llvm::Value* v) -{ - assert(gIR); - d_uns64 n = (global.params.is64bit) ? 16 : 8; - - llvm::Type* i8p_ty = llvm::PointerType::get(llvm::Type::Int8Ty); - - llvm::Value* arr = new llvm::BitCastInst(v,i8p_ty,"tmp",gIR->scopebb()); - - llvm::Function* fn = LLVM_DeclareMemSet32(); - std::vector<llvm::Value*> llargs; - llargs.resize(4); - llargs[0] = arr; - llargs[1] = llvm::ConstantInt::get(llvm::Type::Int8Ty, 0, false); - llargs[2] = llvm::ConstantInt::get(llvm::Type::Int32Ty, n, false); - llargs[3] = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false); - - //Logger::cout() << *fn << '|' << *fn->getType() << '\n'; - //Logger::cout() << "to null array call: " << *llargs[0] << '|' << *llargs[1] << '|' << *llargs[2] << '|' << *llargs[3] << '\n'; - - llvm::Value* ret = new llvm::CallInst(fn, llargs.begin(), llargs.end(), "", gIR->scopebb()); - - return ret; -} ////////////////////////////////////////////////////////////////////////////////////////// @@ -632,216 +557,7 @@ return new llvm::CallInst(fn, llargs.begin(), llargs.end(), "", gIR->scopebb()); } -////////////////////////////////////////////////////////////////////////////////////////// -llvm::Value* LLVM_DtoArrayAssign(llvm::Value* dst, llvm::Value* src) -{ - assert(gIR); - if (dst->getType() == src->getType()) - { - d_uns64 n = (global.params.is64bit) ? 16 : 8; - - llvm::Type* arrty = llvm::PointerType::get(llvm::Type::Int8Ty); - - llvm::Value* dstarr = new llvm::BitCastInst(dst,arrty,"tmp",gIR->scopebb()); - llvm::Value* srcarr = new llvm::BitCastInst(src,arrty,"tmp",gIR->scopebb()); - - llvm::Function* fn = LLVM_DeclareMemCpy32(); - std::vector<llvm::Value*> llargs; - llargs.resize(4); - llargs[0] = dstarr; - llargs[1] = srcarr; - llargs[2] = llvm::ConstantInt::get(llvm::Type::Int32Ty, n, false); - llargs[3] = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false); - - return new llvm::CallInst(fn, llargs.begin(), llargs.end(), "", gIR->scopebb()); - } - else - { - if (!llvm::isa<llvm::ArrayType>(src->getType()->getContainedType(0))) - { - Logger::cout() << "invalid: " << *src << '\n'; - assert(0); - } - const llvm::ArrayType* arrty = llvm::cast<llvm::ArrayType>(src->getType()->getContainedType(0)); - llvm::Type* dstty = llvm::PointerType::get(arrty->getElementType()); - - llvm::Value* zero = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false); - llvm::Value* one = llvm::ConstantInt::get(llvm::Type::Int32Ty, 1, false); - - llvm::Value* dstlen = new llvm::GetElementPtrInst(dst,zero,zero,"tmp",gIR->scopebb()); - llvm::Value* srclen = llvm::ConstantInt::get(LLVM_DtoSize_t(), arrty->getNumElements(), false); - new llvm::StoreInst(srclen, dstlen, gIR->scopebb()); - - llvm::Value* dstptr = new llvm::GetElementPtrInst(dst,zero,one,"tmp",gIR->scopebb()); - llvm::Value* srcptr = new llvm::BitCastInst(src,dstty,"tmp",gIR->scopebb()); - new llvm::StoreInst(srcptr, dstptr, gIR->scopebb()); - } -} - -////////////////////////////////////////////////////////////////////////////////////////// - -void LLVM_DtoArrayInit(llvm::Value* l, llvm::Value* r) -{ - const llvm::PointerType* ptrty = llvm::cast<llvm::PointerType>(l->getType()); - if (llvm::isa<llvm::ArrayType>(ptrty->getContainedType(0))) - { - const llvm::ArrayType* arrty = llvm::cast<llvm::ArrayType>(ptrty->getContainedType(0)); - llvm::Value* zero = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false); - - std::vector<llvm::Value*> args; - args.resize(3); - args[0] = new llvm::GetElementPtrInst(l,zero,zero,"tmp",gIR->scopebb()); - args[1] = llvm::ConstantInt::get(LLVM_DtoSize_t(), arrty->getNumElements(), false); - args[2] = r; - - const char* funcname = NULL; - - if (llvm::isa<llvm::PointerType>(arrty->getElementType())) { - funcname = "_d_array_init_pointer"; - - const llvm::Type* dstty = llvm::PointerType::get(llvm::PointerType::get(llvm::Type::Int8Ty)); - if (args[0]->getType() != dstty) - args[0] = new llvm::BitCastInst(args[0],dstty,"tmp",gIR->scopebb()); - - const llvm::Type* valty = llvm::PointerType::get(llvm::Type::Int8Ty); - if (args[2]->getType() != valty) - args[2] = new llvm::BitCastInst(args[2],valty,"tmp",gIR->scopebb()); - } - else if (r->getType() == llvm::Type::Int1Ty) { - funcname = "_d_array_init_i1"; - } - else if (r->getType() == llvm::Type::Int8Ty) { - funcname = "_d_array_init_i8"; - } - else if (r->getType() == llvm::Type::Int16Ty) { - funcname = "_d_array_init_i16"; - } - else if (r->getType() == llvm::Type::Int32Ty) { - funcname = "_d_array_init_i32"; - } - else if (r->getType() == llvm::Type::Int64Ty) { - funcname = "_d_array_init_i64"; - } - else if (r->getType() == llvm::Type::FloatTy) { - funcname = "_d_array_init_float"; - } - else if (r->getType() == llvm::Type::DoubleTy) { - funcname = "_d_array_init_double"; - } - else { - assert(0); - } - - Logger::cout() << *args[0] << '|' << *args[2] << '\n'; - - llvm::Function* fn = LLVM_D_GetRuntimeFunction(gIR->module, funcname); - assert(fn); - llvm::CallInst* call = new llvm::CallInst(fn, args.begin(), args.end(), "", gIR->scopebb()); - call->setCallingConv(llvm::CallingConv::C); - - Logger::println("array init call ok"); - } - else if (llvm::isa<llvm::StructType>(ptrty->getContainedType(0))) - { - assert(0 && "Only static arrays support initialisers atm"); - } - else - assert(0); -} - -////////////////////////////////////////////////////////////////////////////////////////// - -void LLVM_DtoSetArray(llvm::Value* arr, llvm::Value* dim, llvm::Value* ptr) -{ - const llvm::StructType* st = llvm::cast<llvm::StructType>(arr->getType()->getContainedType(0)); - //const llvm::PointerType* pt = llvm::cast<llvm::PointerType>(r->getType()); - - llvm::Value* zero = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false); - llvm::Value* one = llvm::ConstantInt::get(llvm::Type::Int32Ty, 1, false); - - llvm::Value* arrdim = new llvm::GetElementPtrInst(arr,zero,zero,"tmp",gIR->scopebb()); - new llvm::StoreInst(dim, arrdim, gIR->scopebb()); - - llvm::Value* arrptr = new llvm::GetElementPtrInst(arr,zero,one,"tmp",gIR->scopebb()); - new llvm::StoreInst(ptr, arrptr, gIR->scopebb()); -} - -////////////////////////////////////////////////////////////////////////////////////////// -llvm::Constant* LLVM_DtoArrayInitializer(ArrayInitializer* arrinit) -{ - Logger::println("arr init begin"); - assert(arrinit->type->ty == Tsarray); - TypeSArray* t = (TypeSArray*)arrinit->type; - integer_t tdim = t->dim->toInteger(); - - std::vector<llvm::Constant*> inits(tdim, 0); - - const llvm::Type* elemty = LLVM_DtoType(arrinit->type->next); - - assert(arrinit->index.dim == arrinit->value.dim); - for (int i=0,j=0; i < tdim; ++i) - { - Initializer* init = 0; - Expression* idx = (Expression*)arrinit->index.data[j]; - - if (idx) - { - integer_t k = idx->toInteger(); - if (i == k) - { - init = (Initializer*)arrinit->value.data[j]; - assert(init); - ++j; - } - } - else - { - init = (Initializer*)arrinit->value.data[j]; - ++j; - } - - llvm::Constant* v = 0; - - if (!init) - { - elem* e = t->next->defaultInit()->toElem(gIR); - v = llvm::cast<llvm::Constant>(e->val); - delete e; - } - else if (ExpInitializer* ex = init->isExpInitializer()) - { - elem* e = ex->exp->toElem(gIR); - v = llvm::cast<llvm::Constant>(e->val); - delete e; - } - else if (StructInitializer* si = init->isStructInitializer()) - { - v = LLVM_DtoStructInitializer(si); - } - else if (ArrayInitializer* ai = init->isArrayInitializer()) - { - v = LLVM_DtoArrayInitializer(ai); - } - else if (init->isVoidInitializer()) - { - v = llvm::UndefValue::get(elemty); - } - else - assert(v); - - inits[i] = v; - } - - llvm::ArrayType* arrty = LLVM_DtoStaticArrayType(t); - return llvm::ConstantArray::get(arrty, inits); -} - -////////////////////////////////////////////////////////////////////////////////////////// -void LLVM_DtoArrayCopy(elem* dst, elem* src) -{ - assert(0); -} //////////////////////////////////////////////////////////////////////////////////////////
--- a/gen/tollvm.h Sat Sep 01 22:26:33 2007 +0200 +++ b/gen/tollvm.h Mon Sep 03 17:34:30 2007 +0200 @@ -16,16 +16,6 @@ llvm::Value* LLVM_DtoNullDelegate(llvm::Value* v); llvm::Value* LLVM_DtoDelegateCopy(llvm::Value* dst, llvm::Value* src); -llvm::StructType* LLVM_DtoArrayType(Type* t); -llvm::ArrayType* LLVM_DtoStaticArrayType(Type* t); -llvm::Value* LLVM_DtoNullArray(llvm::Value* v); -llvm::Value* LLVM_DtoArrayAssign(llvm::Value* l, llvm::Value* r); -void LLVM_DtoSetArray(llvm::Value* arr, llvm::Value* dim, llvm::Value* ptr); -llvm::Constant* LLVM_DtoArrayInitializer(ArrayInitializer* si); -void LLVM_DtoArrayCopy(elem* dst, elem* src); - -void LLVM_DtoArrayInit(llvm::Value* l, llvm::Value* r); - llvm::GlobalValue::LinkageTypes LLVM_DtoLinkage(PROT prot, uint stc); unsigned LLVM_DtoCallingConv(LINK l); @@ -41,4 +31,9 @@ llvm::Constant* LLVM_DtoInitializer(Type* type, Initializer* init); +llvm::Function* LLVM_DeclareMemSet32(); +llvm::Function* LLVM_DeclareMemSet64(); +llvm::Function* LLVM_DeclareMemCpy32(); +llvm::Function* LLVM_DeclareMemCpy64(); + #include "enums.h"
--- a/gen/toobj.c Sat Sep 01 22:26:33 2007 +0200 +++ b/gen/toobj.c Mon Sep 03 17:34:30 2007 +0200 @@ -34,11 +34,11 @@ #include "id.h" #include "import.h" #include "template.h" -#include "irstate.h" -#include "elem.h" -#include "logger.h" -#include "tollvm.h" +#include "gen/irstate.h" +#include "gen/elem.h" +#include "gen/logger.h" +#include "gen/tollvm.h" //////////////////////////////////////////////////////////////////////////////////////////
--- a/gen/typinf.c Sat Sep 01 22:26:33 2007 +0200 +++ b/gen/typinf.c Mon Sep 03 17:34:30 2007 +0200 @@ -25,7 +25,7 @@ #include "import.h" #include "aggregate.h" -#include "logger.h" +#include "gen/logger.h" /*******************************************
--- a/premake.lua Sat Sep 01 22:26:33 2007 +0200 +++ b/premake.lua Mon Sep 03 17:34:30 2007 +0200 @@ -29,6 +29,6 @@ package.config.Release.defines = { "LLVMD_NO_LOGGER" } package.config.Debug.buildoptions = { "-g" } --package.targetprefix = "llvm" -package.includepaths = { "dmd" } +package.includepaths = { ".", "dmd" } --package.postbuildcommands = { "cd runtime; ./build.sh; cd .." } package.links = { "gc" }
--- a/test/dotproduct.d Sat Sep 01 22:26:33 2007 +0200 +++ b/test/dotproduct.d Mon Sep 03 17:34:30 2007 +0200 @@ -7,9 +7,9 @@ return x*v.x + y*v.y + z*v.z; } - void print(char* n) + void print(char[] n) { - printf("%s = vec3(%.4f, %.4f, %.4f)\n", n, x,y,z); + printf("%.*s = vec3(%.4f, %.4f, %.4f)\n", n.length, n.ptr, x,y,z); } }