From 0ee579cd4e05beecb067353b73258e08fc0f914c Mon Sep 17 00:00:00 2001
From: pinskia <pinskia@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Fri, 16 Dec 2005 20:19:37 +0000
Subject: [PATCH] 2005-12-14  Andrew Pinski  <pinskia@physics.uc.edu>

        PR objc/25360
        * objc/objc-act.c (encode_type): Encode Complex types as 'j' followed
        by the inner type.

2005-12-14  Andrew Pinski  <pinskia@physics.uc.edu>

        PR objc/25360
        * objc/objc-api.c (_C_COMPLEX): New define.
        * encoding.c (objc_sizeof_type): Handle _C_Complex.
        (objc_alignof_type): Likewise.
        (objc_skip_typespec): Likewise.



git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@108675 138bc75d-0d04-0410-961f-82ee72b054a4
---
 gcc/objc/ChangeLog      |   6 ++
 gcc/objc/objc-act.c     |   6 ++
 libobjc/ChangeLog       |   8 +++
 libobjc/encoding.c      | 129 ++++++++++++++++++++++++++++++++++++++++
 libobjc/objc/objc-api.h |   1 +
 5 files changed, 150 insertions(+)

diff --git a/gcc/objc/ChangeLog b/gcc/objc/ChangeLog
index 5f7951f82db4..466ff50ca26c 100644
--- a/gcc/objc/ChangeLog
+++ b/gcc/objc/ChangeLog
@@ -1,3 +1,9 @@
+2005-12-14  Andrew Pinski  <pinskia@physics.uc.edu>
+
+	PR objc/25360
+        * objc/objc-act.c (encode_type): Encode Complex types as 'j' followed
+        by the inner type.
+
 2005-12-12  Andrew Pinski  <pinskia@physics.uc.edu>
 
 	PR objc/25348
diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c
index 201a722c2321..526dec6144b7 100644
--- a/gcc/objc/objc-act.c
+++ b/gcc/objc/objc-act.c
@@ -8119,6 +8119,12 @@ encode_type (tree type, int curtype, int format)
 
   else if (code == FUNCTION_TYPE) /* '?' */
     obstack_1grow (&util_obstack, '?');
+    
+  else if (code == COMPLEX_TYPE)
+    {
+      obstack_1grow (&util_obstack, 'j');
+      encode_type (TREE_TYPE (type), curtype, format);
+    }
 }
 
 static void
diff --git a/libobjc/ChangeLog b/libobjc/ChangeLog
index 3ac957d3baf2..27378fbd79bb 100644
--- a/libobjc/ChangeLog
+++ b/libobjc/ChangeLog
@@ -1,3 +1,11 @@
+2005-12-14  Andrew Pinski  <pinskia@physics.uc.edu>
+
+	PR objc/25360
+        * objc/objc-api.c (_C_COMPLEX): New define.
+        * encoding.c (objc_sizeof_type): Handle _C_Complex.
+        (objc_alignof_type): Likewise.
+        (objc_skip_typespec): Likewise.
+
 2005-12-15  David Ayers  <d.ayers@inode.at>
 
 	PR libobjc/14382
diff --git a/libobjc/encoding.c b/libobjc/encoding.c
index af6b93d4498c..21a785814dc8 100644
--- a/libobjc/encoding.c
+++ b/libobjc/encoding.c
@@ -248,6 +248,68 @@ objc_sizeof_type (const char *type)
 
       return size;
     }
+    
+  case _C_COMPLEX:
+    {
+      type++; /* Skip after the 'j'. */
+      switch (*type)
+        {
+	    case _C_CHR:
+	      return sizeof (_Complex char);
+	      break;
+
+	    case _C_UCHR:
+	      return sizeof (_Complex unsigned char);
+	      break;
+
+	    case _C_SHT:
+	      return sizeof (_Complex short);
+	      break;
+
+	    case _C_USHT:
+	      return sizeof (_Complex unsigned short);
+	      break;
+
+	    case _C_INT:
+	      return sizeof (_Complex int);
+	      break;
+
+	    case _C_UINT:
+	      return sizeof (_Complex unsigned int);
+	      break;
+
+	    case _C_LNG:
+	      return sizeof (_Complex long);
+	      break;
+
+	    case _C_ULNG:
+	      return sizeof (_Complex unsigned long);
+	      break;
+
+	    case _C_LNG_LNG:
+	      return sizeof (_Complex long long);
+	      break;
+
+	    case _C_ULNG_LNG:
+	      return sizeof (_Complex unsigned long long);
+	      break;
+
+	    case _C_FLT:
+	      return sizeof (_Complex float);
+	      break;
+
+	    case _C_DBL:
+	      return sizeof (_Complex double);
+	      break;
+	    
+	    default:
+	      {
+		objc_error (nil, OBJC_ERR_BAD_TYPE, "unknown complex type %s\n",
+			    type);
+		return 0;
+	      }
+	}
+    }
 
   default:
     {
@@ -360,6 +422,69 @@ objc_alignof_type (const char *type)
 
       return align;
     }
+    
+    
+  case _C_COMPLEX:
+    {
+      type++; /* Skip after the 'j'. */
+      switch (*type)
+        {
+	    case _C_CHR:
+	      return __alignof__ (_Complex char);
+	      break;
+
+	    case _C_UCHR:
+	      return __alignof__ (_Complex unsigned char);
+	      break;
+
+	    case _C_SHT:
+	      return __alignof__ (_Complex short);
+	      break;
+
+	    case _C_USHT:
+	      return __alignof__ (_Complex unsigned short);
+	      break;
+
+	    case _C_INT:
+	      return __alignof__ (_Complex int);
+	      break;
+
+	    case _C_UINT:
+	      return __alignof__ (_Complex unsigned int);
+	      break;
+
+	    case _C_LNG:
+	      return __alignof__ (_Complex long);
+	      break;
+
+	    case _C_ULNG:
+	      return __alignof__ (_Complex unsigned long);
+	      break;
+
+	    case _C_LNG_LNG:
+	      return __alignof__ (_Complex long long);
+	      break;
+
+	    case _C_ULNG_LNG:
+	      return __alignof__ (_Complex unsigned long long);
+	      break;
+
+	    case _C_FLT:
+	      return __alignof__ (_Complex float);
+	      break;
+
+	    case _C_DBL:
+	      return __alignof__ (_Complex double);
+	      break;
+	    
+	    default:
+	      {
+		objc_error (nil, OBJC_ERR_BAD_TYPE, "unknown complex type %s\n",
+			    type);
+		return 0;
+	      }
+	}
+    }
 
   default:
     {
@@ -491,6 +616,10 @@ objc_skip_typespec (const char *type)
   case _C_UNDEF:
     return ++type;
     break;
+    
+  case _C_COMPLEX:
+    return type + 2;
+    break;
 
   case _C_ARY_B:
     /* skip digits, typespec and closing ']' */
diff --git a/libobjc/objc/objc-api.h b/libobjc/objc/objc-api.h
index e393c3952190..e0e49e21fdfc 100644
--- a/libobjc/objc/objc-api.h
+++ b/libobjc/objc/objc-api.h
@@ -82,6 +82,7 @@ struct objc_method_description
 #define _C_STRUCT_B '{'
 #define _C_STRUCT_E '}'
 #define _C_VECTOR   '!'
+#define _C_COMPLEX   'j'
 
 
 /*
-- 
GitLab