/* Encoding of types for Objective C.
- Copyright (C) 1993, 1995, 1996, 1997, 1998, 2000, 2002, 2004, 2009
- Free Software Foundation, Inc.
+ Copyright (C) 1993-2017 Free Software Foundation, Inc.
Contributed by Kresten Krab Thorup
Bitfield support by Ovidiu Predescu
/* FIXME: This file contains functions that will abort the entire
program if they fail. Is that really needed ? */
+#include "config.h"
#include "objc-private/common.h"
#include "objc-private/error.h"
#include "tconfig.h"
/* Some ports (eg ARM) allow the structure size boundary to be
selected at compile-time. We override the normal definition with
one that has a constant value for this compilation. */
-#ifndef BITS_PER_UNIT
-#define BITS_PER_UNIT 8
-#endif
#undef STRUCTURE_SIZE_BOUNDARY
-#define STRUCTURE_SIZE_BOUNDARY (BITS_PER_UNIT * sizeof (struct{char a;}))
+#define STRUCTURE_SIZE_BOUNDARY (__CHAR_BIT__ * sizeof (struct{char a;}))
/* Some ROUND_TYPE_ALIGN macros use TARGET_foo, and consequently
target_flags. Define a dummy entry here to so we don't die.
#undef ALTIVEC_VECTOR_MODE
#define ALTIVEC_VECTOR_MODE(MODE) (0)
+/* Replace TARGET_VSX, TARGET_ALTIVEC, and TARGET_64BIT with constants based on
+ the current switches, rather than looking in the options structure. */
+#ifdef _ARCH_PPC
+#undef TARGET_VSX
+#undef TARGET_ALTIVEC
+#undef TARGET_64BIT
+
+#ifdef __VSX__
+#define TARGET_VSX 1
+#else
+#define TARGET_VSX 0
+#endif
+
+#ifdef __ALTIVEC__
+#define TARGET_ALTIVEC 1
+#else
+#define TARGET_ALTIVEC 0
+#endif
+
+#ifdef _ARCH_PPC64
+#define TARGET_64BIT 1
+#else
+#define TARGET_64BIT 0
+#endif
+#endif
+
/* Furthermore, some (powerpc) targets also use TARGET_ALIGN_NATURAL
in their alignment macros. Currently[4.5/6], rs6000.h points this
to a static variable, initialized by target overrides. This is reset
{
case RECORD_TYPE:
case UNION_TYPE:
- return MAX (MAX (comp, spec), objc_alignof_type (_stp) * BITS_PER_UNIT);
+ return MAX (MAX (comp, spec), objc_alignof_type (_stp) * __CHAR_BIT__);
break;
case DFmode:
case _C_LNG_LNG:
? MAX (MAX (COMPUTED, SPECIFIED), 64) \
: MAX (COMPUTED, SPECIFIED));})
+#define rs6000_special_adjust_field_align_p(FIELD, COMPUTED) 0
/* Skip a variable name, enclosed in quotes ("). */
static inline
;
size = atoi (type + 1);
- startByte = position / BITS_PER_UNIT;
- endByte = (position + size) / BITS_PER_UNIT;
+ startByte = position / __CHAR_BIT__;
+ endByte = (position + size) / __CHAR_BIT__;
return endByte - startByte;
}
}
}
-int
-method_get_number_of_arguments (struct objc_method *mth)
-{
- return method_getNumberOfArguments (mth);
-}
-
-/* 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 (struct objc_method *mth)
-{
- const char *type = objc_skip_typespec (mth->method_types);
- 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 (struct objc_method *m,
- arglist_t argframe,
- const char **type)
-{
- *type = m->method_types;
- 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 (struct objc_method *m,
- arglist_t argframe, int arg,
- const char **type)
-{
- const char *t = objc_skip_argspec (m->method_types);
-
- 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)
{
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
+ was not working on some architectures, particularly on AIX, and in
the presence of bitfields inside the structure. */
void
objc_layout_structure (const char *type,
layout->type = type;
layout->prev_type = NULL;
layout->record_size = 0;
- layout->record_align = BITS_PER_UNIT;
+ layout->record_align = __CHAR_BIT__;
layout->record_align = MAX (layout->record_align, STRUCTURE_SIZE_BOUNDARY);
}
type = objc_skip_type_qualifiers (layout->prev_type);
if (unionp)
layout->record_size = MAX (layout->record_size,
- objc_sizeof_type (type) * BITS_PER_UNIT);
+ objc_sizeof_type (type) * __CHAR_BIT__);
else if (*type != _C_BFLD)
- layout->record_size += objc_sizeof_type (type) * BITS_PER_UNIT;
+ layout->record_size += objc_sizeof_type (type) * __CHAR_BIT__;
else {
/* Get the bitfield's type */
for (bfld_type = type + 1;
bfld_type++)
/* do nothing */;
- bfld_type_align = objc_alignof_type (bfld_type) * BITS_PER_UNIT;
+ bfld_type_align = objc_alignof_type (bfld_type) * __CHAR_BIT__;
bfld_field_size = atoi (objc_skip_typespec (bfld_type));
layout->record_size += bfld_field_size;
}
type = objc_skip_type_qualifiers (layout->type);
if (*type != _C_BFLD)
- desired_align = objc_alignof_type (type) * BITS_PER_UNIT;
+ desired_align = objc_alignof_type (type) * __CHAR_BIT__;
else
{
desired_align = 1;
bfld_type++)
/* do nothing */;
- bfld_type_align = objc_alignof_type (bfld_type) * BITS_PER_UNIT;
+ bfld_type_align = objc_alignof_type (bfld_type) * __CHAR_BIT__;
bfld_field_size = atoi (objc_skip_typespec (bfld_type));
}
/* Record must have at least as much alignment as any field.
Otherwise, the alignment of the field within the record
is meaningless. */
-#ifndef PCC_BITFIELD_TYPE_MATTERS
+#ifndef HAVE_BITFIELD_TYPE_MATTERS
layout->record_align = MAX (layout->record_align, desired_align);
#else /* PCC_BITFIELD_TYPE_MATTERS */
if (*type == _C_BFLD)
if (bfld_field_size)
layout->record_align = MAX (layout->record_align, desired_align);
else
- desired_align = objc_alignof_type (bfld_type) * BITS_PER_UNIT;
+ desired_align = objc_alignof_type (bfld_type) * __CHAR_BIT__;
/* A named bit field of declared type `int'
forces the entire structure to have `int' alignment.
if (maximum_field_alignment != 0)
type_align = MIN (type_align, maximum_field_alignment);
else if (DECL_PACKED (field))
- type_align = MIN (type_align, BITS_PER_UNIT);
+ type_align = MIN (type_align, __CHAR_BIT__);
#endif
layout->record_align = MAX (layout->record_align, type_align);
layout->record_align = MAX (1, layout->record_align);
#endif
-#ifdef ROUND_TYPE_SIZE
- layout->record_size = ROUND_TYPE_SIZE (layout->original_type,
- layout->record_size,
- layout->record_align);
-#else
/* Round the size up to be a multiple of the required alignment */
layout->record_size = ROUND (layout->record_size, layout->record_align);
-#endif
layout->type = NULL;
}
if (size)
- *size = layout->record_size / BITS_PER_UNIT;
+ *size = layout->record_size / __CHAR_BIT__;
if (align)
- *align = layout->record_align / BITS_PER_UNIT;
+ *align = layout->record_align / __CHAR_BIT__;
}
void objc_layout_structure_get_info (struct objc_struct_layout *layout,
const char **type)
{
if (offset)
- *offset = layout->record_size / BITS_PER_UNIT;
+ *offset = layout->record_size / __CHAR_BIT__;
if (align)
- *align = layout->record_align / BITS_PER_UNIT;
+ *align = layout->record_align / __CHAR_BIT__;
if (type)
*type = layout->prev_type;
}