Hi Jan,

> thanks for feedback. Here is updated patch that incorporates Martin's
> changes, formatting corrections and makes symvers of aliases work.

just a few nits.

> Index: doc/extend.texi
> ===================================================================
> --- doc/extend.texi   (revision 278293)
> +++ doc/extend.texi   (working copy)
> @@ -3640,6 +3640,34 @@ Function Attributes}, @ref{PowerPC Funct
>  @ref{Nios II Function Attributes}, and @ref{S/390 Function Attributes}
>  for details.
>  
> +@item symver ("@var{name2}@@@var{nodename}")
> +On ELF targets this attribute creates symbol version.  The @var{name2} part 
> of
> +the parameter is the actual name of the symbol by which it will be externally
> +referenced.  The @code{nodename} portion of the alias should be the name of a

Better be consistent and use @var{} in both cases.

> +node specified in the version script supplied to the linker when building a
> +shared library.  Versioned symbol must be defined and must be exported with
> +default visibility.
> +
> +@smallexample
> +__attribute__ ((__symver__ ("foo@@VERS_1"))) int
> +foo_v1 (void)
> +@{
> +@}
> +@end smallexample
> +
> +Will produce @code{.symver foo_v1, foo@@VERS_1} directive in the assembler
> +output.  It is not allowed to make multiple versions out of one symbol, 
> however
> +versioned symbol may also be an alias.
> +
> +@smallexample
> +__attribute__ ((__symver__ ("foo@VERS_2")))

this broke bootstrap:

/vol/gcc/src/hg/trunk/local/gcc/doc/extend.texi:3663: unknown command `VERS'
make[3]: *** [Makefile:3273: doc/gcc.info] Error 1

You need to be careful to properly quote @'s in texinfo.

> +__attribute__ ((alias ("foo_v1")))
> +int symver_foo_v1 (void);
> +@end smallexample
> +
> +This example creates alias an of @code{foo_v1} with symbol name
> +@code{symver_foo_v1} which will be version @code{VERS_2} of @code{foo}.
> +
>  @item target_clones (@var{options})
>  @cindex @code{target_clones} function attribute
>  The @code{target_clones} attribute is used to specify that a function

Martin already commented on the doc snippet.  I guess you'd better have
it double-checked by a native speaker.

> Index: symtab.c
> ===================================================================
> --- symtab.c  (revision 278293)
> +++ symtab.c  (working copy)
> @@ -848,6 +848,8 @@ symtab_node::dump_base (FILE *f)
>      fprintf (f, " transparent_alias");
>    if (weakref)
>      fprintf (f, " weakref");
> +  if (symver)
> +    fprintf (f, " symver");
>    if (cpp_implicit_alias)
>      fprintf (f, " cpp_implicit_alias");
>    if (alias_target)
> @@ -1145,6 +1147,11 @@ symtab_node::verify_base (void)
>        error ("node is transparent_alias but not an alias");
>        error_found = true;
>      }
> +  if (symver && !alias)
> +    {
> +      error ("node is symver but not alias");
> +      error_found = true;
> +    }
>    if (same_comdat_group)
>      {
>        symtab_node *n = same_comdat_group;
> @@ -1780,7 +1787,9 @@ symtab_node::resolve_alias (symtab_node
>         if (target->get_comdat_group ())
>           alias_alias->add_to_same_comdat_group (target);
>       }
> -      if (!alias_alias->transparent_alias || transparent)
> +      if ((!alias_alias->transparent_alias
> +        && !alias_alias->symver)

No need for the linebreak.

> +       || transparent)
>       {
>         alias_alias->remove_all_references ();
>         alias_alias->create_reference (target, IPA_REF_ALIAS, NULL);
> Index: varasm.c
> ===================================================================
> --- varasm.c  (revision 278293)
> +++ varasm.c  (working copy)
> @@ -1921,6 +1921,7 @@ assemble_end_function (tree decl, const
>      switch_to_section (function_section (decl));
>    ASM_DECLARE_FUNCTION_SIZE (asm_out_file, fnname, decl);
>  #endif
> +
>    if (! CONSTANT_POOL_BEFORE_FUNCTION)
>      {
>        output_constant_pool (fnname, decl);
> @@ -5960,6 +5961,23 @@ do_assemble_alias (tree decl, tree targe
>  #endif
>  }
>  
> +/* Output .symver directive.  */
> +
> +void
> +do_assemble_symver (tree decl, tree target)
> +{
> +  tree id = DECL_ASSEMBLER_NAME (decl);
> +  ultimate_transparent_alias_target (&id);
> +  ultimate_transparent_alias_target (&target);
> +#ifdef ASM_OUTPUT_SYMVER_DIRECTIVE
> +  ASM_OUTPUT_SYMVER_DIRECTIVE (asm_out_file,
> +                            IDENTIFIER_POINTER (target),
> +                            IDENTIFIER_POINTER (id));
> +#else
> +  error ("symver is only supported on ELF platforms");

As I said, this is misleading: better say something like "not supported
in this configuration".

        Rainer

-- 
-----------------------------------------------------------------------------
Rainer Orth, Center for Biotechnology, Bielefeld University

Reply via email to