* 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.
This commit is contained in:
Alan Modra 2003-01-11 06:24:12 +00:00
parent 1fb309eaa6
commit a0ea3e1db8
4 changed files with 40 additions and 19 deletions

View 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> 2003-01-07 DJ Delorie <dj@redhat.com>
* config/tc-xstormy16.c (md_cgen_lookup_reloc): Adjust value based * config/tc-xstormy16.c (md_cgen_lookup_reloc): Adjust value based

View File

@ -1,6 +1,6 @@
/* ELF object file format /* ELF object file format
Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 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. This file is part of GAS, the GNU Assembler.
@ -290,9 +290,10 @@ elf_common (is_common)
char *name; char *name;
char c; char c;
char *p; char *p;
int temp, size; offsetT temp, size, sign;
symbolS *symbolP; symbolS *symbolP;
int have_align; int have_align;
expressionS exp;
if (flag_mri && is_common) if (flag_mri && is_common)
{ {
@ -313,13 +314,15 @@ elf_common (is_common)
return NULL; return NULL;
} }
input_line_pointer++; /* skip ',' */ 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 (); ignore_rest_of_line ();
return NULL; return NULL;
} }
size = temp;
*p = 0; *p = 0;
symbolP = symbol_find_or_make (name); symbolP = symbol_find_or_make (name);
*p = c; *p = c;
@ -333,8 +336,9 @@ elf_common (is_common)
{ {
if (S_GET_VALUE (symbolP) != (valueT) size) if (S_GET_VALUE (symbolP) != (valueT) size)
{ {
as_warn (_("length of .comm \"%s\" is already %ld; not changed to %d"), as_warn (_("length of .comm \"%s\" is already %ld; not changed to %ld"),
S_GET_NAME (symbolP), (long) S_GET_VALUE (symbolP), size); S_GET_NAME (symbolP), (long) S_GET_VALUE (symbolP),
(long) size);
} }
} }
know (symbolP->sy_frag == &zero_address_frag); know (symbolP->sy_frag == &zero_address_frag);
@ -352,8 +356,8 @@ elf_common (is_common)
temp = 0; temp = 0;
else else
{ {
temp = get_absolute_expression (); temp = get_absolute_expr (&exp);
if (temp < 0) if (!exp.X_unsigned)
{ {
temp = 0; temp = 0;
as_warn (_("common alignment negative; 0 assumed")); as_warn (_("common alignment negative; 0 assumed"));

View File

@ -1,6 +1,6 @@
/* read.c - read a source file - /* read.c - read a source file -
Copyright 1986, 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 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. This file is part of GAS, the GNU Assembler.
@ -4801,19 +4801,26 @@ get_known_segmented_expression (expP)
return (retval); return (retval);
} }
offsetT
get_absolute_expr (exp)
expressionS *exp;
{
expression (exp);
if (exp->X_op != O_constant)
{
if (exp->X_op != O_absent)
as_bad (_("bad or irreducible absolute expression"));
exp->X_add_number = 0;
}
return exp->X_add_number;
}
offsetT offsetT
get_absolute_expression () get_absolute_expression ()
{ {
expressionS exp; expressionS exp;
expression (&exp); return get_absolute_expr (&exp);
if (exp.X_op != O_constant)
{
if (exp.X_op != O_absent)
as_bad (_("bad or irreducible absolute expression"));
exp.X_add_number = 0;
}
return exp.X_add_number;
} }
char /* Return terminator. */ char /* Return terminator. */

View File

@ -1,6 +1,6 @@
/* read.h - of read.c /* read.h - of read.c
Copyright 1986, 1990, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, Copyright 1986, 1990, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
2000 2000, 2001, 2002, 2003
Free Software Foundation, Inc. Free Software Foundation, Inc.
This file is part of GAS, the GNU Assembler. 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 *demand_copy_C_string PARAMS ((int *len_pointer));
extern char get_absolute_expression_and_terminator extern char get_absolute_expression_and_terminator
PARAMS ((long *val_pointer)); PARAMS ((long *val_pointer));
extern offsetT get_absolute_expr PARAMS ((expressionS *));
extern offsetT get_absolute_expression PARAMS ((void)); extern offsetT get_absolute_expression PARAMS ((void));
extern unsigned int next_char_of_string PARAMS ((void)); extern unsigned int next_char_of_string PARAMS ((void));
extern void s_mri_sect PARAMS ((char *)); extern void s_mri_sect PARAMS ((char *));