aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>2012-05-29 16:32:11 +0000
committerRoland McGrath <roland@gnu.org>2012-05-29 16:32:11 +0000
commitd416e51da0f5e79c66f1d609068e83fff4add35a (patch)
tree99554506bbc79f81aa1a8eeed32237f98579886e
parentacf89cab13c1826d83dce1c7ae8ea805bc034bda (diff)
downloadgdb-d416e51da0f5e79c66f1d609068e83fff4add35a.zip
gdb-d416e51da0f5e79c66f1d609068e83fff4add35a.tar.gz
gdb-d416e51da0f5e79c66f1d609068e83fff4add35a.tar.bz2
gas/
* read.c [HANDLE_BUNDLE] (bundle_lock_depth): New variable. (read_a_source_file) [HANDLE_BUNDLE]: Reset it. [HANDLE_BUNDLE] (s_bundle_lock, s_bundle_unlock): Allow nested pairs. gas/testsuite/ * gas/i386/bundle-bad.s: Remove nested .bundle_lock case. * gas/i386/bundle-bad.l: Remove expected error line. * gas/i386/bundle-lock.s: Add nested .bundle_lock case. * gas/i386/bundle-lock.d: Update expectations.
-rw-r--r--gas/ChangeLog7
-rw-r--r--gas/doc/as.texinfo9
-rw-r--r--gas/read.c19
-rw-r--r--gas/testsuite/ChangeLog7
-rw-r--r--gas/testsuite/gas/i386/bundle-bad.l3
-rw-r--r--gas/testsuite/gas/i386/bundle-bad.s7
-rw-r--r--gas/testsuite/gas/i386/bundle-lock.d6
-rw-r--r--gas/testsuite/gas/i386/bundle-lock.s10
8 files changed, 49 insertions, 19 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index a32f87c..03424ce 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,10 @@
+2012-05-29 Roland McGrath <mcgrathr@google.com>
+
+ * read.c [HANDLE_BUNDLE] (bundle_lock_depth): New variable.
+ (read_a_source_file) [HANDLE_BUNDLE]: Reset it.
+ [HANDLE_BUNDLE] (s_bundle_lock, s_bundle_unlock): Allow nested
+ pairs.
+
2012-05-28 Nick Clifton <nickc@redhat.com>
* read.c (read_symbol_name): New function. Reads a symbol names.
diff --git a/gas/doc/as.texinfo b/gas/doc/as.texinfo
index 72b5d05..5b5d268 100644
--- a/gas/doc/as.texinfo
+++ b/gas/doc/as.texinfo
@@ -4351,9 +4351,12 @@ first instruction of the sequence so that the whole sequence starts on an
aligned bundle boundary. It's an error if the sequence is longer than the
bundle size.
-Bundle-locked sequences do not nest. It's an error if two
-@code{.bundle_lock} directives appear without an intervening
-@code{.bundle_unlock} directive.
+For convenience when using @code{.bundle_lock} and @code{.bundle_unlock}
+inside assembler macros (@pxref{Macro}), bundle-locked sequences may be
+nested. That is, a second @code{.bundle_lock} directive before the next
+@code{.bundle_unlock} directive has no effect except that it must be
+matched by another closing @code{.bundle_unlock} so that there is the
+same number of @code{.bundle_lock} and @code{.bundle_unlock} directives.
@node Byte
@section @code{.byte @var{expressions}}
diff --git a/gas/read.c b/gas/read.c
index cf7f752..2b7f4ff 100644
--- a/gas/read.c
+++ b/gas/read.c
@@ -233,6 +233,10 @@ static unsigned int bundle_align_p2;
we are expecting to see .bundle_unlock. */
static fragS *bundle_lock_frag;
static frchainS *bundle_lock_frchain;
+
+/* This is incremented by .bundle_lock and decremented by .bundle_unlock,
+ to allow nesting. */
+static unsigned int bundle_lock_depth;
#endif
static void do_s_func (int end_p, const char *default_prefix);
@@ -1288,6 +1292,7 @@ read_a_source_file (char *name)
_(".bundle_lock with no matching .bundle_unlock"));
bundle_lock_frag = NULL;
bundle_lock_frchain = NULL;
+ bundle_lock_depth = 0;
}
#endif
@@ -6096,14 +6101,12 @@ s_bundle_lock (int arg ATTRIBUTE_UNUSED)
return;
}
- if (bundle_lock_frag != NULL)
+ if (bundle_lock_depth == 0)
{
- as_bad (_("second .bundle_lock without .bundle_unlock"));
- return;
+ bundle_lock_frchain = frchain_now;
+ bundle_lock_frag = start_bundle ();
}
-
- bundle_lock_frchain = frchain_now;
- bundle_lock_frag = start_bundle ();
+ ++bundle_lock_depth;
}
void
@@ -6121,6 +6124,10 @@ s_bundle_unlock (int arg ATTRIBUTE_UNUSED)
gas_assert (bundle_align_p2 > 0);
+ gas_assert (bundle_lock_depth > 0);
+ if (--bundle_lock_depth > 0)
+ return;
+
size = pending_bundle_size (bundle_lock_frag);
if (size > (1U << bundle_align_p2))
diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog
index e19086a..78bec37 100644
--- a/gas/testsuite/ChangeLog
+++ b/gas/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2012-05-29 Roland McGrath <mcgrathr@google.com>
+
+ * gas/i386/bundle-bad.s: Remove nested .bundle_lock case.
+ * gas/i386/bundle-bad.l: Remove expected error line.
+ * gas/i386/bundle-lock.s: Add nested .bundle_lock case.
+ * gas/i386/bundle-lock.d: Update expectations.
+
2012-05-28 Nick Clifton <nickc@redhat.com>
* gas/elf/syms.s: New test - checks the generation of multibyte
diff --git a/gas/testsuite/gas/i386/bundle-bad.l b/gas/testsuite/gas/i386/bundle-bad.l
index ece5d7e..dd6a793 100644
--- a/gas/testsuite/gas/i386/bundle-bad.l
+++ b/gas/testsuite/gas/i386/bundle-bad.l
@@ -7,5 +7,4 @@
[^:]*:26:.*cannot change section or subsection inside \.bundle_lock
[^:]*:31:.*cannot change \.bundle_align_mode inside \.bundle_lock
[^:]*:36:.*\.bundle_unlock without preceding \.bundle_lock
-[^:]*:41:.*second \.bundle_lock without \.bundle_unlock
-[^:]*:46:.*\.bundle_lock with no matching \.bundle_unlock
+[^:]*:39:.*\.bundle_lock with no matching \.bundle_unlock
diff --git a/gas/testsuite/gas/i386/bundle-bad.s b/gas/testsuite/gas/i386/bundle-bad.s
index 0974d30..0234ae5 100644
--- a/gas/testsuite/gas/i386/bundle-bad.s
+++ b/gas/testsuite/gas/i386/bundle-bad.s
@@ -35,13 +35,6 @@
hlt
.bundle_unlock
- # Nested .bundle_lock.
- .bundle_lock
- clc
- .bundle_lock
- cld
- .bundle_unlock
-
# End of input with dangling .bundle_lock.
.bundle_lock
hlt
diff --git a/gas/testsuite/gas/i386/bundle-lock.d b/gas/testsuite/gas/i386/bundle-lock.d
index afca500..86547e0 100644
--- a/gas/testsuite/gas/i386/bundle-lock.d
+++ b/gas/testsuite/gas/i386/bundle-lock.d
@@ -3052,5 +3052,9 @@ Disassembly of section \.text:
#...
*bde0:\s+(f4\s+hlt|f8\s+clc)\s*
#...
- *be00:\s+f4\s+hlt\s*
+ *be00:\s+f8\s+clc\s*
+ *be01:\s+fc\s+cld\s*
+ *be02:\s+f8\s+clc\s*
+#...
+ *be20:\s+f4\s+hlt\s*
#pass
diff --git a/gas/testsuite/gas/i386/bundle-lock.s b/gas/testsuite/gas/i386/bundle-lock.s
index 6fca9c8..af52e99 100644
--- a/gas/testsuite/gas/i386/bundle-lock.s
+++ b/gas/testsuite/gas/i386/bundle-lock.s
@@ -90,4 +90,14 @@ sequence_\size\()_offset_\offset\():
test_offsets 32
.p2align 5
+ # Nested .bundle_lock.
+ .bundle_lock
+ clc
+ .bundle_lock
+ cld
+ .bundle_unlock
+ clc
+ .bundle_unlock
+
+.p2align 5
hlt