I think these changes should be enclosed by some macro ( shall we use the #ifdef KEY? ). Also, these changes should be only applied under "if (flag_spin_file)". For example:
if (flag_spin_file) { TREE_TO_TRANSLATED_GS(olddecl) = TREE_TO_TRANSLATED_GS(newdecl); FULLY_TRANSLATED_TO_GS(olddecl) = FULLY_TRANSLATED_TO_GS(newdecl); } 2010/8/15 Chen, Rui (Roger, TSG-GDCC-SH) <rui.c...@hp.com>: > Hi all, > > > > This is the fix for bug 582 (https://bugs.open64.net/show_bug.cgi?id=582). > Can gatekeeper help to review it? > > > > I attached the test case (min.i) and patch (582.patch). You can reproduce > the problem with “openCC -O0 -g -c min.i”. > > > > This bug caused by merge user declared “log” function with built-in “log” > function. The front-end forgets to copy GSPIN related fields and declaration > assembler name. > > > > If you are interested in the analysis process, here it is: > > > > Breakpoints you need to setup: > > b name-lookup.c:615 if strcmp(name.identifier.id.str, "log") == 0 > > b passes.c:148 > > > > Compiler will initial built-in functions first, so those functions declared > in osprey-gcc-4.2.0/gcc/builtins.def will be translated to gcc tree. And > built-in “log” will be translated twice, one into global namespace, one into > std namespace. > > > > Then the second breakpoint is triggered. This method checks whether the > declared function has “alias” attribute or not. If the answer is yes, it > will translate gcc tree to open64 gspin tree: > > > > #ifdef KEY > > /* Put aliases into the list of decls emitted by g++ so that we can > > * iterate through the list when expanding aliases to WHIRL. An > alias > > * can be expanded only if its target, which can be another alias, > is > > * expanded. Bug 4393. */ > > if (flag_spin_file) > > gspin_gxx_emits_decl(decl); > > #endif > > > > In this test case, it declares: > > > > extern __typeof(pthread_once) __gthrw_pthread_once > __attribute__ ((__weakref__("pthread_once"))); > > > > __weakref__ means “alias” attribute, so compiler start translation at this > time. At this time, only built-in log can be found by compiler. > > > > After that, compiler parsed user defined “log”. It then find out we have > already defined a “log” in the global namespace. (name-lookup.c, line 623) > So it tries to merge the declarations. (duplicate_decls function in decl.c) > > > > I patched this file, to let it also copy gspin related fields and > declaration assembler name. > > > > Then after compiler parsed the whole file, it will translate gcc tree to > gspin tree again. Without the patch, it just re-use the built-in log gspin > tree. With this patch, it will rebuild the log gspin tree using the new log > declaration. > > > > Regards, > > Roger > > ------------------------------------------------------------------------------ > This SF.net email is sponsored by > > Make an app they can't live without > Enter the BlackBerry Developer Challenge > http://p.sf.net/sfu/RIM-dev2dev > _______________________________________________ > Open64-devel mailing list > Open64-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/open64-devel > > -- Regards, Lai Jian-Xin ------------------------------------------------------------------------------ This SF.net email is sponsored by Make an app they can't live without Enter the BlackBerry Developer Challenge http://p.sf.net/sfu/RIM-dev2dev _______________________________________________ Open64-devel mailing list Open64-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/open64-devel