static inline jit_abi_t psi_jit_abi(const char *convention)
{
+ if (!strcasecmp(convention, "stdcall")) {
+ return jit_abi_stdcall;
+ }
+ if (!strcasecmp(convention, "fastcall")) {
+ return jit_abi_fastcall;
+ }
return jit_abi_cdecl;
}
static inline jit_type_t psi_jit_token_type(token_t t)
{
switch (t) {
default:
- ZEND_ASSERT(0);
+ assert(0);
/* no break */
case PSI_T_VOID:
return jit_type_void;
jit_type_t **fields)
{
size_t i = 0, argc = psi_plist_count(strct->args), nels = 0, offset = 0,
- maxalign;
+ maxalign, last_arg_pos = -1;
struct psi_decl_arg *darg;
*fields = calloc(argc + 1, sizeof(*fields));
while (psi_plist_get(strct->args, i++, &darg)) {
- jit_type_t type = jit_type_copy(psi_jit_decl_arg_type(darg));
+ jit_type_t type;
size_t padding, alignment;
+ if (darg->layout->pos == last_arg_pos) {
+ /* skip bit fields */
+ continue;
+ }
+ last_arg_pos = darg->layout->pos;
+
+ type = jit_type_copy(psi_jit_decl_arg_type(darg));
+
if ((alignment = jit_type_get_alignment(type)) > maxalign) {
maxalign = alignment;
}
/* apply struct alignment padding */
offset = (offset + maxalign - 1) & ~(maxalign - 1);
- ZEND_ASSERT(offset <= strct->size);
+ assert(offset <= strct->size);
if (offset < strct->size) {
nels += psi_jit_struct_type_pad(&(*fields)[nels], strct->size - offset);
}
signature = jit_type_create_signature(jit_abi_vararg,
jit_type_get_return(info->signature), param_types, argc + va_count,
1);
- ZEND_ASSERT(signature);
+ assert(signature);
info->impl.fn.frame = frame;
jit_apply(signature, decl->sym, args, argc, rval);