[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Dotgnu-libjit] Convert a jit_type_ubyte to int = Segmentation fault
From: |
Klaus Treichel |
Subject: |
Re: [Dotgnu-libjit] Convert a jit_type_ubyte to int = Segmentation fault |
Date: |
Sun, 28 Aug 2011 07:08:36 +0200 |
Hi Manolo,
this is the fixed version.
#include <stdio.h>
#include <jit/jit.h>
int main(void)
{
jit_ubyte memory[65536];
jit_context_t context;
jit_type_t signature;
jit_function_t function;
jit_value_t
tmp1,tmp2,tmp3,tmp4,tmp_index,ubyte_tmp1,p_memory,p_result,constant_100000;
jit_int index,result;
index=3;
memory[index]=0x56;
/* result=memory[index]+10000*/
/* Create a context to hold the JIT's primary state */
context = jit_context_create();
/* Lock the context while we build and compile the function */
jit_context_build_start(context);
/* Build the function signature */
signature = jit_type_create_signature(jit_abi_cdecl, jit_type_void,
0, 0, 1);
/* Create the function object */
function = jit_function_create(context, signature);
tmp1 = jit_value_create(function, jit_type_void_ptr);
tmp2 = jit_value_create(function, jit_type_int);
tmp3 = jit_value_create(function, jit_type_int);
tmp4 = jit_value_create(function, jit_type_int);
constant_100000 = jit_value_create(function, jit_type_int);
p_memory=jit_value_create(function, jit_type_void_ptr);
p_result=jit_value_create(function, jit_type_void_ptr);
tmp_index = jit_value_create(function, jit_type_int);
p_memory=jit_value_create_nint_constant(function,jit_type_void_ptr,(jit_nint)&memory[0]);//*
p_memory=&memory[0]*/
p_result=jit_value_create_nint_constant(function,jit_type_void_ptr,
(jit_nint)&result); /* p_result=&result*/
constant_100000=jit_value_create_nint_constant(function,jit_type_sys_int,(jit_int)(100000));
/*constant_100000=100000*/
tmp_index=jit_value_create_nint_constant(function,jit_type_sys_int,(jit_int)(index));
/*tmp_index=index*/
jit_insn_store(function, tmp1,p_memory);/* tmp1=p_memory*/
jit_insn_store(function, tmp2,tmp_index); /*
tmp2=index*/
ubyte_tmp1=jit_insn_load_elem(function,tmp1,tmp2,jit_type_ubyte);/*ubyte_tmp1=memory(tmp1+tmp2)
*/
tmp3=jit_insn_convert(function,
ubyte_tmp1,jit_type_int,0);/*tmp3=(int)ubyte_tmp1*/ /*SEGMENT
VIOLATION*/
tmp4=jit_insn_add(function, tmp3,constant_100000); /*tmp4=tmp3
+constant_100000*/
jit_insn_store_relative(function,p_result,(jit_int)0,tmp4);/*
memory(p_result+0)=tmp4*/
/* Compile the function */
jit_function_compile(function);
jit_dump_function(stdout,function,"myfunct");
/* Unlock the context */
jit_context_build_end(context);
/* Execute the function and print the result */
jit_function_apply(function,0,0);
/* Clean up */
jit_context_destroy(context);
/* Finished */
printf("\nresult=%d\n",result);
/* Finished */
return 0;
}
1. use jit_insn_load_elem instead of jit_insn_load_relative if the index
is in a jit_value.
The other changes are for portability.
tmp1 = jit_value_create(function, jit_type_void_ptr);
with jit_type_int the generated tode doesn't run on 64bit systems
because jit_type_int is only 32bit wide.
Cheers,
Klaus
Am Sonntag, den 28.08.2011, 00:45 +0200 schrieb manolo ohara:
> Hi, I have fix the code.
> Now there is one warning, but I dont't know how to fix it.
>
> Cheers.
>
> #include <stdio.h>
> #include <jit/jit.h>
>
> int main(void)
> {
> jit_ubyte memory[65536];
> jit_context_t context;
> jit_type_t signature;
> jit_function_t function;
> jit_value_t
> tmp1,tmp2,tmp3,tmp4,tmp_index,ubyte_tmp1,p_memory,p_result,constant_100000;
> jit_int index,result;
>
> index=3;
> memory[index]=0x56;
>
> /* result=memory[index]+10000*/
>
> /* Create a context to hold the JIT's primary state */
> context = jit_context_create();
>
> /* Lock the context while we build and compile the function */
> jit_context_build_start(context);
>
> /* Build the function signature */
> signature = jit_type_create_signature(jit_abi_cdecl,
> jit_type_void, 0, 0, 1);
>
> /* Create the function object */
> function = jit_function_create(context, signature);
> tmp1 = jit_value_create(function, jit_type_int);
> tmp2 = jit_value_create(function, jit_type_int);
> tmp3 = jit_value_create(function, jit_type_int);
> tmp4 = jit_value_create(function, jit_type_int);
> constant_100000 = jit_value_create(function, jit_type_int);
> p_memory=jit_value_create(function, jit_type_void_ptr);
> p_result=jit_value_create(function, jit_type_void_ptr);
> tmp_index = jit_value_create(function, jit_type_int);
>
> p_memory=jit_value_create_nint_constant(function,jit_type_void_ptr,(jit_int)&memory[0]);//*
> p_memory=&memory[0]*/
>
> p_result=jit_value_create_nint_constant(function,jit_type_void_ptr,
> (jit_int)&result); /* p_result=&result*/
>
> constant_100000=jit_value_create_nint_constant(function,jit_type_sys_int,(jit_int)(100000));
> /*constant_100000=100000*/
>
> tmp_index=jit_value_create_nint_constant(function,jit_type_sys_int,(jit_int)(index));
> /*tmp_index=index*/
> jit_insn_store(function, tmp1,p_memory);/* tmp1=p_memory*/
> jit_insn_store(function, tmp2,tmp_index); /* tmp2=index*/
>
>
> ubyte_tmp1=jit_insn_load_relative(function,tmp1,tmp2,jit_type_ubyte);/*ubyte_tmp1=memory(tmp1+tmp2)
> */
> tmp3=jit_insn_convert(function,
> ubyte_tmp1,jit_type_int,0);/*tmp3=(int)ubyte_tmp1*/ /*SEGMENT
> VIOLATION*/
> tmp4=jit_insn_add(function, tmp3,constant_100000); /*tmp4=tmp3
> +constant_100000*/
> jit_insn_store_relative(function,p_result,(jit_int)0,tmp4);/*
> memory(p_result+0)=tmp4*/
>
> /* Compile the function */
> jit_function_compile(function);
> jit_dump_function(stdout,function,"myfunct");
> /* Unlock the context */
> jit_context_build_end(context);
>
> /* Execute the function and print the result */
>
> jit_function_apply(function,0,0);
>
>
> /* Clean up */
> jit_context_destroy(context);
>
> /* Finished */
> printf("\nresult=%d\n",result);
> /* Finished */
> return 0;
> }
>
> 2011/8/27 Klaus Treichel <address@hidden>
> Hi Manolo,
>
> first fix the compiler warnings:
>
> TestBugxxx.c: In function ‘main’:
> TestBugxxx.c:36:5: warning: passing argument 3 of
> ‘jit_value_create_nint_constant’ makes integer from pointer
> without a
> cast
> /usr/local/include/jit/jit-value.h:57:13: note: expected
> ‘jit_nint’ but
> argument is of type ‘char *’
> TestBugxxx.c:36:13: warning: assignment makes integer from
> pointer
> without a cast
> TestBugxxx.c:37:5: warning: passing argument 3 of
> ‘jit_value_create_nint_constant’ makes integer from pointer
> without a
> cast
> /usr/local/include/jit/jit-value.h:57:13: note: expected
> ‘jit_nint’ but
> argument is of type ‘jit_int *’
> TestBugxxx.c:37:13: warning: assignment makes integer from
> pointer
> without a cast
> TestBugxxx.c:38:20: warning: assignment makes integer from
> pointer
> without a cast
> TestBugxxx.c:40:7: warning: passing argument 3 of
> ‘jit_insn_store’ makes
> pointer from integer without a cast
> /usr/local/include/jit/jit-insn.h:77:5: note: expected
> ‘jit_value_t’ but
> argument is of type ‘jit_int’
> TestBugxxx.c:42:7: warning: passing argument 3 of
> ‘jit_insn_load_relative’ makes integer from pointer without a
> cast
> /usr/local/include/jit/jit-insn.h:79:13: note: expected
> ‘jit_nint’ but
> argument is of type ‘jit_value_t’
> TestBugxxx.c:44:5: warning: passing argument 3 of
> ‘jit_insn_add’ makes
> pointer from integer without a cast
> /usr/local/include/jit/jit-insn.h:98:13: note: expected
> ‘jit_value_t’
> but argument is of type ‘jit_int’
> TestBugxxx.c:45:5: warning: passing argument 2 of
> ‘jit_insn_store_relative’ makes pointer from integer without a
> cast
> /usr/local/include/jit/jit-insn.h:82:5: note: expected
> ‘jit_value_t’ but
> argument is of type ‘jit_int’
>
> These are the warnings i get with gcc 4.6 on amd64 buiding
> with the
> following command:
>
> gcc -O2 -l jit TestBugxxx.c
>
> Cheers,
> Klaus
>
> Am Mittwoch, den 24.08.2011, 17:59 +0200 schrieb manolo ohara:
>
> > Hello.
> > I'm trying to convert a jit_type_ubyte to int, but it gives
> me
> > "segmentation fault".
> > My machine: Debian 6.0 32 bits with the last libjit version.
> >
> > What's the problem?
> >
> > #include <stdio.h>
> > #include <jit/jit.h>
> >
> > int main(void)
> > { jit_int p_memory;
> > char memory[65536];
> > jit_context_t context;
> > jit_type_t signature;
> > jit_function_t function;
> > jit_value_t tmp1,tmp2,tmp3,tmp4,tmp_index,ubyte_tmp1;
> > jit_int index,constant_100000,p_result,result;
> >
> > index=3;
> > memory[index]=0x56;
> >
> > /* result=memory[index]+10000*/
> >
> > /* Create a context to hold the JIT's primary state */
> > context = jit_context_create();
> >
> > /* Lock the context while we build and compile the
> function */
> > jit_context_build_start(context);
> >
> > /* Build the function signature */
> > signature = jit_type_create_signature(jit_abi_cdecl,
> > jit_type_void, 0, 0, 1);
> >
> > /* Create the function object */
> > function = jit_function_create(context, signature);
> > tmp1 = jit_value_create(function, jit_type_int);
> > tmp2 = jit_value_create(function, jit_type_int);
> > tmp3 = jit_value_create(function, jit_type_int);
> > tmp4 = jit_value_create(function, jit_type_int);
> > tmp_index = jit_value_create(function, jit_type_int);
> > ubyte_tmp1=jit_value_create(function, jit_type_ubyte);
> >
> >
>
> p_memory=jit_value_create_nint_constant(function,jit_type_void_ptr,memory);/*
> p_memory=&memory*/
> >
> >
> p_result=jit_value_create_nint_constant(function,jit_type_void_ptr,
> > &result); /* p_result=&result*/
> >
> >
>
> constant_100000=jit_value_create_nint_constant(function,jit_type_sys_int,(jit_int)(100000));
> /*constant_100000=100000*/
> >
> >
>
> tmp_index=jit_value_create_nint_constant(function,jit_type_sys_int,(jit_int)(index));
> /*tmp_index=index*/
> > jit_insn_store(function, tmp1,p_memory);/*
> tmp1=p_memory*/
> > jit_insn_store(function, tmp2,tmp_index); /*
> tmp2=index*/
> >
> >
> >
>
> ubyte_tmp1=jit_insn_load_relative(function,tmp1,tmp2,jit_type_ubyte);/*ubyte_tmp1=memory(tmp1+tmp2)
> */
> > tmp3=jit_insn_convert(function,
> > ubyte_tmp1,jit_type_int,0);/*tmp3=(int)ubyte_tmp1*/
> /*SEGMENT
> > VIOLATION*/
> > tmp4=jit_insn_add(function,
> tmp3,constant_100000); /*tmp4=tmp3
> > +constant_100000*/
> >
> jit_insn_store_relative(function,p_result,(jit_int)0,tmp4);/*
> > memory(p_result+0)=tmp4*/
> >
> > /* Compile the function */
> > jit_function_compile(function);
> > jit_dump_function(stdout,function,"myfunct");
> > /* Unlock the context */
> > jit_context_build_end(context);
> >
> > /* Execute the function and print the result */
> >
> > jit_function_apply(function,0,0);
> >
> >
> > /* Clean up */
> > jit_context_destroy(context);
> >
> > /* Finished */
> > printf("\nresult=%d\n",result);
> > /* Finished */
> > return 0;
> > }
>
> > _______________________________________________
> > Dotgnu-libjit mailing list
> > address@hidden
> > https://lists.gnu.org/mailman/listinfo/dotgnu-libjit
>
>
signature.asc
Description: This is a digitally signed message part