Mercurial > projects > ldc
changeset 264:a9dae3da4e87 trunk
[svn r285] Fixed D -> bool LLVM helper for floating point values.
Changed the way D-style varargs are passed, now each param should be aligned to size_t.sizeof.
author | lindquist |
---|---|
date | Sat, 14 Jun 2008 17:28:13 +0200 |
parents | 2be09ee06bc7 |
children | 455eb10696f2 |
files | gen/toir.cpp gen/tollvm.cpp tango/tango/core/Vararg.d tango/tango/text/convert/Layout.d tangotests/vararg3.d |
diffstat | 5 files changed, 31 insertions(+), 15 deletions(-) [+] |
line wrap: on
line diff
--- a/gen/toir.cpp Sat Jun 14 06:13:35 2008 +0200 +++ b/gen/toir.cpp Sat Jun 14 17:28:13 2008 +0200 @@ -1121,6 +1121,9 @@ Argument* argu = Argument::getNth(tf->parameters, i); Expression* argexp = (Expression*)arguments->data[i]; vtypes.push_back(DtoType(argexp->type)); + size_t sz = getABITypeSize(vtypes.back()); + if (sz < PTRSIZE) + vtypes.back() = DtoSize_t(); } const LLStructType* vtype = LLStructType::get(vtypes); Logger::cout() << "d-variadic argument struct type:\n" << *vtype << '\n'; @@ -1132,7 +1135,9 @@ Expression* argexp = (Expression*)arguments->data[i]; if (global.params.llvmAnnotate) DtoAnnotation(argexp->toChars()); - DtoVariadicArgument(argexp, DtoGEPi(mem,0,k,"tmp")); + LLValue* argdst = DtoGEPi(mem,0,k); + argdst = DtoBitCast(argdst, getPtrToType(DtoType(argexp->type))); + DtoVariadicArgument(argexp, argdst); } // build type info array
--- a/gen/tollvm.cpp Sat Jun 14 06:13:35 2008 +0200 +++ b/gen/tollvm.cpp Sat Jun 14 17:28:13 2008 +0200 @@ -330,14 +330,16 @@ return new llvm::ICmpInst(llvm::ICmpInst::ICMP_NE, val, zero, "tmp", gIR->scopebb()); } } + else if (t->isFloatingPoint()) + { + LLValue* zero = llvm::Constant::getNullValue(t); + return new llvm::FCmpInst(llvm::FCmpInst::FCMP_ONE, val, zero, "tmp", gIR->scopebb()); + } else if (isaPointer(t)) { LLValue* zero = llvm::Constant::getNullValue(t); return new llvm::ICmpInst(llvm::ICmpInst::ICMP_NE, val, zero, "tmp", gIR->scopebb()); } - else - { - Logger::cout() << *t << '\n'; - } + std::cout << "unsupported -> bool : " << *t << '\n'; assert(0); return 0; }
--- a/tango/tango/core/Vararg.d Sat Jun 14 06:13:35 2008 +0200 +++ b/tango/tango/core/Vararg.d Sat Jun 14 17:28:13 2008 +0200 @@ -36,10 +36,13 @@ */ T va_arg(T)(ref va_list vp) { - size_t size = T.sizeof > size_t.sizeof ? size_t.sizeof : T.sizeof; - va_list vptmp = cast(va_list)((cast(size_t)vp + size - 1) & ~(size - 1)); - vp = vptmp + T.sizeof; - return *cast(T*)vptmp; +// size_t size = T.sizeof > size_t.sizeof ? size_t.sizeof : T.sizeof; +// va_list vptmp = cast(va_list)((cast(size_t)vp + size - 1) & ~(size - 1)); +// vp = vptmp + T.sizeof; +// return *cast(T*)vptmp; + T* arg = cast(T*) vp; + vp = cast(va_list) ( cast(void*) vp + ( ( T.sizeof + size_t.sizeof - 1 ) & ~( size_t.sizeof - 1 ) ) ); + return *arg; } } else
--- a/tango/tango/text/convert/Layout.d Sat Jun 14 06:13:35 2008 +0200 +++ b/tango/tango/text/convert/Layout.d Sat Jun 14 17:28:13 2008 +0200 @@ -195,6 +195,14 @@ version (LLVMDC) { + // code for LLVMDC, all targets! + Arg[64] arglist = void; + foreach (i, arg; arguments) + { + arglist[i] = args; + args += (arg.tsize + size_t.sizeof - 1) & ~ (size_t.sizeof - 1); + } + /* static va_list get_va_arg(TypeInfo ti, ref va_list vp) { auto tisize = ti.tsize; @@ -209,6 +217,7 @@ { arglist[i] = get_va_arg(arg, args); } + */ } else version (X86_64) {
--- a/tangotests/vararg3.d Sat Jun 14 06:13:35 2008 +0200 +++ b/tangotests/vararg3.d Sat Jun 14 17:28:13 2008 +0200 @@ -113,12 +113,9 @@ private void* get_va_arg(TypeInfo ti, ref void* vp) { - auto tisize = ti.tsize; - assert(tisize); - size_t size = tisize > size_t.sizeof ? size_t.sizeof : tisize; - void* vptmp = cast(void*)((cast(size_t)vp + size - 1) & ~(size - 1)); - vp = vptmp + tisize; - return vptmp; + void* arg = vp; + vp = vp + ( ( ti.tsize + size_t.sizeof - 1 ) & ~( size_t.sizeof - 1 ) ); + return arg; } void print(TypeInfo ti, void* arg)