OSDN Git Service

* stor-layout.c (mode_for_size_tree): Remove restiction on type
[pf3gnuchains/gcc-fork.git] / gcc / builtins.c
index 1ce6083..c4200c2 100644 (file)
@@ -275,21 +275,29 @@ get_pointer_alignment (tree exp, unsigned int max_align)
        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;
@@ -5373,6 +5381,8 @@ expand_builtin_fork_or_exec (tree fn, tree arglist, rtx target, int ignore)
   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);