diff options
author | Dave Korn <dave.korn@artimi.com> | 2009-05-19 16:08:08 +0000 |
---|---|---|
committer | Dave Korn <dave.korn@artimi.com> | 2009-05-19 16:08:08 +0000 |
commit | c1711530e652a14bc0df9b603c73e350b5dfe5ec (patch) | |
tree | f0e82c9c384277dc508547d786bbc912eac7edf8 /gas | |
parent | fbdebf465713844d23625ae09e0ae4995418328b (diff) | |
download | gdb-c1711530e652a14bc0df9b603c73e350b5dfe5ec.zip gdb-c1711530e652a14bc0df9b603c73e350b5dfe5ec.tar.gz gdb-c1711530e652a14bc0df9b603c73e350b5dfe5ec.tar.bz2 |
==> bfd/ChangeLog <==
2009-05-19 Dave Korn <dave.korn.cygwin@gmail.com>
* cofflink.c (process_embedded_commands): Ignore "-aligncomm".
==> gas/ChangeLog <==
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.
==> gas/testsuite/ChangeLog <==
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.
==> ld/ChangeLog <==
2009-05-19 Dave Korn <dave.korn.cygwin@gmail.com>
* 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 <dave.korn.cygwin@gmail.com>
* 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.
Diffstat (limited to 'gas')
-rw-r--r-- | gas/ChangeLog | 8 | ||||
-rw-r--r-- | gas/NEWS | 2 | ||||
-rw-r--r-- | gas/config/obj-coff.c | 69 | ||||
-rw-r--r-- | gas/doc/as.texinfo | 25 | ||||
-rw-r--r-- | gas/testsuite/ChangeLog | 14 | ||||
-rwxr-xr-x | gas/testsuite/gas/pe/aligncomm-a.d | 12 | ||||
-rwxr-xr-x | gas/testsuite/gas/pe/aligncomm-a.s | 11 | ||||
-rwxr-xr-x | gas/testsuite/gas/pe/aligncomm-b.d | 16 | ||||
-rw-r--r-- | gas/testsuite/gas/pe/aligncomm-b.s | 11 | ||||
-rwxr-xr-x | gas/testsuite/gas/pe/aligncomm-c.d | 8 | ||||
-rwxr-xr-x | gas/testsuite/gas/pe/aligncomm-c.s | 5 | ||||
-rwxr-xr-x | gas/testsuite/gas/pe/aligncomm-d.d | 12 | ||||
-rwxr-xr-x | gas/testsuite/gas/pe/aligncomm-d.s | 5 | ||||
-rwxr-xr-x | gas/testsuite/gas/pe/pe.exp | 34 | ||||
-rw-r--r-- | gas/testsuite/lib/gas-defs.exp | 12 |
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 @@ -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]] |