This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

PATCH to c-commonc.c, preliminary for PR/3865 fix


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
  


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]