aboutsummaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
Diffstat (limited to 'gas')
-rw-r--r--gas/ChangeLog8
-rw-r--r--gas/NEWS2
-rw-r--r--gas/config/obj-coff.c69
-rw-r--r--gas/doc/as.texinfo25
-rw-r--r--gas/testsuite/ChangeLog14
-rwxr-xr-xgas/testsuite/gas/pe/aligncomm-a.d12
-rwxr-xr-xgas/testsuite/gas/pe/aligncomm-a.s11
-rwxr-xr-xgas/testsuite/gas/pe/aligncomm-b.d16
-rw-r--r--gas/testsuite/gas/pe/aligncomm-b.s11
-rwxr-xr-xgas/testsuite/gas/pe/aligncomm-c.d8
-rwxr-xr-xgas/testsuite/gas/pe/aligncomm-c.s5
-rwxr-xr-xgas/testsuite/gas/pe/aligncomm-d.d12
-rwxr-xr-xgas/testsuite/gas/pe/aligncomm-d.s5
-rwxr-xr-xgas/testsuite/gas/pe/pe.exp34
-rw-r--r--gas/testsuite/lib/gas-defs.exp12
15 files changed, 235 insertions, 9 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 907c5d6..7f4fd56 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,11 @@
+2009-05-19 Dave Korn <dave.korn.cygwin@gmail.com>
+
+ * NEWS: Mention new feature.
+ * config/obj-coff.c (obj_coff_common_parse): New function.
+ (obj_coff_comm): Likewise.
+ (coff_pseudo_table): Override default ".comm" definition on PE.
+ * doc/as.texinfo: Document new feature.
+
2009-05-17 Kai Tietz <kai.tietz@onevision.com>
* config/obj-coff.c (obj_coff_section): Add 'y' as
diff --git a/gas/NEWS b/gas/NEWS
index 0650b30..b4b2ca6 100644
--- a/gas/NEWS
+++ b/gas/NEWS
@@ -1,5 +1,7 @@
-*- text -*-
+* Add support for common symbol alignment to PE formats.
+
* Add support for the new discriminator column in the DWARF line table,
with a discriminator operand for the .loc directive.
diff --git a/gas/config/obj-coff.c b/gas/config/obj-coff.c
index b2f4558..98d8d6c 100644
--- a/gas/config/obj-coff.c
+++ b/gas/config/obj-coff.c
@@ -169,6 +169,71 @@ obj_coff_bss (int ignore ATTRIBUTE_UNUSED)
s_lcomm (0);
}
+#ifdef TE_PE
+/* Called from read.c:s_comm after we've parsed .comm symbol, size.
+ Parse a possible alignment value. */
+
+static symbolS *
+obj_coff_common_parse (int ignore ATTRIBUTE_UNUSED, symbolS *symbolP, addressT size)
+{
+ addressT align = 0;
+
+ if (*input_line_pointer == ',')
+ {
+ align = parse_align (0);
+ if (align == (addressT) -1)
+ return NULL;
+ }
+
+ S_SET_VALUE (symbolP, size);
+ S_SET_EXTERNAL (symbolP);
+ S_SET_SEGMENT (symbolP, bfd_com_section_ptr);
+
+ symbol_get_bfdsym (symbolP)->flags |= BSF_OBJECT;
+
+ /* There is no S_SET_ALIGN (symbolP, align) in COFF/PE.
+ Instead we must add a note to the .drectve section. */
+ if (align)
+ {
+ segT current_seg = now_seg;
+ subsegT current_subseg = now_subseg;
+ flagword oldflags;
+ asection *sec;
+ size_t pfxlen, numlen;
+ char *frag;
+ char numbuff[20];
+
+ sec = subseg_new (".drectve", 0);
+ oldflags = bfd_get_section_flags (stdoutput, sec);
+ if (oldflags == SEC_NO_FLAGS)
+ {
+ if (!bfd_set_section_flags (stdoutput, sec,
+ TC_COFF_SECTION_DEFAULT_ATTRIBUTES))
+ as_warn (_("error setting flags for \"%s\": %s"),
+ bfd_section_name (stdoutput, sec),
+ bfd_errmsg (bfd_get_error ()));
+ }
+
+ /* Emit a string. Note no NUL-termination. */
+ pfxlen = strlen (" -aligncomm:") + strlen (S_GET_NAME (symbolP)) + 1;
+ numlen = snprintf (numbuff, sizeof (numbuff), "%d", (int) align);
+ frag = frag_more (pfxlen + numlen);
+ (void) sprintf (frag, " -aligncomm:%s,", S_GET_NAME (symbolP));
+ memcpy (frag + pfxlen, numbuff, numlen);
+ /* Restore original subseg. */
+ subseg_set (current_seg, current_subseg);
+ }
+
+ return symbolP;
+}
+
+static void
+obj_coff_comm (int ignore ATTRIBUTE_UNUSED)
+{
+ s_comm_internal (ignore, obj_coff_common_parse);
+}
+#endif /* TE_PE */
+
#define GET_FILENAME_STRING(X) \
((char *) (&((X)->sy_symbol.ost_auxent->x_file.x_n.x_offset))[1])
@@ -1784,6 +1849,10 @@ const pseudo_typeS coff_pseudo_table[] =
/* We accept the .bss directive for backward compatibility with
earlier versions of gas. */
{"bss", obj_coff_bss, 0},
+#ifdef TE_PE
+ /* PE provides an enhanced version of .comm with alignment. */
+ {"comm", obj_coff_comm, 0},
+#endif /* TE_PE */
{"def", obj_coff_def, 0},
{"dim", obj_coff_dim, 0},
{"endef", obj_coff_endef, 0},
diff --git a/gas/doc/as.texinfo b/gas/doc/as.texinfo
index 9871fe2..e4f7984 100644
--- a/gas/doc/as.texinfo
+++ b/gas/doc/as.texinfo
@@ -4308,16 +4308,23 @@ absolute expression. If @code{@value{LD}} sees multiple common symbols with
the same name, and they do not all have the same size, it will allocate space
using the largest size.
-@ifset ELF
-When using ELF, the @code{.comm} directive takes an optional third argument.
-This is the desired alignment of the symbol, specified as a byte boundary (for
-example, an alignment of 16 means that the least significant 4 bits of the
-address should be zero). The alignment must be an absolute expression, and it
-must be a power of two. If @code{@value{LD}} allocates uninitialized memory
-for the common symbol, it will use the alignment when placing the symbol. If
-no alignment is specified, @command{@value{AS}} will set the alignment to the
+@ifset COFF-ELF
+When using ELF or (as a GNU extension) PE, the @code{.comm} directive takes
+an optional third argument. This is the desired alignment of the symbol,
+specified for ELF as a byte boundary (for example, an alignment of 16 means
+that the least significant 4 bits of the address should be zero), and for PE
+as a power of two (for example, an alignment of 5 means aligned to a 32-byte
+boundary). The alignment must be an absolute expression, and it must be a
+power of two. If @code{@value{LD}} allocates uninitialized memory for the
+common symbol, it will use the alignment when placing the symbol. If no
+alignment is specified, @command{@value{AS}} will set the alignment to the
largest power of two less than or equal to the size of the symbol, up to a
-maximum of 16.
+maximum of 16 on ELF, or the default section alignment of 4 on PE@footnote{This
+is not the same as the executable image file alignment controlled by @code{@value{LD}}'s
+@samp{--section-alignment} option; image file sections in PE are aligned to
+multiples of 4096, which is far too large an alignment for ordinary variables.
+It is rather the default alignment for (non-debug) sections within object
+(@samp{*.o}) files, which are less strictly aligned.}.
@end ifset
@ifset HPPA
diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog
index d8b6e49..e5c8a4c 100644
--- a/gas/testsuite/ChangeLog
+++ b/gas/testsuite/ChangeLog
@@ -1,3 +1,17 @@
+2009-05-19 Dave Korn <dave.korn.cygwin@gmail.com>
+
+ * gas/pe/: New directory for PE format-specific tests.
+ * gas/pe/aligncomm-a.d: New test pattern file.
+ * gas/pe/aligncomm-a.s: New test source file.
+ * gas/pe/aligncomm-b.d: New test pattern file.
+ * gas/pe/aligncomm-b.s: New test source file.
+ * gas/pe/aligncomm-c.d: New test pattern file.
+ * gas/pe/aligncomm-c.s: New test source file.
+ * gas/pe/aligncomm-d.d: New test pattern file.
+ * gas/pe/aligncomm-d.s: New test source file.
+ * gas/pe/pe.exp: New test control script.
+ * lib/gas-defs.exp (is_pecoff_format): New function.
+
2009-05-05 H.J. Lu <hongjiu.lu@intel.com>
* gas/lns/lns-common-1-ia64.s: Add test for discriminator.
diff --git a/gas/testsuite/gas/pe/aligncomm-a.d b/gas/testsuite/gas/pe/aligncomm-a.d
new file mode 100755
index 0000000..21cad88
--- /dev/null
+++ b/gas/testsuite/gas/pe/aligncomm-a.d
@@ -0,0 +1,12 @@
+#objdump: -s -j .drectve
+#name: aligned common A
+
+# Test the aligned form of the .comm pseudo-op.
+
+.*: .*
+
+Contents of section .drectve:
+ 0000 202d616c 69676e63 6f6d6d3a 5f682c35 -aligncomm:_h,5
+ 0010 202d616c 69676e63 6f6d6d3a 5f692c34 -aligncomm:_i,4
+ 0020 202d616c 69676e63 6f6d6d3a 5f6a2c33 -aligncomm:_j,3
+ 0030 202d616c 69676e63 6f6d6d3a 5f6b2c32 -aligncomm:_k,2
diff --git a/gas/testsuite/gas/pe/aligncomm-a.s b/gas/testsuite/gas/pe/aligncomm-a.s
new file mode 100755
index 0000000..47bab4d
--- /dev/null
+++ b/gas/testsuite/gas/pe/aligncomm-a.s
@@ -0,0 +1,11 @@
+ .file "a.c"
+ .comm _h, 16
+ .comm _i, 16
+ .comm _j, 16
+ .comm _k, 16
+ .section .drectve
+ .ascii " -aligncomm:_h,5"
+ .ascii " -aligncomm:_i,4"
+ .ascii " -aligncomm:_j,3"
+ .ascii " -aligncomm:_k,2"
+
diff --git a/gas/testsuite/gas/pe/aligncomm-b.d b/gas/testsuite/gas/pe/aligncomm-b.d
new file mode 100755
index 0000000..9a162be
--- /dev/null
+++ b/gas/testsuite/gas/pe/aligncomm-b.d
@@ -0,0 +1,16 @@
+#objdump: -s -j .drectve
+#name: aligned common B
+
+# Test the aligned form of the .comm pseudo-op.
+
+.*: .*
+
+Contents of section .drectve:
+ 0000 202d616c 69676e63 6f6d6d3a 5f682c38 -aligncomm:_h,8
+ 0010 202d616c 69676e63 6f6d6d3a 5f692c34 -aligncomm:_i,4
+ 0020 202d616c 69676e63 6f6d6d3a 5f6a2c32 -aligncomm:_j,2
+ 0030 202d616c 69676e63 6f6d6d3a 5f6b2c31 -aligncomm:_k,1
+ 0040 202d616c 69676e63 6f6d6d3a 5f682c35 -aligncomm:_h,5
+ 0050 202d616c 69676e63 6f6d6d3a 5f692c34 -aligncomm:_i,4
+ 0060 202d616c 69676e63 6f6d6d3a 5f6a2c33 -aligncomm:_j,3
+ 0070 202d616c 69676e63 6f6d6d3a 5f6b2c32 -aligncomm:_k,2
diff --git a/gas/testsuite/gas/pe/aligncomm-b.s b/gas/testsuite/gas/pe/aligncomm-b.s
new file mode 100644
index 0000000..29606e1
--- /dev/null
+++ b/gas/testsuite/gas/pe/aligncomm-b.s
@@ -0,0 +1,11 @@
+ .file "a.c"
+ .comm _h, 16, 8
+ .comm _i, 16, 4
+ .comm _j, 16, 2
+ .comm _k, 16, 1
+ .section .drectve
+ .ascii " -aligncomm:_h,5"
+ .ascii " -aligncomm:_i,4"
+ .ascii " -aligncomm:_j,3"
+ .ascii " -aligncomm:_k,2"
+
diff --git a/gas/testsuite/gas/pe/aligncomm-c.d b/gas/testsuite/gas/pe/aligncomm-c.d
new file mode 100755
index 0000000..f9dc3a8
--- /dev/null
+++ b/gas/testsuite/gas/pe/aligncomm-c.d
@@ -0,0 +1,8 @@
+#objdump: -s -j .drectve
+#name: aligned common C
+
+# Test the aligned form of the .comm pseudo-op.
+
+.*: .*
+
+# No .drectve section emitted. \ No newline at end of file
diff --git a/gas/testsuite/gas/pe/aligncomm-c.s b/gas/testsuite/gas/pe/aligncomm-c.s
new file mode 100755
index 0000000..154b4bd
--- /dev/null
+++ b/gas/testsuite/gas/pe/aligncomm-c.s
@@ -0,0 +1,5 @@
+ .file "a.c"
+ .comm _h, 16
+ .comm _i, 16
+ .comm _j, 16
+ .comm _k, 16
diff --git a/gas/testsuite/gas/pe/aligncomm-d.d b/gas/testsuite/gas/pe/aligncomm-d.d
new file mode 100755
index 0000000..639d057
--- /dev/null
+++ b/gas/testsuite/gas/pe/aligncomm-d.d
@@ -0,0 +1,12 @@
+#objdump: -s -j .drectve
+#name: aligned common D
+
+# Test the aligned form of the .comm pseudo-op.
+
+.*: .*
+
+Contents of section .drectve:
+ 0000 202d616c 69676e63 6f6d6d3a 5f682c38 -aligncomm:_h,8
+ 0010 202d616c 69676e63 6f6d6d3a 5f692c34 -aligncomm:_i,4
+ 0020 202d616c 69676e63 6f6d6d3a 5f6a2c32 -aligncomm:_j,2
+ 0030 202d616c 69676e63 6f6d6d3a 5f6b2c31 -aligncomm:_k,1
diff --git a/gas/testsuite/gas/pe/aligncomm-d.s b/gas/testsuite/gas/pe/aligncomm-d.s
new file mode 100755
index 0000000..bf2b397
--- /dev/null
+++ b/gas/testsuite/gas/pe/aligncomm-d.s
@@ -0,0 +1,5 @@
+ .file "a.c"
+ .comm _h, 16, 8
+ .comm _i, 16, 4
+ .comm _j, 16, 2
+ .comm _k, 16, 1
diff --git a/gas/testsuite/gas/pe/pe.exp b/gas/testsuite/gas/pe/pe.exp
new file mode 100755
index 0000000..87e2a3e
--- /dev/null
+++ b/gas/testsuite/gas/pe/pe.exp
@@ -0,0 +1,34 @@
+# Expect control script for GAS testsuite PE object-format-specific tests.
+
+# Copyright (C) 2009
+# Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+
+# Please email any bugs, comments, and/or additions to this file to:
+# binutils@gnu.org
+
+load_lib gas-dg.exp
+load_lib gas-defs.exp
+
+# These tests can only be run on PE/COFF platforms.
+if {![is_pecoff_format]} {
+ return
+}
+
+run_dump_test "aligncomm-a"
+run_dump_test "aligncomm-b"
+run_dump_test "aligncomm-c"
+run_dump_test "aligncomm-d"
diff --git a/gas/testsuite/lib/gas-defs.exp b/gas/testsuite/lib/gas-defs.exp
index 1e02847..5eda00a 100644
--- a/gas/testsuite/lib/gas-defs.exp
+++ b/gas/testsuite/lib/gas-defs.exp
@@ -310,6 +310,18 @@ proc is_elf_format {} {
return 1
}
+# True if the object format is known to be PE COFF.
+#
+proc is_pecoff_format {} {
+ if { ![istarget *-*-mingw*] \
+ && ![istarget *-*-cygwin*] \
+ && ![istarget *-*-pe*] } {
+ return 0
+ }
+
+ return 1
+}
+
# run_dump_tests TESTCASES EXTRA_OPTIONS
# Wrapper for run_dump_test, which is suitable for invoking as
# run_dump_tests [lsort [glob -nocomplain $srcdir/$subdir/*.d]]