diff options
-rw-r--r-- | gas/config/tc-aarch64.c | 63 | ||||
-rw-r--r-- | gas/testsuite/gas/aarch64/pr27217.d | 6 |
2 files changed, 23 insertions, 46 deletions
diff --git a/gas/config/tc-aarch64.c b/gas/config/tc-aarch64.c index 779db31..e12b68e 100644 --- a/gas/config/tc-aarch64.c +++ b/gas/config/tc-aarch64.c @@ -565,25 +565,18 @@ static bool in_aarch64_get_expression = false; #define ALLOW_ABSENT false #define REJECT_ABSENT true -/* Fifth argument to aarch64_get_expression. */ -#define NORMAL_RESOLUTION false - /* Return TRUE if the string pointed by *STR is successfully parsed as an valid expression; *EP will be filled with the information of such an expression. Otherwise return FALSE. If ALLOW_IMMEDIATE_PREFIX is true then skip a '#' at the start. - If REJECT_ABSENT is true then trat missing expressions as an error. - If DEFER_RESOLUTION is true, then do not resolve expressions against - constant symbols. Necessary if the expression is part of a fixup - that uses a reloc that must be emitted. */ + If REJECT_ABSENT is true then trat missing expressions as an error. */ static bool aarch64_get_expression (expressionS * ep, char ** str, bool allow_immediate_prefix, - bool reject_absent, - bool defer_resolution) + bool reject_absent) { char *save_in; segT seg; @@ -603,10 +596,7 @@ aarch64_get_expression (expressionS * ep, save_in = input_line_pointer; input_line_pointer = *str; in_aarch64_get_expression = true; - if (defer_resolution) - seg = deferred_expression (ep); - else - seg = expression (ep); + seg = expression (ep); in_aarch64_get_expression = false; if (ep->X_op == O_illegal || (reject_absent && ep->X_op == O_absent)) @@ -1035,8 +1025,7 @@ parse_typed_reg (char **ccp, aarch64_reg_type type, aarch64_reg_type *rtype, atype.defined |= NTA_HASINDEX; - aarch64_get_expression (&exp, &str, GE_NO_PREFIX, REJECT_ABSENT, - NORMAL_RESOLUTION); + aarch64_get_expression (&exp, &str, GE_NO_PREFIX, REJECT_ABSENT); if (exp.X_op != O_constant) { @@ -1239,8 +1228,7 @@ parse_vector_reg_list (char **ccp, aarch64_reg_type type, { expressionS exp; - aarch64_get_expression (&exp, &str, GE_NO_PREFIX, REJECT_ABSENT, - NORMAL_RESOLUTION); + aarch64_get_expression (&exp, &str, GE_NO_PREFIX, REJECT_ABSENT); if (exp.X_op != O_constant) { set_first_syntax_error (_("constant expression required.")); @@ -2187,8 +2175,7 @@ parse_immediate_expression (char **str, expressionS *exp, return false; } - aarch64_get_expression (exp, str, GE_OPT_PREFIX, REJECT_ABSENT, - NORMAL_RESOLUTION); + aarch64_get_expression (exp, str, GE_OPT_PREFIX, REJECT_ABSENT); if (exp->X_op == O_absent) { @@ -2422,8 +2409,7 @@ parse_big_immediate (char **str, int64_t *imm, aarch64_reg_type reg_type) return false; } - aarch64_get_expression (&inst.reloc.exp, &ptr, GE_OPT_PREFIX, REJECT_ABSENT, - NORMAL_RESOLUTION); + aarch64_get_expression (&inst.reloc.exp, &ptr, GE_OPT_PREFIX, REJECT_ABSENT); if (inst.reloc.exp.X_op == O_constant) *imm = inst.reloc.exp.X_add_number; @@ -3320,8 +3306,7 @@ parse_shift (char **str, aarch64_opnd_info *operand, enum parse_shift_mode mode) p++; exp_has_prefix = 1; } - (void) aarch64_get_expression (&exp, &p, GE_NO_PREFIX, ALLOW_ABSENT, - NORMAL_RESOLUTION); + aarch64_get_expression (&exp, &p, GE_NO_PREFIX, ALLOW_ABSENT); } if (kind == AARCH64_MOD_MUL_VL) /* For consistency, give MUL VL the same shift amount as an implicit @@ -3385,7 +3370,7 @@ parse_shifter_operand_imm (char **str, aarch64_opnd_info *operand, /* Accept an immediate expression. */ if (! aarch64_get_expression (&inst.reloc.exp, &p, GE_OPT_PREFIX, - REJECT_ABSENT, NORMAL_RESOLUTION)) + REJECT_ABSENT)) return false; /* Accept optional LSL for arithmetic immediate values. */ @@ -3509,8 +3494,7 @@ parse_shifter_operand_reloc (char **str, aarch64_opnd_info *operand, /* Next, we parse the expression. */ if (! aarch64_get_expression (&inst.reloc.exp, str, GE_NO_PREFIX, - REJECT_ABSENT, - aarch64_force_reloc (entry->add_type) == 1)) + REJECT_ABSENT)) return false; /* Record the relocation type (use the ADD variant here). */ @@ -3656,8 +3640,7 @@ parse_address_main (char **str, aarch64_opnd_info *operand, } /* #:<reloc_op>: */ - if (! aarch64_get_expression (exp, &p, GE_NO_PREFIX, REJECT_ABSENT, - aarch64_force_reloc (ty) == 1)) + if (! aarch64_get_expression (exp, &p, GE_NO_PREFIX, REJECT_ABSENT)) { set_syntax_error (_("invalid relocation expression")); return false; @@ -3673,8 +3656,7 @@ parse_address_main (char **str, aarch64_opnd_info *operand, /* =immediate; need to generate the literal in the literal pool. */ inst.gen_lit_pool = 1; - if (!aarch64_get_expression (exp, &p, GE_NO_PREFIX, REJECT_ABSENT, - NORMAL_RESOLUTION)) + if (!aarch64_get_expression (exp, &p, GE_NO_PREFIX, REJECT_ABSENT)) { set_syntax_error (_("invalid address")); return false; @@ -3780,8 +3762,7 @@ parse_address_main (char **str, aarch64_opnd_info *operand, /* We now have the group relocation table entry corresponding to the name in the assembler source. Next, we parse the expression. */ - if (! aarch64_get_expression (exp, &p, GE_NO_PREFIX, REJECT_ABSENT, - aarch64_force_reloc (entry->ldst_type) == 1)) + if (! aarch64_get_expression (exp, &p, GE_NO_PREFIX, REJECT_ABSENT)) { set_syntax_error (_("invalid relocation expression")); return false; @@ -3794,8 +3775,7 @@ parse_address_main (char **str, aarch64_opnd_info *operand, } else { - if (! aarch64_get_expression (exp, &p, GE_OPT_PREFIX, REJECT_ABSENT, - NORMAL_RESOLUTION)) + if (! aarch64_get_expression (exp, &p, GE_OPT_PREFIX, REJECT_ABSENT)) { set_syntax_error (_("invalid expression in the address")); return false; @@ -3851,8 +3831,7 @@ parse_address_main (char **str, aarch64_opnd_info *operand, operand->addr.offset.regno = reg->number; operand->addr.offset.is_reg = 1; } - else if (! aarch64_get_expression (exp, &p, GE_OPT_PREFIX, REJECT_ABSENT, - NORMAL_RESOLUTION)) + else if (! aarch64_get_expression (exp, &p, GE_OPT_PREFIX, REJECT_ABSENT)) { /* [Xn],#expr */ set_syntax_error (_("invalid expression in the address")); @@ -3980,8 +3959,7 @@ parse_half (char **str, int *internal_fixup_p) else *internal_fixup_p = 1; - if (! aarch64_get_expression (&inst.reloc.exp, &p, GE_NO_PREFIX, REJECT_ABSENT, - aarch64_force_reloc (inst.reloc.type) == 1)) + if (! aarch64_get_expression (&inst.reloc.exp, &p, GE_NO_PREFIX, REJECT_ABSENT)) return false; *str = p; @@ -4023,8 +4001,7 @@ parse_adrp (char **str) inst.reloc.type = BFD_RELOC_AARCH64_ADR_HI21_PCREL; inst.reloc.pc_rel = 1; - if (! aarch64_get_expression (&inst.reloc.exp, &p, GE_NO_PREFIX, REJECT_ABSENT, - aarch64_force_reloc (inst.reloc.type) == 1)) + if (! aarch64_get_expression (&inst.reloc.exp, &p, GE_NO_PREFIX, REJECT_ABSENT)) return false; *str = p; return true; @@ -6706,8 +6683,7 @@ parse_operands (char *str, const aarch64_opcode *opcode) goto failure; str = saved; po_misc_or_fail (aarch64_get_expression (&inst.reloc.exp, &str, - GE_OPT_PREFIX, REJECT_ABSENT, - NORMAL_RESOLUTION)); + GE_OPT_PREFIX, REJECT_ABSENT)); /* The MOV immediate alias will be fixed up by fix_mov_imm_insn later. fix_mov_imm_insn will try to determine a machine instruction (MOVZ, MOVN or ORR) for it and will issue an error @@ -8834,7 +8810,8 @@ md_apply_fix (fixS * fixP, valueT * valP, segT seg) /* Note whether this will delete the relocation. */ - if (fixP->fx_addsy == 0 && !fixP->fx_pcrel) + if (fixP->fx_addsy == 0 && !fixP->fx_pcrel + && aarch64_force_reloc (fixP->fx_r_type) <= 0) fixP->fx_done = 1; /* Process the relocations. */ diff --git a/gas/testsuite/gas/aarch64/pr27217.d b/gas/testsuite/gas/aarch64/pr27217.d index abbc487..3397dfa 100644 --- a/gas/testsuite/gas/aarch64/pr27217.d +++ b/gas/testsuite/gas/aarch64/pr27217.d @@ -7,9 +7,9 @@ Disassembly of section \.text: 0+000 <.*>: -[ ]+0:[ ]+90000000[ ]+adrp[ ]+x0, 12345678[ ]+<bar> -[ ]+0:[ ]+R_AARCH64(|_P32)_ADR_PREL_PG_HI21[ ]+bar +[ ]+0:[ ]+90000000[ ]+adrp[ ]+x0, [0-9]*[ ]+<.*> +[ ]+0:[ ]+R_AARCH64(|_P32)_ADR_PREL_PG_HI21[ ]+\*ABS\*\+0x12345678 [ ]+4:[ ]+91000000[ ]+add[ ]+x0, x0, #0x0 -[ ]+4:[ ]+R_AARCH64(|_P32)_ADD_ABS_LO12_NC[ ]+bar +[ ]+4:[ ]+R_AARCH64(|_P32)_ADD_ABS_LO12_NC[ ]+\*ABS\*\+0x12345678 [ ]+8:[ ]+d65f03c0[ ]+ret #pass |