diff options
author | Alan Modra <amodra@gmail.com> | 2003-01-11 06:24:12 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2003-01-11 06:24:12 +0000 |
commit | a0ea3e1db8c4ecb6ed33c135384d35d31a333918 (patch) | |
tree | 7132902ced6c6a4f714716e7c5ab8779e7a8f95a /gas | |
parent | 1fb309eaa6afba828c4b780e41dd744585fa09b2 (diff) | |
download | gdb-a0ea3e1db8c4ecb6ed33c135384d35d31a333918.zip gdb-a0ea3e1db8c4ecb6ed33c135384d35d31a333918.tar.gz gdb-a0ea3e1db8c4ecb6ed33c135384d35d31a333918.tar.bz2 |
* 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.
Diffstat (limited to 'gas')
-rw-r--r-- | gas/ChangeLog | 9 | ||||
-rw-r--r-- | gas/config/obj-elf.c | 22 | ||||
-rw-r--r-- | gas/read.c | 25 | ||||
-rw-r--r-- | gas/read.h | 3 |
4 files changed, 40 insertions, 19 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index 54d04b1..47b457e 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -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 diff --git a/gas/config/obj-elf.c b/gas/config/obj-elf.c index 5dc4279..7976704 100644 --- a/gas/config/obj-elf.c +++ b/gas/config/obj-elf.c @@ -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")); @@ -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. */ @@ -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 *)); |