Subject: toolchain/36664: a simpler and safer way to find gcc's pre-defined macros
To: None <toolchain-manager@netbsd.org, gnats-admin@netbsd.org,>
From: Greg A. Woods <woods@planix.com>
List: netbsd-bugs
Date: 07/17/2007 23:20:00
>Number:         36664
>Category:       toolchain
>Synopsis:       a simpler and safer way to find gcc's pre-defined macros
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    toolchain-manager
>State:          open
>Class:          doc-bug
>Submitter-Id:   net
>Arrival-Date:   Tue Jul 17 23:20:00 +0000 2007
>Originator:     Greg A. Woods
>Release:        NetBSD 4.0_BETA2
>Organization:
Planix, Inc.; Toronto, Ontario; Canada
>Environment:
	
	
System: NetBSD 4.0_BETA2
>Description:

	Since gcc-4 now uses a built-in pre-processor exclusively it is
	no longer possible to discover the likely pre-defined macros
	simply by examining the cpp0 command parameters shown when the
	"-v" option is used.

	After rather extensive searching I find the gcc(1) manual
	suggests using the "cpp" command and asking it to dump its list
	of defined macros after parsing an empty file.

	However there's a simpler, and thus safer, way to do it without
	having to create a custom empty file.  "cpp" doesn't care what
	it's filename parameters look like and by default it'll even
	read from stdin.

>How-To-Repeat:
	
>Fix:

	I put the alternate section in since due to what would seem to
	be an obvious design flaw in the gcc/cc wrapper program it fails
	to use argv[0] to determine its own name and thus has to be
	specially compiled to produce a custom "cpp" binary.  In reality
	the "cpp" variant could simply be ignored since this is of
	course the gcc(1) manual page, not the cpp(1) manual page.

	The sort is there because there are so many new pre-defined
	macros in gcc-4 that it's impossible to read the list otherwise,
	and really the example should suggest a "| more" too since there
	are far more than fit on even a largish window, but generally I
	assume (perhaps unwisely) that users are smart enough to try
	again with a pager if they need to.

	The redirection to read /dev/null from stdin is probably safest
	just in case "gcc -E" suddenly does start to care what its
	filenames look like again.


Index: gnu/usr.bin/gcc4/gcc/gcc.1
===================================================================
RCS file: /cvs/master/m-NetBSD/main/src/gnu/usr.bin/gcc4/gcc/gcc.1,v
retrieving revision 1.1
diff -u -r1.1 gcc.1
--- gnu/usr.bin/gcc4/gcc/gcc.1	10 May 2006 22:48:13 -0000	1.1
+++ gnu/usr.bin/gcc4/gcc/gcc.1	17 Jul 2007 21:42:38 -0000
@@ -6272,13 +6272,20 @@
 directives for all the macros defined during the execution of the
 preprocessor, including predefined macros.  This gives you a way of
 finding out what is predefined in your version of the preprocessor.
-Assuming you have no file \fIfoo.h\fR, the command
+The following command:
 .Sp
 .Vb 1
-\&        touch foo.h; cpp -dM foo.h
+\&        cpp -dM < /dev/null | sort
+.Ve
+.Sp
+will show all the predefined macros and their values.  Alternately to be
+sure the exact same built-in preprocessor code is running you can use
+this command:
+.Sp
+.Vb 1
+\&        gcc -dM -E - < /dev/null | sort
 .Ve
 .Sp
-will show all the predefined macros.
 .IP "\fBD\fR" 4
 .IX Item "D"
 Like \fBM\fR except in two respects: it does \fInot\fR include the

>Unformatted: