This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
PATCH to c-commonc.c, preliminary for PR/3865 fix
- From: Gabriel Dos Reis <gdr at integrable-solutions dot net>
- To: gcc-patches at gcc dot gnu dot org
- Date: 27 Aug 2002 11:21:31 +0200
- Subject: PATCH to c-commonc.c, preliminary for PR/3865 fix
- Organization: CodeSourcery, LLC
As discussed in the thread starting at
http://gcc.gnu.org/ml/gcc/2002-08/msg01391.html
I'm about to check-in the following patch, a preliminary for fixing
numerical supports in the C++ runtime system (see for example
PR/3865).
Bootstrapped and tested on an i686-pc-linux.
-- Gaby
2002-08-27 Gabriel Dos Reis <gdr@integrable-solutions.net>
* c-common.c (cpp_define_data_format): New function.
(cb_register_builtins): Call it.
* doc/cpp.texi (Common Predefined Macros): Document
__TARGET_BITS_ORDER__, __TARGET_BYTES_ORDER__,
__TARGET_INT_WORDS_ORDER__, __TARGET_FLOAT_WORDS_ORDER__,
__TARGET_FLOAT_FORMAT__, __TARGET_USES_VAX_F_FLOAT__,
__TARGET_USES_VAX_D_FLOAT__, __TARGET_USES_VAX_G_FLOAT__,
__TARGET_USES_VAX_H_FLOAT__.
Index: c-common.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/c-common.c,v
retrieving revision 1.366
diff -p -r1.366 c-common.c
*** c-common.c 16 Aug 2002 23:31:03 -0000 1.366
--- c-common.c 27 Aug 2002 09:19:10 -0000
*************** void builtin_define_std PARAMS ((const c
*** 749,754 ****
--- 749,755 ----
static void builtin_define_with_value PARAMS ((const char *, const char *,
int));
static void builtin_define_type_max PARAMS ((const char *, tree, int));
+ static void cpp_define_data_format PARAMS ((cpp_reader *));
/* Table of machine-independent attributes common to all C-like languages. */
const struct attribute_spec c_common_attribute_table[] =
*************** boolean_increment (code, arg)
*** 4661,4666 ****
--- 4662,4757 ----
return val;
}
+ /* Define macros necessary to describe fundamental data type formats. */
+ static void
+ cpp_define_data_format (pfile)
+ cpp_reader *pfile;
+ {
+ const char *format;
+ /* Define endianness enumeration values. */
+ cpp_define (pfile, "__GCC_LITTLE_ENDIAN__=0");
+ cpp_define (pfile, "__GCC_BIG_ENDIAN__=1");
+
+ /* Define supported floating-point format enumeration values. */
+ cpp_define (pfile, "__UNKNOWN_FORMAT__=0");
+ cpp_define (pfile, "__IEEE_FORMAT__=1");
+ cpp_define (pfile, "__IBM_FORMAT__=2");
+ cpp_define (pfile, "__C4X_FORMAT__=3");
+ cpp_define (pfile, "__VAX_FORMAT__=4");
+
+ /* Define target endianness:
+ - bit order
+ - byte order
+ - word order in an integer that spans a multi-word
+ - word order in a floating-poing that spans a multi-word */
+ if (BITS_BIG_ENDIAN)
+ cpp_define (pfile, "__TARGET_BITS_ORDER__=__GCC_BIG_ENDIAN__");
+ else
+ cpp_define (pfile, "__TARGET_BITS_ORDER__=__GCC_BIG_ENDIAN__");
+ if (BYTES_BIG_ENDIAN)
+ cpp_define (pfile, "__TARGET_BYTES_ORDER__=__GCC_BIG_ENDIAN__");
+ else
+ cpp_define (pfile, "__TARGET_BYTES_ORDER__=__GCC_LITTLE_ENDIAN__");
+ /* Define words order in a multi-word integer. */
+ if (WORDS_BIG_ENDIAN)
+ cpp_define (pfile, "__TARGET_INT_WORDS_ORDER__=__GCC_BIG_ENDIAN__");
+ else
+ cpp_define (pfile, "__TARGET_INT_WORDS_ORDER__=__GCC_LITTLE_ENDIAN__");
+ /* Define words order in a multi-word floating point. */
+ if (FLOAT_WORDS_BIG_ENDIAN)
+ cpp_define (pfile, "__TARGET_FLOAT_WORDS_ORDER__=__GCC_BIG_ENDIAN__");
+ else
+ cpp_define (pfile, "__TARGET_FLOAT_WORDS_ORDER__=__GCC_LITTLE_ENDIAN__");
+
+ switch (TARGET_FLOAT_FORMAT)
+ {
+ case UNKNOWN_FLOAT_FORMAT:
+ format = "__UNKNOWN_FORMAT__";
+ break;
+
+ case IEEE_FLOAT_FORMAT:
+ format = "__IEEE_FORMAT__";
+ break;
+
+ case VAX_FLOAT_FORMAT:
+ format = "__VAX_FORMAT__";
+ cpp_define (pfile, "__TARGET_USES_VAX_F_FLOAT__=1");
+ #ifdef TARGET_G_FLOAT
+ if (TARGET_G_FLOAT)
+ {
+ cpp_define (pfile, "__TARGET_USES_VAX_D_FLOAT__=0");
+ cpp_define (pfile, "__TARGET_USES_VAX_G_FLOAT__=1");
+ }
+ else
+ {
+ cpp_define (pfile, "__TARGET_USES_VAX_D_FLOAT__=1");
+ cpp_define (pfile, "__TARGET_USES_VAX_G_FLOAT__=0");
+ }
+ #endif
+ cpp_define (pfile, "__TARGET_USES_VAX_H_FLOAT__=1");
+ break;
+
+ case IBM_FLOAT_FORMAT:
+ format = "__IBM_FORMAT__";
+ break;
+
+ case C4X_FLOAT_FORMAT:
+ format = "__C4X_FORMAT__";
+ break;
+
+ default:
+ abort();
+ }
+ if (TARGET_FLOAT_FORMAT != VAX_FLOAT_FORMAT)
+ {
+ cpp_define (pfile, "__TARGET_USES_VAX_F_FLOAT__=0");
+ cpp_define (pfile, "__TARGET_USES_VAX_D_FLOAT__=0");
+ cpp_define (pfile, "__TARGET_USES_VAX_G_FLOAT__=0");
+ cpp_define (pfile, "__TARGET_USES_VAX_H_FLOAT__=0");
+ }
+ builtin_define_with_value ("__GCC_FLOAT_FORMAT__", format, 0);
+ }
+
/* Hook that registers front end and target-specific built-ins. */
void
cb_register_builtins (pfile)
*************** cb_register_builtins (pfile)
*** 4745,4750 ****
--- 4836,4843 ----
if (!flag_signed_char)
cpp_define (pfile, "__CHAR_UNSIGNED__");
+ cpp_define_data_format (pfile);
+
/* Make the choice of ObjC runtime visible to source code. */
if (flag_objc && flag_next_runtime)
cpp_define (pfile, "__NEXT_RUNTIME__");
Index: doc/cpp.texi
===================================================================
RCS file: /cvs/gcc/egcs/gcc/doc/cpp.texi,v
retrieving revision 1.42
diff -p -r1.42 cpp.texi
*** doc/cpp.texi 20 Aug 2002 19:56:30 -0000 1.42
--- doc/cpp.texi 27 Aug 2002 09:19:12 -0000
*************** This macro is defined, with value 1, whe
*** 2012,2017 ****
--- 2012,2059 ----
(as in @option{-fnext-runtime}) is in use for Objective-C.
@end table
+ @item __TARGET_BITS_ORDER__
+ This macro describes the target's bits order in a byte. Its value is
+ @code{__GCC_LITTLE_ENDIAN__} or @code{__GCC_BIG_ENDIAN__}.
+
+ @item __TARGET_BYTES_ORDER__
+ This macro is defined with value @code{__GCC_LITTLE_ENDIAN__} or
+ @code{__GCC_BIG_ENDIAN__} if the target's bytes order within a word
+ is little-endian or big-endian, respectively.
+
+ @item __TARGET_INT_WORDS_ORDER__
+ This macro is defined with value @code{__GCC_LITTLE_ENDIAN__} or
+ @code{__GCC_BIG_ENDIAN__} if the target's words order within a
+ multi-word integer datum is little-endian or big-endian, respectively.
+
+ @item __TARGET_FLOAT_WORDS_ORDER__
+ This macro is defined with value @code{__GCC_LITTLE_ENDIAN__} or
+ @code{__GCC_BIG_ENDIAN__} if the target's words order within a
+ multi-word floating-point datum is little-endian or big-endian, respectively.
+
+ @item __TARGET_FLOAT_FORMAT__
+ This macro is defined to describe the floating-point format used by the
+ target. It has value in the set comprised of:
+ @code{__UNKNOWN_FORMAT__}, @code{__IEEE_FORMAT__},
+ @code{__IBM_FORMAT__}, @code{__C4X_FORMAT__} and @code{__VAX_FORMAT__}.
+
+ @item __TARGET_USES_VAX_F_FLOAT__
+ This macro is defined with value 1 if the target uses the VAX F-format
+ for the single precision floating-point data type; else if has value 0.
+
+ @item __TARGET_USES_VAX_D_FLOAT__
+ @item __TARGET_USES_VAX_G_FLOAT__
+ These macros are always defined, with values 0 or 1. If
+ @code{__TARGET_FLOAT_FORMAT__} is @code{__VAX_FORMAT__} then they have
+ mutually exclusive values; else both have value 0. Non-zero
+ @code{__TARGET_USES_VAX_D_FLOAT__} means the target uses the VAX
+ D-format for the double precision floating-point data type; non-zero
+ @code{__TARGET_USES_VAX_G_FLOAT__} means the VAX G-format is used.
+
+ @item __TARGET_USES_VAX_H_FLOAT__
+ When non-zero, the target uses the VAX H-format for the extended
+ precision floating-point data type.
+
@node System-specific Predefined Macros
@subsection System-specific Predefined Macros