New keywords (string32) for GNU as ?
Helge Deller
deller@gmx.de
Tue Nov 21 23:35:00 GMT 2006
More information about the Binutils mailing list
Tue Nov 21 23:35:00 GMT 2006
- Previous message (by thread): New keywords (string32) for GNU as ?
- Next message (by thread): New keywords (string32) for GNU as ?
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Hi Dave, Dave Korn wrote: > On 19 November 2006 14:23, Helge Deller wrote: >> Would this kind of new keyword "in principle" be acceptable for GNU >> as/binutils ? > .... > That said, I think your patch is well motivated and a reasonable > solution to the problem. I haven't tested it yet but it looks sane. Thanks a lot for your feedback. Below is an updated patch against CVS HEAD, which should include all your proposed changes, which include: - added .string64 as well (beside .string8, .string16, .string32) - cleaned up the coding style - fixed the comments - abort on coding error (if wrong bitsize was provided) - fixed up all callers of the stringer() function to include the bit size - added Changelog entries - added a testcase (strings.s, strings.d) Additionally, I did tested, compiled and ran a "make check" sucessfully on Linux/i686/little-endian _and_ Linux/hppa/big-endian. Could you please take a look at it again ? As a side-note: If this patch would be ok, will someone (who?) take it up and commit, or should I maybe ask for a cvs-commit rights and commit myself ? Helge Index: ChangeLog =================================================================== RCS file: /cvs/src/src/gas/ChangeLog,v retrieving revision 1.3060 diff -u -p -r1.3060 ChangeLog --- ChangeLog 20 Nov 2006 01:28:43 -0000 1.3060 +++ ChangeLog 21 Nov 2006 22:59:32 -0000 @@ -1,3 +1,25 @@ +2006-11-21 Helge Deller <deller@gmx.de> + + * read.c (potable): Add string8, string16, string32 and string64. + Add bit size for stringer function. + (stringer_append_char): New. + (stringer): Use stringer_append_char(). + * config/obj-coff.c (obj_coff_ident): Add bit size for stringer function. + * config/obj-elf.c (obj_elf_ident): Likewise. + * config/tc-alpha.c (s_alpha_stringer): Likewise. + * config/tc-dlx.c (dlx_pseudo_table): Likewise. + * config/tc-hppa.c (pa_stringer): Likewise. + * config/tc-ia64.c (md_pseudo_table, pseudo_opcode): Likewise. + * config/tc-m68hc11.c (md_pseudo_table): Likewise. + * config/tc-mcore.c (md_pseudo_table): Likewise. + * config/tc-mips.c (mips_pseudo_table): Likewise. + * config/tc-spu.c (md_pseudo_table): Likewise. + * config/tc-s390.c (md_pseudo_table): Likewise. Replace '2' by '1'. + * doc/as.texinfo (ABORT): Fix identing. + (String): Document new string8, string16, string32, string64 functions. + * testsuite/gas/all/gas.exp: Include new test "strings" + * testsuite/gas/all/string.s, testsuite/gas/all/string.d: New. + 2006-11-16 Mei ligang <ligang@sunnorth.com.cn> * config/tc-score.c (score_relax_frag): If next frag contains 32 bit branch Index: read.c =================================================================== RCS file: /cvs/src/src/gas/read.c,v retrieving revision 1.121 diff -u -p -r1.121 read.c --- read.c 29 Aug 2006 15:19:43 -0000 1.121 +++ read.c 21 Nov 2006 22:59:33 -0000 @@ -266,8 +266,8 @@ static const pseudo_typeS potable[] = { {"abort", s_abort, 0}, {"align", s_align_ptwo, 0}, {"altmacro", s_altmacro, 1}, - {"ascii", stringer, 0}, - {"asciz", stringer, 1}, + {"ascii", stringer, 8+0}, + {"asciz", stringer, 8+1}, {"balign", s_align_bytes, 0}, {"balignw", s_align_bytes, -2}, {"balignl", s_align_bytes, -4}, @@ -407,7 +407,11 @@ static const pseudo_typeS potable[] = { {"stabd", s_stab, 'd'}, {"stabn", s_stab, 'n'}, {"stabs", s_stab, 's'}, - {"string", stringer, 1}, + {"string", stringer, 8+1}, + {"string8", stringer, 8+1}, + {"string16", stringer, 16+1}, + {"string32", stringer, 32+1}, + {"string64", stringer, 64+1}, {"struct", s_struct, 0}, /* tag */ {"text", s_text, 0}, @@ -4654,6 +4658,36 @@ s_leb128 (int sign) input_line_pointer--; demand_empty_rest_of_line (); } + +static void stringer_append_char( int c, int bitsize ) +{ + if (!target_big_endian) + FRAG_APPEND_1_CHAR(c); + switch (bitsize) { + case 64: + FRAG_APPEND_1_CHAR(0); + FRAG_APPEND_1_CHAR(0); + FRAG_APPEND_1_CHAR(0); + FRAG_APPEND_1_CHAR(0); + /* Fall through */ + case 32: + FRAG_APPEND_1_CHAR(0); + FRAG_APPEND_1_CHAR(0); + /* Fall through */ + case 16: + FRAG_APPEND_1_CHAR(0); + /* Fall through */ + case 8: + break; + default: + /* Called with invalid bitsize argument. */ + abort(); + break; + } + if (target_big_endian) + FRAG_APPEND_1_CHAR(c); +} + /* We read 0 or more ',' separated, double-quoted strings. Caller should have checked need_pass_2 is FALSE because we don't @@ -4662,8 +4696,12 @@ s_leb128 (int sign) void stringer (/* Worker to do .ascii etc statements. */ /* Checks end-of-line. */ - register int append_zero /* 0: don't append '\0', else 1. */) + int bits_appendzero ) + /* bits_appendzero: bit 0 = 0: don't append '\0', else 1. */ + /* Upper bits in bits_appendzero define target char bitsize */ { + const int bitsize = bits_appendzero & ~7; + const int append_zero = bits_appendzero & 1; register unsigned int c; char *start; @@ -4704,11 +4742,11 @@ stringer (/* Worker to do .ascii etc sta start = input_line_pointer; while (is_a_char (c = next_char_of_string ())) { - FRAG_APPEND_1_CHAR (c); + stringer_append_char (c, bitsize); } if (append_zero) { - FRAG_APPEND_1_CHAR (0); + stringer_append_char (0, bitsize); } know (input_line_pointer[-1] == '\"'); @@ -4736,7 +4774,7 @@ stringer (/* Worker to do .ascii etc sta case '<': input_line_pointer++; c = get_single_number (); - FRAG_APPEND_1_CHAR (c); + stringer_append_char (c, bitsize); if (*input_line_pointer != '>') { as_bad (_("expected <nn>")); Index: config/obj-coff.c =================================================================== RCS file: /cvs/src/src/gas/config/obj-coff.c,v retrieving revision 1.91 diff -u -p -r1.91 obj-coff.c --- config/obj-coff.c 23 Apr 2006 22:12:43 -0000 1.91 +++ config/obj-coff.c 21 Nov 2006 22:59:33 -0000 @@ -497,7 +497,7 @@ obj_coff_ident (int ignore ATTRIBUTE_UNU subseg_new (".comment", 0); #endif - stringer (1); + stringer (8+1); subseg_set (current_seg, current_subseg); } Index: config/obj-elf.c =================================================================== RCS file: /cvs/src/src/gas/config/obj-elf.c,v retrieving revision 1.98 diff -u -p -r1.98 obj-elf.c --- config/obj-elf.c 10 Nov 2006 07:47:14 -0000 1.98 +++ config/obj-elf.c 21 Nov 2006 22:59:33 -0000 @@ -1613,7 +1613,7 @@ obj_elf_ident (int ignore ATTRIBUTE_UNUS } else subseg_set (comment_section, 0); - stringer (1); + stringer (8+1); subseg_set (old_section, old_subsection); } Index: config/tc-alpha.c =================================================================== RCS file: /cvs/src/src/gas/config/tc-alpha.c,v retrieving revision 1.71 diff -u -p -r1.71 tc-alpha.c --- config/tc-alpha.c 16 Nov 2005 01:49:48 -0000 1.71 +++ config/tc-alpha.c 21 Nov 2006 22:59:34 -0000 @@ -4527,7 +4527,7 @@ s_alpha_stringer (int terminate) { alpha_current_align = 0; alpha_insn_label = NULL; - stringer (terminate); + stringer (8+terminate); } /* Hook the normal space processing to reset known alignment. */ Index: config/tc-dlx.c =================================================================== RCS file: /cvs/src/src/gas/config/tc-dlx.c,v retrieving revision 1.15 diff -u -p -r1.15 tc-dlx.c --- config/tc-dlx.c 7 Jun 2005 17:54:16 -0000 1.15 +++ config/tc-dlx.c 21 Nov 2006 22:59:34 -0000 @@ -1276,7 +1276,7 @@ const pseudo_typeS dlx_pseudo_table[] = { /* Some additional ops that are used by gcc-dlx. */ - {"asciiz", stringer, 1}, + {"asciiz", stringer, 8+1}, {"half", cons, 2}, {"dword", cons, 8}, {"word", cons, 4}, Index: config/tc-hppa.c =================================================================== RCS file: /cvs/src/src/gas/config/tc-hppa.c,v retrieving revision 1.133 diff -u -p -r1.133 tc-hppa.c --- config/tc-hppa.c 30 Oct 2006 01:09:18 -0000 1.133 +++ config/tc-hppa.c 21 Nov 2006 22:59:35 -0000 @@ -8150,7 +8150,7 @@ pa_stringer (int append_zero) } } } - stringer (append_zero); + stringer (8+append_zero); pa_undefine_label (); } Index: config/tc-ia64.c =================================================================== RCS file: /cvs/src/src/gas/config/tc-ia64.c,v retrieving revision 1.189 diff -u -p -r1.189 tc-ia64.c --- config/tc-ia64.c 2 May 2006 13:34:25 -0000 1.189 +++ config/tc-ia64.c 21 Nov 2006 22:59:36 -0000 @@ -5530,8 +5530,8 @@ const pseudo_typeS md_pseudo_table[] = { "xreal8", dot_xfloat_cons, 'd' }, { "xreal10", dot_xfloat_cons, 'x' }, { "xreal16", dot_xfloat_cons, 'X' }, - { "xstring", dot_xstringer, 0 }, - { "xstringz", dot_xstringer, 1 }, + { "xstring", dot_xstringer, 8+0 }, + { "xstringz", dot_xstringer, 8+1 }, /* unaligned versions: */ { "xdata2.ua", dot_xdata_ua, 2 }, @@ -5588,8 +5588,8 @@ pseudo_opcode[] = { "real8", stmt_float_cons, 'd' }, { "real10", stmt_float_cons, 'x' }, { "real16", stmt_float_cons, 'X' }, - { "string", stringer, 0 }, - { "stringz", stringer, 1 }, + { "string", stringer, 8+0 }, + { "stringz", stringer, 8+1 }, /* unaligned versions: */ { "data2.ua", stmt_cons_ua, 2 }, Index: config/tc-m68hc11.c =================================================================== RCS file: /cvs/src/src/gas/config/tc-m68hc11.c,v retrieving revision 1.50 diff -u -p -r1.50 tc-m68hc11.c --- config/tc-m68hc11.c 23 Oct 2006 03:23:49 -0000 1.50 +++ config/tc-m68hc11.c 21 Nov 2006 22:59:36 -0000 @@ -263,7 +263,7 @@ const pseudo_typeS md_pseudo_table[] = { /* The following pseudo-ops are supported for MRI compatibility. */ {"fcb", cons, 1}, {"fdb", cons, 2}, - {"fcc", stringer, 1}, + {"fcc", stringer, 8+1}, {"rmb", s_space, 0}, /* Motorola ALIS. */ Index: config/tc-mcore.c =================================================================== RCS file: /cvs/src/src/gas/config/tc-mcore.c,v retrieving revision 1.41 diff -u -p -r1.41 tc-mcore.c --- config/tc-mcore.c 7 Jun 2006 11:27:57 -0000 1.41 +++ config/tc-mcore.c 21 Nov 2006 22:59:37 -0000 @@ -411,8 +411,8 @@ const pseudo_typeS md_pseudo_table[] = occupy can be taken into account when deciding whether or not to dump the current literal pool. XXX - currently we do not cope with the .space and .dcb.d directives. */ - { "ascii", mcore_stringer, 0 }, - { "asciz", mcore_stringer, 1 }, + { "ascii", mcore_stringer, 8+0 }, + { "asciz", mcore_stringer, 8+1 }, { "byte", mcore_cons, 1 }, { "dc", mcore_cons, 2 }, { "dc.b", mcore_cons, 1 }, @@ -430,7 +430,7 @@ const pseudo_typeS md_pseudo_table[] = { "quad", mcore_cons, 8 }, { "short", mcore_cons, 2 }, { "single", mcore_float_cons, 'f'}, - { "string", mcore_stringer, 1 }, + { "string", mcore_stringer, 8+1 }, { "word", mcore_cons, 2 }, { "fill", mcore_fill, 0 }, Index: config/tc-mips.c =================================================================== RCS file: /cvs/src/src/gas/config/tc-mips.c,v retrieving revision 1.361 diff -u -p -r1.361 tc-mips.c --- config/tc-mips.c 9 Nov 2006 13:04:39 -0000 1.361 +++ config/tc-mips.c 21 Nov 2006 22:59:38 -0000 @@ -1096,7 +1096,7 @@ static const pseudo_typeS mips_pseudo_ta /* Relatively generic pseudo-ops that happen to be used on MIPS chips. */ - {"asciiz", stringer, 1}, + {"asciiz", stringer, 8+1}, {"bss", s_change_sec, 'b'}, {"err", s_err, 0}, {"half", s_cons, 1}, Index: config/tc-s390.c =================================================================== RCS file: /cvs/src/src/gas/config/tc-s390.c,v retrieving revision 1.49 diff -u -p -r1.49 tc-s390.c --- config/tc-s390.c 7 Jun 2006 11:27:58 -0000 1.49 +++ config/tc-s390.c 21 Nov 2006 22:59:39 -0000 @@ -95,7 +95,7 @@ const pseudo_typeS md_pseudo_table[] = { "long", s390_elf_cons, 4 }, { "quad", s390_elf_cons, 8 }, { "ltorg", s390_literals, 0 }, - { "string", stringer, 2 }, + { "string", stringer, 8+1 }, { NULL, NULL, 0 } }; Index: config/tc-spu.c =================================================================== RCS file: /cvs/src/src/gas/config/tc-spu.c,v retrieving revision 1.2 diff -u -p -r1.2 tc-spu.c --- config/tc-spu.c 29 Oct 2006 18:18:34 -0000 1.2 +++ config/tc-spu.c 21 Nov 2006 22:59:39 -0000 @@ -89,7 +89,7 @@ const pseudo_typeS md_pseudo_table[] = {"global", s_globl, 0}, {"half", cons, 2}, {"bss", s_lcomm_bytes, 1}, - {"string", stringer, 1}, + {"string", stringer, 8+1}, {"word", cons, 4}, /* Force set to be treated as an instruction. */ {"set", NULL, 0}, Index: doc/as.texinfo =================================================================== RCS file: /cvs/src/src/gas/doc/as.texinfo,v retrieving revision 1.155 diff -u -p -r1.155 as.texinfo --- doc/as.texinfo 3 Nov 2006 07:29:37 -0000 1.155 +++ doc/as.texinfo 21 Nov 2006 22:59:40 -0000 @@ -3759,7 +3759,7 @@ Some machine configurations provide addi @menu * Abort:: @code{.abort} @ifset COFF -* ABORT (COFF):: @code{.ABORT} +* ABORT (COFF):: @code{.ABORT} @end ifset * Align:: @code{.align @var{abs-expr} , @var{abs-expr}} @@ -3890,7 +3890,7 @@ Some machine configurations provide addi * Stab:: @code{.stabd, .stabn, .stabs} @end ifset -* String:: @code{.string "@var{str}"} +* String:: @code{.string | .string8 | .string16 | .string32 | .string64 "@var{str}"} * Struct:: @code{.struct @var{expression}} @ifset ELF * SubSection:: @code{.subsection} @@ -5873,16 +5873,38 @@ All five fields are specified. @c end have-stabs @node String -@section @code{.string} "@var{str}" +@section @code{.string | .string8 | .string16 | .string32 | .string64 "@var{str}"} @cindex string, copying to object file +@cindex string8, copying to object file +@cindex string16, copying to object file +@cindex string32, copying to object file +@cindex string64, copying to object file @cindex @code{string} directive +@cindex @code{string8} directive +@cindex @code{string16} directive +@cindex @code{string32} directive +@cindex @code{string64} directive Copy the characters in @var{str} to the object file. You may specify more than one string to copy, separated by commas. Unless otherwise specified for a particular machine, the assembler marks the end of each string with a 0 byte. You can use any of the escape sequences described in @ref{Strings,,Strings}. +The variants @code{string16}, @code{string32} and @code{string64} differ from +the original @code{string} Pseudo Opcode in that way, that each (8 bit) character +from the @var{STR} string is copied and expanded to 16, 32 or 64bit respectively. +Each 16, 32 or 64bit value will then be copied in target endianess byte order +to the object file. + +Example: +@smallexample + .string32 "BYE" +expands to: + .string "B\0\0\0Y\0\0\0E\0\0\0" /* on little endian targets */ + .string "\0\0\0B\0\0\0Y\0\0\0E" /* on big endian targets */ +@end smallexample + @node Struct @section @code{.struct @var{expression}} Index: testsuite/gas/all/gas.exp =================================================================== RCS file: /cvs/src/src/gas/testsuite/gas/all/gas.exp,v retrieving revision 1.41 diff -u -p -r1.41 gas.exp --- testsuite/gas/all/gas.exp 20 Sep 2006 11:35:11 -0000 1.41 +++ testsuite/gas/all/gas.exp 21 Nov 2006 22:59:40 -0000 @@ -281,6 +281,8 @@ gas_test_error "weakref2.s" "" "e: would gas_test_error "weakref3.s" "" "a: would close weakref loop: a => b => c => d => e => a" gas_test_error "weakref4.s" "" "is already defined" +run_dump_test string + load_lib gas-dg.exp dg-init dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/err-*.s $srcdir/$subdir/warn-*.s]] "" "" --- ./testsuite/gas/all/string.d.org 2006-11-21 23:54:18.000000000 +0100 +++ ./testsuite/gas/all/string.d 2006-11-21 23:53:32.000000000 +0100 @@ -0,0 +1,13 @@ +#objdump : -s -j .data -j "\$DATA\$" +#name : .strings tests + +.*: .* + +Contents of section (\.data|\$DATA\$): + 0000 73747238 00000000 00000000 00000000 str8.* + 0010 7374726e 65773800 00000000 00000000 strnew8.* + 0020 (73007400 72003100 36000000 00000000|00730074 00720031 00360000 00000000).* + 0030 (33000000 32000000 00000000 00000000|00000033 00000032 00000000 00000000).* + 0040 (36000000 00000000 34000000 00000000|00000000 00000036 00000000 00000034).* +#pass + --- ./testsuite/gas/all/string.s.org 2006-11-21 23:54:21.000000000 +0100 +++ ./testsuite/gas/all/string.s 2006-11-21 23:01:41.000000000 +0100 @@ -0,0 +1,14 @@ + .data + .string "str8" + + .align 16 + .string8 "strnew8" + + .align 16 + .string16 "str16" + + .align 16 + .string32 "32" + + .align 16 + .string64 "64"
- Previous message (by thread): New keywords (string32) for GNU as ?
- Next message (by thread): New keywords (string32) for GNU as ?
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Binutils mailing list