void rewriteFunctionType(TypeFunction *tf, IrFuncTy &fty) override { Type *retTy = fty.ret->type->toBasetype(); if (!fty.ret->byref && retTy->ty == Tstruct) { // Rewrite HFAs only because union HFAs are turned into IR types that are // non-HFA and messes up register selection if (isHFA((TypeStruct *)retTy, &fty.ret->ltype)) { fty.ret->rewrite = &hfaToArray; fty.ret->ltype = hfaToArray.type(fty.ret->type); } else { fty.ret->rewrite = &integerRewrite; fty.ret->ltype = integerRewrite.type(fty.ret->type); } } for (auto arg : fty.args) { if (!arg->byref) rewriteArgument(fty, *arg); } // extern(D): reverse parameter order for non variadics, for DMD-compliance if (tf->linkage == LINKd && tf->varargs != 1 && fty.args.size() > 1) { fty.reverseParams = true; } }
void rewriteArgument(IrFuncTy &fty, IrFuncTyArg &arg) override { // FIXME Type *ty = arg.type->toBasetype(); if (ty->ty == Tstruct || ty->ty == Tsarray) { // Rewrite HFAs only because union HFAs are turned into IR types that are // non-HFA and messes up register selection if (ty->ty == Tstruct && isHFA((TypeStruct *)ty, &arg.ltype)) { hfaToArray.applyTo(arg, arg.ltype); } else { compositeToArray64.applyTo(arg); } } }
void rewriteFunctionType(IrFuncTy &fty) override { Type *retTy = fty.ret->type->toBasetype(); if (!fty.ret->byref && retTy->ty == Tstruct) { // Rewrite HFAs only because union HFAs are turned into IR types that are // non-HFA and messes up register selection if (isHFA((TypeStruct *)retTy, &fty.ret->ltype)) { hfaToArray.applyTo(*fty.ret, fty.ret->ltype); } else { integerRewrite.applyTo(*fty.ret); } } for (auto arg : fty.args) { if (!arg->byref) rewriteArgument(fty, *arg); } }
void rewriteArgument(IrFuncTy &fty, IrFuncTyArg &arg) override { Type *ty = arg.type->toBasetype(); if (ty->ty == Tstruct || ty->ty == Tsarray) { if (ty->ty == Tstruct && isHFA((TypeStruct *)ty, &arg.ltype, 8)) { arg.rewrite = &hfaToArray; arg.ltype = hfaToArray.type(arg.type); } else if (canRewriteAsInt(ty, true)) { arg.rewrite = &integerRewrite; arg.ltype = integerRewrite.type(arg.type); } else { arg.rewrite = &compositeToArray64; arg.ltype = compositeToArray64.type(arg.type); } } else if (ty->isintegral()) { arg.attrs.add(ty->isunsigned() ? LLAttribute::ZExt : LLAttribute::SExt); } }
void rewriteFunctionType(TypeFunction *tf, IrFuncTy &fty) override { Type *retTy = fty.ret->type->toBasetype(); if (!fty.ret->byref && retTy->ty == Tstruct) { // Rewrite HFAs only because union HFAs are turned into IR types that are // non-HFA and messes up register selection if (isHFA((TypeStruct *)retTy, &fty.ret->ltype)) { fty.ret->rewrite = &hfaToArray; fty.ret->ltype = hfaToArray.type(fty.ret->type); } else { fty.ret->rewrite = &integerRewrite; fty.ret->ltype = integerRewrite.type(fty.ret->type); } } for (auto arg : fty.args) { if (!arg->byref) rewriteArgument(fty, *arg); else if (passByVal(arg->type)) arg->attrs.remove(LLAttribute::ByVal); } }