This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: [REINSTATED] Re: [PATCH,trunk+2.20.1] Extend COFF .section directive syntax to specify alignment.
On 22/01/2010 04:34, Alan Modra wrote:
> On Thu, Jan 21, 2010 at 04:08:21PM +0000, Dave Korn wrote:
>> What I should have said was: There is currently no way to specify an
>> alignment *less than the default section alignment* for a section:
>
> I see.
>
>> or should I revive this patch?
>
> Possibly. Another option would be to invent a new assembler directive
> that resets alignment, or extend existing alignment directives to do
> the same. eg. ".p2align -1" could align to 2 bytes even if previous
> section alignment was higher.
Well, I don't like the idea of changing .p2align; its job is to adjust the
location pointer, and it only adjusts the section alignment upward
incidentally, because it "has to" rather than because it particularly "wants
to"; making that part of its primary purpose would seem like semantically
overloading it to me. Adding a new directive wouldn't be as confusing as
that, but it seems overkill to me: the alignment is a property of a section
and it makes sense to me to set it at the same time as other properties of the
section are set, when it is created in the .section directive.
So, unless anyone actually objects within say 48 hours, I'll apply this
patch to HEAD. Tristan, how do you feel about putting it on the branch too?
cheers,
DaveK
Index: gas/NEWS
===================================================================
RCS file: /cvs/src/src/gas/NEWS,v
retrieving revision 1.111
diff -p -u -r1.111 NEWS
--- gas/NEWS 29 Sep 2009 14:17:06 -0000 1.111
+++ gas/NEWS 23 Jan 2010 18:51:03 -0000
@@ -4,6 +4,9 @@
Changes in 2.20:
+* GAS now understands an extended syntax in the .section directive flags
+ for COFF targets that allows the section's alignment to be specified.
+
* GNU/Linux targets now supports "gnu_unique_object" as a value in the .type
pseudo op. It marks the symbol as being globally unique in the entire
process.
Index: gas/config/obj-coff.c
===================================================================
RCS file: /cvs/src/src/gas/config/obj-coff.c,v
retrieving revision 1.103
diff -p -u -r1.103 obj-coff.c
--- gas/config/obj-coff.c 11 Dec 2009 13:42:10 -0000 1.103
+++ gas/config/obj-coff.c 23 Jan 2010 18:51:03 -0000
@@ -23,6 +23,7 @@
#define OBJ_HEADER "obj-coff.h"
#include "as.h"
+#include "safe-ctype.h"
#include "obstack.h"
#include "subsegs.h"
@@ -1540,6 +1541,7 @@ coff_frob_file_after_relocs (void)
'r' for read-only data
's' for shared data (PE)
'y' for noread
+ '0' - '9' for power-of-two alignment (GNU extension).
But if the argument is not a quoted string, treat it as a
subsegment number.
@@ -1551,7 +1553,7 @@ obj_coff_section (int ignore ATTRIBUTE_U
{
/* Strip out the section name. */
char *section_name;
- char c;
+ char c, alignment = -1;
char *name;
unsigned int exp;
flagword flags, oldflags;
@@ -1594,6 +1596,11 @@ obj_coff_section (int ignore ATTRIBUTE_U
attr != '"'
&& ! is_end_of_line[attr])
{
+ if (ISDIGIT (attr))
+ {
+ alignment = attr - '0';
+ continue;
+ }
switch (attr)
{
case 'b':
@@ -1670,6 +1677,8 @@ obj_coff_section (int ignore ATTRIBUTE_U
}
sec = subseg_new (name, (subsegT) exp);
+ if (alignment >= 0)
+ sec->alignment_power = alignment;
oldflags = bfd_get_section_flags (stdoutput, sec);
if (oldflags == SEC_NO_FLAGS)
Index: gas/doc/as.texinfo
===================================================================
RCS file: /cvs/src/src/gas/doc/as.texinfo,v
retrieving revision 1.214
diff -p -u -r1.214 as.texinfo
--- gas/doc/as.texinfo 29 Oct 2009 00:19:19 -0000 1.214
+++ gas/doc/as.texinfo 23 Jan 2010 18:51:04 -0000
@@ -5768,6 +5768,8 @@ shared section (meaningful for PE target
ignored. (For compatibility with the ELF version)
@item y
section is not readable (meaningful for PE targets)
+@item 0-9
+single-digit power-of-two section alignment (GNU extension)
@end table
If no flags are specified, the default flags depend upon the section name. If
Index: gas/testsuite/gas/pe/pe.exp
===================================================================
RCS file: /cvs/src/src/gas/testsuite/gas/pe/pe.exp,v
retrieving revision 1.1
diff -p -u -r1.1 pe.exp
--- gas/testsuite/gas/pe/pe.exp 19 May 2009 16:08:07 -0000 1.1
+++ gas/testsuite/gas/pe/pe.exp 23 Jan 2010 18:51:05 -0000
@@ -32,3 +32,6 @@ run_dump_test "aligncomm-a"
run_dump_test "aligncomm-b"
run_dump_test "aligncomm-c"
run_dump_test "aligncomm-d"
+
+run_dump_test "section-align-1"
+run_dump_test "section-align-3"
Index: gas/testsuite/gas/pe/section-align-1.d
===================================================================
RCS file: gas/testsuite/gas/pe/section-align-1.d
diff -N gas/testsuite/gas/pe/section-align-1.d
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ gas/testsuite/gas/pe/section-align-1.d 23 Jan 2010 18:51:05 -0000
@@ -0,0 +1,29 @@
+#objdump: -h
+#name: section alignment
+
+# Test that alignment works in .section directives.
+
+.*: .*
+
+Sections:
+Idx Name *Size *VMA *LMA *File off *Algn
+ 0 \.text 0*0000000 0*0000000 0*0000000 0*0000000 2\*\*[24]
+ ALLOC, LOAD, READONLY, CODE
+ 1 \.data 0*0000000 0*0000000 0*0000000 0*0000000 2\*\*[24]
+ ALLOC, LOAD, DATA
+ 2 \.bss 0*0000000 0*0000000 0*0000000 0*0000000 2\*\*[24]
+ ALLOC
+ 3 \.none 0*0000000 0*0000000 0*0000000 0*0000000 2\*\*0
+ ALLOC, LOAD, READONLY, DATA
+ 4 \.zero 0*0000000 0*0000000 0*0000000 0*0000000 2\*\*0
+ ALLOC, LOAD, READONLY, DATA
+ 5 \.one 0*0000001 0*0000000 0*0000000 0*00001a4 2\*\*0
+ CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 6 \.two 0*0000002 0*0000000 0*0000000 0*00001a5 2\*\*0
+ CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 7 \.three 0*0000003 0*0000000 0*0000000 0*00001a7 2\*\*0
+ CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 8 \.four 0*0000004 0*0000000 0*0000000 0*00001aa 2\*\*0
+ CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 9 \.five 0*0000005 0*0000000 0*0000000 0*00001ae 2\*\*0
+ CONTENTS, ALLOC, LOAD, READONLY, DATA
Index: gas/testsuite/gas/pe/section-align-1.s
===================================================================
RCS file: gas/testsuite/gas/pe/section-align-1.s
diff -N gas/testsuite/gas/pe/section-align-1.s
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ gas/testsuite/gas/pe/section-align-1.s 23 Jan 2010 18:51:05 -0000
@@ -0,0 +1,15 @@
+
+ .section .none,"dr0"
+ .section .zero,"dr0"
+ .ascii ""
+ .section .one,"dr0"
+ .ascii "1"
+ .section .two,"dr0"
+ .ascii "12"
+ .section .three,"dr0"
+ .ascii "123"
+ .section .four,"dr0"
+ .ascii "1234"
+ .section .five,"dr0"
+ .ascii "12345"
+ .end
Index: gas/testsuite/gas/pe/section-align-3.d
===================================================================
RCS file: gas/testsuite/gas/pe/section-align-3.d
diff -N gas/testsuite/gas/pe/section-align-3.d
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ gas/testsuite/gas/pe/section-align-3.d 23 Jan 2010 18:51:05 -0000
@@ -0,0 +1,39 @@
+#objdump: -h
+#name: section alignment
+
+# Test that alignment works in .section directives.
+
+.*: .*
+
+Sections:
+Idx Name *Size *VMA *LMA *File off *Algn
+ 0 \.text 0*0000000 0*0000000 0*0000000 0*0000000 2\*\*[24]
+ ALLOC, LOAD, READONLY, CODE
+ 1 \.data 0*0000000 0*0000000 0*0000000 0*0000000 2\*\*[24]
+ ALLOC, LOAD, DATA
+ 2 \.bss 0*0000000 0*0000000 0*0000000 0*0000000 2\*\*[24]
+ ALLOC
+ 3 \.none 0*0000000 0*0000000 0*0000000 0*0000000 2\*\*3
+ ALLOC, LOAD, READONLY, DATA
+ 4 \.zero 0*0000000 0*0000000 0*0000000 0*0000000 2\*\*3
+ ALLOC, LOAD, READONLY, DATA
+ 5 \.one 0*0000008 0*0000000 0*0000000 0*000026c 2\*\*3
+ CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 6 \.two 0*0000008 0*0000000 0*0000000 0*0000274 2\*\*3
+ CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 7 \.three 0*0000008 0*0000000 0*0000000 0*000027c 2\*\*3
+ CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 8 \.four 0*0000008 0*0000000 0*0000000 0*0000284 2\*\*3
+ CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 9 \.five 0*0000008 0*0000000 0*0000000 0*000028c 2\*\*3
+ CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 10 \.six 0*0000008 0*0000000 0*0000000 0*0000294 2\*\*3
+ CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 11 \.seven 0*0000008 0*0000000 0*0000000 0*000029c 2\*\*3
+ CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 12 \.eight 0*0000008 0*0000000 0*0000000 0*00002a4 2\*\*3
+ CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 13 \.nine 0*0000010 0*0000000 0*0000000 0*00002ac 2\*\*3
+ CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 14 \.ten 0*0000010 0*0000000 0*0000000 0*00002bc 2\*\*3
+ CONTENTS, ALLOC, LOAD, READONLY, DATA
Index: gas/testsuite/gas/pe/section-align-3.s
===================================================================
RCS file: gas/testsuite/gas/pe/section-align-3.s
diff -N gas/testsuite/gas/pe/section-align-3.s
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ gas/testsuite/gas/pe/section-align-3.s 23 Jan 2010 18:51:05 -0000
@@ -0,0 +1,25 @@
+
+ .section .none,"dr3"
+ .section .zero,"dr3"
+ .ascii ""
+ .section .one,"dr3"
+ .ascii "1"
+ .section .two,"dr3"
+ .ascii "12"
+ .section .three,"dr3"
+ .ascii "123"
+ .section .four,"dr3"
+ .ascii "1234"
+ .section .five,"dr3"
+ .ascii "12345"
+ .section .six,"dr3"
+ .ascii "123456"
+ .section .seven,"dr3"
+ .ascii "1234567"
+ .section .eight,"dr3"
+ .ascii "12345678"
+ .section .nine,"dr3"
+ .ascii "123456789"
+ .section .ten,"dr3"
+ .ascii "1234567890"
+ .end