This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
common syms on 64 bit
- From: Alan Modra <amodra at bigpond dot net dot au>
- To: binutils at sources dot redhat dot com
- Date: Sat, 11 Jan 2003 16:54:35 +1030
- Subject: common syms on 64 bit
Allows 64-bit machines to have huge common syms. I've also changed
the range checking to take into account the arch address space, rather
than just bombing on negative values.
* 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.
Index: gas/read.c
===================================================================
RCS file: /cvs/src/src/gas/read.c,v
retrieving revision 1.57
diff -u -p -r1.57 read.c
--- gas/read.c 2 Dec 2002 15:42:08 -0000 1.57
+++ gas/read.c 11 Jan 2003 06:15:43 -0000
@@ -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: gas/read.h
===================================================================
RCS file: /cvs/src/src/gas/read.h,v
retrieving revision 1.15
diff -u -p -r1.15 read.h
--- gas/read.h 14 Jun 2002 14:08:51 -0000 1.15
+++ gas/read.h 11 Jan 2003 06:15:43 -0000
@@ -105,6 +105,7 @@ extern void aout_process_stab PARAMS ((i
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 *));
Index: gas/config/obj-elf.c
===================================================================
RCS file: /cvs/src/src/gas/config/obj-elf.c,v
retrieving revision 1.59
diff -u -p -r1.59 obj-elf.c
--- gas/config/obj-elf.c 1 Jan 2003 16:56:34 -0000 1.59
+++ gas/config/obj-elf.c 11 Jan 2003 06:15:44 -0000
@@ -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"));
--
Alan Modra
IBM OzLabs - Linux Technology Centre