> Honza,
> 
> I'm glad that you're making progress.
> 
> > David, this looks like a bug in the AIX target output macros. I get:
> >         .set 
> > _ZTCSt14basic_ifstreamIcSt11char_traitsIcEE0_Si.localalias.69,_ZTCSt14basic_ifstreamIcSt11char_traitsIcEE0_Si
> 
> > (this is correct since localalias is really an alias)
> 
> > _ZTCSt14basic_ifstreamIcSt11char_traitsIcEE0_Si.localalias.69:
> >         .space 40
> > _ZTCSt14basic_ifstreamIcSt11char_traitsIcEE0_Si:
> ...
> 
> > This is wrong, since we should not try to out the variable at least if I 
> > read AIX assembly correctly.
> 
> > varpool has explicit test to not output any aliases, so perhaps this is a 
> > bug in wrapup_globals
> > and AIX output macros.  I will try to track more after my teaching tonight.
> 
> The AIX support handles AIX XCOFF assembler syntax and chooses
> appropriate sections, but it would not choose to emit an extra
> definition. If there are multiple definitions, then the varasm macros
> are being invoked multiple times for the same symbol.

I now understand what goes wrong: AIX uses section anchors and the code to
produce them completely ignore the existence of aliases.  It means that we 
get a variable and alias on a different offsets within the anchor.

I think we need to somehow propagate anchros of objects into anchors of aliases.
The code goes by:

validize_mem
  that gets SYMBOL_REF for the alias
  to
use_anchored_address
  to
place_block_symbol

and place_block adds the alias and allocates space for it.
I suppose we want to walk to alias target there:

Index: varasm.c
===================================================================
--- varasm.c    (revision 211028)
+++ varasm.c    (working copy)
@@ -1083,6 +1083,9 @@
 {
   addr_space_t as = ADDR_SPACE_GENERIC;
   int reloc;
+  symtab_node *snode = symtab_get_node (decl);
+  if (snode)
+    decl = symtab_alias_ultimate_target (snode)->decl;
 
   if (TREE_TYPE (decl) != error_mark_node)
     as = TYPE_ADDR_SPACE (TREE_TYPE (decl));
@@ -7084,7 +7087,16 @@
     }
   else
     {
+      struct symtab_node *snode;
       decl = SYMBOL_REF_DECL (symbol);
+
+      snode = symtab_node (decl);
+      if (snode->alias)
+       {
+         rtx target = DECL_RTL (symtab_alias_ultimate_target (snode)->decl);
+         SYMBOL_REF_BLOCK_OFFSET (symbol) = SYMBOL_REF_BLOCK_OFFSET (target);
+         return;
+       }
       alignment = get_variable_align (decl);
       size = tree_to_uhwi (DECL_SIZE_UNIT (decl));
       if ((flag_sanitize & SANITIZE_ADDRESS)

I am testing if that lets me to finish a bootstrap at gcc111

Reply via email to