This is the mail archive of the mailing list for the GCC project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Help with building MEM_REF node


I inserted a new local var decl in gimple, a pointer which is
malloc'ed and now I am trying to read/write in that memory.

int *mumu;
mumu = malloc ( 40 * sizeof (int));
mumu[1] = 10;

The following statement: mumu[1] = 10; which should look like this
MEM[(int *)mumu_10 + 4B] = 10;

for me, looks like:
MEM[(int * *)mumu_10 + 4B] = 10;

This is the variable insertion:
tree vardecl = build_decl (DECL_SOURCE_LOCATION (current_function_decl),
                                VAR_DECL, get_identifier ("mumu"),
TREE_ADDRESSABLE (vardecl) = 1;
DECL_CONTEXT (vardecl) = current_function_decl;
TREE_USED (vardecl) = 1;
add_local_decl (cfun, vardecl);

Then I insert the malloc call:

tree fn_ptr = make_ssa_name (vardecl);
fn = builtin_decl_explicit (BUILT_IN_MALLOC);
size = build_int_cst (integer_type_node, 40 * sizeof(int)); // testing purpose
gimple *malloc_stmt = gimple_build_call (fn, 1, size);
gimple_call_set_lhs (malloc_stmt, fn_ptr);
gsi_insert_before (&gsi, malloc_stmt, GSI_SAME_STMT);

And then I try to build a mem_ref to the pointer ssa:

tree mem_ref = fold_build2 (MEM_REF, TREE_TYPE (fn_ptr), fn_ptr,
                   build_int_cst (build_pointer_type (TREE_TYPE (fn_ptr)), 4));
gimple *stmt = gimple_build_assign (mem_ref, build_int_cst
gsi_insert_after (&gsi, stmt, GSI_SAME_STMT);

If i use build2() instead of fold_build2() compilation fails with
error: non-trivial conversion at assignment
void *
# .MEM_12 = VDEF <.MEM_2>
MEM[(int * *)mumu_10 + 4B] = 10;

I am a newbie to gcc development, any info is appreciated.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]