Rainer,
On Mar 5, 2012, at 6:14 PM, Rainer Orth wrote:
> The Tru64 UNIX V5.1 port has been obsoleted in GCC 4.7, and it's now
> time to remove it from mainline. The following patch does just that,
> and should be mostly uncontroversial, like removing target-specific
> fixincludes hacks, files, and testsuite support.
>
> Then, there are target-specific features only used by this port (like
> support for #pragma extern_prefix),
[…]
> * As I've mentioned, I've ripped out the #pragma extern_prefix support:
> while VMS has something similar, it doesn't use the common code.
in fact VMS use some of the already existing #pragma extern_prefix support.
You're removing too much code here !
Commenting only the relevant part:
> diff --git a/gcc/c-family/c-cppbuiltin.c b/gcc/c-family/c-cppbuiltin.c
> --- a/gcc/c-family/c-cppbuiltin.c
> +++ b/gcc/c-family/c-cppbuiltin.c
> @@ -1,6 +1,6 @@
> /* Define builtin-in macros for the C family front ends.
> - Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
> - Free Software Foundation, Inc.
> + Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
> + 2011, 2012 Free Software Foundation, Inc.
>
> This file is part of GCC.
>
> @@ -886,9 +886,6 @@ c_cpp_builtins (cpp_reader *pfile)
> /* Show the availability of some target pragmas. */
> cpp_define (pfile, "__PRAGMA_REDEFINE_EXTNAME");
>
> - if (targetm.handle_pragma_extern_prefix)
> - cpp_define (pfile, "__PRAGMA_EXTERN_PREFIX");
VMS doesn't reference this macro, so you could remove it.
> -
> /* Make the choice of the stack protector runtime visible to source code.
> The macro names and values here were chosen for compatibility with an
> earlier implementation, i.e. ProPolice. */
> diff --git a/gcc/c-family/c-pragma.c b/gcc/c-family/c-pragma.c
> --- a/gcc/c-family/c-pragma.c
> +++ b/gcc/c-family/c-pragma.c
> @@ -1,6 +1,6 @@
> /* Handle #pragma, system V.4 style. Supports #pragma weak and #pragma pack.
> Copyright (C) 1992, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
> - 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
> + 2006, 2007, 2008, 2009, 2010, 2012 Free Software Foundation, Inc.
>
> This file is part of GCC.
>
> @@ -369,37 +369,26 @@ handle_pragma_weak (cpp_reader * ARG_UNU
> }
> }
>
> -/* GCC supports two #pragma directives for renaming the external
> +/* GCC supports a #pragma directive for renaming the external
> symbol associated with a declaration (DECL_ASSEMBLER_NAME), for
> - compatibility with the Solaris and Tru64 system headers. GCC also
> + compatibility with the Solaris system headers. GCC also
> has its own notation for this, __asm__("name") annotations.
>
> Corner cases of these features and their interaction:
>
> - 1) Both pragmas silently apply only to declarations with external
> + 1) The pragma silently applies only to declarations with external
> linkage (that is, TREE_PUBLIC || DECL_EXTERNAL). Asm labels
> do not have this restriction.
>
> - 2) In C++, both #pragmas silently apply only to extern "C" declarations.
> + 2) In C++, the #pragma silently applies only to extern "C" declarations.
> Asm labels do not have this restriction.
>
> - 3) If any of the three ways of changing DECL_ASSEMBLER_NAME is
> + 3) If any of the two ways of changing DECL_ASSEMBLER_NAME is
> applied to a decl whose DECL_ASSEMBLER_NAME is already set, and the
> new name is different, a warning issues and the name does not change.
>
> 4) The "source name" for #pragma redefine_extname is the DECL_NAME,
> - *not* the DECL_ASSEMBLER_NAME.
> -
> - 5) If #pragma extern_prefix is in effect and a declaration occurs
> - with an __asm__ name, the #pragma extern_prefix is silently
> - ignored for that declaration.
> -
> - 6) If #pragma extern_prefix and #pragma redefine_extname apply to
> - the same declaration, whichever triggered first wins, and a warning
> - is issued. (We would like to have #pragma redefine_extname always
> - win, but it can appear either before or after the declaration, and
> - if it appears afterward, we have no way of knowing whether a modified
> - DECL_ASSEMBLER_NAME is due to #pragma extern_prefix.) */
> + *not* the DECL_ASSEMBLER_NAME. */
I think the comments would still apply.
>
> typedef struct GTY(()) pending_redefinition_d {
> tree oldname;
> @@ -494,30 +483,6 @@ add_to_renaming_pragma_list (tree oldnam
> p->newname = newname;
> }
>
> -/* The current prefix set by #pragma extern_prefix. */
> -GTY(()) tree pragma_extern_prefix;
This variable is referenced by gcc/config/vms/vms-c.c, so it shouldn't be
removed.
> -
> -/* #pragma extern_prefix "prefix" */
> -static void
> -handle_pragma_extern_prefix (cpp_reader * ARG_UNUSED (dummy))
> -{
> - tree prefix, x;
> - enum cpp_ttype t;
> -
> - if (pragma_lex (&prefix) != CPP_STRING)
> - GCC_BAD ("malformed #pragma extern_prefix, ignored");
> - t = pragma_lex (&x);
> - if (t != CPP_EOF)
> - warning (OPT_Wpragmas, "junk at end of %<#pragma extern_prefix%>");
> -
> - if (targetm.handle_pragma_extern_prefix)
> - /* Note that the length includes the null terminator. */
> - pragma_extern_prefix = (TREE_STRING_LENGTH (prefix) > 1 ? prefix : NULL);
> - else if (warn_unknown_pragmas > in_system_header)
> - warning (OPT_Wunknown_pragmas,
> - "#pragma extern_prefix not supported on this target");
> -}
> -
Currently, the #pragma __extern_prefix is handled by vms-c.c, which is slightly
more powerful than the tru64 version.
It would be easier to me if the above version were removed!
> /* Hook from the front ends to apply the results of one of the preceding
> pragmas that rename variables. */
>
> @@ -580,35 +545,12 @@ maybe_apply_renaming_pragma (tree decl,
> return asmname;
> }
>
> - /* Otherwise we use what we've got; #pragma extern_prefix is
> - silently ignored. */
> + /* Otherwise we use what we've got. */
> return build_string (IDENTIFIER_LENGTH (newname),
> IDENTIFIER_POINTER (newname));
> }
>
> - /* If we've got an asmname, #pragma extern_prefix is silently ignored. */
> - if (asmname)
> - return asmname;
> -
> - /* If #pragma extern_prefix is in effect, apply it. */
> - if (pragma_extern_prefix)
> - {
> - const char *prefix = TREE_STRING_POINTER (pragma_extern_prefix);
> - size_t plen = TREE_STRING_LENGTH (pragma_extern_prefix) - 1;
> -
> - const char *id = IDENTIFIER_POINTER (DECL_NAME (decl));
> - size_t ilen = IDENTIFIER_LENGTH (DECL_NAME (decl));
> -
> - char *newname = (char *) alloca (plen + ilen + 1);
> -
> - memcpy (newname, prefix, plen);
> - memcpy (newname + plen, id, ilen + 1);
> -
> - return build_string (plen + ilen, newname);
> - }
> -
> - /* Nada. */
> - return 0;
> + return asmname;
> }
So this code shouldn't be removed because vms-c.c set pragma_extern_prefix.
> @@ -1396,7 +1338,6 @@ init_pragma (void)
>
> c_register_pragma_with_expansion (0, "redefine_extname",
> handle_pragma_redefine_extname);
> - c_register_pragma (0, "extern_prefix", handle_pragma_extern_prefix);
Agreed as discussed above.
> c_register_pragma_with_expansion (0, "message", handle_pragma_message);
>
> diff --git a/gcc/c-family/c-pragma.h b/gcc/c-family/c-pragma.h
> --- a/gcc/c-family/c-pragma.h
> +++ b/gcc/c-family/c-pragma.h
> @@ -1,6 +1,6 @@
> /* Pragma related interfaces.
> Copyright (C) 1995, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
> - 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
> + 2007, 2008, 2009, 2010, 2012 Free Software Foundation, Inc.
>
> This file is part of GCC.
>
> @@ -146,6 +146,4 @@ extern enum cpp_ttype c_lex_with_flags (
>
> extern void c_pp_lookup_pragma (unsigned int, const char **, const char **);
>
> -extern GTY(()) tree pragma_extern_prefix;
> -
> #endif /* GCC_C_PRAGMA_H */
Shouldn't be removed too.
Thank you Rainer for all the Tru64 maintainership work!
Tristan.