Commit 4540a3ad by Andrew Pinski Committed by Andrew Pinski

re PR libobjc/25347 (objc_alignof_type gets the wrong alignment for unions…

re PR libobjc/25347 (objc_alignof_type gets the wrong alignment for unions (objc_sizeof_type is wrong also too))

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

        PR libobjc/25347
        * encoding.c (objc_sizeof_type): Don't handle _C_UNION_B special
        but use the struct layout functions.
        (objc_alignof_type): Likewise.
        (objc_layout_structure): Handle _C_UNION_B also.
        (objc_layout_structure_next_member): Likewise.
        (objc_layout_finish_structure): Likewise.

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

        PR libobjc/25347
        * objc.dg/encode-8.m: New test.

From-SVN: r108379
parent 153b4898
2005-12-11 Andrew Pinski <pinskia@physics.uc.edu> 2005-12-11 Andrew Pinski <pinskia@physics.uc.edu>
PR libobjc/25347
* objc.dg/encode-8.m: New test.
2005-12-11 Andrew Pinski <pinskia@physics.uc.edu>
PR libobjc/25346 PR libobjc/25346
* objc.dg/encode-7.m: New test. * objc.dg/encode-7.m: New test.
/* { dg-options "-fgnu-runtime" } */
/* { dg-do run } */
#include <objc/encoding.h>
#include <stdlib.h>
union f
{
char i;
double f1;
short t;
};
union g
{
int i;
};
int main(void)
{
if (objc_sizeof_type (@encode (union f)) != sizeof(union f))
abort ();
if (objc_alignof_type (@encode (union f)) != __alignof__(union f))
abort ();
if (objc_sizeof_type (@encode (union g)) != sizeof(union g))
abort ();
if (objc_alignof_type (@encode (union g)) != __alignof__(union g))
abort ();
return 0;
}
2005-12-11 Andrew Pinski <pinskia@physics.uc.edu> 2005-12-11 Andrew Pinski <pinskia@physics.uc.edu>
PR libobjc/25347
* encoding.c (objc_sizeof_type): Don't handle _C_UNION_B special
but use the struct layout functions.
(objc_alignof_type): Likewise.
(objc_layout_structure): Handle _C_UNION_B also.
(objc_layout_structure_next_member): Likewise.
(objc_layout_finish_structure): Likewise.
2005-12-11 Andrew Pinski <pinskia@physics.uc.edu>
PR libobjc/25346 PR libobjc/25346
* objc/objc-api.h (_C_BOOL): New define. * objc/objc-api.h (_C_BOOL): New define.
* encoding.c (objc_sizeof_type): Handle _C_BOOL. * encoding.c (objc_sizeof_type): Handle _C_BOOL.
......
...@@ -222,6 +222,7 @@ objc_sizeof_type (const char *type) ...@@ -222,6 +222,7 @@ objc_sizeof_type (const char *type)
return endByte - startByte; return endByte - startByte;
} }
case _C_UNION_B:
case _C_STRUCT_B: case _C_STRUCT_B:
{ {
struct objc_struct_layout layout; struct objc_struct_layout layout;
...@@ -235,25 +236,6 @@ objc_sizeof_type (const char *type) ...@@ -235,25 +236,6 @@ objc_sizeof_type (const char *type)
return size; 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;
}
default: default:
{ {
objc_error (nil, OBJC_ERR_BAD_TYPE, "unknown type %s\n", type); objc_error (nil, OBJC_ERR_BAD_TYPE, "unknown type %s\n", type);
...@@ -353,6 +335,7 @@ objc_alignof_type (const char *type) ...@@ -353,6 +335,7 @@ objc_alignof_type (const char *type)
return objc_alignof_type (type); return objc_alignof_type (type);
case _C_STRUCT_B: case _C_STRUCT_B:
case _C_UNION_B:
{ {
struct objc_struct_layout layout; struct objc_struct_layout layout;
unsigned int align; unsigned int align;
...@@ -365,25 +348,6 @@ objc_alignof_type (const char *type) ...@@ -365,25 +348,6 @@ objc_alignof_type (const char *type)
return 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;
}
default: default:
{ {
objc_error (nil, OBJC_ERR_BAD_TYPE, "unknown type %s\n", type); objc_error (nil, OBJC_ERR_BAD_TYPE, "unknown type %s\n", type);
...@@ -762,13 +726,14 @@ objc_layout_structure (const char *type, ...@@ -762,13 +726,14 @@ objc_layout_structure (const char *type,
{ {
const char *ntype; const char *ntype;
if (*type++ != _C_STRUCT_B) if (*type != _C_UNION_B && *type != _C_STRUCT_B)
{ {
objc_error (nil, OBJC_ERR_BAD_TYPE, objc_error (nil, OBJC_ERR_BAD_TYPE,
"record type expected in objc_layout_structure, got %s\n", "record (or union) type expected in objc_layout_structure, got %s\n",
type); type);
} }
type ++;
layout->original_type = type; layout->original_type = type;
/* Skip "<name>=" if any. Avoid embedded structures and unions. */ /* Skip "<name>=" if any. Avoid embedded structures and unions. */
...@@ -801,13 +766,17 @@ objc_layout_structure_next_member (struct objc_struct_layout *layout) ...@@ -801,13 +766,17 @@ objc_layout_structure_next_member (struct objc_struct_layout *layout)
/* The current type without the type qualifiers */ /* The current type without the type qualifiers */
const char *type; const char *type;
BOOL unionp = layout->original_type[-1] == _C_UNION_B;
/* Add the size of the previous field to the size of the record. */ /* Add the size of the previous field to the size of the record. */
if (layout->prev_type) if (layout->prev_type)
{ {
type = objc_skip_type_qualifiers (layout->prev_type); type = objc_skip_type_qualifiers (layout->prev_type);
if (unionp)
layout->record_size = MAX (layout->record_size,
objc_sizeof_type (type) * BITS_PER_UNIT);
if (*type != _C_BFLD) else if (*type != _C_BFLD)
layout->record_size += objc_sizeof_type (type) * BITS_PER_UNIT; layout->record_size += objc_sizeof_type (type) * BITS_PER_UNIT;
else { else {
/* Get the bitfield's type */ /* Get the bitfield's type */
...@@ -823,7 +792,8 @@ objc_layout_structure_next_member (struct objc_struct_layout *layout) ...@@ -823,7 +792,8 @@ objc_layout_structure_next_member (struct objc_struct_layout *layout)
} }
} }
if (*layout->type == _C_STRUCT_E) if ((unionp && *layout->type == _C_UNION_E)
|| (!unionp && *layout->type == _C_STRUCT_E))
return NO; return NO;
/* Skip the variable name if any */ /* Skip the variable name if any */
...@@ -923,7 +893,10 @@ void objc_layout_finish_structure (struct objc_struct_layout *layout, ...@@ -923,7 +893,10 @@ void objc_layout_finish_structure (struct objc_struct_layout *layout,
unsigned int *size, unsigned int *size,
unsigned int *align) unsigned int *align)
{ {
if (layout->type && *layout->type == _C_STRUCT_E) BOOL unionp = layout->original_type[-1] == _C_UNION_B;
if (layout->type
&& ((!unionp && *layout->type == _C_STRUCT_E)
|| (unionp && *layout->type == _C_UNION_E)))
{ {
/* Work out the alignment of the record as one expression and store /* Work out the alignment of the record as one expression and store
in the record type. Round it up to a multiple of the record's in the record type. Round it up to a multiple of the record's
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment