On Sun, Feb 3, 2013 at 7:26 AM, Sudakshina Das <sudakshina1...@gmail.com> wrote: > Hello, > > Now I am trying to convert the same pass into a dynamic plugin. Since > I was having trouble doing so, I tried adding a simple dynamic plugin > which would just dump the cfg using gimple_dump_cfg. But even in this > simple plugin I faced the same problem, as explained below. > > When I build my plugin using ../install/bin/g++ it would not give any > errors. But when I used gcc instead of g++, it gave the following > error during runtime : > > cc1: error: cannot load plugin ./plugin.so > ./plugin.so: undefined symbol: decl_assembler_name > make: *** [test] Error 1 > > However, this symbol decl_assembler_name (a function) and is not > present anywhere in my plugin. It is declared in tree.c so and is not > static, so I even tried including tree.h and declaring the function as > extern. > > I don't know what else to do!!
You have to compile the plugin with a C++ compiler, as GCC 4.7 is now built as a C++ program. Richard. > Sudakshina > > > > > On Sat, Jan 26, 2013 at 1:16 AM, Sudakshina Das > <sudakshina1...@gmail.com> wrote: >> >> On Fri, Jan 25, 2013 at 9:27 PM, Richard Biener >> <richard.guent...@gmail.com> wrote: >> > On Fri, Jan 25, 2013 at 3:57 PM, Sudakshina Das >> > <sudakshina1...@gmail.com> wrote: >> >> On Fri, Jan 25, 2013 at 8:02 PM, Richard Biener >> >> <richard.guent...@gmail.com> wrote: >> >>> On Fri, Jan 25, 2013 at 3:05 PM, Sudakshina Das >> >>> <sudakshina1...@gmail.com> wrote: >> >>>> On Fri, Jan 25, 2013 at 9:46 AM, Sudakshina Das >> >>>> <sudakshina1...@gmail.com> wrote: >> >>>>> >> >>>>> On Thu, Jan 24, 2013 at 5:15 PM, Richard Biener >> >>>>> <richard.guent...@gmail.com> wrote: >> >>>>> > >> >>>>> > On Thu, Jan 24, 2013 at 7:06 AM, Sudakshina Das >> >>>>> > <sudakshina1...@gmail.com> wrote: >> >>>>> > > Dear all, >> >>>>> > > >> >>>>> > > I am currently updating a pass that was made for gcc-4.6.*, so >> >>>>> > > that it >> >>>>> > > works for gcc.4.7.2. >> >>>>> > > >> >>>>> > > In the pass for gcc-4.6.*, a code fragment from >> >>>>> > > tree-ssa-structalias.c >> >>>>> > > was picked up and used. >> >>>>> > > Given below is the fragment taken form create_function_info_for >> >>>>> > > () . >> >>>>> > > This fragment was used to create variable information for the >> >>>>> > > function >> >>>>> > > and it was picked up to perform a similar operation in the added >> >>>>> > > pass >> >>>>> > > as well. >> >>>>> > > >> >>>>> > > But in gcc-4.7.2 some changes are introduced in the fragment. >> >>>>> > > The code >> >>>>> > > given below shows the changes that have been introduced in >> >>>>> > > create_function_info_for () of tree-ssa-structalias.c in >> >>>>> > > gcc-4.7.2 >> >>>>> > > along with the original code in the comments. >> >>>>> > > >> >>>>> > > /* Add one representative for all further args. */ >> >>>>> > > if (is_varargs) >> >>>>> > > { >> >>>>> > > varinfo_t argvi; >> >>>>> > > const char *newname; >> >>>>> > > char *tempname; >> >>>>> > > tree decl; >> >>>>> > > >> >>>>> > > asprintf (&tempname, "%s.varargs", name); >> >>>>> > > newname = ggc_strdup (tempname); >> >>>>> > > free (tempname); >> >>>>> > > >> >>>>> > > /* We need sth that can be pointed to for va_start. */ >> >>>>> > > >> >>>>> > > /**************** CHANGED CODE in GCC-4.7.2 ***************/ >> >>>>> > > decl = build_fake_var_decl (ptr_type_node); >> >>>>> > > >> >>>>> > > /************ ORIGINAL CODE in GCC-4.6.2 ******************* >> >>>>> > > /* decl = create_tmp_var_raw (ptr_type_node, name); >> >>>>> > > get_var_ann (decl); >> >>>>> > > */ >> >>>>> > > >> >>>>> > > argvi = new_var_info (decl, newname); >> >>>>> > > argvi->offset = fi_parm_base + num_args; >> >>>>> > > argvi->size = ~0; >> >>>>> > > argvi->is_full_var = true; >> >>>>> > > argvi->is_heap_var = true; >> >>>>> > > argvi->fullsize = vi->fullsize; >> >>>>> > > gcc_assert (prev_vi->offset < argvi->offset); >> >>>>> > > prev_vi->next = argvi; >> >>>>> > > prev_vi = argvi; >> >>>>> > > } >> >>>>> > > >> >>>>> > > return vi; >> >>>>> > > >> >>>>> > > >> >>>>> > > So I made the same changes in the pass where this fragment was >> >>>>> > > used. >> >>>>> > > But after making the changes the pass is now giving an "internal >> >>>>> > > compiler error" and a "segmentation fault" at runtime. >> >>>>> > > >> >>>>> > > After debugging I could narrow it down to the function >> >>>>> > > build_fake_var_decl() and to be specific at the memory >> >>>>> > > allocation >> >>>>> > > statement highlighted below. >> >>>>> > > >> >>>>> > > >> >>>>> > > tree >> >>>>> > > build_fake_var_decl (tree type) >> >>>>> > > { >> >>>>> > > /************************ My debugging showed that the control >> >>>>> > > came >> >>>>> > > here *********************/ >> >>>>> > > tree decl = (tree) XOBNEW (&fake_var_decl_obstack, struct >> >>>>> > > tree_var_decl); >> >>>>> > > /************************ But did not come here >> >>>>> > > **********************************************************/ >> >>>>> > > memset (decl, 0, sizeof (struct tree_var_decl)); >> >>>>> > > TREE_SET_CODE (decl, VAR_DECL); >> >>>>> > > TREE_TYPE (decl) = type; >> >>>>> > > DECL_UID (decl) = allocate_decl_uid (); >> >>>>> > > SET_DECL_PT_UID (decl, -1); >> >>>>> > > layout_decl (decl, 0); >> >>>>> > > return decl; >> >>>>> > > } >> >>>>> > > >> >>>>> > > The builf_fake_var_decl() function is a gcc function defined in >> >>>>> > > tree-ssa-structalias.c. To be able to use it in my pass, I >> >>>>> > > removed the >> >>>>> > > keyword static in its definition. >> >>>>> > > >> >>>>> > > I cannot figure out what can possibly cause this error in the >> >>>>> > > XOBNEW function. >> >>>>> > > >> >>>>> > > Please help!!! >> >>>>> > >> >>>>> > Don't use build_fake_var_decl, use what 4.6 did, >> >>>>> > create_tmp_var_raw. >> >>>>> > >> >>>>> > Richard. >> >>>>> > >> >>>>> > >> >>>>> >> >>>>> But 4.6 used get_var_ann() also along with create_tmp_var_raw() >> >>>>> which >> >>>>> has been removed from 4.7. >> >>>> >> >>>> >> >>>> I would like to clarify my above statement by saying that 4.6 used 2 >> >>>> functions [ie. create_tmp_var_raw() and get_var_ann()] whereas 4.7 >> >>>> used only one function [build_fake_var_decl()] for the same purpose. >> >>>> Now in 4.7 get_var_ann() is unavailable. So is it safe to use only >> >>>> create_tmp_var_raw(). In other words, was get_var_ann() a redundant >> >>>> function in 4.6? >> >>> >> >>> The whole function is very special for tree-ssa-structalias.c. I have >> >>> no idea >> >>> what your pass does, but unless it closely resembles >> >>> tree-ssa-structalias.c >> >>> and shares its internal data structures you shouldn't blindly copy >> >>> over what >> >>> tree-ssa-structalias.c does (well, at least not without understanding >> >>> what you >> >>> are doing). >> >>> >> >>> What do you think you are doing with the copy of that code? >> >>> >> >>> Richard. >> >>> >> >>>> >> >>>>> >> >> >> >> >> >> The copy of the above code is from function create_function_info_for() >> >> in tree-ssa-structalias.c which is used to create variables for a >> >> function in its tree. In the pass there is a similar function named >> >> cs_create_func_info_for() used for the same purpose, except it does >> >> not create variables for all the cases. In other words some portions >> >> from the original function is omitted. Also the data structure >> >> varinfo_t is modified a bit to suite the pass and renamed as >> >> csvarinfo_t. I have copied the function from my pass below, >> >> highlighting the difference from the original function using comments. >> > >> > Well, then you can literally copy the original function. Just make sure >> > to also copy and initialize and free the obstack it uses. >> > >> >> >> Thank you!!!!! The initializing and freeing obstack was the problem. >> So with that and after removing a few more glitches the pass is now >> running!!! >> >> >> >> /* Creation function node for DECL, using NAME, and return the index >> >> of the variable we've created for the function. */ >> >> static csvarinfo_t >> >> cs_create_func_info_for (tree decl, const char *name) >> >> { >> >> csvarinfo_t vi, prev_vi; >> >> tree arg; >> >> unsigned int i; >> >> bool is_varargs = false; >> >> unsigned int num_args = count_num_arguments (decl, &is_varargs); >> >> >> >> /* Create the variable info. */ >> >> vi = cs_new_var_info (decl, name); >> >> vi->offset = 0; >> >> vi->size = 1; >> >> vi->fullsize = num_args + 1; >> >> vi->may_have_pointers = false; >> >> if (is_varargs) >> >> vi->fullsize = ~0; >> >> cs_insert_vi_for_tree (vi->decl, vi); >> >> >> >> prev_vi = vi >> >> >> >> /************ There were portions in original code with the >> >> following comments: ************** >> >> >> >> 1. Create a variable for things the function clobbers and one >> >> for things the function uses. >> >> >> >> 2. And one for the static chain. >> >> >> >> 3. Create a variable for the return var. >> >> >> >> >> >> *******************************************************************************************************/ >> >> >> >> /* Set up variables for each argument. */ >> >> arg = DECL_ARGUMENTS (decl); >> >> for (i = 1; i < num_args + 1; i++) { >> >> csvarinfo_t argvi; >> >> tree argdecl = decl; >> >> >> >> if (arg) >> >> argdecl = arg; >> >> >> >> argvi = cs_new_var_info (argdecl, alias_get_name (argdecl)); >> >> argvi->offset = i; >> >> argvi->size = 1; >> >> argvi->is_full_var = true; >> >> argvi->fullsize = vi->fullsize; >> >> if (arg) >> >> argvi->may_have_pointers = true; >> >> gcc_assert (prev_vi->offset < argvi->offset); >> >> prev_vi->next = argvi; >> >> prev_vi = argvi; >> >> if (arg) { >> >> cs_insert_vi_for_tree (arg, argvi); >> >> arg = DECL_CHAIN (arg); >> >> } >> >> } >> >> >> >> /* Add one representative for all further args. */ >> >> if (is_varargs) { >> >> csvarinfo_t argvi; >> >> const char *newname; >> >> char *tempname; >> >> tree decl; >> >> >> >> asprintf (&tempname, "%s.varargs", name); >> >> newname = ggc_strdup (tempname); >> >> free (tempname); >> >> >> >> /* We need sth that can be pointed to for va_start. */ >> >> decl = create_tmp_var_raw (ptr_type_node, name); >> >> get_var_ann (decl); >> >> >> >> argvi = cs_new_var_info (decl, newname); >> >> argvi->offset = 1 + num_args; >> >> argvi->size = ~0; >> >> argvi->is_full_var = true; >> >> argvi->is_heap_var = true; >> >> argvi->fullsize = vi->fullsize; >> >> gcc_assert (prev_vi->offset < argvi->offset); >> >> prev_vi->next = argvi; >> >> prev_vi = argvi; >> >> } >> >> >> >> return vi; >> >> } >> >> >> >> >> >> Sudakshina Das