This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: RFC: adding lookups on the target names for alias attributes


Greg McGary <greg@mcgary.org> writes:

> I'd like to do this in decl_attributes:
> 
> 1) Lookup the target name, seeking a decl with the same
>    flavor (function, data, type, whatever) as the aliasing decl
>    yielding a target decl.
> 
> 2) If a target decl of appropriate flavor is found and is unambiguous
>    (overloading in C++ being the primary source of ambiguity), use the
>    target decl's DECL_ASSEMBLER_NAME as the alias target, rather than
>    the programmer-supplied target string.
> 
>    If the target name is not found, is the wrong flavor, or is
>    ambiguous, issue a warning and use the programmer-supplied string.
>    The warning is justified because if the target remains undefined in
>    the object file, then the assembler will silently ignore the alias,
>    which is unexpected and sometimes confusing behavior.  It's easy
>    enough to avoid the warning by placing the alias decl after the
>    target's definition.  Explicitly mangled C++ names need special
>    handling to avoid the warning, but I'm inclined to just let that
>    slide for now since aliases seem to be seldom, if ever, used in C++.

Don't everyone chime in at once!  8^)

Here's a better idea: As documented, the alias attribute takes a
literal-string argument, but the parser will accept an identifier as a
general attribute arg well.  Therefore, retain old behavior for
literal-string targets.  Implement new behavior when an identifier
appears as target name.  For C++, the parser should accept a
scope-qualified name (e.g., alias (a::b))

Example:

Old style:
	/* OK to reference "__foo" before __foo is defined.  */
	void foo () attribute ((alias ("__foo")));
	void __foo () {}

New style:
	void __foo () {}
	/* Must define __foo before referencing it.  */
	void foo () attribute ((alias (__foo)));

Basically, the new style gives better error checking, since it will
ensure (a) that a target name is declared before being referenced as
an alias target, (b) that the decls of alias and target are consistent
(same flavor; and for functions, that arg signatures match), (c)
the alias target is automatically mangled.

Comments?

Greg

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]