2002-03-20 Daniel Jacobowitz <drow@mvista.com>
authorDaniel Jacobowitz <drow@false.org>
Thu, 21 Mar 2002 00:53:44 +0000 (00:53 +0000)
committerDaniel Jacobowitz <drow@false.org>
Thu, 21 Mar 2002 00:53:44 +0000 (00:53 +0000)
        Fix PR gdb/422.
        * c-lang.c (c_create_fundamental_type): Handle FT_COMPLEX,
        FT_DBL_PREC_COMPLEX, and FT_EXT_PREC_COMPLEX.
        * dwarf2read.c (read_base_type): Set TYPE_TARGET_TYPE for
        complex types.
        * stabsread.c (rs6000_builtin_type): Likewise.
        (read_sun_floating_type): Likewise.

gdb/ChangeLog
gdb/c-lang.c
gdb/dwarf2read.c
gdb/stabsread.c

index acdb2c3db6c3477612fb4d1d2b784a0a31019aa2..45f050ad26217d66280955c51d84cab7b12096da 100644 (file)
@@ -1,3 +1,13 @@
+2002-03-20  Daniel Jacobowitz  <drow@mvista.com>
+
+       Fix PR gdb/422.
+       * c-lang.c (c_create_fundamental_type): Handle FT_COMPLEX,
+       FT_DBL_PREC_COMPLEX, and FT_EXT_PREC_COMPLEX.
+       * dwarf2read.c (read_base_type): Set TYPE_TARGET_TYPE for
+       complex types.
+       * stabsread.c (rs6000_builtin_type): Likewise.
+       (read_sun_floating_type): Likewise.
+
 2002-03-19  Peter Schauer  <pes@regent.e-technik.tu-muenchen.de>
 
        * stabsread.c (read_member_functions): Remove skip code for duplicate
index fa977cdd8598e1ba6ba020a36347d4a78ba4c3c6..f98548a63afedea3927746d554e19988dddee845 100644 (file)
@@ -338,6 +338,30 @@ c_create_fundamental_type (struct objfile *objfile, int typeid)
                        TARGET_LONG_DOUBLE_BIT / TARGET_CHAR_BIT,
                        0, "long double", objfile);
       break;
+    case FT_COMPLEX:
+      type = init_type (TYPE_CODE_FLT,
+                       2 * TARGET_FLOAT_BIT / TARGET_CHAR_BIT,
+                       0, "complex float", objfile);
+      TYPE_TARGET_TYPE (type)
+       = init_type (TYPE_CODE_FLT, TARGET_FLOAT_BIT / TARGET_CHAR_BIT,
+                    0, "float", objfile);
+      break;
+    case FT_DBL_PREC_COMPLEX:
+      type = init_type (TYPE_CODE_FLT,
+                       2 * TARGET_DOUBLE_BIT / TARGET_CHAR_BIT,
+                       0, "complex double", objfile);
+      TYPE_TARGET_TYPE (type)
+       = init_type (TYPE_CODE_FLT, TARGET_DOUBLE_BIT / TARGET_CHAR_BIT,
+                    0, "double", objfile);
+      break;
+    case FT_EXT_PREC_COMPLEX:
+      type = init_type (TYPE_CODE_FLT,
+                       2 * TARGET_LONG_DOUBLE_BIT / TARGET_CHAR_BIT,
+                       0, "complex long double", objfile);
+      TYPE_TARGET_TYPE (type)
+       = init_type (TYPE_CODE_FLT, TARGET_LONG_DOUBLE_BIT / TARGET_CHAR_BIT,
+                    0, "long double", objfile);
+      break;
     case FT_TEMPLATE_ARG:
       type = init_type (TYPE_CODE_TEMPLATE_ARG,
                        0,
index e006681a13a283f562294949a01a88678461132c..e5450d06cef5156bb96738fd5cc6f886e3014eef 100644 (file)
@@ -2979,6 +2979,18 @@ read_base_type (struct die_info *die, struct objfile *objfile)
       type = init_type (code, size, type_flags, DW_STRING (attr), objfile);
       if (encoding == DW_ATE_address)
        TYPE_TARGET_TYPE (type) = dwarf2_fundamental_type (objfile, FT_VOID);
+      else if (encoding == DW_ATE_complex_float)
+       {
+         if (size == 32)
+           TYPE_TARGET_TYPE (type)
+             = dwarf2_fundamental_type (objfile, FT_EXT_PREC_FLOAT);
+         else if (size == 16)
+           TYPE_TARGET_TYPE (type)
+             = dwarf2_fundamental_type (objfile, FT_DBL_PREC_FLOAT);
+         else if (size == 8)
+           TYPE_TARGET_TYPE (type)
+             = dwarf2_fundamental_type (objfile, FT_FLOAT);
+       }
     }
   else
     {
index a06b37ff79b8bc0f30fffe8f2c0838b4393c5c0a..671d4da46ebe5fdda467afe5a28725714900192b 100644 (file)
@@ -2978,10 +2978,14 @@ rs6000_builtin_type (int typenum)
     case 25:
       /* Complex type consisting of two IEEE single precision values.  */
       rettype = init_type (TYPE_CODE_COMPLEX, 8, 0, "complex", NULL);
+      TYPE_TARGET_TYPE (rettype) = init_type (TYPE_CODE_FLT, 4, 0, "float",
+                                             NULL);
       break;
     case 26:
       /* Complex type consisting of two IEEE double precision values.  */
       rettype = init_type (TYPE_CODE_COMPLEX, 16, 0, "double complex", NULL);
+      TYPE_TARGET_TYPE (rettype) = init_type (TYPE_CODE_FLT, 8, 0, "double",
+                                             NULL);
       break;
     case 27:
       rettype = init_type (TYPE_CODE_INT, 1, 0, "integer*1", NULL);
@@ -4491,6 +4495,7 @@ read_sun_floating_type (char **pp, int typenums[2], struct objfile *objfile)
   int nbits;
   int details;
   int nbytes;
+  struct type *rettype;
 
   /* The first number has more details about the type, for example
      FN_COMPLEX.  */
@@ -4505,9 +4510,12 @@ read_sun_floating_type (char **pp, int typenums[2], struct objfile *objfile)
 
   if (details == NF_COMPLEX || details == NF_COMPLEX16
       || details == NF_COMPLEX32)
-    /* This is a type we can't handle, but we do know the size.
-       We also will be able to give it a name.  */
-    return init_type (TYPE_CODE_COMPLEX, nbytes, 0, NULL, objfile);
+    {
+      rettype = init_type (TYPE_CODE_COMPLEX, nbytes, 0, NULL, objfile);
+      TYPE_TARGET_TYPE (rettype)
+       = init_type (TYPE_CODE_FLT, nbytes / 2, 0, NULL, objfile);
+      return rettype;
+    }
 
   return init_type (TYPE_CODE_FLT, nbytes, 0, NULL, objfile);
 }