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
> 
> 

Reply via email to