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:[email protected]]
> Sent: 09 November 2009 19:00
> To: Bingfeng Mei
> Cc: [email protected]
> Subject: Re: How to avoid a tree node being garbage collected
> after C frontend?
>
> "Bingfeng Mei" <[email protected]> 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
>
>