Mercurial > projects > ldc
diff gen/tocall.cpp @ 445:cc40db549aea
Changed the handling of variadic intrinsics a bit.
Removed the -fp80 option and made real be 80bit floats on X86, this is what the D spec really says it should be and fixes a bunch of issues.
Changed the handling of parameter attributes to a bit more generalized approach.
Added sext/zext attributes for byte/short/ubyte/ushort parameters, fixes #60 .
Parameter attribs now properly set for intrinsic calls if necessary.
Made the tango.math.Math patch less intrusive.
Fixed/added some mini tests.
author | Tomas Lindquist Olsen <tomas.l.olsen@gmail.com> |
---|---|
date | Fri, 01 Aug 2008 17:59:58 +0200 |
parents | 74101be2a553 |
children | 283d113d4753 |
line wrap: on
line diff
--- a/gen/tocall.cpp Fri Aug 01 01:12:33 2008 +0200 +++ b/gen/tocall.cpp Fri Aug 01 17:59:58 2008 +0200 @@ -173,8 +173,8 @@ DValue* argval = DtoArgument(fnarg, (Expression*)arguments->data[i]); args.push_back(argval->getRVal()); - if (fnarg->llvmByVal) - palist = palist.addAttr(argidx, llvm::ParamAttr::ByVal); + if (fnarg->llvmAttrs) + palist = palist.addAttr(argidx, fnarg->llvmAttrs); ++argidx; } @@ -189,8 +189,8 @@ // get func value if any DFuncValue* dfnval = fnval->isFunc(); - // handle special va_copy / va_end intrinsics - bool va_intrinsic = (dfnval && dfnval->func && (dfnval->func->llvmInternal == LLVMva_intrinsic)); + // handle special vararg intrinsics + bool va_intrinsic = (dfnval && dfnval->func && dfnval->func->isVaIntrinsic()); // get function type info TypeFunction* tf = DtoTypeFunction(fnval); @@ -263,6 +263,9 @@ // handle the rest of the arguments based on param passing style llvm::PAListPtr palist; + if (tf->llvmRetAttrs) + palist = palist.addAttr(0, tf->llvmRetAttrs); + // variadic instrinsics need some custom casts if (va_intrinsic) { @@ -293,10 +296,13 @@ Argument* fnarg = Argument::getNth(tf->parameters, i); DValue* argval = DtoArgument(fnarg, (Expression*)arguments->data[i]); LLValue* arg = argval->getRVal(); - if (fnarg && arg->getType() != callableTy->getParamType(j)) - arg = DtoBitCast(arg, callableTy->getParamType(j)); - if (fnarg && fnarg->llvmByVal) - palist = palist.addAttr(j+1, llvm::ParamAttr::ByVal); + if (fnarg) + { + if (arg->getType() != callableTy->getParamType(j)) + arg = DtoBitCast(arg, callableTy->getParamType(j)); + if (fnarg->llvmAttrs) + palist = palist.addAttr(j+1, fnarg->llvmAttrs); + } ++argiter; args.push_back(arg); } @@ -327,21 +333,17 @@ if (retllval->getType()->isAbstract()) retllval = DtoBitCast(retllval, getPtrToType(DtoType(resulttype)), "retval"); - // set calling convention + // set calling convention and parameter attributes if (dfnval && dfnval->func) { - int li = dfnval->func->llvmInternal; - if (li != LLVMintrinsic && li != LLVMva_start && li != LLVMva_intrinsic) - { + LLFunction* llfunc = llvm::dyn_cast<LLFunction>(dfnval->val); + if (llfunc && llfunc->isIntrinsic()) + palist = llvm::Intrinsic::getParamAttrs((llvm::Intrinsic::ID)llfunc->getIntrinsicID()); + else call->setCallingConv(callconv); - } } else - { call->setCallingConv(callconv); - } - - // param attrs call->setParamAttrs(palist); return new DImValue(resulttype, retllval, false);