Ian, Thanks. I tried to follow the examples, but it still doesn't work. Here is the related code:
in target-c.c: extern GTY(()) tree pragma_ghs_sections[GHS_SECTION_COUNT]; ... pragma_ghs_sections[sec_num] = copy_node (sec_name); in target.c: ... section_name = pragma_ghs_sections[sec_num]; if (section_name == NULL_TREE) return; DECL_SECTION_NAME(decl) = section_name; ... When I watch the memory pragma_ghs_sections[sec_num] points to, it is motified by #0 0x006cb3e7 in memset () from /lib/tls/libc.so.6 #1 0xffffc4f0 in ?? () #2 0x08120da4 in poison_pages () at ../../src/gcc/ggc-page.c:1854 #3 0x08120ee6 in ggc_collect () at ../../src/gcc/ggc-page.c:1945 #4 0x080f3692 in c_parser_translation_unit (parser=0xf7f92834) at ../../src/gcc/c-parser.c:978 #5 0x08103bd7 in c_parse_file () at ../../src/gcc/c-parser.c:8290 So target.c won't get correct section_name. What is wrong here? I understood GTY marker tells GC that this global pointer contains access to GC allocated memory. Thanks for any input, Bingfeng > -----Original Message----- > From: Ian Lance Taylor [mailto:i...@google.com] > Sent: 09 November 2009 19:00 > To: Bingfeng Mei > Cc: gcc@gcc.gnu.org > Subject: Re: How to avoid a tree node being garbage collected > after C frontend? > > "Bingfeng Mei" <b...@broadcom.com> writes: > > > I need to pass a tree node (section name from processing pragmas) > > from C frontend to main GCC body (used in > TARGET_INSERT_ATTRIBUTES). > > I store the node in a global pointer array delcared in target.c. > > But the tree node is garbage collected in the end of c-parser > > pass, and causes an ICE later on. I am not familiar with GC part > > at all. How to prevent this from hanppening? > > Mark the global variable with GTY(()). See many many existing > examples. > > Ian > >