This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]