Hi Ian,
Thanks so much for the pointers. I was able to insert most of the lines
except for the global extern declaration which is the following :
extern char _binary_ccu_start;
My current plugin code is as follows :
void insert_elfset_call()
{
basic_block bb = ENTRY_BLOCK_PTR->next_bb;
gimple_stmt_iterator gsi = gsi_start_bb(bb);
tree temp = create_tmp_var(TREE_TYPE(TREE_TYPE(elfset_decl)), "p");
tree var_decl = build_decl(UNKNOWN_LOCATION, VAR_DECL,
get_identifier("_binary_ccu_start"), char_type_node);
TREE_STATIC(var_decl) = 1;
DECL_EXTERNAL(var_decl) = 1; //this does not
cause var_decl to also be declared as extern globally
rest_of_decl_compilation (var_decl, 1, 0);
tree addr_var_decl = build_fold_addr_expr(var_decl);
gimple assign = gimple_build_assign_stat (temp, addr_var_decl);
gsi_insert_before(&gsi, assign, GSI_SAME_STMT);
//Build a function call from the compiled molen_elfset() code first :
function has unique attribute marked with __attribute__((user("replace")))
which helps pick it using elfset_decl
gimple elfcall = gimple_build_call(elfset_decl, 1, temp);
//gsi_insert_after (&gsi, elfcall, GSI_CONTINUE_LINKING);//can be used
to insert the call after 1st statement, still needs function call graph edge
gsi_insert_before(&gsi, elfcall, GSI_SAME_STMT);
cgraph_create_edge(cgraph_node(current_function_decl),
cgraph_node(elfset_decl), elfcall, bb->count,
compute_call_stmt_bb_frequency(current_function_decl, bb),
bb->loop_depth);
}
I get the following output from it :
;; Function main (main)
main ()
{
char * p.1;
<bb 2>:
.....
p.1 = &_binary_ccu_start;
molen_elfset (p.1);
....
}
------------------------------------------------------------------------------------
To recall I am trying to insert the following in a C program :
extern char _binary_ccu_start;
int main (int argc, char **argv)
{
....
char *p = &_binary_ccu_start;
molen_elfset(p);
...
}
Thanks,
Abhi
-----Original Message-----
From: Ian Lance Taylor
Sent: Tuesday, May 31, 2011 4:36 PM
To: Abhijit Nandy
Cc: gcc
Subject: Re: How to insert external global variable declarations and pointer
assignment statements through GCC plugin GIMPLE pass
"Abhijit Nandy" <abhijit.nandy@xxxxxxxxx> writes:
Thanks for the pointers. I have been trying to make a simple VAR_DECL
using the following call :
tree type_node = make_node(POINTER_TYPE);
//TYPE_NAME(type_node) = type_id;
tree var_decl = build0(VAR_DECL, type_node);
Use build_decl.
testcode.c:33:1: internal compiler error: Segmentation fault
When you get a segmentation fault, your first step should be to use the
debugger to find out what went wrong. That will normally point you in
the right direction.
Ian