bool returnInArg(TypeFunction *tf, bool) override { if (tf->isref) { return false; } Type *rt = tf->next->toBasetype(); if (!isPOD(rt)) return true; return passByVal(tf, rt); }
bool returnInArg(TypeFunction *tf) override { // AAPCS 5.4 wants composites > 4-bytes returned by arg except for // Homogeneous Aggregates of up-to 4 float types (6.1.2.1) - an HFA. // TODO: see if Tsarray should be candidate for HFA. if (tf->isref) return false; Type *rt = tf->next->toBasetype(); if (!isPOD(rt)) return true; return rt->ty == Tsarray || (rt->ty == Tstruct && rt->size() > 4 && (gTargetMachine->Options.FloatABIType == llvm::FloatABI::Soft || !isHFA((TypeStruct *)rt))); }
bool returnInArg(TypeFunction *tf) override { if (tf->isref) { return false; } Type *rt = tf->next->toBasetype(); if (!isPOD(rt)) return true; // Return structs and static arrays on the stack. The latter is needed // because otherwise LLVM tries to actually return the array in a number // of physical registers, which leads, depending on the target, to // either horrendous codegen or backend crashes. return (rt->ty == Tstruct || rt->ty == Tsarray); }
static BOOLEAN is_pod(LEXEME **lex, SYMBOL *funcsp, SYMBOL *sym, TYPE **tp, EXPRESSION **exp) { INITLIST *lst; BOOLEAN rv = FALSE; FUNCTIONCALL funcparams; memset(&funcparams, 0, sizeof(funcparams)); funcparams.sp = sym; *lex = getTypeList(*lex, funcsp, &funcparams.arguments); lst = funcparams.arguments; while (lst) { lst->tp = PerformDeferredInitialization(lst->tp, NULL); lst = lst->next; } if (funcparams.arguments && !funcparams.arguments-> next) { rv = !!isPOD(funcparams.arguments->tp); } *exp = intNode(en_c_i, rv); *tp = &stdint; return TRUE; }