Can we have a symbol_ref node of a declared symbol without having its flags set?

Fariborz Jahanian fjahanian@apple.com
Thu Sep 15 23:48:00 GMT 2005


I ran into a problem when chasing down an -mfix-and-continue (an  
apple specialty :) code-gen problem.

In a test case, ivopts creates a symbol_ref via a call to  
produce_memory_decl_rtl; as in:

     if (TREE_STATIC (obj) || DECL_EXTERNAL (obj))
       {
         const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME  
(obj));
         x = gen_rtx_SYMBOL_REF (Pmode, name);
       }
...

But it does not set the flags for this symbol. This causes code gen  
problem in certain cases ; such as in apple-ppc-darwin PIC generation  
code, which rely on these flags. An obvious fix come to mind is to  
set the flags when symbol_ref is created. Such as in this patch. But  
a more general question is should we always set the flags for  
symbol_ref whenever such a node is created for a declared symbol?


--- 2376,2404 ----
   static rtx
   produce_memory_decl_rtl (tree obj, int *regno)
   {
!   rtx x, ret;
     if (!obj)
       abort ();
     if (TREE_STATIC (obj) || DECL_EXTERNAL (obj))
       {
         const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME  
(obj));
         x = gen_rtx_SYMBOL_REF (Pmode, name);
+       ret = gen_rtx_MEM (DECL_MODE (obj), x);
+       SET_DECL_RTL (obj, ret);
+       targetm.encode_section_info (obj, DECL_RTL (obj), true);
       }
     else
!     {
!       x = gen_raw_REG (Pmode, (*regno)++);
!       ret = gen_rtx_MEM (DECL_MODE (obj), x);
!     }

!   return ret;
   }

Thanks, fariborz (fjahanian@apple.com)



More information about the Gcc mailing list