diff options
author | Roland McGrath <roland@gnu.org> | 2012-05-29 16:32:11 +0000 |
---|---|---|
committer | Roland McGrath <roland@gnu.org> | 2012-05-29 16:32:11 +0000 |
commit | d416e51da0f5e79c66f1d609068e83fff4add35a (patch) | |
tree | 99554506bbc79f81aa1a8eeed32237f98579886e /gas | |
parent | acf89cab13c1826d83dce1c7ae8ea805bc034bda (diff) | |
download | binutils-d416e51da0f5e79c66f1d609068e83fff4add35a.zip binutils-d416e51da0f5e79c66f1d609068e83fff4add35a.tar.gz binutils-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.
Diffstat (limited to 'gas')
-rw-r--r-- | gas/ChangeLog | 7 | ||||
-rw-r--r-- | gas/doc/as.texinfo | 9 | ||||
-rw-r--r-- | gas/read.c | 19 | ||||
-rw-r--r-- | gas/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/bundle-bad.l | 3 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/bundle-bad.s | 7 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/bundle-lock.d | 6 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/bundle-lock.s | 10 |
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}} @@ -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 |