From bea2c1d72cc5e0dd740ff59acbc90e643120eb88 Mon Sep 17 00:00:00 2001 From: Kai Tietz Date: Wed, 15 Sep 2010 19:48:52 +0000 Subject: [PATCH] ChangeLog gas 2010-09-15 Kai Tietz * config/obj-coff-seh.c (seh_validate_seg): New funtion. (obj_coff_seh_endproc): Add check for segment. (obj_coff_seh_endprologue): Likewise. (obj_coff_seh_pushreg): Likewise. (obj_coff_seh_pushframe): Likewise. (obj_coff_seh_save): Likewise. (obj_coff_seh_setframe): Likewise. ChangeLog gas/testsuite 2010-09-15 Kai Tietz * gas/pe/pe.exp: Add new test. * gas/pe/seh-x64-err-1.l: New. * gas/pe/seh-x64-err-1.s: New. --- gas/ChangeLog | 14 ++++++++++--- gas/config/obj-coff-seh.c | 35 ++++++++++++++++++++++++------- gas/testsuite/ChangeLog | 14 ++++++++----- gas/testsuite/gas/pe/pe.exp | 2 +- gas/testsuite/gas/pe/seh-x64-err-1.l | 24 ++++++++++++++++++++++ gas/testsuite/gas/pe/seh-x64-err-1.s | 40 ++++++++++++++++++++++++++++++++++++ 6 files changed, 113 insertions(+), 16 deletions(-) create mode 100644 gas/testsuite/gas/pe/seh-x64-err-1.l create mode 100644 gas/testsuite/gas/pe/seh-x64-err-1.s diff --git a/gas/ChangeLog b/gas/ChangeLog index 6f5aa0c..f230efc 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,8 +1,16 @@ 2010-09-15 Kai Tietz - * config/obj-coff-seh.h (seh_context): New member code_seg. - * config/obj-coff-seh.c: Implementing xdata/pdata section cloning - for link-once code-segment. + * config/obj-coff-seh.c (seh_validate_seg): New funtion. + (obj_coff_seh_endproc): Add check for segment. + (obj_coff_seh_endprologue): Likewise. + (obj_coff_seh_pushreg): Likewise. + (obj_coff_seh_pushframe): Likewise. + (obj_coff_seh_save): Likewise. + (obj_coff_seh_setframe): Likewise. + + * config/obj-coff-seh.h (seh_context): New member code_seg. + * config/obj-coff-seh.c: Implementing xdata/pdata section cloning + for link-once code-segment. 2010-09-14 Jie Zhang diff --git a/gas/config/obj-coff-seh.c b/gas/config/obj-coff-seh.c index 6c3fe7c..83e8cb6 100644 --- a/gas/config/obj-coff-seh.c +++ b/gas/config/obj-coff-seh.c @@ -155,6 +155,21 @@ seh_hash_find_or_make (segT cseg, const char *base_name) return item; } +/* Check if current segment has same name. */ +static int +seh_validate_seg (const char *directive) +{ + const char *cseg_name, *nseg_name; + if (seh_ctx_cur->code_seg == now_seg) + return 1; + cseg_name = bfd_get_section_name (stdoutput, seh_ctx_cur->code_seg); + nseg_name = bfd_get_section_name (stdoutput, now_seg); + as_bad (_("%s used in segment '%s' instead of expected '%s'"), + directive, nseg_name, cseg_name); + ignore_rest_of_line (); + return 0; +} + static void switch_xdata (int subseg, segT code_seg) { @@ -395,7 +410,7 @@ obj_coff_seh_endproc (int what ATTRIBUTE_UNUSED) as_bad (_(".seh_endproc used without .seh_proc")); return; } - + seh_validate_seg (".seh_endproc"); do_seh_endproc (); } @@ -448,7 +463,8 @@ obj_coff_seh_proc (int what ATTRIBUTE_UNUSED) static void obj_coff_seh_endprologue (int what ATTRIBUTE_UNUSED) { - if (!verify_context (".seh_endprologue")) + if (!verify_context (".seh_endprologue") + || !seh_validate_seg (".seh_endprologue")) return; demand_empty_rest_of_line (); @@ -553,7 +569,8 @@ obj_coff_seh_pushreg (int what ATTRIBUTE_UNUSED) { int reg; - if (!verify_context_and_target (".seh_pushreg", seh_kind_x64)) + if (!verify_context_and_target (".seh_pushreg", seh_kind_x64) + || !seh_validate_seg (".seh_pushreg")) return; reg = seh_x64_read_reg (".seh_pushreg", 1); @@ -570,7 +587,8 @@ obj_coff_seh_pushreg (int what ATTRIBUTE_UNUSED) static void obj_coff_seh_pushframe (int what ATTRIBUTE_UNUSED) { - if (!verify_context_and_target (".seh_pushframe", seh_kind_x64)) + if (!verify_context_and_target (".seh_pushframe", seh_kind_x64) + || !seh_validate_seg (".seh_pushframe")) return; demand_empty_rest_of_line (); @@ -586,7 +604,8 @@ obj_coff_seh_save (int what) int code, reg, scale; offsetT off; - if (!verify_context_and_target (directive, seh_kind_x64)) + if (!verify_context_and_target (directive, seh_kind_x64) + || !seh_validate_seg (directive)) return; reg = seh_x64_read_reg (directive, what); @@ -631,7 +650,8 @@ obj_coff_seh_stackalloc (int what ATTRIBUTE_UNUSED) offsetT off; int code, info; - if (!verify_context_and_target (".seh_stackalloc", seh_kind_x64)) + if (!verify_context_and_target (".seh_stackalloc", seh_kind_x64) + || !seh_validate_seg (".seh_stackalloc")) return; off = get_absolute_expression (); @@ -668,7 +688,8 @@ obj_coff_seh_setframe (int what ATTRIBUTE_UNUSED) offsetT off; int reg; - if (!verify_context_and_target (".seh_setframe", seh_kind_x64)) + if (!verify_context_and_target (".seh_setframe", seh_kind_x64) + || !seh_validate_seg (".seh_setframe")) return; reg = seh_x64_read_reg (".seh_setframe", 0); diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index 126b881..a023502 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,10 +1,14 @@ 2010-09-15 Kai Tietz - * gas/pe/pe.exp: Add peseh-x64-4,5,6 tests. - * gas/pe/peseh-x64-4.s: New. - * gas/pe/peseh-x64-4.d: New. - * gas/pe/peseh-x64-5.d: New. - * gas/pe/peseh-x64-6.d: New. + * gas/pe/pe.exp: Add new test. + * gas/pe/seh-x64-err-1.l: New. + * gas/pe/seh-x64-err-1.s: New. + + * gas/pe/pe.exp: Add peseh-x64-4,5,6 tests. + * gas/pe/peseh-x64-4.s: New. + * gas/pe/peseh-x64-4.d: New. + * gas/pe/peseh-x64-5.d: New. + * gas/pe/peseh-x64-6.d: New. 2010-09-14 Maciej W. Rozycki diff --git a/gas/testsuite/gas/pe/pe.exp b/gas/testsuite/gas/pe/pe.exp index 6e6063c..d5506e9 100755 --- a/gas/testsuite/gas/pe/pe.exp +++ b/gas/testsuite/gas/pe/pe.exp @@ -40,7 +40,7 @@ run_dump_test "section-align-3" # These tests are only for x86_64 targets if ([istarget "x86_64-*-mingw*"]) then { - + run_list_test "seh-x64-err-1" "" run_dump_test "peseh-x64" run_dump_test "peseh-x64-2" run_dump_test "peseh-x64-3" diff --git a/gas/testsuite/gas/pe/seh-x64-err-1.l b/gas/testsuite/gas/pe/seh-x64-err-1.l new file mode 100644 index 0000000..cdac829 --- /dev/null +++ b/gas/testsuite/gas/pe/seh-x64-err-1.l @@ -0,0 +1,24 @@ +.*: Assembler messages: +.*:5: Error: .seh_endproc used without .seh_proc +.*:6: Error: .seh_stackalloc used outside of .seh_proc block +.*:7: Error: .seh_setframe used outside of .seh_proc block +.*:8: Error: .seh_endprologue used outside of .seh_proc block +.*:9: Error: .seh_pushreg used outside of .seh_proc block +.*:10: Error: .seh_savereg used outside of .seh_proc block +.*:11: Error: .seh_savexmm used outside of .seh_proc block +.*:12: Error: .seh_handler used outside of .seh_proc block +.*:13: Error: .seh_handler used outside of .seh_proc block +.*:14: Error: .seh_handler used outside of .seh_proc block +.*:15: Error: .seh_handler used outside of .seh_proc block +.*:16: Error: .seh_handlerdata used outside of .seh_proc block +.*:19: Error: .seh_proc requires function label name +.*:23: Warning: .seh_eh ignored for this target +.*:24: Warning: .seh_32 ignored for this target +.*:25: Warning: .seh_no32 ignored for this target +.*:33: Error: .seh_stackalloc used in segment '.data' instead of expected '.text' +.*:34: Error: .seh_setframe used in segment '.data' instead of expected '.text' +.*:35: Error: .seh_endprologue used in segment '.data' instead of expected '.text' +.*:36: Error: .seh_pushreg used in segment '.data' instead of expected '.text' +.*:37: Error: .seh_savereg used in segment '.data' instead of expected '.text' +.*:38: Error: .seh_savexmm used in segment '.data' instead of expected '.text' +.*:39: Error: .seh_endproc used in segment '.data' instead of expected '.text' diff --git a/gas/testsuite/gas/pe/seh-x64-err-1.s b/gas/testsuite/gas/pe/seh-x64-err-1.s new file mode 100644 index 0000000..c472257 --- /dev/null +++ b/gas/testsuite/gas/pe/seh-x64-err-1.s @@ -0,0 +1,40 @@ + .file "t1.c" + .text +#seh pseudos out of seh_proc block + + .seh_endproc + .seh_stackalloc 8 + .seh_setframe %rbp, 0 + .seh_endprologue + .seh_pushreg %rbp + .seh_savereg %rbp + .seh_savexmm %xmm1 + .seh_handler dummy_handler + .seh_handler dummy_handler, @unwind + .seh_handler dummy_handler, @except + .seh_handler dummy_handler, @unwind,@except + .seh_handlerdata + .long 0 + .text + .seh_proc + + .seh_proc test_foreign_directives +test_foreign_directives: + .seh_eh + .seh_32 + .seh_no32 + .long 0 + .seh_endproc + +# test for wrong segment pseudos. + .seh_proc test_wrong_segment +test_wrong_segment: + .data + .seh_stackalloc 8 + .seh_setframe %rbp, 0 + .seh_endprologue + .seh_pushreg %rbp + .seh_savereg %rbp + .seh_savexmm %xmm1 + .seh_endproc + -- 2.7.4