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:
Mike Frysinger 2010-10-11 08:36:30 +00:00
parent 71ef6f79bc
commit 5664043466
4 changed files with 38 additions and 0 deletions

View file

@ -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>
* config/tc-bfin.c (bfin_gen_loop): Check symbol before removing.

View file

@ -56,6 +56,7 @@ INSTR_T bfin_gen_cactrl (REG_T, 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_loop (Expr_Node *, REG_T, int, REG_T);
void bfin_loop_attempt_create_label (Expr_Node *, int);
void bfin_loop_beginend (Expr_Node *, int);
INSTR_T bfin_gen_pushpopmultiple (int, int, int, int, int);
INSTR_T bfin_gen_pushpopreg (REG_T, int);

View file

@ -3573,6 +3573,17 @@ asm_1:
}
/* 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
{
if (!IS_RELOC ($2))
@ -3583,6 +3594,17 @@ asm_1:
}
/* 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
{
if (!IS_RELOC ($2))

View file

@ -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);
}
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
bfin_loop_beginend (Expr_Node *exp, int begin)
{