Rationalize ARM .align
authorAlan Modra <amodra@gmail.com>
Sun, 16 Aug 2015 23:35:42 +0000 (09:05 +0930)
committerAlan Modra <amodra@gmail.com>
Sun, 16 Aug 2015 23:35:54 +0000 (09:05 +0930)
* gas/config/tc-arm.c (s_align): Delete.
(md_pseudo_table): Use s_align_ptwo for "align".
* gas/config/tc-arm.h (TC_ALIGN_ZERO_IS_DEFAULT): Define.
* read.c (s_align): Modify for TC_ALIGN_ZERO_IS_DEFAULT.

gas/ChangeLog
gas/config/tc-arm.c
gas/config/tc-arm.h
gas/read.c

index ecf77fb..4064fc1 100644 (file)
@@ -1,3 +1,10 @@
+2015-08-17  Alan Modra  <amodra@gmail.com>
+
+       * gas/config/tc-arm.c (s_align): Delete.
+       (md_pseudo_table): Use s_align_ptwo for "align".
+       * gas/config/tc-arm.h (TC_ALIGN_ZERO_IS_DEFAULT): Define.
+       * read.c (s_align): Modify for TC_ALIGN_ZERO_IS_DEFAULT.
+
 2015-08-13  Alan Modra  <amodra@gmail.com>
 
        * expr.c (operand): Rewrite handling of operands starting with "0f".
index fabcf80..e54b81b 100644 (file)
@@ -2969,53 +2969,6 @@ s_syntax (int unused ATTRIBUTE_UNUSED)
 
 /* Directives: sectioning and alignment.  */
 
-/* Same as s_align_ptwo but align 0 => align 2.         */
-
-static void
-s_align (int unused ATTRIBUTE_UNUSED)
-{
-  int temp;
-  bfd_boolean fill_p;
-  long temp_fill;
-  long max_alignment = 15;
-
-  temp = get_absolute_expression ();
-  if (temp > max_alignment)
-    as_bad (_("alignment too large: %d assumed"), temp = max_alignment);
-  else if (temp < 0)
-    {
-      as_bad (_("alignment negative. 0 assumed."));
-      temp = 0;
-    }
-
-  if (*input_line_pointer == ',')
-    {
-      input_line_pointer++;
-      temp_fill = get_absolute_expression ();
-      fill_p = TRUE;
-    }
-  else
-    {
-      fill_p = FALSE;
-      temp_fill = 0;
-    }
-
-  if (!temp)
-    temp = 2;
-
-  /* Only make a frag if we HAVE to.  */
-  if (temp && !need_pass_2)
-    {
-      if (!fill_p && subseg_text_p (now_seg))
-       frag_align_code (temp, 0);
-      else
-       frag_align (temp, (int) temp_fill, 0);
-    }
-  demand_empty_rest_of_line ();
-
-  record_alignment (now_seg, temp);
-}
-
 static void
 s_bss (int ignore ATTRIBUTE_UNUSED)
 {
@@ -4691,7 +4644,7 @@ const pseudo_typeS md_pseudo_table[] =
   { "qn",          s_qn,          0 },
   { "unreq",      s_unreq,       0 },
   { "bss",        s_bss,         0 },
-  { "align",      s_align,       0 },
+  { "align",      s_align_ptwo,  2 },
   { "arm",        s_arm,         0 },
   { "thumb",      s_thumb,       0 },
   { "code",       s_code,        0 },
index 22e9027..98038be 100644 (file)
@@ -245,6 +245,7 @@ arm_min (int am_p1, int am_p2)
 #define TC_FRAG_TYPE           struct arm_frag_type
 /* NOTE: max_chars is a local variable from frag_var / frag_variant.  */
 #define TC_FRAG_INIT(fragp)    arm_init_frag (fragp, max_chars)
+#define TC_ALIGN_ZERO_IS_DEFAULT 1
 #define HANDLE_ALIGN(fragp)    arm_handle_align (fragp)
 #define SUB_SEGMENT_ALIGN(SEG, FRCHAIN)                        \
   ((!(FRCHAIN)->frch_next && subseg_text_p (SEG))              \
index 816c255..000c75b 100644 (file)
@@ -1471,6 +1471,11 @@ s_align (int arg, int bytes_p)
     {
       align = get_absolute_expression ();
       SKIP_WHITESPACE ();
+
+#ifdef TC_ALIGN_ZERO_IS_DEFAULT
+      if (arg > 0 && align == 0)
+       align = arg;
+#endif
     }
 
   if (bytes_p)