+2002-12-05  Alan Modra  <amodra@bigpond.net.au>
+
+       * config/tc-arm.c (arm_force_relocation): Move out of #if OBJ_ELF.
+       Move OBJ_COFF TC_FORCE_RELOCATION code here so that COFF handles
+       ARM_IMMEDIATE and ARM_ADRL_IMMEDIATE relocs as for ELF.
+       * config/tc-arm.h (TC_FORCE_RELOCATION): Define for both ELF and
+       COFF to call arm_force_relocation.
+
 2002-12-04  David Mosberger  <davidm@hpl.hp.com>
 
        * config/tc-ia64.c (pseudo_func): Add "@pause" constant for "hint"
 
     }
 }
 
+int
+arm_force_relocation (fixp)
+     struct fix * fixp;
+{
+#if defined (OBJ_COFF) && defined (TE_PE)
+  if (fixp->fx_r_type == BFD_RELOC_RVA)
+    return 1;
+#endif
+#ifdef OBJ_ELF
+  if (   fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
+      || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY
+      || fixp->fx_r_type == BFD_RELOC_ARM_PCREL_BRANCH
+      || fixp->fx_r_type == BFD_RELOC_ARM_PCREL_BLX
+      || fixp->fx_r_type == BFD_RELOC_THUMB_PCREL_BLX
+      || fixp->fx_r_type == BFD_RELOC_THUMB_PCREL_BRANCH23)
+    return 1;
+#endif
+
+  /* Resolve these relocations even if the symbol is extern or weak.  */
+  if (fixp->fx_r_type == BFD_RELOC_ARM_IMMEDIATE
+      || fixp->fx_r_type == BFD_RELOC_ARM_ADRL_IMMEDIATE)
+    return 0;
+
+  return S_FORCE_RELOC (fixp->fx_addsy);
+}
+
 #ifdef OBJ_COFF
 /* This is a little hack to help the gas/arm/adrl.s test.  It prevents
    local labels from being added to the output symbol table when they
   return 0;
 }
 #endif
+
 #ifdef OBJ_ELF
 /* Relocations against Thumb function names must be left unadjusted,
    so that the linker can use this information to correctly set the
   elf_frob_symbol (symp, puntp);
 }
 
-int
-arm_force_relocation (fixp)
-     struct fix * fixp;
-{
-  if (   fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
-      || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY
-      || fixp->fx_r_type == BFD_RELOC_ARM_PCREL_BRANCH
-      || fixp->fx_r_type == BFD_RELOC_ARM_PCREL_BLX
-      || fixp->fx_r_type == BFD_RELOC_THUMB_PCREL_BLX
-      || fixp->fx_r_type == BFD_RELOC_THUMB_PCREL_BRANCH23)
-    return 1;
-
-  /* Resolve these relocations even if the symbol is extern or weak.  */
-  if (fixp->fx_r_type == BFD_RELOC_ARM_IMMEDIATE
-      || fixp->fx_r_type == BFD_RELOC_ARM_ADRL_IMMEDIATE)
-    return 0;
-
-  return S_FORCE_RELOC (fixp->fx_addsy);
-}
-
 static bfd_reloc_code_real_type
 arm_parse_reloc ()
 {
 
 
 #ifdef OBJ_COFF
 # if defined TE_PE
-#  define TC_FORCE_RELOCATION(x) \
-     ((x)->fx_r_type == BFD_RELOC_RVA || S_FORCE_RELOC ((x)->fx_addsy))
 #   ifdef TE_EPOC
 #    define TARGET_FORMAT (target_big_endian ? "epoc-pe-arm-big" : "epoc-pe-arm-little")
 #   else
 #ifdef OBJ_ELF
 # define TARGET_FORMAT elf32_arm_target_format()
   extern const char * elf32_arm_target_format PARAMS ((void));
-
-# define TC_FORCE_RELOCATION(FIX) arm_force_relocation (FIX)
-  extern int arm_force_relocation PARAMS ((struct fix *));
 #endif
 
+#define TC_FORCE_RELOCATION(FIX) arm_force_relocation (FIX)
+extern int arm_force_relocation PARAMS ((struct fix *));
+
 #define md_convert_frag(b, s, f) {as_fatal (_("arm convert_frag\n"));}
 
 #define md_cleanup() arm_cleanup ()