This is the mail archive of the binutils@sourceware.org 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]

PATCH: PR gas/5221: .pushsection is broken


.pushsection and .section are very similar. The main difference
is .pushsection takes additional parameter for subsection. This
patch

http://sourceware.org/ml/binutils/2007-10/msg00178.html

breaks .pushsection. Here is a patch to fix it.


H.J.
---
gas/

2007-10-26  H.J. Lu  <hongjiu.lu@intel.com>

	PR gas/5221
	* config/obj-elf.c (obj_elf_section): Handle optional
	parameters for .pushsection.

	* doc/as.texinfo: Document optional parameters for
	.pushsection.

gas/testsuite/

2007-10-26  H.J. Lu  <hongjiu.lu@intel.com>

	PR gas/5221
	* gas/elf/elf.exp: Run section7.

	* gas/elf/section7.d: New.
	* gas/elf/section7.s: Likewise.

--- gas/config/obj-elf.c.push	2007-10-26 06:23:23.000000000 -0700
+++ gas/config/obj-elf.c	2007-10-26 06:47:38.000000000 -0700
@@ -964,11 +964,23 @@ obj_elf_section (int push)
       ++input_line_pointer;
       SKIP_WHITESPACE ();
 
-      if (push)
+      if (push && ISDIGIT (*input_line_pointer))
 	{
+	  /* .pushsection has an optional subsection.  */
 	  new_subsection = (subsegT) get_absolute_expression ();
+
+	  SKIP_WHITESPACE ();
+
+	  /* Stop if we don't see a comma.  */
+	  if (*input_line_pointer != ',')
+	    goto done;
+
+	  /* Skip the comma.  */
+	  ++input_line_pointer;
+	  SKIP_WHITESPACE ();
 	}
-      else if (*input_line_pointer == '"')
+
+      if (*input_line_pointer == '"')
 	{
 	  beg = demand_copy_C_string (&dummy);
 	  if (beg == NULL)
@@ -1074,6 +1086,7 @@ obj_elf_section (int push)
 	}
     }
 
+done:
   demand_empty_rest_of_line ();
 
   obj_elf_change_section (name, type, attr, entsize, group_name, linkonce, push);
--- gas/doc/as.texinfo.push	2007-10-17 08:48:37.000000000 -0700
+++ gas/doc/as.texinfo	2007-10-26 08:00:09.000000000 -0700
@@ -5468,7 +5468,7 @@ expanded.  @xref{Macro}.
 
 @ifset ELF
 @node PushSection
-@section @code{.pushsection @var{name} , @var{subsection}}
+@section @code{.pushsection @var{name} [, @var{subsection} [, "@var{flags}"[, @@@var{type}[,@var{arguments}]]]]}
 
 @cindex @code{pushsection} directive
 @cindex Section Stack
@@ -5479,7 +5479,9 @@ This is one of the ELF section stack man
 
 This directive pushes the current section (and subsection) onto the
 top of the section stack, and then replaces the current section and
-subsection with @code{name} and @code{subsection}.
+subsection with @code{name} and @code{subsection}. The optional
+@code{flags}, @code{type} and @code{arguments} are treated the same
+as in the @code{.section} (@pxref{Section}) directive.
 @end ifset
 
 @node Quad
--- gas/testsuite/gas/elf/elf.exp.push	2007-10-11 18:36:34.000000000 -0700
+++ gas/testsuite/gas/elf/elf.exp	2007-10-26 07:02:50.000000000 -0700
@@ -104,4 +104,5 @@ if { ([istarget "*-*-*elf*"]		
     run_dump_test "symver" 
     run_elf_list_test "type" "" "" "-s" "| grep \"1 \\\[FONTC\\\]\""
     run_dump_test "section6" 
+    run_dump_test "section7" 
 }
--- gas/testsuite/gas/elf/section7.d.push	2007-10-26 07:02:11.000000000 -0700
+++ gas/testsuite/gas/elf/section7.d	2007-10-26 07:52:44.000000000 -0700
@@ -0,0 +1,21 @@
+#objdump: -s
+#name: elf section7
+
+.*: +file format .*
+
+# The MIPS includes a 'section .reginfo' and such here.
+#...
+Contents of section .bar:
+ 0000 00000000 00000000 0000 .*
+Contents of section .bar1:
+ 0000 0102 .*
+Contents of section .bar2:
+ 0000 0102 .*
+Contents of section .bar3:
+ 0000 0103 .*
+Contents of section .bar4:
+ 0000 04 .*
+Contents of section .text:
+ 0000 feff .*
+# Arm includes a .ARM.attributes section here
+#...
--- gas/testsuite/gas/elf/section7.s.push	2007-10-26 07:02:13.000000000 -0700
+++ gas/testsuite/gas/elf/section7.s	2007-10-26 07:50:26.000000000 -0700
@@ -0,0 +1,38 @@
+	.section .bar,"a"
+	.byte 0
+.pushsection .bar1,2,"a"
+	.byte 2
+.popsection
+	.byte 0
+.pushsection .bar2,3,"a"
+	.byte 2
+.popsection
+	.byte 0
+.pushsection .bar3,2,"a", %progbits
+	.byte 3
+.popsection
+	.byte 0
+.pushsection .bar4
+	.byte 4
+.popsection
+	.byte 0
+.pushsection        .text,1,"axG",%progbits,foo,comdat
+	.byte -1
+.popsection
+	.byte 0
+.pushsection        .text,"axG",%progbits,foo,comdat
+	.byte -2
+.popsection
+	.byte 0
+.pushsection .bar1,"a"
+	.byte 1
+.popsection
+	.byte 0
+.pushsection .bar3,"a", %progbits
+	.byte 1
+.popsection
+	.byte 0
+.pushsection .bar2,"a"
+	.byte 1
+.popsection
+	.byte 0


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