#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;
   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))
 
       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)
        {
        {
          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."));
       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)
     {
       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;
          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
 
   /* 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.  */
 
       /* 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).  */
            }
 
          /* #:<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;
            /* =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;
              /* 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;
            }
          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;
          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"));
   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;
     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;
              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
 
   /* 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.  */