From 5664043466b5a1a79232f5a3ee6339e638384720 Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Mon, 11 Oct 2010 08:36:30 +0000 Subject: 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(+) (limited to 'gas') diff --git a/gas/ChangeLog b/gas/ChangeLog index 66853b9..ef21345 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,5 +1,11 @@ 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. 2010-10-08 Pierre Muller diff --git a/gas/config/bfin-aux.h b/gas/config/bfin-aux.h index 465a6af..e78a4e8 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 81640aa..c34e84c 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 e854dce..3efc4b6 100644 --- a/gas/config/tc-bfin.c +++ b/gas/config/tc-bfin.c @@ -1905,6 +1905,15 @@ bfin_gen_loop (Expr_Node *exp, REG_T reg, int rop, REG_T 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) { const char *loopsym; -- cgit v1.1