> 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