From c1711530e652a14bc0df9b603c73e350b5dfe5ec Mon Sep 17 00:00:00 2001 From: Dave Korn Date: Tue, 19 May 2009 16:08:08 +0000 Subject: ==> bfd/ChangeLog <== 2009-05-19 Dave Korn * cofflink.c (process_embedded_commands): Ignore "-aligncomm". ==> gas/ChangeLog <== 2009-05-19 Dave Korn * 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. ==> gas/testsuite/ChangeLog <== 2009-05-19 Dave Korn * 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. ==> ld/ChangeLog <== 2009-05-19 Dave Korn * NEWS: Mention new feature. * deffile.h (def_file_aligncomm): Add new struct definition. (def_file): Add new def_file_aligncomm member. * deffilep.y (%token): Add new ALIGNCOMM token. (command): Add production rule for ALIGNCOMM. (def_file_free): Free any chained def_file_aligncomm structs. (diropts[]): Add entry for '-aligncomm' .drectve command. (def_aligncomm): New grammar function. * ld.texinfo: Document new feature. * pe-dll.c (process_def_file): Rename from this ... (process_def_file_and_drectve): ... to this, updating all callers, and process any aligncomms chained to the def file after scanning all .drectve sections. (generate_edata): Updated to match. (pe_dll_build_sections): Likewise. ==> ld/testsuite/ChangeLog <== 2009-05-19 Dave Korn * ld-pe/aligncomm-1.c: New test source file. * ld-pe/aligncomm-2.c: Likewise. * ld-pe/aligncomm-3.c: Likewise. * ld-pe/aligncomm-4.c: Likewise. * ld-pe/aligncomm.d: New test pattern file. * ld-pe/direct.exp: Deleted, and content moved into ... * ld-pe/pe-run.exp: ... New common file for all PE run tests. * ld-pe/vers-script.exp: Deleted, and content merged into ... * ld-pe/pe-compile.exp: ... New common file for PE tests needing a compiler, adding aligned common tests. * ld-pe/pe.exp: Update header comment. --- gas/ChangeLog | 8 +++++ gas/NEWS | 2 ++ gas/config/obj-coff.c | 69 ++++++++++++++++++++++++++++++++++++++ gas/doc/as.texinfo | 25 +++++++++----- gas/testsuite/ChangeLog | 14 ++++++++ gas/testsuite/gas/pe/aligncomm-a.d | 12 +++++++ gas/testsuite/gas/pe/aligncomm-a.s | 11 ++++++ gas/testsuite/gas/pe/aligncomm-b.d | 16 +++++++++ gas/testsuite/gas/pe/aligncomm-b.s | 11 ++++++ gas/testsuite/gas/pe/aligncomm-c.d | 8 +++++ gas/testsuite/gas/pe/aligncomm-c.s | 5 +++ gas/testsuite/gas/pe/aligncomm-d.d | 12 +++++++ gas/testsuite/gas/pe/aligncomm-d.s | 5 +++ gas/testsuite/gas/pe/pe.exp | 34 +++++++++++++++++++ gas/testsuite/lib/gas-defs.exp | 12 +++++++ 15 files changed, 235 insertions(+), 9 deletions(-) create mode 100755 gas/testsuite/gas/pe/aligncomm-a.d create mode 100755 gas/testsuite/gas/pe/aligncomm-a.s create mode 100755 gas/testsuite/gas/pe/aligncomm-b.d create mode 100644 gas/testsuite/gas/pe/aligncomm-b.s create mode 100755 gas/testsuite/gas/pe/aligncomm-c.d create mode 100755 gas/testsuite/gas/pe/aligncomm-c.s create mode 100755 gas/testsuite/gas/pe/aligncomm-d.d create mode 100755 gas/testsuite/gas/pe/aligncomm-d.s create mode 100755 gas/testsuite/gas/pe/pe.exp (limited to 'gas') 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 + + * 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 * 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 + + * 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 * 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]] -- cgit v1.1