mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-30 00:52:16 +08:00
gas: blackfin: support numeric local labels with LOOP_BEGIN/LOOP_END pseudo insns
The current LOOP_BEGIN/LOOP_END pseudo insns hit parser errors when trying to use numeric local labels. So add support for them. Signed-off-by: David Gibson <david.gibson@analog.com> Signed-off-by: Mike Frysinger <vapier@gentoo.org>
This commit is contained in:
@ -1,3 +1,9 @@
|
|||||||
|
2010-09-11 David Gibson <david.gibson@analog.com>
|
||||||
|
|
||||||
|
* config/bfin-aux.h (bfin_loop_attempt_create_label): New prototype.
|
||||||
|
* config/bfin-parse.y (LOOP_BEGIN, LOOP_END): Handle numeric labels.
|
||||||
|
* config/tc-bfin.c (bfin_loop_attempt_create_label): New funtion.
|
||||||
|
|
||||||
2010-09-11 David Gibson <david.gibson@analog.com>
|
2010-09-11 David Gibson <david.gibson@analog.com>
|
||||||
|
|
||||||
* config/tc-bfin.c (bfin_gen_loop): Check symbol before removing.
|
* config/tc-bfin.c (bfin_gen_loop): Check symbol before removing.
|
||||||
|
@ -56,6 +56,7 @@ INSTR_T bfin_gen_cactrl (REG_T, int, int);
|
|||||||
INSTR_T bfin_gen_progctrl (int, int);
|
INSTR_T bfin_gen_progctrl (int, int);
|
||||||
INSTR_T bfin_gen_loopsetup (Expr_Node *, REG_T, int, Expr_Node *, REG_T);
|
INSTR_T bfin_gen_loopsetup (Expr_Node *, REG_T, int, Expr_Node *, REG_T);
|
||||||
INSTR_T bfin_gen_loop (Expr_Node *, REG_T, int, REG_T);
|
INSTR_T bfin_gen_loop (Expr_Node *, REG_T, int, REG_T);
|
||||||
|
void bfin_loop_attempt_create_label (Expr_Node *, int);
|
||||||
void bfin_loop_beginend (Expr_Node *, int);
|
void bfin_loop_beginend (Expr_Node *, int);
|
||||||
INSTR_T bfin_gen_pushpopmultiple (int, int, int, int, int);
|
INSTR_T bfin_gen_pushpopmultiple (int, int, int, int, int);
|
||||||
INSTR_T bfin_gen_pushpopreg (REG_T, int);
|
INSTR_T bfin_gen_pushpopreg (REG_T, int);
|
||||||
|
@ -3573,6 +3573,17 @@ asm_1:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* LOOP_BEGIN. */
|
/* LOOP_BEGIN. */
|
||||||
|
| LOOP_BEGIN NUMBER
|
||||||
|
{
|
||||||
|
Expr_Node_Value val;
|
||||||
|
val.i_value = $2;
|
||||||
|
Expr_Node *tmp = Expr_Node_Create (Expr_Node_Constant, val, NULL, NULL);
|
||||||
|
bfin_loop_attempt_create_label (tmp, 1);
|
||||||
|
if (!IS_RELOC (tmp))
|
||||||
|
return yyerror ("Invalid expression in LOOP_BEGIN statement");
|
||||||
|
bfin_loop_beginend (tmp, 1);
|
||||||
|
$$ = 0;
|
||||||
|
}
|
||||||
| LOOP_BEGIN expr
|
| LOOP_BEGIN expr
|
||||||
{
|
{
|
||||||
if (!IS_RELOC ($2))
|
if (!IS_RELOC ($2))
|
||||||
@ -3583,6 +3594,17 @@ asm_1:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* LOOP_END. */
|
/* LOOP_END. */
|
||||||
|
| LOOP_END NUMBER
|
||||||
|
{
|
||||||
|
Expr_Node_Value val;
|
||||||
|
val.i_value = $2;
|
||||||
|
Expr_Node *tmp = Expr_Node_Create (Expr_Node_Constant, val, NULL, NULL);
|
||||||
|
bfin_loop_attempt_create_label (tmp, 1);
|
||||||
|
if (!IS_RELOC (tmp))
|
||||||
|
return yyerror ("Invalid expression in LOOP_END statement");
|
||||||
|
bfin_loop_beginend (tmp, 0);
|
||||||
|
$$ = 0;
|
||||||
|
}
|
||||||
| LOOP_END expr
|
| LOOP_END expr
|
||||||
{
|
{
|
||||||
if (!IS_RELOC ($2))
|
if (!IS_RELOC ($2))
|
||||||
|
@ -1904,6 +1904,15 @@ bfin_gen_loop (Expr_Node *exp, REG_T reg, int rop, REG_T preg)
|
|||||||
return bfin_gen_loopsetup (lbegin, reg, rop, lend, preg);
|
return bfin_gen_loopsetup (lbegin, reg, rop, lend, preg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
bfin_loop_attempt_create_label (Expr_Node *exp, int is_begin)
|
||||||
|
{
|
||||||
|
char *name;
|
||||||
|
name = fb_label_name (exp->value.i_value, is_begin);
|
||||||
|
exp->value.s_value = xstrdup (name);
|
||||||
|
exp->type = Expr_Node_Reloc;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
bfin_loop_beginend (Expr_Node *exp, int begin)
|
bfin_loop_beginend (Expr_Node *exp, int begin)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user