]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c-common.c (cpp_define_data_format): New function.
authorGabriel Dos Reis <gdr@integrable-solutions.net>
Tue, 27 Aug 2002 09:38:05 +0000 (09:38 +0000)
committerGabriel Dos Reis <gdr@gcc.gnu.org>
Tue, 27 Aug 2002 09:38:05 +0000 (09:38 +0000)
* 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__.

From-SVN: r56597

gcc/ChangeLog
gcc/c-common.c
gcc/doc/cpp.texi

index 4783fea3a840d927c3d3fefe61183a6d6febe2b3..4add4da5e4c29696ac309e5540addae081a95243 100644 (file)
@@ -1,3 +1,15 @@
+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__.
+
 2002-08-26  Ziemowit Laski <zlaski@apple.com>
 
        * objc/objc-act.c (get_super_receiver): If inside a class method
index 74224afd55ca2c611a8290fd6047555cd6b45b90..9e9e409c69a0ff36463a570fc99421febb667e4b 100644 (file)
@@ -749,6 +749,7 @@ void builtin_define_std PARAMS ((const char *));
 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[] =
@@ -4661,6 +4662,96 @@ boolean_increment (code, arg)
   return val;
 }
 \f
+/* 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)
@@ -4745,6 +4836,8 @@ cb_register_builtins (pfile)
   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 71f0d870f4897e67c44efab5c28d20b1345ff652..66edaab348e87a5eac2ab81a8dd4e2705a884c9f 100644 (file)
@@ -2012,6 +2012,48 @@ This macro is defined, with value 1, when the NeXT runtime
 (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