/* Encoding of types for Objective C.
- Copyright (C) 1993-2014 Free Software Foundation, Inc.
+ Copyright (C) 1993-2018 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.
{
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 E_DFmode:
case _C_LNG_LNG:
case _C_ULNG_LNG:
return MAX (MAX (comp, spec), 64);
;
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;
}
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));
}
desired_align = MIN (desired_align, BIGGEST_FIELD_ALIGNMENT);
#endif
#ifdef ADJUST_FIELD_ALIGN
- desired_align = ADJUST_FIELD_ALIGN (type, desired_align);
+ desired_align = ADJUST_FIELD_ALIGN (type, type, desired_align);
#endif
/* 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;
}