* read.c (get_absolute_expr): New, split out from..
authorAlan Modra <amodra@gmail.com>
Sat, 11 Jan 2003 06:24:12 +0000 (06:24 +0000)
committerAlan Modra <amodra@gmail.com>
Sat, 11 Jan 2003 06:24:12 +0000 (06:24 +0000)
(get_absolute_expression): ..here.
* read.h (get_absolute_expr): Declare.
* config/obj-elf.c (elf_common): Use offsetT for "temp" and "size".
Trim size to arch bits_per_address, and test for negative input
via get_absolute_expr.

gas/ChangeLog
gas/config/obj-elf.c
gas/read.c
gas/read.h

index 54d04b1..47b457e 100644 (file)
@@ -1,3 +1,12 @@
+2003-01-11  Alan Modra  <amodra@bigpond.net.au>
+
+       * read.c (get_absolute_expr): New, split out from..
+       (get_absolute_expression): ..here.
+       * read.h (get_absolute_expr): Declare.
+       * config/obj-elf.c (elf_common): Use offsetT for "temp" and "size".
+       Trim size to arch bits_per_address, and test for negative input
+       via get_absolute_expr.
+
 2003-01-07  DJ Delorie  <dj@redhat.com>
 
        * config/tc-xstormy16.c (md_cgen_lookup_reloc): Adjust value based
index 5dc4279..7976704 100644 (file)
@@ -1,6 +1,6 @@
 /* ELF object file format
    Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-   2001, 2002 Free Software Foundation, Inc.
+   2001, 2002, 2003 Free Software Foundation, Inc.
 
    This file is part of GAS, the GNU Assembler.
 
@@ -290,9 +290,10 @@ elf_common (is_common)
   char *name;
   char c;
   char *p;
-  int temp, size;
+  offsetT temp, size, sign;
   symbolS *symbolP;
   int have_align;
+  expressionS exp;
 
   if (flag_mri && is_common)
     {
@@ -313,13 +314,15 @@ elf_common (is_common)
       return NULL;
     }
   input_line_pointer++;                /* skip ',' */
-  if ((temp = get_absolute_expression ()) < 0)
+  temp = get_absolute_expr (&exp);
+  sign = (offsetT) 1 << (stdoutput->arch_info->bits_per_address - 1);
+  size = temp & ((sign << 1) - 1);
+  if (temp != size || !exp.X_unsigned)
     {
-      as_bad (_(".COMMon length (%d.) <0! Ignored."), temp);
+      as_bad (_(".COMMon length (%ld) out of range, ignored."), (long) temp);
       ignore_rest_of_line ();
       return NULL;
     }
-  size = temp;
   *p = 0;
   symbolP = symbol_find_or_make (name);
   *p = c;
@@ -333,8 +336,9 @@ elf_common (is_common)
     {
       if (S_GET_VALUE (symbolP) != (valueT) size)
        {
-         as_warn (_("length of .comm \"%s\" is already %ld; not changed to %d"),
-                  S_GET_NAME (symbolP), (long) S_GET_VALUE (symbolP), size);
+         as_warn (_("length of .comm \"%s\" is already %ld; not changed to %ld"),
+                  S_GET_NAME (symbolP), (long) S_GET_VALUE (symbolP),
+                  (long) size);
        }
     }
   know (symbolP->sy_frag == &zero_address_frag);
@@ -352,8 +356,8 @@ elf_common (is_common)
        temp = 0;
       else
        {
-         temp = get_absolute_expression ();
-         if (temp < 0)
+         temp = get_absolute_expr (&exp);
+         if (!exp.X_unsigned)
            {
              temp = 0;
              as_warn (_("common alignment negative; 0 assumed"));
index 8fdcf43..f8d5d7e 100644 (file)
@@ -1,6 +1,6 @@
 /* read.c - read a source file -
    Copyright 1986, 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
-   1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+   1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
 
 This file is part of GAS, the GNU Assembler.
 
@@ -4802,18 +4802,25 @@ get_known_segmented_expression (expP)
 }
 
 offsetT
-get_absolute_expression ()
+get_absolute_expr (exp)
+     expressionS *exp;
 {
-  expressionS exp;
-
-  expression (&exp);
-  if (exp.X_op != O_constant)
+  expression (exp);
+  if (exp->X_op != O_constant)
     {
-      if (exp.X_op != O_absent)
+      if (exp->X_op != O_absent)
        as_bad (_("bad or irreducible absolute expression"));
-      exp.X_add_number = 0;
+      exp->X_add_number = 0;
     }
-  return exp.X_add_number;
+  return exp->X_add_number;
+}
+
+offsetT
+get_absolute_expression ()
+{
+  expressionS exp;
+
+  return get_absolute_expr (&exp);
 }
 
 char                           /* Return terminator.  */
index f57126d..1e8ca7a 100644 (file)
@@ -1,6 +1,6 @@
 /* read.h - of read.c
    Copyright 1986, 1990, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-   2000
+   2000, 2001, 2002, 2003
    Free Software Foundation, Inc.
 
    This file is part of GAS, the GNU Assembler.
@@ -105,6 +105,7 @@ extern void aout_process_stab PARAMS ((int, const char *, int, int, int));
 extern char *demand_copy_C_string PARAMS ((int *len_pointer));
 extern char get_absolute_expression_and_terminator
   PARAMS ((long *val_pointer));
+extern offsetT get_absolute_expr PARAMS ((expressionS *));
 extern offsetT get_absolute_expression PARAMS ((void));
 extern unsigned int next_char_of_string PARAMS ((void));
 extern void s_mri_sect PARAMS ((char *));