From ed5589ce59844c7ab26408441a107904ebabe382 Mon Sep 17 00:00:00 2001 From: Paulo Andrade Date: Mon, 26 Feb 2018 09:48:50 -0300 Subject: [PATCH] Build and pass all test cases on Alpha Linux * check/lightning.c, include/lightning.h: Add the new jit_va_push interface. That should be called when passing a va_list to a C function. This is required because on Alpha a va_list is passed by value, and lightning does not know about data types, so, cannot understand it is pushing a va_list as argument. * lib/jit_names.c, lib/lightning.c: Minor changes for the new jit_code_va_push. * check/cva_list.c: Update only test case using jit_va_push, to pass a va_list to a C function. doc/body.texi: Better documentation of the varargs interface. * jit_alpha.c, jit_alpha-cpu.c: Update to properly push a C va_list and correctly calculate varargs offset. * lib/jit_aarch64-sz.c, lib/jit_aarch64.c, lib/jit_alpha-sz.c, lib/jit_arm-sz.c, lib/jit_arm.c, lib/jit_hppa-sz.c, lib/jit_hppa.c, lib/jit_ia64-sz.c, lib/jit_ia64.c, lib/jit_mips-sz.c, lib/jit_mips.c, lib/jit_ppc-sz.c, lib/jit_ppc.c, lib/jit_s390-sz.c, lib/jit_s390.c, lib/jit_sparc-sz.c, lib/jit_sparc.c, lib/jit_x86-sz.c, lib/jit_x86.c: Update for the new jit_va_push interface. --- ChangeLog | 26 ++++++++++++++++++++++++++ check/cva_list.c | 32 ++++++++++++++++---------------- check/lightning.c | 9 ++++++++- doc/body.texi | 10 ++++++++++ include/lightning.h | 3 +++ lib/jit_aarch64-sz.c | 1 + lib/jit_aarch64.c | 9 +++++++++ lib/jit_alpha-cpu.c | 5 ++++- lib/jit_alpha-sz.c | 1 + lib/jit_alpha.c | 15 +++++++++++++++ lib/jit_arm-sz.c | 2 ++ lib/jit_arm.c | 9 +++++++++ lib/jit_hppa-sz.c | 1 + lib/jit_hppa.c | 9 +++++++++ lib/jit_ia64-sz.c | 1 + lib/jit_ia64.c | 9 +++++++++ lib/jit_mips-sz.c | 3 +++ lib/jit_mips.c | 9 +++++++++ lib/jit_names.c | 2 +- lib/jit_ppc-sz.c | 4 ++++ lib/jit_ppc.c | 9 +++++++++ lib/jit_s390-sz.c | 2 ++ lib/jit_s390.c | 9 +++++++++ lib/jit_sparc-sz.c | 1 + lib/jit_sparc.c | 9 +++++++++ lib/jit_x86-sz.c | 4 ++++ lib/jit_x86.c | 9 +++++++++ lib/lightning.c | 4 ++-- 28 files changed, 186 insertions(+), 21 deletions(-) diff --git a/ChangeLog b/ChangeLog index 660f01809..3ace35a11 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,29 @@ +2018-02-26 Paulo Andrade + + * check/lightning.c, include/lightning.h: Add the new jit_va_push + interface. That should be called when passing a va_list to a C + function. This is required because on Alpha a va_list is passed + by value, and lightning does not know about data types, so, cannot + understand it is pushing a va_list as argument. + + * lib/jit_names.c, lib/lightning.c: Minor changes for the new + jit_code_va_push. + + * check/cva_list.c: Update only test case using jit_va_push, to + pass a va_list to a C function. + + doc/body.texi: Better documentation of the varargs interface. + + * jit_alpha.c, jit_alpha-cpu.c: Update to properly push a + C va_list and correctly calculate varargs offset. + + * lib/jit_aarch64-sz.c, lib/jit_aarch64.c, lib/jit_alpha-sz.c, + lib/jit_arm-sz.c, lib/jit_arm.c, lib/jit_hppa-sz.c, lib/jit_hppa.c, + lib/jit_ia64-sz.c, lib/jit_ia64.c, lib/jit_mips-sz.c, lib/jit_mips.c, + lib/jit_ppc-sz.c, lib/jit_ppc.c, lib/jit_s390-sz.c, lib/jit_s390.c, + lib/jit_sparc-sz.c, lib/jit_sparc.c, lib/jit_x86-sz.c, lib/jit_x86.c: + Update for the new jit_va_push interface. + 2018-02-22 Paulo Andrade * lib/jit_alpha-cpu.c: Always set t12 to the address of the diff --git a/check/cva_list.c b/check/cva_list.c index 350d79615..b0e668c39 100644 --- a/check/cva_list.c +++ b/check/cva_list.c @@ -586,7 +586,7 @@ int main(int argc, char *argv[]) jit_va_start(JIT_V0); jit_prepare(); jit_pushargr(JIT_V1); - jit_pushargr(JIT_V0); + jit_va_push(JIT_V0); jit_finishi(va_i_iiiiiiiii); jit_va_end(JIT_V0); jit_ret(); @@ -603,7 +603,7 @@ int main(int argc, char *argv[]) jit_prepare(); jit_pushargr(JIT_V1); jit_pushargr(JIT_V2); - jit_pushargr(JIT_V0); + jit_va_push(JIT_V0); jit_finishi(va_ii_iiiiiiii); jit_va_end(JIT_V0); jit_ret(); @@ -617,7 +617,7 @@ int main(int argc, char *argv[]) jit_va_start(JIT_V0); jit_prepare(); jit_pushargr_d(JIT_F3); - jit_pushargr(JIT_V0); + jit_va_push(JIT_V0); jit_finishi(va_d_ddddddddd); jit_va_end(JIT_V0); jit_ret(); @@ -634,7 +634,7 @@ int main(int argc, char *argv[]) jit_prepare(); jit_pushargr_d(JIT_F3); jit_pushargr_d(JIT_F4); - jit_pushargr(JIT_V0); + jit_va_push(JIT_V0); jit_finishi(va_dd_dddddddd); jit_va_end(JIT_V0); jit_ret(); @@ -648,7 +648,7 @@ int main(int argc, char *argv[]) jit_va_start(JIT_V0); jit_prepare(); jit_pushargr(JIT_V1); - jit_pushargr(JIT_V0); + jit_va_push(JIT_V0); jit_finishi(va_i_didididid); jit_va_end(JIT_V0); jit_ret(); @@ -665,7 +665,7 @@ int main(int argc, char *argv[]) jit_prepare(); jit_pushargr(JIT_V1); jit_pushargr_d(JIT_F3); - jit_pushargr(JIT_V0); + jit_va_push(JIT_V0); jit_finishi(va_id_idididid); jit_va_end(JIT_V0); jit_ret(); @@ -679,7 +679,7 @@ int main(int argc, char *argv[]) jit_va_start(JIT_V0); jit_prepare(); jit_pushargr_d(JIT_F3); - jit_pushargr(JIT_V0); + jit_va_push(JIT_V0); jit_finishi(va_d_ididididi); jit_va_end(JIT_V0); jit_ret(); @@ -696,7 +696,7 @@ int main(int argc, char *argv[]) jit_prepare(); jit_pushargr_d(JIT_F3); jit_pushargr(JIT_V1); - jit_pushargr(JIT_V0); + jit_va_push(JIT_V0); jit_finishi(va_di_didididi); jit_va_end(JIT_V0); jit_ret(); @@ -723,7 +723,7 @@ int main(int argc, char *argv[]) jit_pushargi(1); jit_pushargr(JIT_V1); jit_pushargr(JIT_V2); - jit_pushargr(JIT_V0); + jit_va_push(JIT_V0); jit_finishi(va_iii_iiiiiii); jit_va_end(JIT_V0); jit_ret(); @@ -750,7 +750,7 @@ int main(int argc, char *argv[]) jit_pushargi(2); jit_pushargr(JIT_V1); jit_pushargr(JIT_V2); - jit_pushargr(JIT_V0); + jit_va_push(JIT_V0); jit_finishi(va_iiii_iiiiii); jit_va_end(JIT_V0); jit_ret(); @@ -771,7 +771,7 @@ int main(int argc, char *argv[]) jit_pushargi_d(1); jit_pushargr_d(JIT_F3); jit_pushargr_d(JIT_F4); - jit_pushargr(JIT_V0); + jit_va_push(JIT_V0); jit_finishi(va_ddd_ddddddd); jit_va_end(JIT_V0); jit_ret(); @@ -798,7 +798,7 @@ int main(int argc, char *argv[]) jit_pushargi_d(2); jit_pushargr_d(JIT_F3); jit_pushargr_d(JIT_F4); - jit_pushargr(JIT_V0); + jit_va_push(JIT_V0); jit_finishi(va_dddd_dddddd); jit_va_end(JIT_V0); jit_ret(); @@ -819,7 +819,7 @@ int main(int argc, char *argv[]) jit_pushargi(1); jit_pushargr_d(JIT_F3); jit_pushargr(JIT_V1); - jit_pushargr(JIT_V0); + jit_va_push(JIT_V0); jit_finishi(va_idi_dididid); jit_va_end(JIT_V0); jit_ret(); @@ -846,7 +846,7 @@ int main(int argc, char *argv[]) jit_pushargi_d(2); jit_pushargr(JIT_V1); jit_pushargr_d(JIT_F3); - jit_pushargr(JIT_V0); + jit_va_push(JIT_V0); jit_finishi(va_idid_ididid); jit_va_end(JIT_V0); jit_ret(); @@ -867,7 +867,7 @@ int main(int argc, char *argv[]) jit_pushargi_d(1); jit_pushargr(JIT_V1); jit_pushargr_d(JIT_F3); - jit_pushargr(JIT_V0); + jit_va_push(JIT_V0); jit_finishi(va_did_idididi); jit_va_end(JIT_V0); jit_ret(); @@ -894,7 +894,7 @@ int main(int argc, char *argv[]) jit_pushargi(2); jit_pushargr_d(JIT_F3); jit_pushargr(JIT_V1); - jit_pushargr(JIT_V0); + jit_va_push(JIT_V0); jit_finishi(va_didi_dididi); jit_va_end(JIT_V0); jit_ret(); diff --git a/check/lightning.c b/check/lightning.c index 2572e6293..448d251d4 100644 --- a/check/lightning.c +++ b/check/lightning.c @@ -497,7 +497,7 @@ static void bunordr_d(void); static void bunordi_d(void); static void pushargr_d(void); static void pushargi_d(void); static void retr_d(void); static void reti_d(void); static void retval_d(void); -static void vastart(void); +static void vastart(void); static void vapush(void); static void vaarg(void); static void vaarg_d(void); static void vaend(void); @@ -811,6 +811,7 @@ static instr_t instr_vector[] = { entry(retr_d), entry(reti_d), entry(retval_d), entry2("va_start", vastart), + entry2("va_push", vapush), entry2("va_arg", vaarg), entry2("va_arg_d", vaarg_d), entry2("va_end", vaend), @@ -1658,6 +1659,12 @@ vastart(void) jit_va_start(r0); } static void +vapush(void) +{ + jit_gpr_t r0 = get_ireg(); + jit_va_push(r0); +} +static void vaarg(void) { jit_gpr_t r0 = get_ireg(), r1 = get_ireg(); diff --git a/doc/body.texi b/doc/body.texi index 09e98666e..60f569218 100644 --- a/doc/body.texi +++ b/doc/body.texi @@ -400,15 +400,19 @@ that uses the appropriate wordsize call. These are: @example prepare (not specified) +va_start (not specified) pushargr _f _d pushargi _f _d +va_push (not specified) arg _c _uc _s _us _i _ui _l _f _d getarg _c _uc _s _us _i _ui _l _f _d +va_arg _d putargr _f _d putargi _f _d ret (not specified) retr _f _d reti _f _d +va_end (not specified) retval _c _uc _s _us _i _ui _l _f _d epilog (not specified) @end example @@ -425,6 +429,12 @@ the @code{pushargr} or @code{pushargi} to push the arguments @strong{in left to right order}; and use @code{finish} or @code{call} (explained below) to perform the actual call. +@code{va_start} returns a @code{C} compatible @code{va_list}. To fetch +arguments, use @code{va_arg} for integers and @code{va_arg_d} for doubles. +@code{va_push} is required when passing a @code{va_list} to another function, +because not all architectures expect it as a single pointer. Known case +is DEC Alpha, that requires it as a structure passed by value. + @code{arg}, @code{getarg} and @code{putarg} are used by the callee. @code{arg} is different from other instruction in that it does not actually generate any code: instead, it is a function which returns diff --git a/include/lightning.h b/include/lightning.h index c30dfd2fd..55657c858 100644 --- a/include/lightning.h +++ b/include/lightning.h @@ -202,6 +202,8 @@ typedef enum { #define jit_ellipsis() _jit_ellipsis(_jit) jit_code_ellipsis, +#define jit_va_push(u) _jit_va_push(_jit,u) + jit_code_va_push, #define jit_allocai(u) _jit_allocai(_jit,u) #define jit_allocar(u, v) _jit_allocar(_jit,u,v) jit_code_allocai, jit_code_allocar, @@ -950,6 +952,7 @@ extern void _jit_putargi(jit_state_t*, jit_word_t, jit_node_t*); extern void _jit_prepare(jit_state_t*); extern void _jit_ellipsis(jit_state_t*); +extern void _jit_va_push(jit_state_t*, jit_gpr_t); extern void _jit_pushargr(jit_state_t*, jit_gpr_t); extern void _jit_pushargi(jit_state_t*, jit_word_t); extern void _jit_finishr(jit_state_t*, jit_gpr_t); diff --git a/lib/jit_aarch64-sz.c b/lib/jit_aarch64-sz.c index 75a5e78ac..7e22e0e7b 100644 --- a/lib/jit_aarch64-sz.c +++ b/lib/jit_aarch64-sz.c @@ -11,6 +11,7 @@ 0, /* label */ 120, /* prolog */ 0, /* ellipsis */ + 0, /* va_push */ 0, /* allocai */ 0, /* allocar */ 0, /* arg */ diff --git a/lib/jit_aarch64.c b/lib/jit_aarch64.c index c1fb11d9f..2d0f2b4c7 100644 --- a/lib/jit_aarch64.c +++ b/lib/jit_aarch64.c @@ -371,6 +371,14 @@ _jit_ellipsis(jit_state_t *_jit) jit_dec_synth(); } +void +_jit_va_push(jit_state_t *_jit, jit_int32_t u) +{ + jit_inc_synth_w(va_push, u); + jit_pushargr(u); + jit_dec_synth(); +} + jit_node_t * _jit_arg(jit_state_t *_jit) { @@ -1452,6 +1460,7 @@ _emit_code(jit_state_t *_jit) vaarg_d(rn(node->u.w), rn(node->v.w)); break; case jit_code_live: case jit_code_ellipsis: + case jit_code_va_push: case jit_code_allocai: case jit_code_allocar: case jit_code_arg: case jit_code_arg_f: case jit_code_arg_d: diff --git a/lib/jit_alpha-cpu.c b/lib/jit_alpha-cpu.c index afc22bb44..a59029095 100644 --- a/lib/jit_alpha-cpu.c +++ b/lib/jit_alpha-cpu.c @@ -2689,7 +2689,10 @@ _vastart(jit_state_t *_jit, jit_int32_t r0) stxi(offsetof(jit_va_list_t, base), r0, rn(reg)); /* Initialize the offset field */ - movi(rn(reg), _jitc->function->vagp * 8); + if (_jitc->function.vagp < 6) + movi(rn(reg), _jitc->function->vagp * 8); + else + movi(rn(reg), _jitc->function->self.size - (stack_framesize - 48)); stxi(offsetof(jit_va_list_t, offset), r0, rn(reg)); jit_unget_reg(reg); diff --git a/lib/jit_alpha-sz.c b/lib/jit_alpha-sz.c index c605d5b9b..e1a572aab 100644 --- a/lib/jit_alpha-sz.c +++ b/lib/jit_alpha-sz.c @@ -11,6 +11,7 @@ 0, /* label */ 76, /* prolog */ 0, /* ellipsis */ + 0, /* va_push */ 0, /* allocai */ 0, /* allocar */ 0, /* arg */ diff --git a/lib/jit_alpha.c b/lib/jit_alpha.c index 90f8556c4..a950a33d4 100644 --- a/lib/jit_alpha.c +++ b/lib/jit_alpha.c @@ -346,6 +346,20 @@ _jit_ellipsis(jit_state_t *_jit) jit_dec_synth(); } +void +_jit_va_push(jit_state_t *_jit, jit_int32_t u) +{ + jit_int32_t reg; + jit_inc_synth_w(va_push, u); + reg = jit_get_reg(jit_class_gpr); + jit_ldxi(reg, u, offsetof(jit_va_list_t, base)); + jit_pushargr(reg); + jit_ldxi(reg, u, offsetof(jit_va_list_t, offset)); + jit_pushargr(reg); + jit_unget_reg(reg); + jit_dec_synth(); +} + jit_node_t * _jit_arg(jit_state_t *_jit) { @@ -1406,6 +1420,7 @@ _emit_code(jit_state_t *_jit) vaarg_d(rn(node->u.w), rn(node->v.w)); break; case jit_code_live: case jit_code_ellipsis: + case jit_code_va_push: case jit_code_allocai: case jit_code_allocar: case jit_code_arg: case jit_code_arg_f: case jit_code_arg_d: diff --git a/lib/jit_arm-sz.c b/lib/jit_arm-sz.c index aa991f3f8..9f0d01282 100644 --- a/lib/jit_arm-sz.c +++ b/lib/jit_arm-sz.c @@ -12,6 +12,7 @@ 0, /* label */ 34, /* prolog */ 0, /* ellipsis */ + 0, /* va_push */ 0, /* allocai */ 0, /* allocar */ 0, /* arg */ @@ -415,6 +416,7 @@ 0, /* label */ 30, /* prolog */ 0, /* ellipsis */ + 0, /* va_push */ 0, /* allocai */ 0, /* allocar */ 0, /* arg */ diff --git a/lib/jit_arm.c b/lib/jit_arm.c index 6e73b1dfd..7578865ab 100644 --- a/lib/jit_arm.c +++ b/lib/jit_arm.c @@ -549,6 +549,14 @@ _jit_ellipsis(jit_state_t *_jit) jit_dec_synth(); } +void +_jit_va_push(jit_state_t *_jit, jit_int32_t u) +{ + jit_inc_synth_w(va_push, u); + jit_pushargr(u); + jit_dec_synth(); +} + jit_node_t * _jit_arg(jit_state_t *_jit) { @@ -1885,6 +1893,7 @@ _emit_code(jit_state_t *_jit) vfp_vaarg_d(rn(node->u.w), rn(node->v.w)); break; case jit_code_live: case jit_code_ellipsis: + case jit_code_va_push: case jit_code_allocai: case jit_code_allocar: case jit_code_arg: case jit_code_arg_f: case jit_code_arg_d: diff --git a/lib/jit_hppa-sz.c b/lib/jit_hppa-sz.c index 0903a69d0..3c04f6372 100644 --- a/lib/jit_hppa-sz.c +++ b/lib/jit_hppa-sz.c @@ -11,6 +11,7 @@ 0, /* label */ 64, /* prolog */ 0, /* ellipsis */ + 0, /* va_push */ 0, /* allocai */ 0, /* allocar */ 0, /* arg */ diff --git a/lib/jit_hppa.c b/lib/jit_hppa.c index 41e2df241..bb7182746 100644 --- a/lib/jit_hppa.c +++ b/lib/jit_hppa.c @@ -329,6 +329,14 @@ _jit_ellipsis(jit_state_t *_jit) jit_dec_synth(); } +void +_jit_va_push(jit_state_t *_jit, jit_int32_t u) +{ + jit_inc_synth_w(va_push, u); + jit_pushargr(u); + jit_dec_synth(); +} + jit_node_t * _jit_arg(jit_state_t *_jit) { @@ -1387,6 +1395,7 @@ _emit_code(jit_state_t *_jit) break; case jit_code_live: case jit_code_arg: case jit_code_ellipsis: + case jit_code_va_push: case jit_code_allocai: case jit_code_allocar: case jit_code_arg_f: case jit_code_arg_d: case jit_code_va_end: diff --git a/lib/jit_ia64-sz.c b/lib/jit_ia64-sz.c index 89c7fd7c2..59826d99d 100644 --- a/lib/jit_ia64-sz.c +++ b/lib/jit_ia64-sz.c @@ -11,6 +11,7 @@ 0, /* label */ 224, /* prolog */ 0, /* ellipsis */ + 0, /* va_push */ 0, /* allocai */ 0, /* allocar */ 0, /* arg */ diff --git a/lib/jit_ia64.c b/lib/jit_ia64.c index d13232cae..8f60b2e7f 100644 --- a/lib/jit_ia64.c +++ b/lib/jit_ia64.c @@ -432,6 +432,14 @@ _jit_ellipsis(jit_state_t *_jit) jit_dec_synth(); } +void +_jit_va_push(jit_state_t *_jit, jit_int32_t u) +{ + jit_inc_synth_w(va_push, u); + jit_pushargr(u); + jit_dec_synth(); +} + jit_node_t * _jit_arg(jit_state_t *_jit) { @@ -1578,6 +1586,7 @@ _emit_code(jit_state_t *_jit) break; case jit_code_live: case jit_code_arg: case jit_code_ellipsis: + case jit_code_va_push: case jit_code_allocai: case jit_code_allocar: case jit_code_arg_f: case jit_code_arg_d: case jit_code_va_end: diff --git a/lib/jit_mips-sz.c b/lib/jit_mips-sz.c index 208ef32ea..613aa0090 100644 --- a/lib/jit_mips-sz.c +++ b/lib/jit_mips-sz.c @@ -12,6 +12,7 @@ 0, /* label */ 44, /* prolog */ 0, /* ellipsis */ + 0, /* va_push */ 0, /* allocai */ 0, /* allocar */ 0, /* arg */ @@ -415,6 +416,7 @@ 0, /* label */ 116, /* prolog */ 0, /* ellipsis */ + 0, /* va_push */ 0, /* allocai */ 0, /* allocar */ 0, /* arg */ @@ -817,6 +819,7 @@ 0, /* label */ 44, /* prolog */ 0, /* ellipsis */ + 0, /* va_push */ 0, /* allocai */ 0, /* allocar */ 0, /* arg */ diff --git a/lib/jit_mips.c b/lib/jit_mips.c index 53fa22e70..cca3d76d9 100644 --- a/lib/jit_mips.c +++ b/lib/jit_mips.c @@ -489,6 +489,14 @@ _jit_ellipsis(jit_state_t *_jit) jit_dec_synth(); } +void +_jit_va_push(jit_state_t *_jit, jit_int32_t u) +{ + jit_inc_synth_w(va_push, u); + jit_pushargr(u); + jit_dec_synth(); +} + jit_node_t * _jit_arg(jit_state_t *_jit) { @@ -1779,6 +1787,7 @@ _emit_code(jit_state_t *_jit) break; case jit_code_live: case jit_code_arg: case jit_code_ellipsis: + case jit_code_va_push: case jit_code_allocai: case jit_code_allocar: case jit_code_arg_f: case jit_code_arg_d: case jit_code_va_end: diff --git a/lib/jit_names.c b/lib/jit_names.c index 2ef6a0663..ba09a6a47 100644 --- a/lib/jit_names.c +++ b/lib/jit_names.c @@ -24,7 +24,7 @@ static char *code_name[] = { "#name", "#note", "label", "prolog", - "ellipsis", + "ellipsis", "va_push", "allocai", "allocar", "arg", "getarg_c", "getarg_uc", diff --git a/lib/jit_ppc-sz.c b/lib/jit_ppc-sz.c index c206b0f66..22a6e2543 100644 --- a/lib/jit_ppc-sz.c +++ b/lib/jit_ppc-sz.c @@ -12,6 +12,7 @@ 0, /* label */ 44, /* prolog */ 0, /* ellipsis */ + 0, /* va_push */ 0, /* allocai */ 0, /* allocar */ 0, /* arg */ @@ -416,6 +417,7 @@ 0, /* label */ 136, /* prolog */ 0, /* ellipsis */ + 0, /* va_push */ 0, /* allocai */ 0, /* allocar */ 0, /* arg */ @@ -821,6 +823,7 @@ 0, /* label */ 148, /* prolog */ 0, /* ellipsis */ + 0, /* va_push */ 0, /* allocai */ 0, /* allocar */ 0, /* arg */ @@ -1226,6 +1229,7 @@ 0, /* label */ 124, /* prolog */ 0, /* ellipsis */ + 0, /* va_push */ 0, /* allocai */ 0, /* allocar */ 0, /* arg */ diff --git a/lib/jit_ppc.c b/lib/jit_ppc.c index 2c8a8141e..68db716aa 100644 --- a/lib/jit_ppc.c +++ b/lib/jit_ppc.c @@ -340,6 +340,14 @@ _jit_ellipsis(jit_state_t *_jit) jit_dec_synth(); } +void +_jit_va_push(jit_state_t *_jit, jit_int32_t u) +{ + jit_inc_synth_w(va_push, u); + jit_pushargr(u); + jit_dec_synth(); +} + jit_node_t * _jit_arg(jit_state_t *_jit) { @@ -1603,6 +1611,7 @@ _emit_code(jit_state_t *_jit) break; case jit_code_live: case jit_code_arg: case jit_code_ellipsis: + case jit_code_va_push: case jit_code_allocai: case jit_code_allocar: case jit_code_arg_f: case jit_code_arg_d: case jit_code_va_end: diff --git a/lib/jit_s390-sz.c b/lib/jit_s390-sz.c index d1d8861c7..bb8b2dc97 100644 --- a/lib/jit_s390-sz.c +++ b/lib/jit_s390-sz.c @@ -11,6 +11,7 @@ 2, /* label */ 42, /* prolog */ 0, /* ellipsis */ + 0, /* va_push */ 0, /* allocai */ 0, /* allocar */ 0, /* arg */ @@ -412,6 +413,7 @@ 2, /* label */ 42, /* prolog */ 0, /* ellipsis */ + 0, /* va_push */ 0, /* allocai */ 0, /* allocar */ 0, /* arg */ diff --git a/lib/jit_s390.c b/lib/jit_s390.c index 67335bfc4..27e887100 100644 --- a/lib/jit_s390.c +++ b/lib/jit_s390.c @@ -343,6 +343,14 @@ _jit_ellipsis(jit_state_t *_jit) jit_dec_synth(); } +void +_jit_va_push(jit_state_t *_jit, jit_int32_t u) +{ + jit_inc_synth_w(va_push, u); + jit_pushargr(u); + jit_dec_synth(); +} + jit_node_t * _jit_arg(jit_state_t *_jit) { @@ -1480,6 +1488,7 @@ _emit_code(jit_state_t *_jit) vaarg_d(rn(node->u.w), rn(node->v.w)); break; case jit_code_live: case jit_code_ellipsis: + case jit_code_va_push: case jit_code_allocai: case jit_code_allocar: case jit_code_arg: case jit_code_arg_f: case jit_code_arg_d: diff --git a/lib/jit_sparc-sz.c b/lib/jit_sparc-sz.c index 473c0cad7..654e34e11 100644 --- a/lib/jit_sparc-sz.c +++ b/lib/jit_sparc-sz.c @@ -11,6 +11,7 @@ 0, /* label */ 16, /* prolog */ 0, /* ellipsis */ + 0, /* va_push */ 0, /* allocai */ 0, /* allocar */ 0, /* arg */ diff --git a/lib/jit_sparc.c b/lib/jit_sparc.c index 2df67e45d..16d2610f8 100644 --- a/lib/jit_sparc.c +++ b/lib/jit_sparc.c @@ -298,6 +298,14 @@ _jit_ellipsis(jit_state_t *_jit) jit_dec_synth(); } +void +_jit_va_push(jit_state_t *_jit, jit_int32_t u) +{ + jit_inc_synth_w(va_push, u); + jit_pushargr(u); + jit_dec_synth(); +} + jit_node_t * _jit_arg(jit_state_t *_jit) { @@ -1398,6 +1406,7 @@ _emit_code(jit_state_t *_jit) vaarg_d(rn(node->u.w), rn(node->v.w)); break; case jit_code_live: case jit_code_ellipsis: + case jit_code_va_push: case jit_code_allocai: case jit_code_allocar: case jit_code_arg: case jit_code_arg_f: case jit_code_arg_d: diff --git a/lib/jit_x86-sz.c b/lib/jit_x86-sz.c index feb4c488a..7183e6de4 100644 --- a/lib/jit_x86-sz.c +++ b/lib/jit_x86-sz.c @@ -11,6 +11,7 @@ 3, /* label */ 34, /* prolog */ 0, /* ellipsis */ + 0, /* va_push */ 0, /* allocai */ 0, /* allocar */ 0, /* arg */ @@ -413,6 +414,7 @@ 7, /* label */ 130, /* prolog */ 0, /* ellipsis */ + 0, /* va_push */ 0, /* allocai */ 0, /* allocar */ 0, /* arg */ @@ -814,6 +816,7 @@ 3, /* label */ 108, /* prolog */ 0, /* ellipsis */ + 0, /* va_push */ 0, /* allocai */ 0, /* allocar */ 0, /* arg */ @@ -1214,6 +1217,7 @@ 7, /* label */ 115, /* prolog */ 0, /* ellipsis */ + 0, /* va_push */ 0, /* allocai */ 0, /* allocar */ 0, /* arg */ diff --git a/lib/jit_x86.c b/lib/jit_x86.c index 0bbce1ad8..aae796b46 100644 --- a/lib/jit_x86.c +++ b/lib/jit_x86.c @@ -620,6 +620,14 @@ _jit_ellipsis(jit_state_t *_jit) jit_dec_synth(); } +void +_jit_va_push(jit_state_t *_jit, jit_int32_t u) +{ + jit_inc_synth_w(va_push, u); + jit_pushargr(u); + jit_dec_synth(); +} + jit_node_t * _jit_arg(jit_state_t *_jit) { @@ -2075,6 +2083,7 @@ _emit_code(jit_state_t *_jit) vaarg_d(rn(node->u.w), rn(node->v.w), jit_x87_reg_p(node->u.w)); break; case jit_code_live: case jit_code_ellipsis: + case jit_code_va_push: case jit_code_allocai: case jit_code_allocar: case jit_code_arg: case jit_code_arg_f: case jit_code_arg_d: diff --git a/lib/lightning.c b/lib/lightning.c index 166aebf93..31205034b 100644 --- a/lib/lightning.c +++ b/lib/lightning.c @@ -1253,8 +1253,8 @@ _jit_classify(jit_state_t *_jit, jit_code_t code) switch (code) { case jit_code_data: case jit_code_save: case jit_code_load: case jit_code_name: case jit_code_label: case jit_code_note: - case jit_code_prolog: case jit_code_ellipsis: case jit_code_epilog: - case jit_code_ret: case jit_code_prepare: + case jit_code_prolog: case jit_code_ellipsis: case jit_code_va_push: + case jit_code_epilog: case jit_code_ret: case jit_code_prepare: mask = 0; break; case jit_code_live: case jit_code_va_end: