mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-28 15:18:37 +08:00
gas/
2005-02-13 Jan Beulich <jbeulich@novell.com> * config/tc-ia64.c (dot_rot): Add comment that name strings should be freed when wiping out previous state. Canonicalize names before use. Free name string when detecting redefinition. (dot_pred_rel): Call generic expression parser to process arguments. Handle O_register case for individual predicates and O_subtract for ranges. (ia64_parse_name): Canonicalize name before looking it up in dynamic register hash. (ia64_canonicalize_symbol_name): Strip off all trailing # characters. Warn if multiple found, issue error if resulting symbol name has zero length. (dot_alias): Canonicalize name before use. gas/testsuite/ 2005-02-13 Jan Beulich <jbeulich@novell.com> * gas/ia64/pound.[ls]: New. * gas/ia64/ia64.exp: Run new test.
This commit is contained in:
@ -1,3 +1,18 @@
|
|||||||
|
2005-02-13 Jan Beulich <jbeulich@novell.com>
|
||||||
|
|
||||||
|
* config/tc-ia64.c (dot_rot): Add comment that name strings should
|
||||||
|
be freed when wiping out previous state. Canonicalize names before
|
||||||
|
use. Free name string when detecting redefinition.
|
||||||
|
(dot_pred_rel): Call generic expression parser to process arguments.
|
||||||
|
Handle O_register case for individual predicates and O_subtract for
|
||||||
|
ranges.
|
||||||
|
(ia64_parse_name): Canonicalize name before looking it up in dynamic
|
||||||
|
register hash.
|
||||||
|
(ia64_canonicalize_symbol_name): Strip off all trailing # characters.
|
||||||
|
Warn if multiple found, issue error if resulting symbol name has zero
|
||||||
|
length.
|
||||||
|
(dot_alias): Canonicalize name before use.
|
||||||
|
|
||||||
2005-02-11 H.J. Lu <hongjiu.lu@intel.com>
|
2005-02-11 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
* config/tc-ia64.c (unwind_diagnostic): Return -1 for warning
|
* config/tc-ia64.c (unwind_diagnostic): Return -1 for warning
|
||||||
|
@ -4560,6 +4560,7 @@ dot_rot (type)
|
|||||||
for (dr = md.dynreg[type]; dr && dr->num_regs; dr = dr->next)
|
for (dr = md.dynreg[type]; dr && dr->num_regs; dr = dr->next)
|
||||||
{
|
{
|
||||||
hash_delete (md.dynreg_hash, dr->name);
|
hash_delete (md.dynreg_hash, dr->name);
|
||||||
|
/* FIXME: Free dr->name. */
|
||||||
dr->num_regs = 0;
|
dr->num_regs = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4568,8 +4569,8 @@ dot_rot (type)
|
|||||||
{
|
{
|
||||||
start = input_line_pointer;
|
start = input_line_pointer;
|
||||||
ch = get_symbol_end ();
|
ch = get_symbol_end ();
|
||||||
|
len = strlen (ia64_canonicalize_symbol_name (start));
|
||||||
*input_line_pointer = ch;
|
*input_line_pointer = ch;
|
||||||
len = (input_line_pointer - start);
|
|
||||||
|
|
||||||
SKIP_WHITESPACE ();
|
SKIP_WHITESPACE ();
|
||||||
if (*input_line_pointer != '[')
|
if (*input_line_pointer != '[')
|
||||||
@ -4618,16 +4619,16 @@ dot_rot (type)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
name = obstack_alloc (¬es, len + 1);
|
|
||||||
memcpy (name, start, len);
|
|
||||||
name[len] = '\0';
|
|
||||||
|
|
||||||
if (!*drpp)
|
if (!*drpp)
|
||||||
{
|
{
|
||||||
*drpp = obstack_alloc (¬es, sizeof (*dr));
|
*drpp = obstack_alloc (¬es, sizeof (*dr));
|
||||||
memset (*drpp, 0, sizeof (*dr));
|
memset (*drpp, 0, sizeof (*dr));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
name = obstack_alloc (¬es, len + 1);
|
||||||
|
memcpy (name, start, len);
|
||||||
|
name[len] = '\0';
|
||||||
|
|
||||||
dr = *drpp;
|
dr = *drpp;
|
||||||
dr->name = name;
|
dr->name = name;
|
||||||
dr->num_regs = num_regs;
|
dr->num_regs = num_regs;
|
||||||
@ -4638,6 +4639,7 @@ dot_rot (type)
|
|||||||
if (hash_insert (md.dynreg_hash, name, dr))
|
if (hash_insert (md.dynreg_hash, name, dr))
|
||||||
{
|
{
|
||||||
as_bad ("Attempt to redefine register set `%s'", name);
|
as_bad ("Attempt to redefine register set `%s'", name);
|
||||||
|
obstack_free (¬es, name);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5060,59 +5062,57 @@ dot_pred_rel (type)
|
|||||||
SKIP_WHITESPACE ();
|
SKIP_WHITESPACE ();
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
valueT bit = 1;
|
valueT bits = 1;
|
||||||
int regno;
|
int regno;
|
||||||
|
expressionS pr, *pr1, *pr2;
|
||||||
|
|
||||||
if (TOUPPER (*input_line_pointer) != 'P'
|
expression (&pr);
|
||||||
|| (regno = atoi (++input_line_pointer)) < 0
|
if (pr.X_op == O_register
|
||||||
|| regno > 63)
|
&& pr.X_add_number >= REG_P
|
||||||
|
&& pr.X_add_number <= REG_P + 63)
|
||||||
{
|
{
|
||||||
as_bad (_("Predicate register expected"));
|
regno = pr.X_add_number - REG_P;
|
||||||
ignore_rest_of_line ();
|
bits <<= regno;
|
||||||
return;
|
count++;
|
||||||
|
if (p1 == -1)
|
||||||
|
p1 = regno;
|
||||||
|
else if (p2 == -1)
|
||||||
|
p2 = regno;
|
||||||
}
|
}
|
||||||
while (ISDIGIT (*input_line_pointer))
|
else if (type != 'i'
|
||||||
++input_line_pointer;
|
&& pr.X_op == O_subtract
|
||||||
if (p1 == -1)
|
&& (pr1 = symbol_get_value_expression (pr.X_add_symbol))
|
||||||
p1 = regno;
|
&& pr1->X_op == O_register
|
||||||
else if (p2 == -1)
|
&& pr1->X_add_number >= REG_P
|
||||||
p2 = regno;
|
&& pr1->X_add_number <= REG_P + 63
|
||||||
bit <<= regno;
|
&& (pr2 = symbol_get_value_expression (pr.X_op_symbol))
|
||||||
if (mask & bit)
|
&& pr2->X_op == O_register
|
||||||
as_warn (_("Duplicate predicate register ignored"));
|
&& pr2->X_add_number >= REG_P
|
||||||
mask |= bit;
|
&& pr2->X_add_number <= REG_P + 63)
|
||||||
count++;
|
|
||||||
/* See if it's a range. */
|
|
||||||
if (*input_line_pointer == '-')
|
|
||||||
{
|
{
|
||||||
valueT stop = 1;
|
/* It's a range. */
|
||||||
++input_line_pointer;
|
int stop;
|
||||||
|
|
||||||
if (TOUPPER (*input_line_pointer) != 'P'
|
regno = pr1->X_add_number - REG_P;
|
||||||
|| (regno = atoi (++input_line_pointer)) < 0
|
stop = pr2->X_add_number - REG_P;
|
||||||
|| regno > 63)
|
if (regno >= stop)
|
||||||
{
|
|
||||||
as_bad (_("Predicate register expected"));
|
|
||||||
ignore_rest_of_line ();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
while (ISDIGIT (*input_line_pointer))
|
|
||||||
++input_line_pointer;
|
|
||||||
stop <<= regno;
|
|
||||||
if (bit >= stop)
|
|
||||||
{
|
{
|
||||||
as_bad (_("Bad register range"));
|
as_bad (_("Bad register range"));
|
||||||
ignore_rest_of_line ();
|
ignore_rest_of_line ();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
while (bit < stop)
|
bits = ((bits << stop) << 1) - (bits << regno);
|
||||||
{
|
count += stop - regno + 1;
|
||||||
bit <<= 1;
|
|
||||||
mask |= bit;
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
SKIP_WHITESPACE ();
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
as_bad (_("Predicate register expected"));
|
||||||
|
ignore_rest_of_line ();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (mask & bits)
|
||||||
|
as_warn (_("Duplicate predicate register ignored"));
|
||||||
|
mask |= bits;
|
||||||
if (*input_line_pointer != ',')
|
if (*input_line_pointer != ',')
|
||||||
break;
|
break;
|
||||||
++input_line_pointer;
|
++input_line_pointer;
|
||||||
@ -7728,6 +7728,9 @@ ia64_parse_name (name, e, nextcharP)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
end = alloca (strlen (name) + 1);
|
||||||
|
strcpy (end, name);
|
||||||
|
name = ia64_canonicalize_symbol_name (end);
|
||||||
if ((dr = hash_find (md.dynreg_hash, name)))
|
if ((dr = hash_find (md.dynreg_hash, name)))
|
||||||
{
|
{
|
||||||
/* We've got ourselves the name of a rotating register set.
|
/* We've got ourselves the name of a rotating register set.
|
||||||
@ -7747,9 +7750,20 @@ char *
|
|||||||
ia64_canonicalize_symbol_name (name)
|
ia64_canonicalize_symbol_name (name)
|
||||||
char *name;
|
char *name;
|
||||||
{
|
{
|
||||||
size_t len = strlen (name);
|
size_t len = strlen (name), full = len;
|
||||||
if (len > 1 && name[len - 1] == '#')
|
|
||||||
name[len - 1] = '\0';
|
while (len > 0 && name[len - 1] == '#')
|
||||||
|
--len;
|
||||||
|
if (len <= 0)
|
||||||
|
{
|
||||||
|
if (full > 0)
|
||||||
|
as_bad ("Standalone `#' is illegal");
|
||||||
|
else
|
||||||
|
as_bad ("Zero-length symbol is illegal");
|
||||||
|
}
|
||||||
|
else if (len < full - 1)
|
||||||
|
as_warn ("Redundant `#' suffix operators");
|
||||||
|
name[len] = '\0';
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -11318,6 +11332,7 @@ dot_alias (int section)
|
|||||||
|
|
||||||
input_line_pointer++;
|
input_line_pointer++;
|
||||||
*end_name = 0;
|
*end_name = 0;
|
||||||
|
ia64_canonicalize_symbol_name (name);
|
||||||
|
|
||||||
/* We call demand_copy_C_string to check if alias string is valid.
|
/* We call demand_copy_C_string to check if alias string is valid.
|
||||||
There should be a closing `"' and no `\0' in the string. */
|
There should be a closing `"' and no `\0' in the string. */
|
||||||
|
@ -1,3 +1,8 @@
|
|||||||
|
2005-02-13 Jan Beulich <jbeulich@novell.com>
|
||||||
|
|
||||||
|
* gas/ia64/pound.[ls]: New.
|
||||||
|
* gas/ia64/ia64.exp: Run new test.
|
||||||
|
|
||||||
2005-02-13 H.J. Lu <hongjiu.lu@intel.com>
|
2005-02-13 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
* gas/ia64/ia64.exp: Add "operand-or".
|
* gas/ia64/ia64.exp: Add "operand-or".
|
||||||
|
@ -67,6 +67,7 @@ if [istarget "ia64-*"] then {
|
|||||||
run_dump_test "bundling"
|
run_dump_test "bundling"
|
||||||
run_list_test "label" ""
|
run_list_test "label" ""
|
||||||
run_list_test "last" ""
|
run_list_test "last" ""
|
||||||
|
run_list_test "pound" "-al"
|
||||||
run_list_test "proc" "-munwind-check=error"
|
run_list_test "proc" "-munwind-check=error"
|
||||||
run_list_test "slot2" ""
|
run_list_test "slot2" ""
|
||||||
run_list_test "unwind-err" "-munwind-check=error"
|
run_list_test "unwind-err" "-munwind-check=error"
|
||||||
|
58
gas/testsuite/gas/ia64/pound.l
Normal file
58
gas/testsuite/gas/ia64/pound.l
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
.*: Assembler messages:
|
||||||
|
.*:35: Warning: .* WAW .*
|
||||||
|
#...
|
||||||
|
.*:41: Error: symbol .esym. .* .efunction.
|
||||||
|
.*:43: Error: section .\.extra. .* .esection.
|
||||||
|
GAS LISTING .*
|
||||||
|
#...
|
||||||
|
[[:space:]]*[[:digit:]]+[[:space:]]+\.explicit
|
||||||
|
[[:space:]]*[[:digit:]]+[[:space:]]+
|
||||||
|
[[:space:]]*[[:digit:]]+[[:space:]]+\.global esym#
|
||||||
|
[[:space:]]*[[:digit:]]+[[:space:]]+
|
||||||
|
[[:space:]]*[[:digit:]]+[[:space:]]+\.section \.extra#, "a", @progbits
|
||||||
|
[[:space:]]*[[:digit:]]+[[:space:]]+
|
||||||
|
[[:space:]]*[[:digit:]]+[[:space:]]+\.text
|
||||||
|
[[:space:]]*[[:digit:]]+[[:space:]]+
|
||||||
|
[[:space:]]*[[:digit:]]+[[:space:]]+ break 0
|
||||||
|
[[:space:]]*[[:digit:]]+[[:space:]]+
|
||||||
|
[[:space:]]*[[:digit:]]+[[:space:]]+\?*[[:space:]]+[[:xdigit:]]+[[:space:]]+\.proc psym
|
||||||
|
#...
|
||||||
|
[[:space:]]*[[:digit:]]+[[:space:]]+psym:
|
||||||
|
[[:space:]]*[[:digit:]]+[[:space:]]+ mov\.ret\.sptk b7 = r0, tag#
|
||||||
|
[[:space:]]*[[:digit:]]+[[:space:]]+ mov r8 = 0
|
||||||
|
[[:space:]]*[[:digit:]]+[[:space:]]+\[tag:\] br\.ret\.sptk rp
|
||||||
|
[[:space:]]*[[:digit:]]+[[:space:]]+\?*[[:space:]]+[[:xdigit:]]+[[:space:]]+\.endp psym
|
||||||
|
#...
|
||||||
|
[[:space:]]*[[:digit:]]+[[:space:]]+
|
||||||
|
[[:space:]]*[[:digit:]]+[[:space:]]+\.proc esym#
|
||||||
|
[[:space:]]*[[:digit:]]+[[:space:]]+\.entry entry#
|
||||||
|
[[:space:]]*[[:digit:]]+[[:space:]]+esym:
|
||||||
|
[[:space:]]*[[:digit:]]+[[:space:]]+\.unwentry
|
||||||
|
[[:space:]]*[[:digit:]]+[[:space:]]+\.personality psym#
|
||||||
|
[[:space:]]*[[:digit:]]+[[:space:]]+\.regstk 0, 8, 0, 8
|
||||||
|
[[:space:]]*[[:digit:]]+[[:space:]]+\.rotp p#\[2\], p1#\[4\]
|
||||||
|
[[:space:]]*[[:digit:]]+[[:space:]]+\.rotr r#\[2\], r1#\[4\]
|
||||||
|
[[:space:]]*[[:digit:]]+[[:space:]]+\.reg\.val r#\[1\], 0
|
||||||
|
[[:space:]]*[[:digit:]]+[[:space:]]+\.reg\.val r1#\[3\], 0
|
||||||
|
[[:space:]]*[[:digit:]]+[[:space:]]+\(p1#\[1\]\) cmp\.eq p\[0\] = r\[1\], r1#\[1\]
|
||||||
|
[[:space:]]*[[:digit:]]+[[:space:]]+\(p1#\[3\]\) cmp\.eq p#\[1\] = r#\[1\], r1#\[3\]
|
||||||
|
[[:space:]]*[[:digit:]]+[[:space:]]+\.pred\.rel "mutex", p#\[0\], p\[1\]
|
||||||
|
[[:space:]]*[[:digit:]]+[[:space:]]+ nop 0
|
||||||
|
[[:space:]]*[[:digit:]]+[[:space:]]+ ;;
|
||||||
|
[[:space:]]*[[:digit:]]+[[:space:]]+entry:
|
||||||
|
[[:space:]]*[[:digit:]]+[[:space:]]+\?*[[:space:]]+61828446[[:space:]]+\(p\[0\]\) mov r8 = 1
|
||||||
|
[[:space:]]*[[:digit:]]+[[:space:]]+00781509[[:space:]]*
|
||||||
|
[[:space:]]*[[:digit:]]+[[:space:]]+95007000[[:space:]]*
|
||||||
|
[[:space:]]*[[:digit:]]+[[:space:]]+00000400[[:space:]]*
|
||||||
|
[[:space:]]*[[:digit:]]+[[:space:]]+\(p#\[1\]\) mov r8 = 0
|
||||||
|
[[:space:]]*[[:digit:]]+[[:space:]]+ br\.ret\.sptk rp
|
||||||
|
[[:space:]]*[[:digit:]]+[[:space:]]+\.xdata4 \.extra#, -1
|
||||||
|
[[:space:]]*[[:digit:]]+[[:space:]]+\?*[[:space:]]+11420400+[[:space:]]+\.endp esym#
|
||||||
|
[[:space:]]*[[:digit:]]+[[:space:]]+00648400[[:space:]]*
|
||||||
|
[[:space:]]*[[:digit:]]+[[:space:]]+00004880[[:space:]]*
|
||||||
|
[[:space:]]*[[:digit:]]+[[:space:]]+00008400[[:space:]]*
|
||||||
|
#...
|
||||||
|
[[:space:]]*[[:digit:]]+[[:space:]]+\.alias esym#, "efunction"
|
||||||
|
[[:space:]]*[[:digit:]]+[[:space:]]+\.alias esym, "efunc"
|
||||||
|
[[:space:]]*[[:digit:]]+[[:space:]]+\.secalias \.extra#, "esection"
|
||||||
|
[[:space:]]*[[:digit:]]+[[:space:]]+\.secalias \.extra, "esec"
|
43
gas/testsuite/gas/ia64/pound.s
Normal file
43
gas/testsuite/gas/ia64/pound.s
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
.explicit
|
||||||
|
|
||||||
|
.global esym#
|
||||||
|
|
||||||
|
.section .extra#, "a", @progbits
|
||||||
|
|
||||||
|
.text
|
||||||
|
|
||||||
|
break 0
|
||||||
|
|
||||||
|
.proc psym
|
||||||
|
psym:
|
||||||
|
mov.ret.sptk b7 = r0, tag#
|
||||||
|
mov r8 = 0
|
||||||
|
[tag:] br.ret.sptk rp
|
||||||
|
.endp psym
|
||||||
|
|
||||||
|
.proc esym#
|
||||||
|
.entry entry#
|
||||||
|
esym:
|
||||||
|
.unwentry
|
||||||
|
.personality psym#
|
||||||
|
.regstk 0, 8, 0, 8
|
||||||
|
.rotp p#[2], p1#[4]
|
||||||
|
.rotr r#[2], r1#[4]
|
||||||
|
.reg.val r#[1], 0
|
||||||
|
.reg.val r1#[3], 0
|
||||||
|
(p1#[1]) cmp.eq p[0] = r[1], r1#[1]
|
||||||
|
(p1#[3]) cmp.eq p#[1] = r#[1], r1#[3]
|
||||||
|
.pred.rel "mutex", p#[0], p[1]
|
||||||
|
nop 0
|
||||||
|
;;
|
||||||
|
entry:
|
||||||
|
(p[0]) mov r8 = 1
|
||||||
|
(p#[1]) mov r8 = 0
|
||||||
|
br.ret.sptk rp
|
||||||
|
.xdata4 .extra#, -1
|
||||||
|
.endp esym#
|
||||||
|
|
||||||
|
.alias esym#, "efunction"
|
||||||
|
.alias esym, "efunc"
|
||||||
|
.secalias .extra#, "esection"
|
||||||
|
.secalias .extra, "esec"
|
Reference in New Issue
Block a user