aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIain Sandoe <iains@gcc.gnu.org>2011-01-08 14:12:14 +0000
committerIain Sandoe <iains@gcc.gnu.org>2011-01-08 14:12:14 +0000
commitd5dc93f4464d315c1ee2f5d72377381529b88208 (patch)
treec9cef10888f13a820fe64443d26bc8d8fc3d1581
parentecb3baaa8e973e3963eee7929bfd2fc419a2a950 (diff)
downloadgcc-d5dc93f4464d315c1ee2f5d72377381529b88208.zip
gcc-d5dc93f4464d315c1ee2f5d72377381529b88208.tar.gz
gcc-d5dc93f4464d315c1ee2f5d72377381529b88208.tar.bz2
ObjC NeXT, split encode-support code from next-mapping.h
* objc-obj-c++-shared/next-mapping.h: Move code and definitions for emulation of libobjc-gnu structure layout functionality to .. * objc-obj-c++-shared/objc-test-suite-next-encode-assist.h: New. * objc-obj-c++-shared/objc-test-suite-next-encode-assist-impl.h: New. * objc/execute/bf-common.h: Adjust headers. * objc/execute/bf-1.m: Likewise. * objc/execute/bf-2.m: Likewise. * objc/execute/bf-3.m: Likewise. * objc/execute/bf-4.m: Likewise. * objc/execute/bf-5.m: Likewise. * objc/execute/bf-6.m: Likewise. * objc/execute/bf-7.m: Likewise. * objc/execute/bf-8.m: Likewise. * objc/execute/bf-9.m: Likewise. * objc/execute/bf-10.m: Likewise. * objc/execute/bf-11.m: Likewise. * objc/execute/bf-12.m: Likewise. * objc/execute/bf-13.m: Likewise. * objc/execute/bf-14.m: Likewise. * objc/execute/bf-15.m: Likewise. * objc/execute/bf-16.m: Likewise. * objc/execute/bf-17.m: Likewise. * objc/execute/bf-18.m: Likewise. * objc/execute/bf-19.m: Likewise. * objc/execute/bf-20.m: Likewise. * objc/execute/bf-21.m: Likewise. * objc/execute/bycopy-3.m: Adjust headers, add next-specific code for objc_get_type_qualifiers (). From-SVN: r168597
-rw-r--r--gcc/testsuite/ChangeLog31
-rw-r--r--gcc/testsuite/objc-obj-c++-shared/next-mapping.h839
-rw-r--r--gcc/testsuite/objc-obj-c++-shared/objc-test-suite-next-encode-assist-impl.h785
-rw-r--r--gcc/testsuite/objc-obj-c++-shared/objc-test-suite-next-encode-assist.h97
-rw-r--r--gcc/testsuite/objc/execute/bf-1.m3
-rw-r--r--gcc/testsuite/objc/execute/bf-10.m2
-rw-r--r--gcc/testsuite/objc/execute/bf-11.m2
-rw-r--r--gcc/testsuite/objc/execute/bf-12.m2
-rw-r--r--gcc/testsuite/objc/execute/bf-13.m2
-rw-r--r--gcc/testsuite/objc/execute/bf-14.m2
-rw-r--r--gcc/testsuite/objc/execute/bf-15.m2
-rw-r--r--gcc/testsuite/objc/execute/bf-16.m2
-rw-r--r--gcc/testsuite/objc/execute/bf-17.m2
-rw-r--r--gcc/testsuite/objc/execute/bf-18.m2
-rw-r--r--gcc/testsuite/objc/execute/bf-19.m2
-rw-r--r--gcc/testsuite/objc/execute/bf-2.m2
-rw-r--r--gcc/testsuite/objc/execute/bf-20.m2
-rw-r--r--gcc/testsuite/objc/execute/bf-21.m2
-rw-r--r--gcc/testsuite/objc/execute/bf-3.m2
-rw-r--r--gcc/testsuite/objc/execute/bf-4.m2
-rw-r--r--gcc/testsuite/objc/execute/bf-5.m2
-rw-r--r--gcc/testsuite/objc/execute/bf-6.m2
-rw-r--r--gcc/testsuite/objc/execute/bf-7.m2
-rw-r--r--gcc/testsuite/objc/execute/bf-8.m2
-rw-r--r--gcc/testsuite/objc/execute/bf-9.m2
-rw-r--r--gcc/testsuite/objc/execute/bf-common.h12
-rw-r--r--gcc/testsuite/objc/execute/bycopy-3.m36
27 files changed, 963 insertions, 880 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 5cb1143..968564e 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,34 @@
+2011-01-08 Iain Sandoe <iains@gcc.gnu.org>
+
+ * objc-obj-c++-shared/next-mapping.h: Move code and definitions for
+ emulation of libobjc-gnu structure layout functionality to ..
+ * objc-obj-c++-shared/objc-test-suite-next-encode-assist.h: New.
+ * objc-obj-c++-shared/objc-test-suite-next-encode-assist-impl.h: New.
+ * objc/execute/bf-common.h: Adjust headers.
+ * objc/execute/bf-1.m: Likewise.
+ * objc/execute/bf-2.m: Likewise.
+ * objc/execute/bf-3.m: Likewise.
+ * objc/execute/bf-4.m: Likewise.
+ * objc/execute/bf-5.m: Likewise.
+ * objc/execute/bf-6.m: Likewise.
+ * objc/execute/bf-7.m: Likewise.
+ * objc/execute/bf-8.m: Likewise.
+ * objc/execute/bf-9.m: Likewise.
+ * objc/execute/bf-10.m: Likewise.
+ * objc/execute/bf-11.m: Likewise.
+ * objc/execute/bf-12.m: Likewise.
+ * objc/execute/bf-13.m: Likewise.
+ * objc/execute/bf-14.m: Likewise.
+ * objc/execute/bf-15.m: Likewise.
+ * objc/execute/bf-16.m: Likewise.
+ * objc/execute/bf-17.m: Likewise.
+ * objc/execute/bf-18.m: Likewise.
+ * objc/execute/bf-19.m: Likewise.
+ * objc/execute/bf-20.m: Likewise.
+ * objc/execute/bf-21.m: Likewise.
+ * objc/execute/bycopy-3.m: Adjust headers, add next-specific code for
+ objc_get_type_qualifiers ().
+
2011-01-08 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/45777
diff --git a/gcc/testsuite/objc-obj-c++-shared/next-mapping.h b/gcc/testsuite/objc-obj-c++-shared/next-mapping.h
index e5e2d22..3b141c6 100644
--- a/gcc/testsuite/objc-obj-c++-shared/next-mapping.h
+++ b/gcc/testsuite/objc-obj-c++-shared/next-mapping.h
@@ -1,3 +1,6 @@
+#ifndef _OBJC_NEXT_MAPPING_H_
+#define _OBJC_NEXT_MAPPING_H_
+
/* This file "renames" various ObjC GNU runtime entry points
(and fakes the existence of several others)
if the NeXT runtime is being used. */
@@ -81,839 +84,6 @@
#define NULL 0
#endif
-/* The following is necessary to "cover" the bf*.m test cases on NeXT. */
-
-#undef MAX
-#undef MIN
-#undef ROUND
-
-#ifdef __cplusplus
-# define MAX(X, Y) ((X > Y) ? X : Y)
-# define MIN(X, Y) ((X < Y) ? X : Y)
-# define ROUND(V, A) (A * ((V + A - 1) / A))
-#else
-# define MAX(X, Y) \
- ({ typeof (X) __x = (X), __y = (Y); \
- (__x > __y ? __x : __y); })
-# define MIN(X, Y) \
- ({ typeof (X) __x = (X), __y = (Y); \
- (__x < __y ? __x : __y); })
-# define ROUND(V, A) \
- ({ typeof (V) __v = (V); typeof (A) __a = (A); \
- __a * ((__v+__a - 1)/__a); })
-#endif
-
-#define BITS_PER_UNIT __CHAR_BIT__
-typedef struct{ char a; } __small_struct;
-#define STRUCTURE_SIZE_BOUNDARY (BITS_PER_UNIT * sizeof (__small_struct))
-
-/* Not sure why the following are missing from NeXT objc headers... */
-
-#ifndef _C_LNG_LNG
-#define _C_LNG_LNG 'q'
-#endif
-#ifndef _C_ULNG_LNG
-#define _C_ULNG_LNG 'Q'
-#endif
-#ifndef _C_ATOM
-#define _C_ATOM '%'
-#endif
-#ifndef _C_BOOL
-#define _C_BOOL 'B'
-#endif
-
-#define _C_CONST 'r'
-#define _C_IN 'n'
-#define _C_INOUT 'N'
-#define _C_OUT 'o'
-#define _C_BYCOPY 'O'
-#define _C_BYREF 'R'
-#define _C_ONEWAY 'V'
-#define _C_GCINVISIBLE '!'
-
-#define _F_CONST 0x01
-#define _F_IN 0x01
-#define _F_OUT 0x02
-#define _F_INOUT 0x03
-#define _F_BYCOPY 0x04
-#define _F_BYREF 0x08
-#define _F_ONEWAY 0x10
-#define _F_GCINVISIBLE 0x20
-
-struct objc_struct_layout
-{
- const char *original_type;
- const char *type;
- const char *prev_type;
- unsigned int record_size;
- unsigned int record_align;
-};
-
-typedef union arglist {
- char *arg_ptr;
- char arg_regs[sizeof (char*)];
-} *arglist_t; /* argument frame */
-
-const char *objc_skip_typespec (const char *type);
-void objc_layout_structure_get_info (struct objc_struct_layout *layout,
- unsigned int *offset, unsigned int *align, const char **type);
-void objc_layout_structure (const char *type,
- struct objc_struct_layout *layout);
-BOOL objc_layout_structure_next_member (struct objc_struct_layout *layout);
-void objc_layout_finish_structure (struct objc_struct_layout *layout,
- unsigned int *size, unsigned int *align);
-int objc_aligned_size (const char *type);
-
-/*
- return the size of an object specified by type
-*/
-
-int
-objc_sizeof_type (const char *type)
-{
- /* Skip the variable name if any */
- if (*type == '"')
- {
- for (type++; *type++ != '"';)
- /* do nothing */;
- }
-
- switch (*type) {
- case _C_ID:
- return sizeof (id);
- break;
-
- case _C_CLASS:
- return sizeof (Class);
- break;
-
- case _C_SEL:
- return sizeof (SEL);
- break;
-
- case _C_CHR:
- return sizeof (char);
- break;
-
- case _C_UCHR:
- return sizeof (unsigned char);
- break;
-
- case _C_SHT:
- return sizeof (short);
- break;
-
- case _C_USHT:
- return sizeof (unsigned short);
- break;
-
- case _C_INT:
- return sizeof (int);
- break;
-
- case _C_UINT:
- return sizeof (unsigned int);
- break;
-
- case _C_LNG:
- return sizeof (long);
- break;
-
- case _C_ULNG:
- return sizeof (unsigned long);
- break;
-
- case _C_LNG_LNG:
- return sizeof (long long);
- break;
-
- case _C_ULNG_LNG:
- return sizeof (unsigned long long);
- break;
-
- case _C_FLT:
- return sizeof (float);
- break;
-
- case _C_DBL:
- return sizeof (double);
- break;
-
- case _C_PTR:
- case _C_ATOM:
- case _C_CHARPTR:
- return sizeof (char *);
- break;
-
- case _C_ARY_B:
- {
- int len = atoi (type + 1);
- while (isdigit ((unsigned char)*++type))
- ;
- return len * objc_aligned_size (type);
- }
- break;
-
- case _C_BFLD:
- {
- /* The NeXT encoding of bitfields is _still_: b 'size' */
- int size = atoi (type + 1);
- /* Return an upper bound on byte size */
- return (size + BITS_PER_UNIT - 1) / BITS_PER_UNIT;
- }
-
- case _C_STRUCT_B:
- {
- struct objc_struct_layout layout;
- unsigned int size;
-
- objc_layout_structure (type, &layout);
- while (objc_layout_structure_next_member (&layout))
- /* do nothing */ ;
- objc_layout_finish_structure (&layout, &size, NULL);
-
- return size;
- }
-
- case _C_UNION_B:
- {
- int max_size = 0;
- while (*type != _C_UNION_E && *type++ != '=')
- /* do nothing */;
- while (*type != _C_UNION_E)
- {
- /* Skip the variable name if any */
- if (*type == '"')
- {
- for (type++; *type++ != '"';)
- /* do nothing */;
- }
- max_size = MAX (max_size, objc_sizeof_type (type));
- type = objc_skip_typespec (type);
- }
- return max_size;
- }
- }
- return 0; /* error */
-}
-
-
-/*
- Return the alignment of an object specified by type
-*/
-
-int
-objc_alignof_type (const char *type)
-{
- /* Skip the variable name if any */
- if (*type == '"')
- {
- for (type++; *type++ != '"';)
- /* do nothing */;
- }
- switch (*type) {
- case _C_ID:
- return __alignof__ (id);
- break;
-
- case _C_CLASS:
- return __alignof__ (Class);
- break;
-
- case _C_SEL:
- return __alignof__ (SEL);
- break;
-
- case _C_CHR:
- return __alignof__ (char);
- break;
-
- case _C_UCHR:
- return __alignof__ (unsigned char);
- break;
-
- case _C_SHT:
- return __alignof__ (short);
- break;
-
- case _C_USHT:
- return __alignof__ (unsigned short);
- break;
-
- case _C_INT:
- case _C_BFLD: /* This is for the NeXT only */
- return __alignof__ (int);
- break;
-
- case _C_UINT:
- return __alignof__ (unsigned int);
- break;
-
- case _C_LNG:
- return __alignof__ (long);
- break;
-
- case _C_ULNG:
- return __alignof__ (unsigned long);
- break;
-
- case _C_LNG_LNG:
- return __alignof__ (long long);
- break;
-
- case _C_ULNG_LNG:
- return __alignof__ (unsigned long long);
- break;
-
- case _C_FLT:
- return __alignof__ (float);
- break;
-
- case _C_DBL:
- return __alignof__ (double);
- break;
-
- case _C_PTR:
- case _C_ATOM:
- case _C_CHARPTR:
- return __alignof__ (char *);
- break;
-
- case _C_ARY_B:
- while (isdigit ((unsigned char)*++type))
- /* do nothing */;
- return objc_alignof_type (type);
-
- case _C_STRUCT_B:
- {
- struct objc_struct_layout layout;
- unsigned int align;
-
- objc_layout_structure (type, &layout);
- while (objc_layout_structure_next_member (&layout))
- /* do nothing */;
- objc_layout_finish_structure (&layout, NULL, &align);
-
- return align;
- }
-
- case _C_UNION_B:
- {
- int maxalign = 0;
- while (*type != _C_UNION_E && *type++ != '=')
- /* do nothing */;
- while (*type != _C_UNION_E)
- {
- /* Skip the variable name if any */
- if (*type == '"')
- {
- for (type++; *type++ != '"';)
- /* do nothing */;
- }
- maxalign = MAX (maxalign, objc_alignof_type (type));
- type = objc_skip_typespec (type);
- }
- return maxalign;
- }
- }
- return 0; /* error */
-}
-
-/*
- The aligned size if the size rounded up to the nearest alignment.
-*/
-
-int
-objc_aligned_size (const char *type)
-{
- int size, align;
-
- /* Skip the variable name */
- if (*type == '"')
- {
- for (type++; *type++ != '"';)
- /* do nothing */;
- }
-
- size = objc_sizeof_type (type);
- align = objc_alignof_type (type);
-
- return ROUND (size, align);
-}
-
-/*
- The size rounded up to the nearest integral of the wordsize, taken
- to be the size of a void *.
-*/
-
-int
-objc_promoted_size (const char *type)
-{
- int size, wordsize;
-
- /* Skip the variable name */
- if (*type == '"')
- {
- for (type++; *type++ != '"';)
- /* do nothing */;
- }
-
- size = objc_sizeof_type (type);
- wordsize = sizeof (void *);
-
- return ROUND (size, wordsize);
-}
-
-/*
- Skip type qualifiers. These may eventually precede typespecs
- occurring in method prototype encodings.
-*/
-
-inline const char *
-objc_skip_type_qualifiers (const char *type)
-{
- while (*type == _C_CONST
- || *type == _C_IN
- || *type == _C_INOUT
- || *type == _C_OUT
- || *type == _C_BYCOPY
- || *type == _C_BYREF
- || *type == _C_ONEWAY
- || *type == _C_GCINVISIBLE)
- {
- type += 1;
- }
- return type;
-}
-
-
-/*
- Skip one typespec element. If the typespec is prepended by type
- qualifiers, these are skipped as well.
-*/
-
-const char *
-objc_skip_typespec (const char *type)
-{
- /* Skip the variable name if any */
- if (*type == '"')
- {
- for (type++; *type++ != '"';)
- /* do nothing */;
- }
-
- type = objc_skip_type_qualifiers (type);
-
- switch (*type) {
-
- case _C_ID:
- /* An id may be annotated by the actual type if it is known
- with the @"ClassName" syntax */
-
- if (*++type != '"')
- return type;
- else
- {
- while (*++type != '"')
- /* do nothing */;
- return type + 1;
- }
-
- /* The following are one character type codes */
- case _C_CLASS:
- case _C_SEL:
- case _C_CHR:
- case _C_UCHR:
- case _C_CHARPTR:
- case _C_ATOM:
- case _C_SHT:
- case _C_USHT:
- case _C_INT:
- case _C_UINT:
- case _C_LNG:
- case _C_ULNG:
- case _C_LNG_LNG:
- case _C_ULNG_LNG:
- case _C_FLT:
- case _C_DBL:
- case _C_VOID:
- case _C_UNDEF:
- return ++type;
- break;
-
- case _C_ARY_B:
- /* skip digits, typespec and closing ']' */
-
- while (isdigit ((unsigned char)*++type))
- ;
- type = objc_skip_typespec (type);
- if (*type == _C_ARY_E)
- return ++type;
- else
- break; /* error */
-
- case _C_BFLD:
- /* The NeXT encoding for bitfields is _still_: b 'size' */
- while (isdigit ((unsigned char)*++type))
- ; /* skip type and size */
- return type;
-
- case _C_STRUCT_B:
- /* skip name, and elements until closing '}' */
-
- while (*type != _C_STRUCT_E && *type++ != '=')
- ;
- while (*type != _C_STRUCT_E)
- {
- type = objc_skip_typespec (type);
- }
- return ++type;
-
- case _C_UNION_B:
- /* skip name, and elements until closing ')' */
-
- while (*type != _C_UNION_E && *type++ != '=')
- ;
- while (*type != _C_UNION_E)
- {
- type = objc_skip_typespec (type);
- }
- return ++type;
-
- case _C_PTR:
- /* Just skip the following typespec */
-
- return objc_skip_typespec (++type);
- }
- return 0; /* error */
-}
-
-/*
- Skip an offset as part of a method encoding. This is prepended by a
- '+' if the argument is passed in registers.
-*/
-inline const char *
-objc_skip_offset (const char *type)
-{
- if (*type == '+')
- type++;
- while (isdigit ((unsigned char) *++type))
- ;
- return type;
-}
-
-/*
- Skip an argument specification of a method encoding.
-*/
-const char *
-objc_skip_argspec (const char *type)
-{
- type = objc_skip_typespec (type);
- type = objc_skip_offset (type);
- return type;
-}
-
-#ifdef NEXT_OBJC_USE_NEW_INTERFACE
-typedef void *PMETH;
-#else
-typedef struct objc_method *PMETH;
-#endif
-
-/*
- Return the number of arguments that the method MTH expects.
- Note that all methods need two implicit arguments `self' and
- `_cmd'.
-*/
-int
-method_get_number_of_arguments (PMETH mth)
-{
- int i = 0;
-#ifdef NEXT_OBJC_USE_NEW_INTERFACE
- const char *type = method_getTypeEncoding((Method)mth);
-#else
- const char *type = mth->method_types;
-#endif
- while (*type)
- {
- type = objc_skip_argspec (type);
- i += 1;
- }
- return i - 1;
-}
-
-/*
- Return the size of the argument block needed on the stack to invoke
- the method MTH. This may be zero, if all arguments are passed in
- registers.
-*/
-
-int
-method_get_sizeof_arguments (PMETH mth)
-{
-#ifdef NEXT_OBJC_USE_NEW_INTERFACE
- const char *type = objc_skip_typespec (method_getTypeEncoding((Method)mth));
-#else
- const char *type = objc_skip_typespec (mth->method_types);
-#endif
- return atoi (type);
-}
-
-/*
- Return a pointer to the next argument of ARGFRAME. type points to
- the last argument. Typical use of this look like:
-
- {
- char *datum, *type;
- for (datum = method_get_first_argument (method, argframe, &type);
- datum; datum = method_get_next_argument (argframe, &type))
- {
- unsigned flags = objc_get_type_qualifiers (type);
- type = objc_skip_type_qualifiers (type);
- if (*type != _C_PTR)
- [portal encodeData: datum ofType: type];
- else
- {
- if ((flags & _F_IN) == _F_IN)
- [portal encodeData: *(char **) datum ofType: ++type];
- }
- }
- }
-*/
-
-char *
-method_get_next_argument (arglist_t argframe, const char **type)
-{
- const char *t = objc_skip_argspec (*type);
-
- if (*t == '\0')
- return 0;
-
- *type = t;
- t = objc_skip_typespec (t);
-
- if (*t == '+')
- return argframe->arg_regs + atoi (++t);
- else
- return argframe->arg_ptr + atoi (t);
-}
-
-/*
- Return a pointer to the value of the first argument of the method
- described in M with the given argumentframe ARGFRAME. The type
- is returned in TYPE. type must be passed to successive calls of
- method_get_next_argument.
-*/
-char *
-method_get_first_argument (PMETH m,
- arglist_t argframe,
- const char **type)
-{
-#ifdef NEXT_OBJC_USE_NEW_INTERFACE
- *type = method_getTypeEncoding((Method)m);
-#else
- *type = m->method_types;
-#endif
-
- return method_get_next_argument (argframe, type);
-}
-
-/*
- Return a pointer to the ARGth argument of the method
- M from the frame ARGFRAME. The type of the argument
- is returned in the value-result argument TYPE
-*/
-
-char *
-method_get_nth_argument (PMETH m,
- arglist_t argframe, int arg,
- const char **type)
-{
-#ifdef NEXT_OBJC_USE_NEW_INTERFACE
- const char *t = objc_skip_argspec (method_getTypeEncoding((Method)m));
-#else
- const char *t = objc_skip_argspec (m->method_types);
-#endif
-
- if (arg > method_get_number_of_arguments (m))
- return 0;
-
- while (arg--)
- t = objc_skip_argspec (t);
-
- *type = t;
- t = objc_skip_typespec (t);
-
- if (*t == '+')
- return argframe->arg_regs + atoi (++t);
- else
- return argframe->arg_ptr + atoi (t);
-}
-
-unsigned
-objc_get_type_qualifiers (const char *type)
-{
- unsigned res = 0;
- BOOL flag = YES;
-
- while (flag)
- switch (*type++)
- {
- case _C_CONST: res |= _F_CONST; break;
- case _C_IN: res |= _F_IN; break;
- case _C_INOUT: res |= _F_INOUT; break;
- case _C_OUT: res |= _F_OUT; break;
- case _C_BYCOPY: res |= _F_BYCOPY; break;
- case _C_BYREF: res |= _F_BYREF; break;
- case _C_ONEWAY: res |= _F_ONEWAY; break;
- case _C_GCINVISIBLE: res |= _F_GCINVISIBLE; break;
- default: flag = NO;
- }
-
- return res;
-}
-
-
-/* The following three functions can be used to determine how a
- structure is laid out by the compiler. For example:
-
- struct objc_struct_layout layout;
- int i;
-
- objc_layout_structure (type, &layout);
- while (objc_layout_structure_next_member (&layout))
- {
- int position, align;
- const char *type;
-
- objc_layout_structure_get_info (&layout, &position, &align, &type);
- printf ("element %d has offset %d, alignment %d\n",
- i++, position, align);
- }
-
- These functions are used by objc_sizeof_type and objc_alignof_type
- functions to compute the size and alignment of structures. The
- previous method of computing the size and alignment of a structure
- was not working on some architectures, particulary on AIX, and in
- the presence of bitfields inside the structure. */
-void
-objc_layout_structure (const char *type,
- struct objc_struct_layout *layout)
-{
- const char *ntype;
-
- layout->original_type = ++type;
-
- /* Skip "<name>=" if any. Avoid embedded structures and unions. */
- ntype = type;
- while (*ntype != _C_STRUCT_E && *ntype != _C_STRUCT_B && *ntype != _C_UNION_B
- && *ntype++ != '=')
- /* do nothing */;
-
- /* If there's a "<name>=", ntype - 1 points to '='; skip the the name */
- if (*(ntype - 1) == '=')
- type = ntype;
-
- layout->type = type;
- layout->prev_type = NULL;
- layout->record_size = 0;
- layout->record_align = MAX (BITS_PER_UNIT, STRUCTURE_SIZE_BOUNDARY);
-}
-
-
-BOOL
-objc_layout_structure_next_member (struct objc_struct_layout *layout)
-{
- register int desired_align = 0;
-
- /* The current type without the type qualifiers */
- const char *type;
-
- /* Add the size of the previous field to the size of the record. */
- if (layout->prev_type)
- {
- type = objc_skip_type_qualifiers (layout->prev_type);
-
- if (*type != _C_BFLD)
- layout->record_size += objc_sizeof_type (type) * BITS_PER_UNIT;
- else
- layout->record_size += atoi (++type);
- }
-
- if (*layout->type == _C_STRUCT_E)
- return NO;
-
- /* Skip the variable name if any */
- if (*layout->type == '"')
- {
- for (layout->type++; *layout->type++ != '"';)
- /* do nothing */;
- }
-
- type = objc_skip_type_qualifiers (layout->type);
-
- desired_align = objc_alignof_type (type) * BITS_PER_UNIT;
-
- /* Record must have at least as much alignment as any field.
- Otherwise, the alignment of the field within the record
- is meaningless. */
- layout->record_align = MAX (layout->record_align, desired_align);
-
- if (*type == _C_BFLD)
- {
- int bfld_size = atoi (++type);
- int int_align = __alignof__ (int) * BITS_PER_UNIT;
- /* If this bitfield would traverse a word alignment boundary, push it out
- to that boundary instead. */
- if (layout->record_size % int_align
- && (layout->record_size / int_align
- < (layout->record_size + bfld_size - 1) / int_align))
- layout->record_size = ROUND (layout->record_size, int_align);
- }
- else if (layout->record_size % desired_align != 0)
- {
- /* We need to skip space before this field.
- Bump the cumulative size to multiple of field alignment. */
- layout->record_size = ROUND (layout->record_size, desired_align);
- }
-
- /* Jump to the next field in record. */
-
- layout->prev_type = layout->type;
- layout->type = objc_skip_typespec (layout->type); /* skip component */
-
- return YES;
-}
-
-
-void objc_layout_finish_structure (struct objc_struct_layout *layout,
- unsigned int *size,
- unsigned int *align)
-{
- if (layout->type && *layout->type == _C_STRUCT_E)
- {
- /* Round the size up to be a multiple of the required alignment */
- layout->record_size = ROUND (layout->record_size, layout->record_align);
- layout->type = NULL;
- }
- if (size)
- *size = layout->record_size / BITS_PER_UNIT;
- if (align)
- *align = layout->record_align / BITS_PER_UNIT;
-}
-
-
-void objc_layout_structure_get_info (struct objc_struct_layout *layout,
- unsigned int *offset,
- unsigned int *align,
- const char **type)
-{
- if (offset)
- *offset = layout->record_size / BITS_PER_UNIT;
- if (align)
- *align = layout->record_align / BITS_PER_UNIT;
- if (type)
- *type = layout->prev_type;
-}
/* A small, portable NSConstantString implementation for use with the NeXT
runtime.
@@ -983,4 +153,5 @@ void objc_constant_string_init (void) {
sizeof (_NSConstantStringClassReference));
}
-#endif /* #ifdef __NEXT_RUNTIME__ */
+#endif /*__NEXT_RUNTIME__ */
+#endif /* _OBJC_NEXT_MAPPING_H_ */ \ No newline at end of file
diff --git a/gcc/testsuite/objc-obj-c++-shared/objc-test-suite-next-encode-assist-impl.h b/gcc/testsuite/objc-obj-c++-shared/objc-test-suite-next-encode-assist-impl.h
new file mode 100644
index 0000000..b981880
--- /dev/null
+++ b/gcc/testsuite/objc-obj-c++-shared/objc-test-suite-next-encode-assist-impl.h
@@ -0,0 +1,785 @@
+#ifndef _OBJC_TEST_SUITE_NEXT_ENCODE_ASSIST_IMPL_H_
+#define _OBJC_TEST_SUITE_NEXT_ENCODE_ASSIST_IMPL_H_
+
+#ifdef __NEXT_RUNTIME__
+
+/* Determine which API to use. */
+#include "next-abi.h"
+#ifdef NEXT_OBJC_USE_NEW_INTERFACE
+#include <objc/runtime.h>
+typedef void * PMETH;
+#else
+#include <objc/objc-runtime.h>
+typedef struct objc_method * PMETH;
+#endif
+
+/* ---- */
+
+#undef MAX
+#undef MIN
+#undef ROUND
+
+#ifdef __cplusplus
+# define MAX(X, Y) ((X > Y) ? X : Y)
+# define MIN(X, Y) ((X < Y) ? X : Y)
+# define ROUND(V, A) (A * ((V + A - 1) / A))
+#else
+# define MAX(X, Y) \
+ ({ typeof (X) __x = (X), __y = (Y); \
+ (__x > __y ? __x : __y); })
+# define MIN(X, Y) \
+ ({ typeof (X) __x = (X), __y = (Y); \
+ (__x < __y ? __x : __y); })
+# define ROUND(V, A) \
+ ({ typeof (V) __v = (V); typeof (A) __a = (A); \
+ __a * ((__v+__a - 1)/__a); })
+#endif
+
+#define BITS_PER_UNIT __CHAR_BIT__
+typedef struct{ char a; } __small_struct;
+#define STRUCTURE_SIZE_BOUNDARY (BITS_PER_UNIT * sizeof (__small_struct))
+
+/*
+ return the size of an object specified by type
+*/
+
+int
+objc_sizeof_type (const char *type)
+{
+ /* Skip the variable name if any */
+ if (*type == '"')
+ {
+ for (type++; *type++ != '"';)
+ /* do nothing */;
+ }
+
+ switch (*type) {
+ case _C_ID:
+ return sizeof (id);
+ break;
+
+ case _C_CLASS:
+ return sizeof (Class);
+ break;
+
+ case _C_SEL:
+ return sizeof (SEL);
+ break;
+
+ case _C_CHR:
+ return sizeof (char);
+ break;
+
+ case _C_UCHR:
+ return sizeof (unsigned char);
+ break;
+
+ case _C_SHT:
+ return sizeof (short);
+ break;
+
+ case _C_USHT:
+ return sizeof (unsigned short);
+ break;
+
+ case _C_INT:
+ return sizeof (int);
+ break;
+
+ case _C_UINT:
+ return sizeof (unsigned int);
+ break;
+
+ case _C_LNG:
+ return sizeof (long);
+ break;
+
+ case _C_ULNG:
+ return sizeof (unsigned long);
+ break;
+
+ case _C_LNG_LNG:
+ return sizeof (long long);
+ break;
+
+ case _C_ULNG_LNG:
+ return sizeof (unsigned long long);
+ break;
+
+ case _C_FLT:
+ return sizeof (float);
+ break;
+
+ case _C_DBL:
+ return sizeof (double);
+ break;
+
+ case _C_PTR:
+ case _C_ATOM:
+ case _C_CHARPTR:
+ return sizeof (char *);
+ break;
+
+ case _C_ARY_B:
+ {
+ int len = atoi (type + 1);
+ while (isdigit ((unsigned char)*++type))
+ ;
+ return len * objc_aligned_size (type);
+ }
+ break;
+
+ case _C_BFLD:
+ {
+ /* The NeXT encoding of bitfields is _still_: b 'size' */
+ int size = atoi (type + 1);
+ /* Return an upper bound on byte size */
+ return (size + BITS_PER_UNIT - 1) / BITS_PER_UNIT;
+ }
+
+ case _C_STRUCT_B:
+ {
+ struct objc_struct_layout layout;
+ unsigned int size;
+
+ objc_layout_structure (type, &layout);
+ while (objc_layout_structure_next_member (&layout))
+ /* do nothing */ ;
+ objc_layout_finish_structure (&layout, &size, NULL);
+
+ return size;
+ }
+
+ case _C_UNION_B:
+ {
+ int max_size = 0;
+ while (*type != _C_UNION_E && *type++ != '=')
+ /* do nothing */;
+ while (*type != _C_UNION_E)
+ {
+ /* Skip the variable name if any */
+ if (*type == '"')
+ {
+ for (type++; *type++ != '"';)
+ /* do nothing */;
+ }
+ max_size = MAX (max_size, objc_sizeof_type (type));
+ type = objc_skip_typespec (type);
+ }
+ return max_size;
+ }
+ }
+ return 0; /* error */
+}
+
+
+/*
+ Return the alignment of an object specified by type
+*/
+
+int
+objc_alignof_type (const char *type)
+{
+ /* Skip the variable name if any */
+ if (*type == '"')
+ {
+ for (type++; *type++ != '"';)
+ /* do nothing */;
+ }
+ switch (*type) {
+ case _C_ID:
+ return __alignof__ (id);
+ break;
+
+ case _C_CLASS:
+ return __alignof__ (Class);
+ break;
+
+ case _C_SEL:
+ return __alignof__ (SEL);
+ break;
+
+ case _C_CHR:
+ return __alignof__ (char);
+ break;
+
+ case _C_UCHR:
+ return __alignof__ (unsigned char);
+ break;
+
+ case _C_SHT:
+ return __alignof__ (short);
+ break;
+
+ case _C_USHT:
+ return __alignof__ (unsigned short);
+ break;
+
+ case _C_INT:
+ case _C_BFLD: /* This is for the NeXT only */
+ return __alignof__ (int);
+ break;
+
+ case _C_UINT:
+ return __alignof__ (unsigned int);
+ break;
+
+ case _C_LNG:
+ return __alignof__ (long);
+ break;
+
+ case _C_ULNG:
+ return __alignof__ (unsigned long);
+ break;
+
+ case _C_LNG_LNG:
+ return __alignof__ (long long);
+ break;
+
+ case _C_ULNG_LNG:
+ return __alignof__ (unsigned long long);
+ break;
+
+ case _C_FLT:
+ return __alignof__ (float);
+ break;
+
+ case _C_DBL:
+ return __alignof__ (double);
+ break;
+
+ case _C_PTR:
+ case _C_ATOM:
+ case _C_CHARPTR:
+ return __alignof__ (char *);
+ break;
+
+ case _C_ARY_B:
+ while (isdigit ((unsigned char)*++type))
+ /* do nothing */;
+ return objc_alignof_type (type);
+
+ case _C_STRUCT_B:
+ {
+ struct objc_struct_layout layout;
+ unsigned int align;
+
+ objc_layout_structure (type, &layout);
+ while (objc_layout_structure_next_member (&layout))
+ /* do nothing */;
+ objc_layout_finish_structure (&layout, NULL, &align);
+
+ return align;
+ }
+
+ case _C_UNION_B:
+ {
+ int maxalign = 0;
+ while (*type != _C_UNION_E && *type++ != '=')
+ /* do nothing */;
+ while (*type != _C_UNION_E)
+ {
+ /* Skip the variable name if any */
+ if (*type == '"')
+ {
+ for (type++; *type++ != '"';)
+ /* do nothing */;
+ }
+ maxalign = MAX (maxalign, objc_alignof_type (type));
+ type = objc_skip_typespec (type);
+ }
+ return maxalign;
+ }
+ }
+ return 0; /* error */
+}
+
+/*
+ The aligned size if the size rounded up to the nearest alignment.
+*/
+
+int
+objc_aligned_size (const char *type)
+{
+ int size, align;
+
+ /* Skip the variable name */
+ if (*type == '"')
+ {
+ for (type++; *type++ != '"';)
+ /* do nothing */;
+ }
+
+ size = objc_sizeof_type (type);
+ align = objc_alignof_type (type);
+
+ return ROUND (size, align);
+}
+
+/*
+ The size rounded up to the nearest integral of the wordsize, taken
+ to be the size of a void *.
+*/
+
+int
+objc_promoted_size (const char *type)
+{
+ int size, wordsize;
+
+ /* Skip the variable name */
+ if (*type == '"')
+ {
+ for (type++; *type++ != '"';)
+ /* do nothing */;
+ }
+
+ size = objc_sizeof_type (type);
+ wordsize = sizeof (void *);
+
+ return ROUND (size, wordsize);
+}
+
+/*
+ Skip type qualifiers. These may eventually precede typespecs
+ occurring in method prototype encodings.
+*/
+
+const char *
+objc_skip_type_qualifiers (const char *type)
+{
+ while (*type == _C_CONST
+ || *type == _C_IN
+ || *type == _C_INOUT
+ || *type == _C_OUT
+ || *type == _C_BYCOPY
+ || *type == _C_BYREF
+ || *type == _C_ONEWAY
+ || *type == _C_GCINVISIBLE)
+ {
+ type += 1;
+ }
+ return type;
+}
+
+/*
+ Skip one typespec element. If the typespec is prepended by type
+ qualifiers, these are skipped as well.
+*/
+
+const char *
+objc_skip_typespec (const char *type)
+{
+ /* Skip the variable name if any */
+ if (*type == '"')
+ {
+ for (type++; *type++ != '"';)
+ /* do nothing */;
+ }
+
+ type = objc_skip_type_qualifiers (type);
+
+ switch (*type) {
+
+ case _C_ID:
+ /* An id may be annotated by the actual type if it is known
+ with the @"ClassName" syntax */
+
+ if (*++type != '"')
+ return type;
+ else
+ {
+ while (*++type != '"')
+ /* do nothing */;
+ return type + 1;
+ }
+
+ /* The following are one character type codes */
+ case _C_CLASS:
+ case _C_SEL:
+ case _C_CHR:
+ case _C_UCHR:
+ case _C_CHARPTR:
+ case _C_ATOM:
+ case _C_SHT:
+ case _C_USHT:
+ case _C_INT:
+ case _C_UINT:
+ case _C_LNG:
+ case _C_ULNG:
+ case _C_LNG_LNG:
+ case _C_ULNG_LNG:
+ case _C_FLT:
+ case _C_DBL:
+ case _C_VOID:
+ case _C_UNDEF:
+ return ++type;
+ break;
+
+ case _C_ARY_B:
+ /* skip digits, typespec and closing ']' */
+
+ while (isdigit ((unsigned char)*++type))
+ ;
+ type = objc_skip_typespec (type);
+ if (*type == _C_ARY_E)
+ return ++type;
+ else
+ break; /* error */
+
+ case _C_BFLD:
+ /* The NeXT encoding for bitfields is _still_: b 'size' */
+ while (isdigit ((unsigned char)*++type))
+ ; /* skip type and size */
+ return type;
+
+ case _C_STRUCT_B:
+ /* skip name, and elements until closing '}' */
+
+ while (*type != _C_STRUCT_E && *type++ != '=')
+ ;
+ while (*type != _C_STRUCT_E)
+ {
+ type = objc_skip_typespec (type);
+ }
+ return ++type;
+
+ case _C_UNION_B:
+ /* skip name, and elements until closing ')' */
+
+ while (*type != _C_UNION_E && *type++ != '=')
+ ;
+ while (*type != _C_UNION_E)
+ {
+ type = objc_skip_typespec (type);
+ }
+ return ++type;
+
+ case _C_PTR:
+ /* Just skip the following typespec */
+
+ return objc_skip_typespec (++type);
+ }
+ return 0; /* error */
+}
+
+/*
+ Skip an offset as part of a method encoding. This is prepended by a
+ '+' if the argument is passed in registers.
+*/
+const char *
+objc_skip_offset (const char *type)
+{
+ if (*type == '+')
+ type++;
+ while (isdigit ((unsigned char) *++type))
+ ;
+ return type;
+}
+
+/*
+ Skip an argument specification of a method encoding.
+*/
+const char *
+objc_skip_argspec (const char *type)
+{
+ type = objc_skip_typespec (type);
+ type = objc_skip_offset (type);
+ return type;
+}
+/*
+ Return the number of arguments that the method MTH expects.
+ Note that all methods need two implicit arguments `self' and
+ `_cmd'.
+*/
+int
+method_get_number_of_arguments (PMETH mth)
+{
+ int i = 0;
+#ifdef NEXT_OBJC_USE_NEW_INTERFACE
+ const char *type = method_getTypeEncoding((Method)mth);
+#else
+ const char *type = mth->method_types;
+#endif
+ while (*type)
+ {
+ type = objc_skip_argspec (type);
+ i += 1;
+ }
+ return i - 1;
+}
+
+/*
+ Return the size of the argument block needed on the stack to invoke
+ the method MTH. This may be zero, if all arguments are passed in
+ registers.
+*/
+
+int
+method_get_sizeof_arguments (PMETH mth)
+{
+#ifdef NEXT_OBJC_USE_NEW_INTERFACE
+ const char *type = objc_skip_typespec (method_getTypeEncoding((Method)mth));
+#else
+ const char *type = objc_skip_typespec (mth->method_types);
+#endif
+ return atoi (type);
+}
+
+/*
+ Return a pointer to the next argument of ARGFRAME. type points to
+ the last argument. Typical use of this look like:
+
+ {
+ char *datum, *type;
+ for (datum = method_get_first_argument (method, argframe, &type);
+ datum; datum = method_get_next_argument (argframe, &type))
+ {
+ unsigned flags = objc_get_type_qualifiers (type);
+ type = objc_skip_type_qualifiers (type);
+ if (*type != _C_PTR)
+ [portal encodeData: datum ofType: type];
+ else
+ {
+ if ((flags & _F_IN) == _F_IN)
+ [portal encodeData: *(char **) datum ofType: ++type];
+ }
+ }
+ }
+*/
+
+char *
+method_get_next_argument (arglist_t argframe, const char **type)
+{
+ const char *t = objc_skip_argspec (*type);
+
+ if (*t == '\0')
+ return 0;
+
+ *type = t;
+ t = objc_skip_typespec (t);
+
+ if (*t == '+')
+ return argframe->arg_regs + atoi (++t);
+ else
+ return argframe->arg_ptr + atoi (t);
+}
+
+/*
+ Return a pointer to the value of the first argument of the method
+ described in M with the given argumentframe ARGFRAME. The type
+ is returned in TYPE. type must be passed to successive calls of
+ method_get_next_argument.
+*/
+char *
+method_get_first_argument (PMETH m,
+ arglist_t argframe,
+ const char **type)
+{
+#ifdef NEXT_OBJC_USE_NEW_INTERFACE
+ *type = method_getTypeEncoding((Method)m);
+#else
+ *type = m->method_types;
+#endif
+
+ return method_get_next_argument (argframe, type);
+}
+
+/*
+ Return a pointer to the ARGth argument of the method
+ M from the frame ARGFRAME. The type of the argument
+ is returned in the value-result argument TYPE
+*/
+
+char *
+method_get_nth_argument (PMETH m,
+ arglist_t argframe, int arg,
+ const char **type)
+{
+#ifdef NEXT_OBJC_USE_NEW_INTERFACE
+ const char *t = objc_skip_argspec (method_getTypeEncoding((Method)m));
+#else
+ const char *t = objc_skip_argspec (m->method_types);
+#endif
+
+ if (arg > method_get_number_of_arguments (m))
+ return 0;
+
+ while (arg--)
+ t = objc_skip_argspec (t);
+
+ *type = t;
+ t = objc_skip_typespec (t);
+
+ if (*t == '+')
+ return argframe->arg_regs + atoi (++t);
+ else
+ return argframe->arg_ptr + atoi (t);
+}
+
+unsigned
+objc_get_type_qualifiers (const char *type)
+{
+ unsigned res = 0;
+ BOOL flag = YES;
+
+ while (flag)
+ switch (*type++)
+ {
+ case _C_CONST: res |= _F_CONST; break;
+ case _C_IN: res |= _F_IN; break;
+ case _C_INOUT: res |= _F_INOUT; break;
+ case _C_OUT: res |= _F_OUT; break;
+ case _C_BYCOPY: res |= _F_BYCOPY; break;
+ case _C_BYREF: res |= _F_BYREF; break;
+ case _C_ONEWAY: res |= _F_ONEWAY; break;
+ case _C_GCINVISIBLE: res |= _F_GCINVISIBLE; break;
+ default: flag = NO;
+ }
+
+ return res;
+}
+
+
+/* The following three functions can be used to determine how a
+ structure is laid out by the compiler. For example:
+
+ struct objc_struct_layout layout;
+ int i;
+
+ objc_layout_structure (type, &layout);
+ while (objc_layout_structure_next_member (&layout))
+ {
+ int position, align;
+ const char *type;
+
+ objc_layout_structure_get_info (&layout, &position, &align, &type);
+ printf ("element %d has offset %d, alignment %d\n",
+ i++, position, align);
+ }
+
+ These functions are used by objc_sizeof_type and objc_alignof_type
+ functions to compute the size and alignment of structures. The
+ previous method of computing the size and alignment of a structure
+ was not working on some architectures, particulary on AIX, and in
+ the presence of bitfields inside the structure. */
+void
+objc_layout_structure (const char *type,
+ struct objc_struct_layout *layout)
+{
+ const char *ntype;
+
+ layout->original_type = ++type;
+
+ /* Skip "<name>=" if any. Avoid embedded structures and unions. */
+ ntype = type;
+ while (*ntype != _C_STRUCT_E && *ntype != _C_STRUCT_B && *ntype != _C_UNION_B
+ && *ntype++ != '=')
+ /* do nothing */;
+
+ /* If there's a "<name>=", ntype - 1 points to '='; skip the the name */
+ if (*(ntype - 1) == '=')
+ type = ntype;
+
+ layout->type = type;
+ layout->prev_type = NULL;
+ layout->record_size = 0;
+ layout->record_align = MAX (BITS_PER_UNIT, STRUCTURE_SIZE_BOUNDARY);
+}
+
+BOOL
+objc_layout_structure_next_member (struct objc_struct_layout *layout)
+{
+ register int desired_align = 0;
+
+ /* The current type without the type qualifiers */
+ const char *type;
+
+ /* Add the size of the previous field to the size of the record. */
+ if (layout->prev_type)
+ {
+ type = objc_skip_type_qualifiers (layout->prev_type);
+
+ if (*type != _C_BFLD)
+ layout->record_size += objc_sizeof_type (type) * BITS_PER_UNIT;
+ else
+ layout->record_size += atoi (++type);
+ }
+
+ if (*layout->type == _C_STRUCT_E)
+ return NO;
+
+ /* Skip the variable name if any */
+ if (*layout->type == '"')
+ {
+ for (layout->type++; *layout->type++ != '"';)
+ /* do nothing */;
+ }
+
+ type = objc_skip_type_qualifiers (layout->type);
+
+ desired_align = objc_alignof_type (type) * BITS_PER_UNIT;
+
+ /* Record must have at least as much alignment as any field.
+ Otherwise, the alignment of the field within the record
+ is meaningless. */
+ layout->record_align = MAX (layout->record_align, desired_align);
+
+ if (*type == _C_BFLD)
+ {
+ int bfld_size = atoi (++type);
+ int int_align = __alignof__ (int) * BITS_PER_UNIT;
+ /* If this bitfield would traverse a word alignment boundary, push it out
+ to that boundary instead. */
+ if (layout->record_size % int_align
+ && (layout->record_size / int_align
+ < (layout->record_size + bfld_size - 1) / int_align))
+ layout->record_size = ROUND (layout->record_size, int_align);
+ }
+ else if (layout->record_size % desired_align != 0)
+ {
+ /* We need to skip space before this field.
+ Bump the cumulative size to multiple of field alignment. */
+ layout->record_size = ROUND (layout->record_size, desired_align);
+ }
+
+ /* Jump to the next field in record. */
+
+ layout->prev_type = layout->type;
+ layout->type = objc_skip_typespec (layout->type); /* skip component */
+
+ return YES;
+}
+
+
+void objc_layout_finish_structure (struct objc_struct_layout *layout,
+ unsigned int *size,
+ unsigned int *align)
+{
+ if (layout->type && *layout->type == _C_STRUCT_E)
+ {
+ /* Round the size up to be a multiple of the required alignment */
+ layout->record_size = ROUND (layout->record_size, layout->record_align);
+ layout->type = NULL;
+ }
+ if (size)
+ *size = layout->record_size / BITS_PER_UNIT;
+ if (align)
+ *align = layout->record_align / BITS_PER_UNIT;
+}
+
+
+void objc_layout_structure_get_info (struct objc_struct_layout *layout,
+ unsigned int *offset,
+ unsigned int *align,
+ const char **type)
+{
+ if (offset)
+ *offset = layout->record_size / BITS_PER_UNIT;
+ if (align)
+ *align = layout->record_align / BITS_PER_UNIT;
+ if (type)
+ *type = layout->prev_type;
+}
+
+#endif /* __NEXT_RUNTIME__ */
+#endif /* _OBJC_TEST_SUITE_NEXT_ENCODE_ASSIST_IMPL_H_ */
diff --git a/gcc/testsuite/objc-obj-c++-shared/objc-test-suite-next-encode-assist.h b/gcc/testsuite/objc-obj-c++-shared/objc-test-suite-next-encode-assist.h
new file mode 100644
index 0000000..0a0f93c
--- /dev/null
+++ b/gcc/testsuite/objc-obj-c++-shared/objc-test-suite-next-encode-assist.h
@@ -0,0 +1,97 @@
+#ifndef _OBJC_TEST_SUITE_NEXT_ENCODE_ASSIST_H_
+#define _OBJC_TEST_SUITE_NEXT_ENCODE_ASSIST_H_
+
+#ifdef __NEXT_RUNTIME__
+
+#include "next-abi.h"
+#ifdef NEXT_OBJC_USE_NEW_INTERFACE
+#include <objc/runtime.h>
+typedef void * PMETH;
+#else
+#include <objc/objc-runtime.h>
+typedef struct objc_method * PMETH;
+#endif
+
+/* The NeXT headers do not define NULL. */
+#ifndef NULL
+#define NULL 0
+#endif
+
+/* The NeXT runtimes do not include these functions (at least not through
+ any public API). They are required for the objc/execute/bf-* and bycopy-3. */
+
+/* Not sure why the following are missing from NeXT objc headers... */
+
+#ifndef _C_LNG_LNG
+#define _C_LNG_LNG 'q'
+#endif
+#ifndef _C_ULNG_LNG
+#define _C_ULNG_LNG 'Q'
+#endif
+#ifndef _C_ATOM
+#define _C_ATOM '%'
+#endif
+#ifndef _C_BOOL
+#define _C_BOOL 'B'
+#endif
+
+#define _C_CONST 'r'
+#define _C_IN 'n'
+#define _C_INOUT 'N'
+#define _C_OUT 'o'
+#define _C_BYCOPY 'O'
+#define _C_BYREF 'R'
+#define _C_ONEWAY 'V'
+#define _C_GCINVISIBLE '!'
+
+#define _F_CONST 0x01
+#define _F_IN 0x01
+#define _F_OUT 0x02
+#define _F_INOUT 0x03
+#define _F_BYCOPY 0x04
+#define _F_BYREF 0x08
+#define _F_ONEWAY 0x10
+#define _F_GCINVISIBLE 0x20
+
+/* Functions available in the GNU runtime, emulated here for testing with NeXT. */
+
+struct objc_struct_layout
+{
+ const char *original_type;
+ const char *type;
+ const char *prev_type;
+ unsigned int record_size;
+ unsigned int record_align;
+};
+
+typedef union arglist {
+ char *arg_ptr;
+ char arg_regs[sizeof (char*)];
+} *arglist_t; /* argument frame */
+
+void objc_layout_structure_get_info (struct objc_struct_layout *,unsigned int *,
+ unsigned int *, const char **);
+void objc_layout_structure (const char *, struct objc_struct_layout *);
+BOOL objc_layout_structure_next_member (struct objc_struct_layout *);
+void objc_layout_finish_structure (struct objc_struct_layout *, unsigned int *,
+ unsigned int *);
+
+int objc_sizeof_type (const char *);
+int objc_alignof_type (const char *);
+int objc_aligned_size (const char *);
+int objc_promoted_size (const char *);
+
+unsigned objc_get_type_qualifiers (const char *);
+const char *objc_skip_type_qualifiers (const char *);
+const char *objc_skip_typespec (const char *);
+const char *objc_skip_offset (const char *);
+const char *objc_skip_argspec (const char *);
+
+int method_get_number_of_arguments (PMETH);
+int method_get_sizeof_arguments (PMETH);
+char *method_get_next_argument (arglist_t , const char **);
+char *method_get_first_argument (PMETH, arglist_t, const char **);
+char *method_get_nth_argument (PMETH, arglist_t, int, const char **);
+
+#endif /* __NEXT_RUNTIME__ */
+#endif /* _OBJC_TEST_SUITE_NEXT_ENCODE_ASSIST_H_ */
diff --git a/gcc/testsuite/objc/execute/bf-1.m b/gcc/testsuite/objc/execute/bf-1.m
index d8b9b29..a5d2191 100644
--- a/gcc/testsuite/objc/execute/bf-1.m
+++ b/gcc/testsuite/objc/execute/bf-1.m
@@ -1,5 +1,4 @@
-#import "../../objc-obj-c++-shared/Object1.h"
-#include <objc/objc-api.h>
+#include <objc/objc.h>
@interface MyObject
{
diff --git a/gcc/testsuite/objc/execute/bf-10.m b/gcc/testsuite/objc/execute/bf-10.m
index 9f5c7a5..6cbdc22 100644
--- a/gcc/testsuite/objc/execute/bf-10.m
+++ b/gcc/testsuite/objc/execute/bf-10.m
@@ -1,6 +1,4 @@
-#import "../../objc-obj-c++-shared/Object1.h"
#include <objc/objc.h>
-#include <objc/objc-api.h>
@interface MyObject
{
diff --git a/gcc/testsuite/objc/execute/bf-11.m b/gcc/testsuite/objc/execute/bf-11.m
index 1779d0f..42a97a5 100644
--- a/gcc/testsuite/objc/execute/bf-11.m
+++ b/gcc/testsuite/objc/execute/bf-11.m
@@ -1,6 +1,4 @@
-#import "../../objc-obj-c++-shared/Object1.h"
#include <objc/objc.h>
-#include <objc/objc-api.h>
@interface MyObject
{
diff --git a/gcc/testsuite/objc/execute/bf-12.m b/gcc/testsuite/objc/execute/bf-12.m
index 5a05a09..78a19d3 100644
--- a/gcc/testsuite/objc/execute/bf-12.m
+++ b/gcc/testsuite/objc/execute/bf-12.m
@@ -1,6 +1,4 @@
-#import "../../objc-obj-c++-shared/Object1.h"
#include <objc/objc.h>
-#include <objc/objc-api.h>
@interface MyObject
{
diff --git a/gcc/testsuite/objc/execute/bf-13.m b/gcc/testsuite/objc/execute/bf-13.m
index f893bfd..fa47238 100644
--- a/gcc/testsuite/objc/execute/bf-13.m
+++ b/gcc/testsuite/objc/execute/bf-13.m
@@ -1,6 +1,4 @@
-#import "../../objc-obj-c++-shared/Object1.h"
#include <objc/objc.h>
-#include <objc/objc-api.h>
@interface MyObject
{
diff --git a/gcc/testsuite/objc/execute/bf-14.m b/gcc/testsuite/objc/execute/bf-14.m
index 8b65a04..99fa8fe 100644
--- a/gcc/testsuite/objc/execute/bf-14.m
+++ b/gcc/testsuite/objc/execute/bf-14.m
@@ -1,6 +1,4 @@
-#import "../../objc-obj-c++-shared/Object1.h"
#include <objc/objc.h>
-#include <objc/objc-api.h>
@interface MyObject
{
diff --git a/gcc/testsuite/objc/execute/bf-15.m b/gcc/testsuite/objc/execute/bf-15.m
index f8d096b..c32e663 100644
--- a/gcc/testsuite/objc/execute/bf-15.m
+++ b/gcc/testsuite/objc/execute/bf-15.m
@@ -1,6 +1,4 @@
-#import "../../objc-obj-c++-shared/Object1.h"
#include <objc/objc.h>
-#include <objc/objc-api.h>
@interface MyObject
{
diff --git a/gcc/testsuite/objc/execute/bf-16.m b/gcc/testsuite/objc/execute/bf-16.m
index dea379c..e286de7 100644
--- a/gcc/testsuite/objc/execute/bf-16.m
+++ b/gcc/testsuite/objc/execute/bf-16.m
@@ -1,6 +1,4 @@
-#import "../../objc-obj-c++-shared/Object1.h"
#include <objc/objc.h>
-#include <objc/objc-api.h>
struct A {
int i;
diff --git a/gcc/testsuite/objc/execute/bf-17.m b/gcc/testsuite/objc/execute/bf-17.m
index b36d406..7650ffa 100644
--- a/gcc/testsuite/objc/execute/bf-17.m
+++ b/gcc/testsuite/objc/execute/bf-17.m
@@ -1,6 +1,4 @@
-#import "../../objc-obj-c++-shared/Object1.h"
#include <objc/objc.h>
-#include <objc/objc-api.h>
struct A {
int i;
diff --git a/gcc/testsuite/objc/execute/bf-18.m b/gcc/testsuite/objc/execute/bf-18.m
index 96a8aeb..5288295 100644
--- a/gcc/testsuite/objc/execute/bf-18.m
+++ b/gcc/testsuite/objc/execute/bf-18.m
@@ -1,6 +1,4 @@
-#import "../../objc-obj-c++-shared/Object1.h"
#include <objc/objc.h>
-#include <objc/objc-api.h>
@interface MyObject
{
diff --git a/gcc/testsuite/objc/execute/bf-19.m b/gcc/testsuite/objc/execute/bf-19.m
index 8be8ecc..d9306df 100644
--- a/gcc/testsuite/objc/execute/bf-19.m
+++ b/gcc/testsuite/objc/execute/bf-19.m
@@ -1,6 +1,4 @@
-#import "../../objc-obj-c++-shared/Object1.h"
#include <objc/objc.h>
-#include <objc/objc-api.h>
@interface MyObject
{
diff --git a/gcc/testsuite/objc/execute/bf-2.m b/gcc/testsuite/objc/execute/bf-2.m
index bbb6fe1..f776eea 100644
--- a/gcc/testsuite/objc/execute/bf-2.m
+++ b/gcc/testsuite/objc/execute/bf-2.m
@@ -1,6 +1,4 @@
-#import "../../objc-obj-c++-shared/Object1.h"
#include <objc/objc.h>
-#include <objc/objc-api.h>
@interface MyObject
{
diff --git a/gcc/testsuite/objc/execute/bf-20.m b/gcc/testsuite/objc/execute/bf-20.m
index 00cf99b..311a0fd 100644
--- a/gcc/testsuite/objc/execute/bf-20.m
+++ b/gcc/testsuite/objc/execute/bf-20.m
@@ -1,6 +1,4 @@
-#import "../../objc-obj-c++-shared/Object1.h"
#include <objc/objc.h>
-#include <objc/objc-api.h>
@interface MyObject
{
diff --git a/gcc/testsuite/objc/execute/bf-21.m b/gcc/testsuite/objc/execute/bf-21.m
index 423bde0..587060d 100644
--- a/gcc/testsuite/objc/execute/bf-21.m
+++ b/gcc/testsuite/objc/execute/bf-21.m
@@ -1,6 +1,4 @@
-#import "../../objc-obj-c++-shared/Object1.h"
#include <objc/objc.h>
-#include <objc/objc-api.h>
typedef enum
{
diff --git a/gcc/testsuite/objc/execute/bf-3.m b/gcc/testsuite/objc/execute/bf-3.m
index a531726..52863bb 100644
--- a/gcc/testsuite/objc/execute/bf-3.m
+++ b/gcc/testsuite/objc/execute/bf-3.m
@@ -1,6 +1,4 @@
-#import "../../objc-obj-c++-shared/Object1.h"
#include <objc/objc.h>
-#include <objc/objc-api.h>
@interface MyObject
{
diff --git a/gcc/testsuite/objc/execute/bf-4.m b/gcc/testsuite/objc/execute/bf-4.m
index 8c9aa4e..5654b6f 100644
--- a/gcc/testsuite/objc/execute/bf-4.m
+++ b/gcc/testsuite/objc/execute/bf-4.m
@@ -1,6 +1,4 @@
-#import "../../objc-obj-c++-shared/Object1.h"
#include <objc/objc.h>
-#include <objc/objc-api.h>
@interface MyObject
{
diff --git a/gcc/testsuite/objc/execute/bf-5.m b/gcc/testsuite/objc/execute/bf-5.m
index 3a2208f..b75509d 100644
--- a/gcc/testsuite/objc/execute/bf-5.m
+++ b/gcc/testsuite/objc/execute/bf-5.m
@@ -1,6 +1,4 @@
-#import "../../objc-obj-c++-shared/Object1.h"
#include <objc/objc.h>
-#include <objc/objc-api.h>
@interface MyObject
{
diff --git a/gcc/testsuite/objc/execute/bf-6.m b/gcc/testsuite/objc/execute/bf-6.m
index 1a3c2d8..187c758 100644
--- a/gcc/testsuite/objc/execute/bf-6.m
+++ b/gcc/testsuite/objc/execute/bf-6.m
@@ -1,6 +1,4 @@
-#import "../../objc-obj-c++-shared/Object1.h"
#include <objc/objc.h>
-#include <objc/objc-api.h>
@interface MyObject
{
diff --git a/gcc/testsuite/objc/execute/bf-7.m b/gcc/testsuite/objc/execute/bf-7.m
index c4e8d6e..f1ee46e 100644
--- a/gcc/testsuite/objc/execute/bf-7.m
+++ b/gcc/testsuite/objc/execute/bf-7.m
@@ -1,6 +1,4 @@
-#import "../../objc-obj-c++-shared/Object1.h"
#include <objc/objc.h>
-#include <objc/objc-api.h>
@interface MyObject
{
diff --git a/gcc/testsuite/objc/execute/bf-8.m b/gcc/testsuite/objc/execute/bf-8.m
index 8dfdccf..164950f 100644
--- a/gcc/testsuite/objc/execute/bf-8.m
+++ b/gcc/testsuite/objc/execute/bf-8.m
@@ -1,6 +1,4 @@
-#import "../../objc-obj-c++-shared/Object1.h"
#include <objc/objc.h>
-#include <objc/objc-api.h>
@interface MyObject
{
diff --git a/gcc/testsuite/objc/execute/bf-9.m b/gcc/testsuite/objc/execute/bf-9.m
index 077de6c..9fc7c70 100644
--- a/gcc/testsuite/objc/execute/bf-9.m
+++ b/gcc/testsuite/objc/execute/bf-9.m
@@ -1,6 +1,4 @@
-#import "../../objc-obj-c++-shared/Object1.h"
#include <objc/objc.h>
-#include <objc/objc-api.h>
@interface MyObject
{
diff --git a/gcc/testsuite/objc/execute/bf-common.h b/gcc/testsuite/objc/execute/bf-common.h
index 5d6ef57..c79c3ef 100644
--- a/gcc/testsuite/objc/execute/bf-common.h
+++ b/gcc/testsuite/objc/execute/bf-common.h
@@ -1,7 +1,14 @@
+#include <stdio.h>
#include <stdlib.h>
-#include "../../objc-obj-c++-shared/next-mapping.h"
+
#ifndef __NEXT_RUNTIME__
#include <objc/encoding.h>
+#else
+/* The following header, together with the implementation included below,
+ emulate functionality provided by the GNU runtime but not available from
+ the NeXT runtime. */
+#include "../../objc-obj-c++-shared/objc-test-suite-next-encode-assist.h"
+#define objc_get_class(C) objc_getClass(C)
#endif
void print_ivars (Class class)
@@ -63,7 +70,6 @@ int main ()
};
int size1, size2;
Class class = objc_get_class ("MyObject");
-
printf ("type = %s\n", @encode (struct class_vars));
print_ivars (class);
@@ -77,3 +83,5 @@ int main ()
exit (0);
}
+
+#include "../../objc-obj-c++-shared/objc-test-suite-next-encode-assist-impl.h"
diff --git a/gcc/testsuite/objc/execute/bycopy-3.m b/gcc/testsuite/objc/execute/bycopy-3.m
index d1944a4..4c2bd27 100644
--- a/gcc/testsuite/objc/execute/bycopy-3.m
+++ b/gcc/testsuite/objc/execute/bycopy-3.m
@@ -9,8 +9,10 @@
* interfere with what we are testing, which is that the `bycopy'
* keyword generates the _F_BYCOPY qualifier for the return type. */
-#include "../../objc-obj-c++-shared/next-mapping.h"
-#include "../../objc-obj-c++-shared/Protocol1.h"
+extern void exit (int) __attribute__ ((noreturn));
+extern int printf (const char *, ...);
+
+#include <objc/Protocol.h>
#ifndef __NEXT_RUNTIME__
#include <objc/encoding.h>
@@ -31,6 +33,11 @@
}
@end
+/* The following header, together with the implementation included below,
+ emulate functionality provided by the GNU runtime but not available from
+ the NeXT runtime. */
+#include "../../objc-obj-c++-shared/objc-test-suite-next-encode-assist.h"
+
int main (void)
{
struct objc_method_description *method;
@@ -69,3 +76,28 @@ int main (void)
/* Else, happy end */
return 0;
}
+
+#ifdef __NEXT_RUNTIME__
+unsigned
+objc_get_type_qualifiers (const char *type)
+{
+ unsigned res = 0;
+ BOOL flag = YES;
+
+ while (flag)
+ switch (*type++)
+ {
+ case _C_CONST: res |= _F_CONST; break;
+ case _C_IN: res |= _F_IN; break;
+ case _C_INOUT: res |= _F_INOUT; break;
+ case _C_OUT: res |= _F_OUT; break;
+ case _C_BYCOPY: res |= _F_BYCOPY; break;
+ case _C_BYREF: res |= _F_BYREF; break;
+ case _C_ONEWAY: res |= _F_ONEWAY; break;
+ case _C_GCINVISIBLE: res |= _F_GCINVISIBLE; break;
+ default: flag = NO;
+ }
+
+ return res;
+}
+#endif