On Mon, Jan 18, 2016 at 6:51 PM, Prathamesh Kulkarni <prathamesh.kulkarni@xxxxxxxxxx> wrote: > On 18 January 2016 at 01:44, Cristina Georgiana Opriceana > <cristina.opriceana@xxxxxxxxx> wrote: >> Hello, >> >> I am trying to recognize array declarations, get their size and >> replace them with dynamic allocation, through malloc and free calls in >> gimple. >> >> So far I've managed to find arrays with something like: >> >> if (TREE_CODE(var) == VAR_DECL && >> TREE_CODE(var_type) == ARRAY_TYPE ) { ... } >> >> But how can I get the size of the array? > DECL_SIZE (var) for size in bits / DECL_SIZE_UNIT (var) for size in > bytes (defined in tree.h). >> >> Also, supposing that malloc is called at least once, how can I >> construct a new gimple call statement that refers to malloc? > I assume you want to pass to malloc() the size of the array ? > sth like this should perhaps work (haven't tested): > tree size = DECL_SIZE_UNIT (var); > tree malloc_decl = builtin_decl_explicit (BUILT_IN_MALLOC); > gcall *stmt = gimple_build_call (malloc_decl, 1, size); > This will create stmt, and to insert it in basic-block use one of the > gsi_insert_* () routines. > This worked indeed, thanks a lot! Now the only problem left is to compute where to insert the free() call. I found that BIND_EXPR could give me some information about the scope of the variable, but I don't know how can I access the statement list of the BIND_EXPR Also, what is the difference between BIND_EXPR and GIMPLE_BIND? I iterated over the basic blocks and on all the gimple_statement in these blocks, but none has the GIMPLE_BIND code. Thanks, Cristina > Regards, > Prathamesh >> >> Any ideas or examples would help me a lot, as I couldn't find too many. >> >> Thanks, >> Cristina