> 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