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.
This commit is contained in:
parent
acf89cab13
commit
d416e51da0
8 changed files with 49 additions and 19 deletions
|
@ -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.
|
||||
|
|
|
@ -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}}
|
||||
|
|
19
gas/read.c
19
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))
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -89,5 +89,15 @@ sequence_\size\()_offset_\offset\():
|
|||
test_offsets 31
|
||||
test_offsets 32
|
||||
|
||||
.p2align 5
|
||||
# Nested .bundle_lock.
|
||||
.bundle_lock
|
||||
clc
|
||||
.bundle_lock
|
||||
cld
|
||||
.bundle_unlock
|
||||
clc
|
||||
.bundle_unlock
|
||||
|
||||
.p2align 5
|
||||
hlt
|
||||
|
|
Loading…
Reference in a new issue