diff --git a/dynasm/Examples/run.sh b/dynasm/Examples/run.sh new file mode 100755 index 00000000..dbe93b00 --- /dev/null +++ b/dynasm/Examples/run.sh @@ -0,0 +1,13 @@ +#!/bin/bash +# set -x + +# run test +lua ../dynasm.lua test_z_inst.c | gcc -std=gnu99 -Wall -Werror -g -x c -o test_z_inst - +./test_z_inst +ec=$? + +# cleanup +rm -f ./test_z_inst + +# exit +exit $ec diff --git a/dynasm/Examples/test_z_inst.c b/dynasm/Examples/test_z_inst.c index 9c1ae26f..ed20ea65 100644 --- a/dynasm/Examples/test_z_inst.c +++ b/dynasm/Examples/test_z_inst.c @@ -2,91 +2,82 @@ #include #include -#include "../dynasm/dasm_proto.h" -#include "../dynasm/dasm_s390x.h" +#include "../dasm_proto.h" +#include "../dasm_s390x.h" -//DynASM directives. - |.arch s390x - |.actionlist actions +// DynASM directives. +|.arch s390x +|.actionlist actions -typedef struct +static void add(dasm_State *state) { - int arg1; - int arg2; - void (*fn)(dasm_State *); - int want; - char *testname; -}test_table; + dasm_State ** Dst = &state; -test_table test[] = { - {1,2,add,3,"add"}, - {10,5 ,sub ,5,"subract"} , - {2,3,mul,6,"Multiply"} - }; - - -void *jitcode(dasm_State **state); -void add(dasm_State *); -void sub(dasm_State *); -void mul(dasm_State *); - -void *jitcode(dasm_State **state) -{ - size_t size; - int dasm_status = dasm_link(state, &size); - assert(dasm_status == DASM_S_OK); - - void *ret = (int *)calloc(10,sizeof(int)); - dasm_encode(state, ret); - dasm_free(state); - - return (int *)ret; + | ar r2,r3 + | br r14 } -void add(dasm_State *state) -{ - dasm_State ** Dst = &state; - - | ar r2,r3 - | br r14 -} - -void sub(dasm_State *state) +static void sub(dasm_State *state) { dasm_State **Dst = &state; - + | sr r2,r3 | br r14 } -void mul(dasm_State *state) +static void mul(dasm_State *state) { dasm_State **Dst = &state; - + | msr r2 , r3 | br r14 } -void main(int argc, char *argv[]) +typedef struct { + int arg1; + int arg2; + void (*fn)(dasm_State *); + int want; + const char *testname; +} test_table; + +test_table test[] = { + { 1, 2, add, 3, "add"}, + {10, 5, sub, 5, "sub"}, + { 2, 3, mul, 6, "mul"} +}; + +static void *jitcode(dasm_State **state, size_t *size) +{ + int dasm_status = dasm_link(state, size); + assert(dasm_status == DASM_S_OK); + + void *ret = mmap(0, *size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + dasm_encode(state, ret); + dasm_free(state); + + mprotect(ret, *size, PROT_READ | PROT_EXEC); + return (int *)ret; +} + +int main(int argc, char *argv[]) { dasm_State *state; - dasm_State **Dst = &state; - int i; - size_t size; - - for(i=0;i