Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* PATCH: PATCH: Add builtin floating point types
@ 2010-02-05  1:15 H.J. Lu
  2010-02-07 21:52 ` Mark Kettenis
  2010-02-08 18:55 ` PATCH: Cache types from target description H.J. Lu
  0 siblings, 2 replies; 20+ messages in thread
From: H.J. Lu @ 2010-02-05  1:15 UTC (permalink / raw)
  To: GDB; +Cc: Mark Kettenis

I am resending this patch. The motivation is I am working on x86 xml
target descriptions.  x86 has i387_ext type. I added

  case TDESC_TYPE_I387_EXT:
     return arch_float_type (gdbarch, -1, "builtin_type_i387_ext",
                             floatformats_i387_ext);

to tdesc_gdb_type. I would up 8 i387_ext types at 8 different addresses
with the same bits. x86 does

if (i386_fp_regnum_p (gdbarch, regnum))
   {
     /* Floating point registers must be converted unless we are
        accessing them in their hardware type.  */
     if (type == i387_ext_type (gdbarch))
       return 0;
     else
       return 1;
   }

It expects 2  i387_ext types should have the same address.  This
patch caches ieee_single, ieee_double and i387_ext. OK to install?

Thanks.


H.J.
---
2010-02-04  H.J. Lu  <hongjiu.lu@intel.com>

	* amd64-tdep.c (amd64_register_type): Replace i387_ext_type
	with builtin_i387_ext.
	* i387-tdep.c (print_i387_value): Likewise.
	(i387_convert_register_p): Likewise.
	(i387_register_to_value): Likewise.
	(i387_value_to_register): Likewise.

	* gdbtypes.c (gdbtypes_post_init): Initialize
	builtin_ieee_single, builtin_ieee_double and builtin_i387_ext.

	* gdbtypes.h (builtin_type): Add builtin_ieee_single,
	builtin_ieee_double and builtin_i387_ext.

	* i386-tdep.c (i386_extract_return_value): Replace i387_ext_type
	with builtin_i387_ext.
	(i386_store_return_value): Likewise.
	(i386_register_type): Likewise.
	(i387_ext_type): Removed.

	* i386-tdep.h (gdbarch_tdep): Remove i387_ext_type.
	(i387_ext_type): Removed.

	* target-descriptions.c (tdesc_gdb_type): Use
	builtin_ieee_single and builtin_ieee_double.

diff --git a/gdb/amd64-tdep.c b/gdb/amd64-tdep.c
index 2b15141..51d6824 100644
--- a/gdb/amd64-tdep.c
+++ b/gdb/amd64-tdep.c
@@ -113,7 +113,7 @@ amd64_register_type (struct gdbarch *gdbarch, int regnum)
   if (regnum >= AMD64_CS_REGNUM && regnum <= AMD64_GS_REGNUM)
     return builtin_type (gdbarch)->builtin_int32;
   if (regnum >= AMD64_ST0_REGNUM && regnum <= AMD64_ST0_REGNUM + 7)
-    return i387_ext_type (gdbarch);
+    return builtin_type (gdbarch)->builtin_i387_ext;
   if (regnum >= AMD64_FCTRL_REGNUM && regnum <= AMD64_FCTRL_REGNUM + 7)
     return builtin_type (gdbarch)->builtin_int32;
   if (regnum >= AMD64_XMM0_REGNUM && regnum <= AMD64_XMM0_REGNUM + 15)
diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c
index 46846c4..397adba 100644
--- a/gdb/gdbtypes.c
+++ b/gdb/gdbtypes.c
@@ -3470,6 +3470,16 @@ gdbtypes_post_init (struct gdbarch *gdbarch)
   TYPE_NOTTEXT (builtin_type->builtin_int8) = 1;
   TYPE_NOTTEXT (builtin_type->builtin_uint8) = 1;
 
+  builtin_type->builtin_ieee_single
+    = arch_float_type (gdbarch, -1, "builtin_type_ieee_single",
+		       floatformats_ieee_single);
+  builtin_type->builtin_ieee_double
+    = arch_float_type (gdbarch, -1, "builtin_type_ieee_double",
+		       floatformats_ieee_double);
+  builtin_type->builtin_i387_ext
+    = arch_float_type (gdbarch, -1, "builtin_type_i387_ext",
+		       floatformats_i387_ext);
+
   /* Default data/code pointer types.  */
   builtin_type->builtin_data_ptr
     = lookup_pointer_type (builtin_type->builtin_void);
diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h
index 643fa03..ad8153f 100644
--- a/gdb/gdbtypes.h
+++ b/gdb/gdbtypes.h
@@ -1122,6 +1122,9 @@ struct builtin_type
   struct type *builtin_int128;
   struct type *builtin_uint128;
 
+  struct type *builtin_ieee_single;
+  struct type *builtin_ieee_double;
+  struct type *builtin_i387_ext;
 
   /* Pointer types.  */
 
diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c
index 83aa81f..3888799 100644
--- a/gdb/i386-tdep.c
+++ b/gdb/i386-tdep.c
@@ -1905,7 +1905,9 @@ i386_extract_return_value (struct gdbarch *gdbarch, struct type *type,
 	 exactly how it would happen on the target itself, but it is
 	 the best we can do.  */
       regcache_raw_read (regcache, I386_ST0_REGNUM, buf);
-      convert_typed_floating (buf, i387_ext_type (gdbarch), valbuf, type);
+      convert_typed_floating (buf,
+			      builtin_type (gdbarch)->builtin_i387_ext,
+			      valbuf, type);
     }
   else
     {
@@ -1959,7 +1961,8 @@ i386_store_return_value (struct gdbarch *gdbarch, struct type *type,
 	 floating-point format used by the FPU.  This is probably
 	 not exactly how it would happen on the target itself, but
 	 it is the best we can do.  */
-      convert_typed_floating (valbuf, type, buf, i387_ext_type (gdbarch));
+      convert_typed_floating (valbuf, type, buf,
+			      builtin_type (gdbarch)->builtin_i387_ext);
       regcache_raw_write (regcache, I386_ST0_REGNUM, buf);
 
       /* Set the top of the floating-point register stack to 7.  The
@@ -2178,19 +2181,6 @@ i386_mxcsr_type (struct gdbarch *gdbarch)
   return tdep->i386_mxcsr_type;
 }
 
-struct type *
-i387_ext_type (struct gdbarch *gdbarch)
-{
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
-
-  if (!tdep->i387_ext_type)
-    tdep->i387_ext_type
-      = arch_float_type (gdbarch, -1, "builtin_type_i387_ext",
-			 floatformats_i387_ext);
-
-  return tdep->i387_ext_type;
-}
-
 /* Construct vector type for MMX registers.  */
 struct type *
 i386_mmx_type (struct gdbarch *gdbarch)
@@ -2299,7 +2289,7 @@ i386_register_type (struct gdbarch *gdbarch, int regnum)
     return builtin_type (gdbarch)->builtin_data_ptr;
 
   if (i386_fp_regnum_p (gdbarch, regnum))
-    return i387_ext_type (gdbarch);
+    return builtin_type (gdbarch)->builtin_i387_ext;
 
   if (i386_mmx_regnum_p (gdbarch, regnum))
     return i386_mmx_type (gdbarch);
diff --git a/gdb/i386-tdep.h b/gdb/i386-tdep.h
index 5915eb9..bb3cc14 100644
--- a/gdb/i386-tdep.h
+++ b/gdb/i386-tdep.h
@@ -151,7 +151,6 @@ struct gdbarch_tdep
   struct type *i386_mxcsr_type;
   struct type *i386_mmx_type;
   struct type *i386_sse_type;
-  struct type *i387_ext_type;
 
   /* Process record/replay target.  */
   /* The map for registers because the AMD64's registers order
@@ -244,7 +243,6 @@ extern struct type *i386_eflags_type (struct gdbarch *gdbarch);
 extern struct type *i386_mxcsr_type (struct gdbarch *gdbarch);
 extern struct type *i386_mmx_type (struct gdbarch *gdbarch);
 extern struct type *i386_sse_type (struct gdbarch *gdbarch);
-extern struct type *i387_ext_type (struct gdbarch *gdbarch);
 
 /* Segment selectors.  */
 #define I386_SEL_RPL	0x0003  /* Requester's Privilege Level mask.  */
diff --git a/gdb/i387-tdep.c b/gdb/i387-tdep.c
index 3fb5b56..25dcae5 100644
--- a/gdb/i387-tdep.c
+++ b/gdb/i387-tdep.c
@@ -47,7 +47,8 @@ print_i387_value (struct gdbarch *gdbarch,
      of certain numbers such as NaNs, even if GDB is running natively.
      This is fine since our caller already detects such special
      numbers and we print the hexadecimal representation anyway.  */
-  value = extract_typed_floating (raw, i387_ext_type (gdbarch));
+  value = extract_typed_floating (raw,
+				  builtin_type (gdbarch)->builtin_i387_ext);
 
   /* We try to print 19 digits.  The last digit may or may not contain
      garbage, but we'd better print one too many.  We need enough room
@@ -293,7 +294,7 @@ i387_convert_register_p (struct gdbarch *gdbarch, int regnum, struct type *type)
     {
       /* Floating point registers must be converted unless we are
 	 accessing them in their hardware type.  */
-      if (type == i387_ext_type (gdbarch))
+      if (type == builtin_type (gdbarch)->builtin_i387_ext)
 	return 0;
       else
 	return 1;
@@ -324,7 +325,8 @@ i387_register_to_value (struct frame_info *frame, int regnum,
 
   /* Convert to TYPE.  */
   get_frame_register (frame, regnum, from);
-  convert_typed_floating (from, i387_ext_type (gdbarch), to, type);
+  convert_typed_floating (from, builtin_type (gdbarch)->builtin_i387_ext,
+			  to, type);
 }
 
 /* Write the contents FROM of a value of type TYPE into register
@@ -348,7 +350,8 @@ i387_value_to_register (struct frame_info *frame, int regnum,
     }
 
   /* Convert from TYPE.  */
-  convert_typed_floating (from, type, to, i387_ext_type (gdbarch));
+  convert_typed_floating (from, type, to,
+			  builtin_type (gdbarch)->builtin_i387_ext);
   put_frame_register (frame, regnum, to);
 }
 \f
diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c
index 4fbc72c..cef91e5 100644
--- a/gdb/target-descriptions.c
+++ b/gdb/target-descriptions.c
@@ -532,12 +532,10 @@ tdesc_gdb_type (struct gdbarch *gdbarch, struct tdesc_type *tdesc_type)
       return builtin_type (gdbarch)->builtin_data_ptr;
 
     case TDESC_TYPE_IEEE_SINGLE:
-      return arch_float_type (gdbarch, -1, "builtin_type_ieee_single",
-			      floatformats_ieee_single);
+      return builtin_type (gdbarch)->builtin_ieee_single;
 
     case TDESC_TYPE_IEEE_DOUBLE:
-      return arch_float_type (gdbarch, -1, "builtin_type_ieee_double",
-			      floatformats_ieee_double);
+      return builtin_type (gdbarch)->builtin_ieee_double;
 
     case TDESC_TYPE_ARM_FPA_EXT:
       return arch_float_type (gdbarch, -1, "builtin_type_arm_ext",


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: PATCH: PATCH: Add builtin floating point types
  2010-02-05  1:15 PATCH: PATCH: Add builtin floating point types H.J. Lu
@ 2010-02-07 21:52 ` Mark Kettenis
  2010-02-07 22:00   ` H.J. Lu
  2010-02-08 18:55 ` PATCH: Cache types from target description H.J. Lu
  1 sibling, 1 reply; 20+ messages in thread
From: Mark Kettenis @ 2010-02-07 21:52 UTC (permalink / raw)
  To: hjl.tools; +Cc: gdb-patches, mark.kettenis

> Date: Thu, 4 Feb 2010 17:14:47 -0800
> From: "H.J. Lu" <hongjiu.lu@intel.com>
> 
> I am resending this patch. The motivation is I am working on x86 xml
> target descriptions.  x86 has i387_ext type. I added
> 
>   case TDESC_TYPE_I387_EXT:
>      return arch_float_type (gdbarch, -1, "builtin_type_i387_ext",
>                              floatformats_i387_ext);
> 
> to tdesc_gdb_type. I would up 8 i387_ext types at 8 different addresses
> with the same bits. x86 does
> 
> if (i386_fp_regnum_p (gdbarch, regnum))
>    {
>      /* Floating point registers must be converted unless we are
>         accessing them in their hardware type.  */
>      if (type == i387_ext_type (gdbarch))
>        return 0;
>      else
>        return 1;
>    }
> 
> It expects 2  i387_ext types should have the same address.  This
> patch caches ieee_single, ieee_double and i387_ext. OK to install?

Sorry, but I don't like this diff.  At the very least, keep the
i387_ext_type() function around.  It makes the diff far less invasive.

Adding architecture-specific types the list of builtin types feels
wrong as well.  

> H.J.
> ---
> 2010-02-04  H.J. Lu  <hongjiu.lu@intel.com>
> 
> 	* amd64-tdep.c (amd64_register_type): Replace i387_ext_type
> 	with builtin_i387_ext.
> 	* i387-tdep.c (print_i387_value): Likewise.
> 	(i387_convert_register_p): Likewise.
> 	(i387_register_to_value): Likewise.
> 	(i387_value_to_register): Likewise.
> 
> 	* gdbtypes.c (gdbtypes_post_init): Initialize
> 	builtin_ieee_single, builtin_ieee_double and builtin_i387_ext.
> 
> 	* gdbtypes.h (builtin_type): Add builtin_ieee_single,
> 	builtin_ieee_double and builtin_i387_ext.
> 
> 	* i386-tdep.c (i386_extract_return_value): Replace i387_ext_type
> 	with builtin_i387_ext.
> 	(i386_store_return_value): Likewise.
> 	(i386_register_type): Likewise.
> 	(i387_ext_type): Removed.
> 
> 	* i386-tdep.h (gdbarch_tdep): Remove i387_ext_type.
> 	(i387_ext_type): Removed.
> 
> 	* target-descriptions.c (tdesc_gdb_type): Use
> 	builtin_ieee_single and builtin_ieee_double.
> 
> diff --git a/gdb/amd64-tdep.c b/gdb/amd64-tdep.c
> index 2b15141..51d6824 100644
> --- a/gdb/amd64-tdep.c
> +++ b/gdb/amd64-tdep.c
> @@ -113,7 +113,7 @@ amd64_register_type (struct gdbarch *gdbarch, int regnum)
>    if (regnum >= AMD64_CS_REGNUM && regnum <= AMD64_GS_REGNUM)
>      return builtin_type (gdbarch)->builtin_int32;
>    if (regnum >= AMD64_ST0_REGNUM && regnum <= AMD64_ST0_REGNUM + 7)
> -    return i387_ext_type (gdbarch);
> +    return builtin_type (gdbarch)->builtin_i387_ext;
>    if (regnum >= AMD64_FCTRL_REGNUM && regnum <= AMD64_FCTRL_REGNUM + 7)
>      return builtin_type (gdbarch)->builtin_int32;
>    if (regnum >= AMD64_XMM0_REGNUM && regnum <= AMD64_XMM0_REGNUM + 15)
> diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c
> index 46846c4..397adba 100644
> --- a/gdb/gdbtypes.c
> +++ b/gdb/gdbtypes.c
> @@ -3470,6 +3470,16 @@ gdbtypes_post_init (struct gdbarch *gdbarch)
>    TYPE_NOTTEXT (builtin_type->builtin_int8) = 1;
>    TYPE_NOTTEXT (builtin_type->builtin_uint8) = 1;
>  
> +  builtin_type->builtin_ieee_single
> +    = arch_float_type (gdbarch, -1, "builtin_type_ieee_single",
> +		       floatformats_ieee_single);
> +  builtin_type->builtin_ieee_double
> +    = arch_float_type (gdbarch, -1, "builtin_type_ieee_double",
> +		       floatformats_ieee_double);
> +  builtin_type->builtin_i387_ext
> +    = arch_float_type (gdbarch, -1, "builtin_type_i387_ext",
> +		       floatformats_i387_ext);
> +
>    /* Default data/code pointer types.  */
>    builtin_type->builtin_data_ptr
>      = lookup_pointer_type (builtin_type->builtin_void);
> diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h
> index 643fa03..ad8153f 100644
> --- a/gdb/gdbtypes.h
> +++ b/gdb/gdbtypes.h
> @@ -1122,6 +1122,9 @@ struct builtin_type
>    struct type *builtin_int128;
>    struct type *builtin_uint128;
>  
> +  struct type *builtin_ieee_single;
> +  struct type *builtin_ieee_double;
> +  struct type *builtin_i387_ext;
>  
>    /* Pointer types.  */
>  
> diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c
> index 83aa81f..3888799 100644
> --- a/gdb/i386-tdep.c
> +++ b/gdb/i386-tdep.c
> @@ -1905,7 +1905,9 @@ i386_extract_return_value (struct gdbarch *gdbarch, struct type *type,
>  	 exactly how it would happen on the target itself, but it is
>  	 the best we can do.  */
>        regcache_raw_read (regcache, I386_ST0_REGNUM, buf);
> -      convert_typed_floating (buf, i387_ext_type (gdbarch), valbuf, type);
> +      convert_typed_floating (buf,
> +			      builtin_type (gdbarch)->builtin_i387_ext,
> +			      valbuf, type);
>      }
>    else
>      {
> @@ -1959,7 +1961,8 @@ i386_store_return_value (struct gdbarch *gdbarch, struct type *type,
>  	 floating-point format used by the FPU.  This is probably
>  	 not exactly how it would happen on the target itself, but
>  	 it is the best we can do.  */
> -      convert_typed_floating (valbuf, type, buf, i387_ext_type (gdbarch));
> +      convert_typed_floating (valbuf, type, buf,
> +			      builtin_type (gdbarch)->builtin_i387_ext);
>        regcache_raw_write (regcache, I386_ST0_REGNUM, buf);
>  
>        /* Set the top of the floating-point register stack to 7.  The
> @@ -2178,19 +2181,6 @@ i386_mxcsr_type (struct gdbarch *gdbarch)
>    return tdep->i386_mxcsr_type;
>  }
>  
> -struct type *
> -i387_ext_type (struct gdbarch *gdbarch)
> -{
> -  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> -
> -  if (!tdep->i387_ext_type)
> -    tdep->i387_ext_type
> -      = arch_float_type (gdbarch, -1, "builtin_type_i387_ext",
> -			 floatformats_i387_ext);
> -
> -  return tdep->i387_ext_type;
> -}
> -
>  /* Construct vector type for MMX registers.  */
>  struct type *
>  i386_mmx_type (struct gdbarch *gdbarch)
> @@ -2299,7 +2289,7 @@ i386_register_type (struct gdbarch *gdbarch, int regnum)
>      return builtin_type (gdbarch)->builtin_data_ptr;
>  
>    if (i386_fp_regnum_p (gdbarch, regnum))
> -    return i387_ext_type (gdbarch);
> +    return builtin_type (gdbarch)->builtin_i387_ext;
>  
>    if (i386_mmx_regnum_p (gdbarch, regnum))
>      return i386_mmx_type (gdbarch);
> diff --git a/gdb/i386-tdep.h b/gdb/i386-tdep.h
> index 5915eb9..bb3cc14 100644
> --- a/gdb/i386-tdep.h
> +++ b/gdb/i386-tdep.h
> @@ -151,7 +151,6 @@ struct gdbarch_tdep
>    struct type *i386_mxcsr_type;
>    struct type *i386_mmx_type;
>    struct type *i386_sse_type;
> -  struct type *i387_ext_type;
>  
>    /* Process record/replay target.  */
>    /* The map for registers because the AMD64's registers order
> @@ -244,7 +243,6 @@ extern struct type *i386_eflags_type (struct gdbarch *gdbarch);
>  extern struct type *i386_mxcsr_type (struct gdbarch *gdbarch);
>  extern struct type *i386_mmx_type (struct gdbarch *gdbarch);
>  extern struct type *i386_sse_type (struct gdbarch *gdbarch);
> -extern struct type *i387_ext_type (struct gdbarch *gdbarch);
>  
>  /* Segment selectors.  */
>  #define I386_SEL_RPL	0x0003  /* Requester's Privilege Level mask.  */
> diff --git a/gdb/i387-tdep.c b/gdb/i387-tdep.c
> index 3fb5b56..25dcae5 100644
> --- a/gdb/i387-tdep.c
> +++ b/gdb/i387-tdep.c
> @@ -47,7 +47,8 @@ print_i387_value (struct gdbarch *gdbarch,
>       of certain numbers such as NaNs, even if GDB is running natively.
>       This is fine since our caller already detects such special
>       numbers and we print the hexadecimal representation anyway.  */
> -  value = extract_typed_floating (raw, i387_ext_type (gdbarch));
> +  value = extract_typed_floating (raw,
> +				  builtin_type (gdbarch)->builtin_i387_ext);
>  
>    /* We try to print 19 digits.  The last digit may or may not contain
>       garbage, but we'd better print one too many.  We need enough room
> @@ -293,7 +294,7 @@ i387_convert_register_p (struct gdbarch *gdbarch, int regnum, struct type *type)
>      {
>        /* Floating point registers must be converted unless we are
>  	 accessing them in their hardware type.  */
> -      if (type == i387_ext_type (gdbarch))
> +      if (type == builtin_type (gdbarch)->builtin_i387_ext)
>  	return 0;
>        else
>  	return 1;
> @@ -324,7 +325,8 @@ i387_register_to_value (struct frame_info *frame, int regnum,
>  
>    /* Convert to TYPE.  */
>    get_frame_register (frame, regnum, from);
> -  convert_typed_floating (from, i387_ext_type (gdbarch), to, type);
> +  convert_typed_floating (from, builtin_type (gdbarch)->builtin_i387_ext,
> +			  to, type);
>  }
>  
>  /* Write the contents FROM of a value of type TYPE into register
> @@ -348,7 +350,8 @@ i387_value_to_register (struct frame_info *frame, int regnum,
>      }
>  
>    /* Convert from TYPE.  */
> -  convert_typed_floating (from, type, to, i387_ext_type (gdbarch));
> +  convert_typed_floating (from, type, to,
> +			  builtin_type (gdbarch)->builtin_i387_ext);
>    put_frame_register (frame, regnum, to);
>  }
>  \f
> diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c
> index 4fbc72c..cef91e5 100644
> --- a/gdb/target-descriptions.c
> +++ b/gdb/target-descriptions.c
> @@ -532,12 +532,10 @@ tdesc_gdb_type (struct gdbarch *gdbarch, struct tdesc_type *tdesc_type)
>        return builtin_type (gdbarch)->builtin_data_ptr;
>  
>      case TDESC_TYPE_IEEE_SINGLE:
> -      return arch_float_type (gdbarch, -1, "builtin_type_ieee_single",
> -			      floatformats_ieee_single);
> +      return builtin_type (gdbarch)->builtin_ieee_single;
>  
>      case TDESC_TYPE_IEEE_DOUBLE:
> -      return arch_float_type (gdbarch, -1, "builtin_type_ieee_double",
> -			      floatformats_ieee_double);
> +      return builtin_type (gdbarch)->builtin_ieee_double;
>  
>      case TDESC_TYPE_ARM_FPA_EXT:
>        return arch_float_type (gdbarch, -1, "builtin_type_arm_ext",
> 


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: PATCH: PATCH: Add builtin floating point types
  2010-02-07 21:52 ` Mark Kettenis
@ 2010-02-07 22:00   ` H.J. Lu
  2010-02-07 22:14     ` Daniel Jacobowitz
  0 siblings, 1 reply; 20+ messages in thread
From: H.J. Lu @ 2010-02-07 22:00 UTC (permalink / raw)
  To: Mark Kettenis; +Cc: gdb-patches

On Sun, Feb 7, 2010 at 1:52 PM, Mark Kettenis <mark.kettenis@xs4all.nl> wrote:
>> Date: Thu, 4 Feb 2010 17:14:47 -0800
>> From: "H.J. Lu" <hongjiu.lu@intel.com>
>>
>> I am resending this patch. The motivation is I am working on x86 xml
>> target descriptions.  x86 has i387_ext type. I added
>>
>>   case TDESC_TYPE_I387_EXT:
>>      return arch_float_type (gdbarch, -1, "builtin_type_i387_ext",
>>                              floatformats_i387_ext);
>>
>> to tdesc_gdb_type. I would up 8 i387_ext types at 8 different addresses
>> with the same bits. x86 does
>>
>> if (i386_fp_regnum_p (gdbarch, regnum))
>>    {
>>      /* Floating point registers must be converted unless we are
>>         accessing them in their hardware type.  */
>>      if (type == i387_ext_type (gdbarch))
>>        return 0;
>>      else
>>        return 1;
>>    }
>>
>> It expects 2  i387_ext types should have the same address.  This
>> patch caches ieee_single, ieee_double and i387_ext. OK to install?
>
> Sorry, but I don't like this diff.  At the very least, keep the
> i387_ext_type() function around.  It makes the diff far less invasive.

Is there a way to call i387_ext_type from  target-descriptions.c?
Otherwise,  XML target description will create multiple i386_ext
types and won't work for x86 since x86 requires single i386_ext
type per arch.

Thanks.


-- 
H.J.


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: PATCH: PATCH: Add builtin floating point types
  2010-02-07 22:00   ` H.J. Lu
@ 2010-02-07 22:14     ` Daniel Jacobowitz
  2010-02-07 22:25       ` H.J. Lu
  0 siblings, 1 reply; 20+ messages in thread
From: Daniel Jacobowitz @ 2010-02-07 22:14 UTC (permalink / raw)
  To: H.J. Lu; +Cc: Mark Kettenis, gdb-patches

On Sun, Feb 07, 2010 at 02:00:36PM -0800, H.J. Lu wrote:
> Is there a way to call i387_ext_type from  target-descriptions.c?
> Otherwise,  XML target description will create multiple i386_ext
> types and won't work for x86 since x86 requires single i386_ext
> type per arch.

Maybe the common code could cache the created types?

-- 
Daniel Jacobowitz
CodeSourcery


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: PATCH: PATCH: Add builtin floating point types
  2010-02-07 22:14     ` Daniel Jacobowitz
@ 2010-02-07 22:25       ` H.J. Lu
  2010-02-07 23:03         ` H.J. Lu
  0 siblings, 1 reply; 20+ messages in thread
From: H.J. Lu @ 2010-02-07 22:25 UTC (permalink / raw)
  To: H.J. Lu, Mark Kettenis, gdb-patches

On Sun, Feb 7, 2010 at 2:14 PM, Daniel Jacobowitz <dan@codesourcery.com> wrote:
> On Sun, Feb 07, 2010 at 02:00:36PM -0800, H.J. Lu wrote:
>> Is there a way to call i387_ext_type from  target-descriptions.c?
>> Otherwise,  XML target description will create multiple i386_ext
>> types and won't work for x86 since x86 requires single i386_ext
>> type per arch.
>
> Maybe the common code could cache the created types?
>

I need a place to hold the created type in the common code.
When do I put it?

Thanks.


-- 
H.J.


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: PATCH: PATCH: Add builtin floating point types
  2010-02-07 22:25       ` H.J. Lu
@ 2010-02-07 23:03         ` H.J. Lu
  2010-02-07 23:08           ` Daniel Jacobowitz
  0 siblings, 1 reply; 20+ messages in thread
From: H.J. Lu @ 2010-02-07 23:03 UTC (permalink / raw)
  To: H.J. Lu, Mark Kettenis, gdb-patches

On Sun, Feb 7, 2010 at 2:25 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
> On Sun, Feb 7, 2010 at 2:14 PM, Daniel Jacobowitz <dan@codesourcery.com> wrote:
>> On Sun, Feb 07, 2010 at 02:00:36PM -0800, H.J. Lu wrote:
>>> Is there a way to call i387_ext_type from  target-descriptions.c?
>>> Otherwise,  XML target description will create multiple i386_ext
>>> types and won't work for x86 since x86 requires single i386_ext
>>> type per arch.
>>
>> Maybe the common code could cache the created types?
>>
>
> I need a place to hold the created type in the common code.
> When do I put it?
>

How about adding it to common code without initializing it?
I will lazy initialize it in target-description.c only when it
is used?

Thanks.


-- 
H.J.


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: PATCH: PATCH: Add builtin floating point types
  2010-02-07 23:03         ` H.J. Lu
@ 2010-02-07 23:08           ` Daniel Jacobowitz
  2010-02-08  2:17             ` H.J. Lu
  0 siblings, 1 reply; 20+ messages in thread
From: Daniel Jacobowitz @ 2010-02-07 23:08 UTC (permalink / raw)
  To: H.J. Lu; +Cc: Mark Kettenis, gdb-patches

On Sun, Feb 07, 2010 at 03:03:09PM -0800, H.J. Lu wrote:
> How about adding it to common code without initializing it?
> I will lazy initialize it in target-description.c only when it
> is used?

It's easy to add per-gdbarch variables using gdbarch_data.
I was suggesting the cache at the level of arch_floating_type (or
however it's called).

-- 
Daniel Jacobowitz
CodeSourcery


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: PATCH: PATCH: Add builtin floating point types
  2010-02-07 23:08           ` Daniel Jacobowitz
@ 2010-02-08  2:17             ` H.J. Lu
  2010-02-08  4:17               ` Daniel Jacobowitz
  0 siblings, 1 reply; 20+ messages in thread
From: H.J. Lu @ 2010-02-08  2:17 UTC (permalink / raw)
  To: H.J. Lu, Mark Kettenis, gdb-patches

On Sun, Feb 7, 2010 at 3:08 PM, Daniel Jacobowitz <dan@codesourcery.com> wrote:
> On Sun, Feb 07, 2010 at 03:03:09PM -0800, H.J. Lu wrote:
>> How about adding it to common code without initializing it?
>> I will lazy initialize it in target-description.c only when it
>> is used?
>
> It's easy to add per-gdbarch variables using gdbarch_data.
> I was suggesting the cache at the level of arch_floating_type (or
> however it's called).
>


We have builtin_float and other float types in gdbtypes.c,
using gdbarch_data. I will add

/* Return the type table for the specified architecture.  */
extern const struct arch_floating_type *arch_floating_type (struct
gdbarch *gdbarch);

with gdbfloattypes.[ch].

-- 
H.J.


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: PATCH: PATCH: Add builtin floating point types
  2010-02-08  2:17             ` H.J. Lu
@ 2010-02-08  4:17               ` Daniel Jacobowitz
  2010-02-08  5:16                 ` H.J. Lu
  0 siblings, 1 reply; 20+ messages in thread
From: Daniel Jacobowitz @ 2010-02-08  4:17 UTC (permalink / raw)
  To: H.J. Lu; +Cc: Mark Kettenis, gdb-patches

On Sun, Feb 07, 2010 at 06:16:55PM -0800, H.J. Lu wrote:
> We have builtin_float and other float types in gdbtypes.c,
> using gdbarch_data. I will add
> 
> /* Return the type table for the specified architecture.  */
> extern const struct arch_floating_type *arch_floating_type (struct
> gdbarch *gdbarch);
> 
> with gdbfloattypes.[ch].

I can't figure out what you mean by this at all.

-- 
Daniel Jacobowitz
CodeSourcery


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: PATCH: PATCH: Add builtin floating point types
  2010-02-08  4:17               ` Daniel Jacobowitz
@ 2010-02-08  5:16                 ` H.J. Lu
  2010-02-08 14:14                   ` Daniel Jacobowitz
  0 siblings, 1 reply; 20+ messages in thread
From: H.J. Lu @ 2010-02-08  5:16 UTC (permalink / raw)
  To: H.J. Lu, Mark Kettenis, gdb-patches

On Sun, Feb 7, 2010 at 8:17 PM, Daniel Jacobowitz <dan@codesourcery.com> wrote:
> On Sun, Feb 07, 2010 at 06:16:55PM -0800, H.J. Lu wrote:
>> We have builtin_float and other float types in gdbtypes.c,
>> using gdbarch_data. I will add
>>
>> /* Return the type table for the specified architecture.  */
>> extern const struct arch_floating_type *arch_floating_type (struct
>> gdbarch *gdbarch);
>>
>> with gdbfloattypes.[ch].
>
> I can't figure out what you mean by this at all.
>

I will add a new file, archtypes.c, which provides

extern const struct arch_type *arch_type (struct gdbarch *gdbarch);

which is similar to

extern const struct builtin_type *builtin_type (struct gdbarch *gdbarch);

in gdbtypes.c. struct arch_type will have

struct type *arch_ieee_single;
struct type *arch_ieee_double;
struct type *arch_i387_ext;

They will be lazy initialized. I thought that was what you suggested.


-- 
H.J.


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: PATCH: PATCH: Add builtin floating point types
  2010-02-08  5:16                 ` H.J. Lu
@ 2010-02-08 14:14                   ` Daniel Jacobowitz
  2010-02-08 14:56                     ` H.J. Lu
  2010-02-08 18:56                     ` H.J. Lu
  0 siblings, 2 replies; 20+ messages in thread
From: Daniel Jacobowitz @ 2010-02-08 14:14 UTC (permalink / raw)
  To: H.J. Lu; +Cc: Mark Kettenis, gdb-patches

On Sun, Feb 07, 2010 at 09:16:25PM -0800, H.J. Lu wrote:
> in gdbtypes.c. struct arch_type will have
> 
> struct type *arch_ieee_single;
> struct type *arch_ieee_double;
> struct type *arch_i387_ext;
> 
> They will be lazy initialized. I thought that was what you suggested.

This hasn't changed anything; it still has to know about i387_ext.

There are at least two options.  We could use a per-gdbarch hash table
to cache the result of arch_float_type (in arch_float_type, not in its
caller).  Or we could put the cache in tdesc_gdb_type, which is
probably easier.

There's already an ARM-specific type there.  It's there because the
XML format already has to know the magic arch-specific names and
document them in the GDB manual appendix.

-- 
Daniel Jacobowitz
CodeSourcery


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: PATCH: PATCH: Add builtin floating point types
  2010-02-08 14:14                   ` Daniel Jacobowitz
@ 2010-02-08 14:56                     ` H.J. Lu
  2010-02-08 18:56                     ` H.J. Lu
  1 sibling, 0 replies; 20+ messages in thread
From: H.J. Lu @ 2010-02-08 14:56 UTC (permalink / raw)
  To: H.J. Lu, Mark Kettenis, gdb-patches

On Mon, Feb 8, 2010 at 6:14 AM, Daniel Jacobowitz <dan@codesourcery.com> wrote:
> On Sun, Feb 07, 2010 at 09:16:25PM -0800, H.J. Lu wrote:
>> in gdbtypes.c. struct arch_type will have
>>
>> struct type *arch_ieee_single;
>> struct type *arch_ieee_double;
>> struct type *arch_i387_ext;
>>
>> They will be lazy initialized. I thought that was what you suggested.
>
> This hasn't changed anything; it still has to know about i387_ext.
>
> There are at least two options.  We could use a per-gdbarch hash table
> to cache the result of arch_float_type (in arch_float_type, not in its
> caller).  Or we could put the cache in tdesc_gdb_type, which is
> probably easier.

Something like

/* Return the type associated with ID, from the target description. */

struct type *tdesc_gdb_type (struct gdbarch *gdbarch, const char *id);



-- 
H.J.


^ permalink raw reply	[flat|nested] 20+ messages in thread

* PATCH: Cache types from target description
  2010-02-05  1:15 PATCH: PATCH: Add builtin floating point types H.J. Lu
  2010-02-07 21:52 ` Mark Kettenis
@ 2010-02-08 18:55 ` H.J. Lu
  2010-02-09 15:45   ` H.J. Lu
  1 sibling, 1 reply; 20+ messages in thread
From: H.J. Lu @ 2010-02-08 18:55 UTC (permalink / raw)
  To: H.J. Lu; +Cc: GDB, Mark Kettenis

On Thu, Feb 04, 2010 at 05:14:47PM -0800, H.J. Lu wrote:
> I am resending this patch. The motivation is I am working on x86 xml
> target descriptions.  x86 has i387_ext type. I added
> 
>   case TDESC_TYPE_I387_EXT:
>      return arch_float_type (gdbarch, -1, "builtin_type_i387_ext",
>                              floatformats_i387_ext);
> 
> to tdesc_gdb_type. I would up 8 i387_ext types at 8 different addresses
> with the same bits. x86 does
> 
> if (i386_fp_regnum_p (gdbarch, regnum))
>    {
>      /* Floating point registers must be converted unless we are
>         accessing them in their hardware type.  */
>      if (type == i387_ext_type (gdbarch))
>        return 0;
>      else
>        return 1;
>    }
> 
> It expects 2  i387_ext types should have the same address.  This
> patch caches ieee_single, ieee_double and i387_ext. OK to install?
> 


Here is a different patch to cache types from target description. 
tdesc_find_type will be used in i387_ext_type to lookup "i387_ext".
OK to install?

Thanks.


H.J.
---
2010-02-08  H.J. Lu  <hongjiu.lu@intel.com>

	* target-descriptions.c (tdesc_type): Add TDESC_TYPE_I387_EXT,
	TDESC_TYPE_I386_EFLAGS and TDESC_TYPE_I386_MXCSR.
	(tdesc_predefined_types): Add i387_ext, i386_eflags and
	i386_mxcsr.
	(tdesc_find_type): New.
	(tdesc_gdb_type): Use tdesc_find_type.  Handle TDESC_TYPE_I387_EXT,
	TDESC_TYPE_I386_EFLAGS and TDESC_TYPE_I386_MXCSR.

diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c
index 4fbc72c..ae22163 100644
--- a/gdb/target-descriptions.c
+++ b/gdb/target-descriptions.c
@@ -117,6 +117,9 @@ typedef struct tdesc_type
     TDESC_TYPE_IEEE_SINGLE,
     TDESC_TYPE_IEEE_DOUBLE,
     TDESC_TYPE_ARM_FPA_EXT,
+    TDESC_TYPE_I387_EXT,
+    TDESC_TYPE_I386_EFLAGS,
+    TDESC_TYPE_I386_MXCSR,
 
     /* Types defined by a target feature.  */
     TDESC_TYPE_VECTOR,
@@ -461,7 +464,10 @@ static struct tdesc_type tdesc_predefined_types[] =
   { "data_ptr", TDESC_TYPE_DATA_PTR },
   { "ieee_single", TDESC_TYPE_IEEE_SINGLE },
   { "ieee_double", TDESC_TYPE_IEEE_DOUBLE },
-  { "arm_fpa_ext", TDESC_TYPE_ARM_FPA_EXT }
+  { "arm_fpa_ext", TDESC_TYPE_ARM_FPA_EXT },
+  { "i387_ext", TDESC_TYPE_I387_EXT },
+  { "i386_eflags", TDESC_TYPE_I386_EFLAGS },
+  { "i386_mxcsr", TDESC_TYPE_I386_MXCSR }
 };
 
 /* Return the type associated with ID in the context of FEATURE, or
@@ -486,12 +492,38 @@ tdesc_named_type (const struct tdesc_feature *feature, const char *id)
   return NULL;
 }
 
+/* Lookup type associated with ID.  */
+
+struct type *
+tdesc_find_type (struct gdbarch *gdbarch, const char *id)
+{
+  struct tdesc_arch_reg *reg;
+  struct tdesc_arch_data *data;
+  int i, num_regs;
+
+  data = gdbarch_data (gdbarch, tdesc_data);
+  num_regs = VEC_length (tdesc_arch_reg, data->arch_regs);
+  for (i = 0; i < num_regs; i++)
+    {
+      reg = VEC_index (tdesc_arch_reg, data->arch_regs, i);
+      if (reg->reg
+	  && reg->reg->tdesc_type
+	  && reg->type
+	  && strcmp (id, reg->reg->tdesc_type->name) == 0)
+	return reg->type;
+    }
+
+  return NULL;
+}
+
 /* Construct, if necessary, and return the GDB type implementing target
    type TDESC_TYPE for architecture GDBARCH.  */
 
 static struct type *
 tdesc_gdb_type (struct gdbarch *gdbarch, struct tdesc_type *tdesc_type)
 {
+  struct type *type;
+
   switch (tdesc_type->kind)
     {
     /* Predefined types.  */
@@ -531,6 +563,16 @@ tdesc_gdb_type (struct gdbarch *gdbarch, struct tdesc_type *tdesc_type)
     case TDESC_TYPE_DATA_PTR:
       return builtin_type (gdbarch)->builtin_data_ptr;
 
+    default:
+      break;
+    }
+
+  type = tdesc_find_type (gdbarch, tdesc_type->name);
+  if (type)
+    return type;
+
+  switch (tdesc_type->kind)
+    {
     case TDESC_TYPE_IEEE_SINGLE:
       return arch_float_type (gdbarch, -1, "builtin_type_ieee_single",
 			      floatformats_ieee_single);
@@ -543,6 +585,58 @@ tdesc_gdb_type (struct gdbarch *gdbarch, struct tdesc_type *tdesc_type)
       return arch_float_type (gdbarch, -1, "builtin_type_arm_ext",
 			      floatformats_arm_ext);
 
+    case TDESC_TYPE_I387_EXT:
+      return arch_float_type (gdbarch, -1, "builtin_type_i387_ext",
+			      floatformats_i387_ext);
+
+    case TDESC_TYPE_I386_EFLAGS:
+      {
+	struct type *type;
+
+	type = arch_flags_type (gdbarch, "builtin_type_i386_mxcsr", 4);
+	append_flags_type_flag (type, 0, "IE");
+	append_flags_type_flag (type, 1, "DE");
+	append_flags_type_flag (type, 2, "ZE");
+	append_flags_type_flag (type, 3, "OE");
+	append_flags_type_flag (type, 4, "UE");
+	append_flags_type_flag (type, 5, "PE");
+	append_flags_type_flag (type, 6, "DAZ");
+	append_flags_type_flag (type, 7, "IM");
+	append_flags_type_flag (type, 8, "DM");
+	append_flags_type_flag (type, 9, "ZM");
+	append_flags_type_flag (type, 10, "OM");
+	append_flags_type_flag (type, 11, "UM");
+	append_flags_type_flag (type, 12, "PM");
+	append_flags_type_flag (type, 15, "FZ");
+
+	return type;
+      }
+    break;
+
+    case TDESC_TYPE_I386_MXCSR:
+      {
+	struct type *type;
+
+	type = arch_flags_type (gdbarch, "builtin_type_i386_mxcsr", 4);
+	append_flags_type_flag (type, 0, "IE");
+	append_flags_type_flag (type, 1, "DE");
+	append_flags_type_flag (type, 2, "ZE");
+	append_flags_type_flag (type, 3, "OE");
+	append_flags_type_flag (type, 4, "UE");
+	append_flags_type_flag (type, 5, "PE");
+	append_flags_type_flag (type, 6, "DAZ");
+	append_flags_type_flag (type, 7, "IM");
+	append_flags_type_flag (type, 8, "DM");
+	append_flags_type_flag (type, 9, "ZM");
+	append_flags_type_flag (type, 10, "OM");
+	append_flags_type_flag (type, 11, "UM");
+	append_flags_type_flag (type, 12, "PM");
+	append_flags_type_flag (type, 15, "FZ");
+
+	return type;
+      }
+    break;
+
     /* Types defined by a target feature.  */
     case TDESC_TYPE_VECTOR:
       {
diff --git a/gdb/target-descriptions.h b/gdb/target-descriptions.h
index 17f52eb..da0564b 100644
--- a/gdb/target-descriptions.h
+++ b/gdb/target-descriptions.h
@@ -176,6 +176,10 @@ const char *tdesc_register_name (struct gdbarch *gdbarch, int regno);
 
 struct type *tdesc_register_type (struct gdbarch *gdbarch, int regno);
 
+/* Return the type associated with ID, from the target description. */
+
+struct type *tdesc_find_type (struct gdbarch *gdbarch, const char *id);
+
 /* Check whether REGNUM is a member of REGGROUP using the target
    description.  Return -1 if the target description does not
    specify a group.  */


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: PATCH: PATCH: Add builtin floating point types
  2010-02-08 14:14                   ` Daniel Jacobowitz
  2010-02-08 14:56                     ` H.J. Lu
@ 2010-02-08 18:56                     ` H.J. Lu
  1 sibling, 0 replies; 20+ messages in thread
From: H.J. Lu @ 2010-02-08 18:56 UTC (permalink / raw)
  To: H.J. Lu, Mark Kettenis, gdb-patches

On Mon, Feb 8, 2010 at 6:14 AM, Daniel Jacobowitz <dan@codesourcery.com> wrote:
> On Sun, Feb 07, 2010 at 09:16:25PM -0800, H.J. Lu wrote:
>> in gdbtypes.c. struct arch_type will have
>>
>> struct type *arch_ieee_single;
>> struct type *arch_ieee_double;
>> struct type *arch_i387_ext;
>>
>> They will be lazy initialized. I thought that was what you suggested.
>
> This hasn't changed anything; it still has to know about i387_ext.
>
> There are at least two options.  We could use a per-gdbarch hash table
> to cache the result of arch_float_type (in arch_float_type, not in its
> caller).  Or we could put the cache in tdesc_gdb_type, which is
> probably easier.

A patch is posted at

http://sourceware.org/ml/gdb-patches/2010-02/msg00214.html

Thanks.

-- 
H.J.


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: PATCH: Cache types from target description
  2010-02-08 18:55 ` PATCH: Cache types from target description H.J. Lu
@ 2010-02-09 15:45   ` H.J. Lu
  2010-02-09 18:47     ` Eli Zaretskii
  2010-02-10 18:38     ` Daniel Jacobowitz
  0 siblings, 2 replies; 20+ messages in thread
From: H.J. Lu @ 2010-02-09 15:45 UTC (permalink / raw)
  To: H.J. Lu; +Cc: GDB, Mark Kettenis

On Mon, Feb 08, 2010 at 10:54:54AM -0800, H.J. Lu wrote:
> On Thu, Feb 04, 2010 at 05:14:47PM -0800, H.J. Lu wrote:
> > I am resending this patch. The motivation is I am working on x86 xml
> > target descriptions.  x86 has i387_ext type. I added
> > 
> >   case TDESC_TYPE_I387_EXT:
> >      return arch_float_type (gdbarch, -1, "builtin_type_i387_ext",
> >                              floatformats_i387_ext);
> > 
> > to tdesc_gdb_type. I would up 8 i387_ext types at 8 different addresses
> > with the same bits. x86 does
> > 
> > if (i386_fp_regnum_p (gdbarch, regnum))
> >    {
> >      /* Floating point registers must be converted unless we are
> >         accessing them in their hardware type.  */
> >      if (type == i387_ext_type (gdbarch))
> >        return 0;
> >      else
> >        return 1;
> >    }
> > 
> > It expects 2  i387_ext types should have the same address.  This
> > patch caches ieee_single, ieee_double and i387_ext. OK to install?
> > 
> 
> 
> Here is a different patch to cache types from target description. 
> tdesc_find_type will be used in i387_ext_type to lookup "i387_ext".
> OK to install?
> 

Here is the updated patch. I fixed i386_eflags and documented them.
OK to install?

Thanks.


H.J.
---
gdb/

2010-02-09  H.J. Lu  <hongjiu.lu@intel.com>

	* target-descriptions.c (tdesc_type): Add TDESC_TYPE_I387_EXT,
	TDESC_TYPE_I386_EFLAGS and TDESC_TYPE_I386_MXCSR.
	(tdesc_predefined_types): Add i387_ext, i386_eflags and
	i386_mxcsr.
	(tdesc_find_type): New.
	(tdesc_gdb_type): Use tdesc_find_type.  Handle TDESC_TYPE_I387_EXT,
	TDESC_TYPE_I386_EFLAGS and TDESC_TYPE_I386_MXCSR.

	* target-descriptions.h (tdesc_find_type): New.

doc/

2010-02-09  H.J. Lu  <hongjiu.lu@intel.com>

	* gdb.texinfo: Add i387_ext, i386_eflags and i386_mxcsr.

diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index b31cfed..9c52fcb 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -32749,6 +32749,15 @@ Double precision IEEE floating point.
 @item arm_fpa_ext
 The 12-byte extended precision format used by ARM FPA registers.
 
+@item i387_ext
+The 10-byte extended precision format used by x87 registers.
+
+@item i386_eflags
+32bit EFLAGS register used by x86.
+
+@item i386_mxcsr
+32bit MXCSR register used by x86.
+
 @end table
 
 @node Standard Target Features
diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c
index 4fbc72c..9856d6f 100644
--- a/gdb/target-descriptions.c
+++ b/gdb/target-descriptions.c
@@ -117,6 +117,9 @@ typedef struct tdesc_type
     TDESC_TYPE_IEEE_SINGLE,
     TDESC_TYPE_IEEE_DOUBLE,
     TDESC_TYPE_ARM_FPA_EXT,
+    TDESC_TYPE_I387_EXT,
+    TDESC_TYPE_I386_EFLAGS,
+    TDESC_TYPE_I386_MXCSR,
 
     /* Types defined by a target feature.  */
     TDESC_TYPE_VECTOR,
@@ -461,7 +464,10 @@ static struct tdesc_type tdesc_predefined_types[] =
   { "data_ptr", TDESC_TYPE_DATA_PTR },
   { "ieee_single", TDESC_TYPE_IEEE_SINGLE },
   { "ieee_double", TDESC_TYPE_IEEE_DOUBLE },
-  { "arm_fpa_ext", TDESC_TYPE_ARM_FPA_EXT }
+  { "arm_fpa_ext", TDESC_TYPE_ARM_FPA_EXT },
+  { "i387_ext", TDESC_TYPE_I387_EXT },
+  { "i386_eflags", TDESC_TYPE_I386_EFLAGS },
+  { "i386_mxcsr", TDESC_TYPE_I386_MXCSR }
 };
 
 /* Return the type associated with ID in the context of FEATURE, or
@@ -486,12 +492,38 @@ tdesc_named_type (const struct tdesc_feature *feature, const char *id)
   return NULL;
 }
 
+/* Lookup type associated with ID.  */
+
+struct type *
+tdesc_find_type (struct gdbarch *gdbarch, const char *id)
+{
+  struct tdesc_arch_reg *reg;
+  struct tdesc_arch_data *data;
+  int i, num_regs;
+
+  data = gdbarch_data (gdbarch, tdesc_data);
+  num_regs = VEC_length (tdesc_arch_reg, data->arch_regs);
+  for (i = 0; i < num_regs; i++)
+    {
+      reg = VEC_index (tdesc_arch_reg, data->arch_regs, i);
+      if (reg->reg
+	  && reg->reg->tdesc_type
+	  && reg->type
+	  && strcmp (id, reg->reg->tdesc_type->name) == 0)
+	return reg->type;
+    }
+
+  return NULL;
+}
+
 /* Construct, if necessary, and return the GDB type implementing target
    type TDESC_TYPE for architecture GDBARCH.  */
 
 static struct type *
 tdesc_gdb_type (struct gdbarch *gdbarch, struct tdesc_type *tdesc_type)
 {
+  struct type *type;
+
   switch (tdesc_type->kind)
     {
     /* Predefined types.  */
@@ -531,6 +563,16 @@ tdesc_gdb_type (struct gdbarch *gdbarch, struct tdesc_type *tdesc_type)
     case TDESC_TYPE_DATA_PTR:
       return builtin_type (gdbarch)->builtin_data_ptr;
 
+    default:
+      break;
+    }
+
+  type = tdesc_find_type (gdbarch, tdesc_type->name);
+  if (type)
+    return type;
+
+  switch (tdesc_type->kind)
+    {
     case TDESC_TYPE_IEEE_SINGLE:
       return arch_float_type (gdbarch, -1, "builtin_type_ieee_single",
 			      floatformats_ieee_single);
@@ -543,6 +585,61 @@ tdesc_gdb_type (struct gdbarch *gdbarch, struct tdesc_type *tdesc_type)
       return arch_float_type (gdbarch, -1, "builtin_type_arm_ext",
 			      floatformats_arm_ext);
 
+    case TDESC_TYPE_I387_EXT:
+      return arch_float_type (gdbarch, -1, "builtin_type_i387_ext",
+			      floatformats_i387_ext);
+
+    case TDESC_TYPE_I386_EFLAGS:
+      {
+	struct type *type;
+
+	type = arch_flags_type (gdbarch, "builtin_type_i386_eflags", 4);
+	append_flags_type_flag (type, 0, "CF");
+	append_flags_type_flag (type, 1, NULL);
+	append_flags_type_flag (type, 2, "PF");
+	append_flags_type_flag (type, 4, "AF");
+	append_flags_type_flag (type, 6, "ZF");
+	append_flags_type_flag (type, 7, "SF");
+	append_flags_type_flag (type, 8, "TF");
+	append_flags_type_flag (type, 9, "IF");
+	append_flags_type_flag (type, 10, "DF");
+	append_flags_type_flag (type, 11, "OF");
+	append_flags_type_flag (type, 14, "NT");
+	append_flags_type_flag (type, 16, "RF");
+	append_flags_type_flag (type, 17, "VM");
+	append_flags_type_flag (type, 18, "AC");
+	append_flags_type_flag (type, 19, "VIF");
+	append_flags_type_flag (type, 20, "VIP");
+	append_flags_type_flag (type, 21, "ID");
+
+	return type;
+      }
+    break;
+
+    case TDESC_TYPE_I386_MXCSR:
+      {
+	struct type *type;
+
+	type = arch_flags_type (gdbarch, "builtin_type_i386_mxcsr", 4);
+	append_flags_type_flag (type, 0, "IE");
+	append_flags_type_flag (type, 1, "DE");
+	append_flags_type_flag (type, 2, "ZE");
+	append_flags_type_flag (type, 3, "OE");
+	append_flags_type_flag (type, 4, "UE");
+	append_flags_type_flag (type, 5, "PE");
+	append_flags_type_flag (type, 6, "DAZ");
+	append_flags_type_flag (type, 7, "IM");
+	append_flags_type_flag (type, 8, "DM");
+	append_flags_type_flag (type, 9, "ZM");
+	append_flags_type_flag (type, 10, "OM");
+	append_flags_type_flag (type, 11, "UM");
+	append_flags_type_flag (type, 12, "PM");
+	append_flags_type_flag (type, 15, "FZ");
+
+	return type;
+      }
+    break;
+
     /* Types defined by a target feature.  */
     case TDESC_TYPE_VECTOR:
       {
diff --git a/gdb/target-descriptions.h b/gdb/target-descriptions.h
index 17f52eb..da0564b 100644
--- a/gdb/target-descriptions.h
+++ b/gdb/target-descriptions.h
@@ -176,6 +176,10 @@ const char *tdesc_register_name (struct gdbarch *gdbarch, int regno);
 
 struct type *tdesc_register_type (struct gdbarch *gdbarch, int regno);
 
+/* Return the type associated with ID, from the target description. */
+
+struct type *tdesc_find_type (struct gdbarch *gdbarch, const char *id);
+
 /* Check whether REGNUM is a member of REGGROUP using the target
    description.  Return -1 if the target description does not
    specify a group.  */


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: PATCH: Cache types from target description
  2010-02-09 15:45   ` H.J. Lu
@ 2010-02-09 18:47     ` Eli Zaretskii
  2010-02-09 18:56       ` H.J. Lu
  2010-02-10 18:38     ` Daniel Jacobowitz
  1 sibling, 1 reply; 20+ messages in thread
From: Eli Zaretskii @ 2010-02-09 18:47 UTC (permalink / raw)
  To: H.J. Lu; +Cc: gdb-patches, mark.kettenis

> Date: Tue, 9 Feb 2010 07:45:13 -0800
> From: "H.J. Lu" <hongjiu.lu@intel.com>
> Cc: GDB <gdb-patches@sourceware.org>, 	Mark Kettenis <mark.kettenis@xs4all.nl>
> 
> Here is the updated patch. I fixed i386_eflags and documented them.
> OK to install?

The doco part is okay, but please fix the following 2 minor issues
before committing:

> 2010-02-09  H.J. Lu  <hongjiu.lu@intel.com>
> 
> 	* gdb.texinfo: Add i387_ext, i386_eflags and i386_mxcsr.

Please state the name of the node in which you are making the change
(in parens, as if it were a function).  You can find it by looking
back from the locus of the change for a line that begins with
"@node".

> +@item i386_eflags
> +32bit EFLAGS register used by x86.
> +
> +@item i386_mxcsr
> +32bit MXCSR register used by x86.

It would look prettier in print if you use @sc{eflags} and @sc{mxcsr}
instead of up-casing them in the Texinfo sources.

Thanks.


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: PATCH: Cache types from target description
  2010-02-09 18:47     ` Eli Zaretskii
@ 2010-02-09 18:56       ` H.J. Lu
  0 siblings, 0 replies; 20+ messages in thread
From: H.J. Lu @ 2010-02-09 18:56 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gdb-patches, mark.kettenis

On Tue, Feb 9, 2010 at 10:47 AM, Eli Zaretskii <eliz@gnu.org> wrote:
>> Date: Tue, 9 Feb 2010 07:45:13 -0800
>> From: "H.J. Lu" <hongjiu.lu@intel.com>
>> Cc: GDB <gdb-patches@sourceware.org>,         Mark Kettenis <mark.kettenis@xs4all.nl>
>>
>> Here is the updated patch. I fixed i386_eflags and documented them.
>> OK to install?
>
> The doco part is okay, but please fix the following 2 minor issues
> before committing:
>
>> 2010-02-09  H.J. Lu  <hongjiu.lu@intel.com>
>>
>>       * gdb.texinfo: Add i387_ext, i386_eflags and i386_mxcsr.
>
> Please state the name of the node in which you are making the change
> (in parens, as if it were a function).  You can find it by looking
> back from the locus of the change for a line that begins with
> "@node".
>
>> +@item i386_eflags
>> +32bit EFLAGS register used by x86.
>> +
>> +@item i386_mxcsr
>> +32bit MXCSR register used by x86.
>
> It would look prettier in print if you use @sc{eflags} and @sc{mxcsr}
> instead of up-casing them in the Texinfo sources.
>

This is the doc patch I am checking in. I will wait for OK on the other part.

Thanks.


-- 
H.J.
---
2010-02-09  H.J. Lu  <hongjiu.lu@intel.com>

	* gdb.texinfo (Predefined Target Types): Add i387_ext,
	i386_eflags and i386_mxcsr.

diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index b31cfed..81c0b6b 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -32749,6 +32749,15 @@ Double precision IEEE floating point.
 @item arm_fpa_ext
 The 12-byte extended precision format used by ARM FPA registers.

+@item i387_ext
+The 10-byte extended precision format used by x87 registers.
+
+@item i386_eflags
+32bit @sc{eflags} register used by x86.
+
+@item i386_mxcsr
+32bit @sc{mxcsr} register used by x86.
+
 @end table

 @node Standard Target Features


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: PATCH: Cache types from target description
  2010-02-09 15:45   ` H.J. Lu
  2010-02-09 18:47     ` Eli Zaretskii
@ 2010-02-10 18:38     ` Daniel Jacobowitz
  2010-02-10 20:54       ` Mark Kettenis
  1 sibling, 1 reply; 20+ messages in thread
From: Daniel Jacobowitz @ 2010-02-10 18:38 UTC (permalink / raw)
  To: H.J. Lu; +Cc: GDB, Mark Kettenis

On Tue, Feb 09, 2010 at 07:45:13AM -0800, H.J. Lu wrote:
> 2010-02-09  H.J. Lu  <hongjiu.lu@intel.com>
> 
> 	* target-descriptions.c (tdesc_type): Add TDESC_TYPE_I387_EXT,
> 	TDESC_TYPE_I386_EFLAGS and TDESC_TYPE_I386_MXCSR.
> 	(tdesc_predefined_types): Add i387_ext, i386_eflags and
> 	i386_mxcsr.
> 	(tdesc_find_type): New.
> 	(tdesc_gdb_type): Use tdesc_find_type.  Handle TDESC_TYPE_I387_EXT,
> 	TDESC_TYPE_I386_EFLAGS and TDESC_TYPE_I386_MXCSR.
> 
> 	* target-descriptions.h (tdesc_find_type): New.

This is OK.  I am not happy having the flag types in this file, but
I don't see a better way yet.  Really they should be described in the
XML file!

-- 
Daniel Jacobowitz
CodeSourcery


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: PATCH: Cache types from target description
  2010-02-10 18:38     ` Daniel Jacobowitz
@ 2010-02-10 20:54       ` Mark Kettenis
  2010-02-10 21:01         ` Daniel Jacobowitz
  0 siblings, 1 reply; 20+ messages in thread
From: Mark Kettenis @ 2010-02-10 20:54 UTC (permalink / raw)
  To: dan; +Cc: hjl.tools, gdb-patches

> Date: Wed, 10 Feb 2010 13:38:03 -0500
> From: Daniel Jacobowitz <dan@codesourcery.com>
> 
> Really they should be described in the XML file!

'fraid I don't agree with you on that.  When it comes to things like
multi-bit flags, you want a real programming language.


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: PATCH: Cache types from target description
  2010-02-10 20:54       ` Mark Kettenis
@ 2010-02-10 21:01         ` Daniel Jacobowitz
  0 siblings, 0 replies; 20+ messages in thread
From: Daniel Jacobowitz @ 2010-02-10 21:01 UTC (permalink / raw)
  To: Mark Kettenis; +Cc: hjl.tools, gdb-patches

On Wed, Feb 10, 2010 at 09:52:57PM +0100, Mark Kettenis wrote:
> > Date: Wed, 10 Feb 2010 13:38:03 -0500
> > From: Daniel Jacobowitz <dan@codesourcery.com>
> > 
> > Really they should be described in the XML file!
> 
> 'fraid I don't agree with you on that.  When it comes to things like
> multi-bit flags, you want a real programming language.

How else would you do it?  I don't want the answer to be "in C, in
GDB"; we've got devices with dozens of complicated flag registers that
are specific to that one device.

I'm sure I could do it in Python, but it takes away the
self-describing property.  I'm not nuts enough to encapsulate the
Python in XML and execute untrusted code.

-- 
Daniel Jacobowitz
CodeSourcery


^ permalink raw reply	[flat|nested] 20+ messages in thread

end of thread, other threads:[~2010-02-10 21:01 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-02-05  1:15 PATCH: PATCH: Add builtin floating point types H.J. Lu
2010-02-07 21:52 ` Mark Kettenis
2010-02-07 22:00   ` H.J. Lu
2010-02-07 22:14     ` Daniel Jacobowitz
2010-02-07 22:25       ` H.J. Lu
2010-02-07 23:03         ` H.J. Lu
2010-02-07 23:08           ` Daniel Jacobowitz
2010-02-08  2:17             ` H.J. Lu
2010-02-08  4:17               ` Daniel Jacobowitz
2010-02-08  5:16                 ` H.J. Lu
2010-02-08 14:14                   ` Daniel Jacobowitz
2010-02-08 14:56                     ` H.J. Lu
2010-02-08 18:56                     ` H.J. Lu
2010-02-08 18:55 ` PATCH: Cache types from target description H.J. Lu
2010-02-09 15:45   ` H.J. Lu
2010-02-09 18:47     ` Eli Zaretskii
2010-02-09 18:56       ` H.J. Lu
2010-02-10 18:38     ` Daniel Jacobowitz
2010-02-10 20:54       ` Mark Kettenis
2010-02-10 21:01         ` Daniel Jacobowitz

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox