case ADDR_EXPR:
/* See what we are pointing at and look at its alignment. */
exp = TREE_OPERAND (exp, 0);
+ inner = max_align;
while (handled_component_p (exp))
{
+ /* Fields in a structure can be packed, honour DECL_ALIGN
+ of the FIELD_DECL. For all other references the conservative
+ alignment is the element type alignment. */
if (TREE_CODE (exp) == COMPONENT_REF)
- align = MIN (align, DECL_ALIGN (TREE_OPERAND (exp, 1)));
+ inner = MIN (inner, DECL_ALIGN (TREE_OPERAND (exp, 1)));
+ else
+ inner = MIN (inner, TYPE_ALIGN (TREE_TYPE (exp)));
exp = TREE_OPERAND (exp, 0);
}
if (TREE_CODE (exp) == FUNCTION_DECL)
- align = MIN (align, FUNCTION_BOUNDARY);
+ align = FUNCTION_BOUNDARY;
else if (DECL_P (exp))
- align = MIN (align, DECL_ALIGN (exp));
+ align = MIN (inner, DECL_ALIGN (exp));
#ifdef CONSTANT_ALIGNMENT
else if (CONSTANT_CLASS_P (exp))
- align = MIN (align, (unsigned)CONSTANT_ALIGNMENT (exp, align));
+ align = MIN (inner, (unsigned)CONSTANT_ALIGNMENT (exp, align));
#endif
- return align;
+ else
+ align = MIN (align, inner);
+ return MIN (align, max_align);
default:
return align;
TREE_PUBLIC (decl) = 1;
DECL_ARTIFICIAL (decl) = 1;
TREE_NOTHROW (decl) = 1;
+ DECL_VISIBILITY (decl) = VISIBILITY_DEFAULT;
+ DECL_VISIBILITY_SPECIFIED (decl) = 1;
call = build_function_call_expr (decl, arglist);
return expand_call (call, target, ignore);