From 5664043466b5a1a79232f5a3ee6339e638384720 Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Mon, 11 Oct 2010 08:36:30 +0000 Subject: [PATCH] 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 Signed-off-by: Mike Frysinger --- gas/ChangeLog | 6 ++++++ gas/config/bfin-aux.h | 1 + gas/config/bfin-parse.y | 22 ++++++++++++++++++++++ gas/config/tc-bfin.c | 9 +++++++++ 4 files changed, 38 insertions(+) diff --git a/gas/ChangeLog b/gas/ChangeLog index 66853b9c3b..ef213458de 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,9 @@ +2010-09-11 David Gibson + + * 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 * config/tc-bfin.c (bfin_gen_loop): Check symbol before removing. diff --git a/gas/config/bfin-aux.h b/gas/config/bfin-aux.h index 465a6afc68..e78a4e841c 100755 --- a/gas/config/bfin-aux.h +++ b/gas/config/bfin-aux.h @@ -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); diff --git a/gas/config/bfin-parse.y b/gas/config/bfin-parse.y index 81640aa926..c34e84c210 100644 --- a/gas/config/bfin-parse.y +++ b/gas/config/bfin-parse.y @@ -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)) diff --git a/gas/config/tc-bfin.c b/gas/config/tc-bfin.c index e854dce059..3efc4b67a0 100644 --- a/gas/config/tc-bfin.c +++ b/gas/config/tc-bfin.c @@ -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) { -- 2.34.1