aboutsummaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
authorKai Tietz <kai.tietz@onevision.com>2010-09-15 19:48:52 +0000
committerKai Tietz <kai.tietz@onevision.com>2010-09-15 19:48:52 +0000
commitbea2c1d72cc5e0dd740ff59acbc90e643120eb88 (patch)
treecb3c5e3b37a1a875faf97662a0f599096bed827a /gas
parent2d7f4929019d785e2f3a91f8e655e55e67b2e161 (diff)
downloadfsf-binutils-gdb-bea2c1d72cc5e0dd740ff59acbc90e643120eb88.zip
fsf-binutils-gdb-bea2c1d72cc5e0dd740ff59acbc90e643120eb88.tar.gz
fsf-binutils-gdb-bea2c1d72cc5e0dd740ff59acbc90e643120eb88.tar.bz2
ChangeLog gas
2010-09-15 Kai Tietz <kai.tietz@onevision.com> * 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 <kai.tietz@onevision.com> * gas/pe/pe.exp: Add new test. * gas/pe/seh-x64-err-1.l: New. * gas/pe/seh-x64-err-1.s: New.
Diffstat (limited to 'gas')
-rw-r--r--gas/ChangeLog14
-rw-r--r--gas/config/obj-coff-seh.c35
-rw-r--r--gas/testsuite/ChangeLog14
-rwxr-xr-xgas/testsuite/gas/pe/pe.exp2
-rw-r--r--gas/testsuite/gas/pe/seh-x64-err-1.l24
-rw-r--r--gas/testsuite/gas/pe/seh-x64-err-1.s40
6 files changed, 113 insertions, 16 deletions
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 <kai.tietz@onevision.com>
- * 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 <jie@codesourcery.com>
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 <kai.tietz@onevision.com>
- * 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 <macro@codesourcery.com>
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
+