This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: specs: *predefine oddity
- To: corsepiu at faw dot uni-ulm dot de, egcs at egcs dot cygnus dot com
- Subject: Re: specs: *predefine oddity
- From: Michael Meissner <meissner at cygnus dot com>
- Date: Tue, 2 Nov 1999 15:28:07 -0500
- References: <381F2355.C5CADDEB@faw.uni-ulm.de>
On Tue, Nov 02, 1999 at 06:45:57PM +0100, Ralf Corsepius wrote:
> Hi,
>
> When adding a define (-D...) to *predefines: in gcc's specs, gcc
> apparently implicitly expands these defines into other defines. I am not
>
> sure if the present behaviour is correct (i.e. "a feature") or if there
> might be something broken (i.e. "a buggy").
>
> E.g. having this in specs:
>
> 1)
> *predefines:
> -Dfoo
> gcc -v reports, this to be expanded into
> -Dfoo -D__foo__ -D__foo
>
> 2)
> *predefines:
> -Dfoo -D__bar__
> Expands to:
> -Dfoo -D__bar__ -D__foo__ -D__bar__ -D__foo
>
> 3)
> *predefines:
> -Dfoo -D__foo__
> Expands to this weird and unnecessarily lengthy line:
> -Dfoo -D__foo__ -D__foo__ -D__foo__ -D__foo
>
> Is this really the desired behaviour ? Is it documented somewhere and
> can we rely on this behaviour to be kept in future gcc-versions?
Yes, it is desired beahvior. It's been that way for the 11+ years I've been
working on GCC. Yes, it is documented (look for the documentation for
CPP_PREDEFINES in the tm.texi part of the manual). Yes you should be able to
rely on it it in the future.
> If the answer to all these questions is yes, then probably several
> gcc/config/*.h files which apply CPP_PREDEFINES could be simplified,
> because they explicitly define one or more permutation of
> -Dfoo, -D__foo and -D__foo__.
One key point that you are missing is that CPP_PREDEFINES which is used to
initialize the *predefines spec is handled differently from other specs.
Because of the parsing to add the __'s, it doesn't handle conditionals or used
defined subspecs. If you need macros expanded conditionally, you have to use
CPP_SPECS (*cpp), and handle the __ expansion yourself. For example, the
config/a29k/unix.h file defines:
#undef CPP_PREDEFINES
#define CPP_PREDEFINES "-Dam29k -Da29k -Dam29000 -Asystem(unix) -Acpu(a29k) -Amachine(a29k)"
#undef CPP_SPEC
#define CPP_SPEC "%{!m29000:-Dam29050 -D__am29050__}"
Since am29050/__am29050__ is not to be defined if the -m29000 switch is used,
its processing needs to go in CPP_SPEC.
--
Michael Meissner, Cygnus Solutions
PMB 198, 174 Littleton Road #3, Westford, Massachusetts 01886
email: meissner@cygnus.com phone: 978-486-9304 fax: 978-692-4482