* configure: Regenerate.
* configure.in (arm-*-oabi): New. (thumb-*-oabi): New. * config/tc-arm.c (target_oabi): Declare. (md_apply_fix3): Support REL relocs. (md_parse_option): Handle -oabi. (elf32_arm_target_format): New routine. (md_longopts): Add OPTION_OABI. * config/tc-arm.h: Redefine TARGET_FORMAT.
This commit is contained in:
parent
7f7cef942c
commit
9ac8e451f6
5 changed files with 172 additions and 41 deletions
|
@ -1,3 +1,16 @@
|
|||
Mon Feb 1 12:24:58 1999 Catherine Moore <clm@cygnus.com>
|
||||
|
||||
* configure: Regenerate.
|
||||
* configure.in (arm-*-oabi): New.
|
||||
(thumb-*-oabi): New.
|
||||
* config/tc-arm.c (target_oabi): Declare.
|
||||
(md_apply_fix3): Support REL relocs.
|
||||
(md_parse_option): Handle -oabi.
|
||||
(elf32_arm_target_format): New routine.
|
||||
(md_longopts): Add OPTION_OABI.
|
||||
* config/tc-arm.h: Redefine TARGET_FORMAT.
|
||||
|
||||
|
||||
1999-01-28 Nick Clifton <nickc@cygnus.com>
|
||||
|
||||
* write.c (write_relocs): Handle out or range error.
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* tc-arm.c -- Assemble for the ARM
|
||||
Copyright (C) 1994, 95, 96, 97, 1998 Free Software Foundation, Inc.
|
||||
Copyright (C) 1994, 95, 96, 97, 98, 1999 Free Software Foundation, Inc.
|
||||
Contributed by Richard Earnshaw (rwe@pegasus.esprit.ec.org)
|
||||
Modified by David Taylor (dtaylor@armltd.co.uk)
|
||||
|
||||
|
@ -90,6 +90,7 @@
|
|||
#endif
|
||||
|
||||
static unsigned long cpu_variant = CPU_DEFAULT | FPU_DEFAULT;
|
||||
static int target_oabi = 0;
|
||||
|
||||
#if defined OBJ_COFF || defined OBJ_ELF
|
||||
/* Flags stored in private area of BFD structure */
|
||||
|
@ -4980,13 +4981,11 @@ md_section_align (segment, size)
|
|||
segT segment;
|
||||
valueT size;
|
||||
{
|
||||
/* start-sanitize-armelf */
|
||||
#ifdef OBJ_ELF
|
||||
/* Don't align the dwarf2 debug sections */
|
||||
if (!strncmp(segment->name,".debug",5))
|
||||
return size;
|
||||
#endif
|
||||
/* end-sanitize-armelf */
|
||||
/* Round all sects to multiple of 4 */
|
||||
return (size + 3) & ~3;
|
||||
}
|
||||
|
@ -5239,8 +5238,20 @@ md_apply_fix3 (fixP, val, seg)
|
|||
break;
|
||||
|
||||
case BFD_RELOC_ARM_PCREL_BRANCH:
|
||||
#ifdef OBJ_ELF
|
||||
if (target_oabi)
|
||||
value = (value >> 2) & 0x00ffffff;
|
||||
else
|
||||
value = fixP->fx_offset;
|
||||
#else
|
||||
value = (value >> 2) & 0x00ffffff;
|
||||
#endif
|
||||
newval = md_chars_to_number (buf, INSN_SIZE);
|
||||
#ifdef OBJ_ELF
|
||||
if (!target_oabi)
|
||||
newval = (newval & 0xff000000);
|
||||
#endif
|
||||
newval = (newval & 0xff000000);
|
||||
value = (value + (newval & 0x00ffffff)) & 0x00ffffff;
|
||||
newval = value | (newval & 0xff000000);
|
||||
md_number_to_chars (buf, newval, INSN_SIZE);
|
||||
|
@ -5282,7 +5293,7 @@ md_apply_fix3 (fixP, val, seg)
|
|||
{
|
||||
offsetT newval2;
|
||||
addressT diff;
|
||||
|
||||
|
||||
newval = md_chars_to_number (buf, THUMB_SIZE);
|
||||
newval2 = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
|
||||
diff = ((newval & 0x7ff) << 12) | ((newval2 & 0x7ff) << 1);
|
||||
|
@ -5303,17 +5314,41 @@ md_apply_fix3 (fixP, val, seg)
|
|||
case BFD_RELOC_8:
|
||||
if (fixP->fx_done || fixP->fx_pcrel)
|
||||
md_number_to_chars (buf, value, 1);
|
||||
#ifdef OBJ_ELF
|
||||
else if (!target_oabi)
|
||||
{
|
||||
value = fixP->fx_offset;
|
||||
md_number_to_chars (buf, value, 1);
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
|
||||
case BFD_RELOC_16:
|
||||
if (fixP->fx_done || fixP->fx_pcrel)
|
||||
md_number_to_chars (buf, value, 2);
|
||||
#ifdef OBJ_ELF
|
||||
else if (!target_oabi)
|
||||
{
|
||||
value = fixP->fx_offset;
|
||||
md_number_to_chars (buf, value, 2);
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
|
||||
case BFD_RELOC_RVA:
|
||||
case BFD_RELOC_32:
|
||||
#ifndef OBJ_ELF
|
||||
if (fixP->fx_done || fixP->fx_pcrel)
|
||||
md_number_to_chars (buf, value, 4);
|
||||
#else
|
||||
if (!target_oabi)
|
||||
{
|
||||
value = fixP->fx_offset;
|
||||
md_number_to_chars (buf, value, 4);
|
||||
}
|
||||
else if (fixP->fx_done || fixP->fx_pcrel)
|
||||
md_number_to_chars (buf, value, 4);
|
||||
#endif
|
||||
break;
|
||||
|
||||
case BFD_RELOC_ARM_CP_OFF_IMM:
|
||||
|
@ -5476,6 +5511,11 @@ md_apply_fix3 (fixP, val, seg)
|
|||
md_number_to_chars (buf, newval , THUMB_SIZE);
|
||||
break;
|
||||
|
||||
case BFD_RELOC_VTABLE_INHERIT:
|
||||
case BFD_RELOC_VTABLE_ENTRY:
|
||||
fixP->fx_done = 0;
|
||||
return 1;
|
||||
|
||||
case BFD_RELOC_NONE:
|
||||
default:
|
||||
as_bad_where (fixP->fx_file, fixP->fx_line,
|
||||
|
@ -5538,6 +5578,8 @@ tc_gen_reloc (section, fixp)
|
|||
case BFD_RELOC_THUMB_PCREL_BRANCH9:
|
||||
case BFD_RELOC_THUMB_PCREL_BRANCH12:
|
||||
case BFD_RELOC_THUMB_PCREL_BRANCH23:
|
||||
case BFD_RELOC_VTABLE_ENTRY:
|
||||
case BFD_RELOC_VTABLE_INHERIT:
|
||||
code = fixp->fx_r_type;
|
||||
break;
|
||||
|
||||
|
@ -5899,8 +5941,9 @@ _("Warning: Use of the 'nv' conditional is deprecated\n"));
|
|||
* -m[arm]1 Currently not supported.
|
||||
* -m[arm]2, -m[arm]250 Arm 2 and Arm 250 processor
|
||||
* -m[arm]3 Arm 3 processor
|
||||
* -m[arm]6, Arm 6 processors
|
||||
* -m[arm]7[t][[d]m] Arm 7 processors
|
||||
* -m[arm]6[xx], Arm 6 processors
|
||||
* -m[arm]7[xx][t][[d]m] Arm 7 processors
|
||||
* -mstrongarm[110] Arm 8 processors
|
||||
* -mall All (except the ARM1)
|
||||
* FP variants:
|
||||
* -mfpa10, -mfpa11 FPA10 and 11 co-processor instructions
|
||||
|
@ -5925,6 +5968,10 @@ struct option md_longopts[] =
|
|||
{"EB", no_argument, NULL, OPTION_EB},
|
||||
#define OPTION_EL (OPTION_MD_BASE + 1)
|
||||
{"EL", no_argument, NULL, OPTION_EL},
|
||||
#ifdef OBJ_ELF
|
||||
#define OPTION_OABI (OPTION_MD_BASE +2)
|
||||
{"oabi", no_argument, NULL, OPTION_OABI},
|
||||
#endif
|
||||
#endif
|
||||
{NULL, no_argument, NULL, 0}
|
||||
};
|
||||
|
@ -5967,6 +6014,11 @@ md_parse_option (c, arg)
|
|||
cpu_variant &= ~FPU_ALL;
|
||||
break;
|
||||
|
||||
case 'o':
|
||||
if (!strcmp (str, "oabi"))
|
||||
target_oabi = true;
|
||||
break;
|
||||
|
||||
case 't':
|
||||
/* Limit assembler to generating only Thumb instructions: */
|
||||
if (! strcmp (str, "thumb"))
|
||||
|
@ -6091,15 +6143,33 @@ md_parse_option (c, arg)
|
|||
goto bad;
|
||||
break;
|
||||
|
||||
case '6':
|
||||
if (! strcmp (str, "6"))
|
||||
cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_6;
|
||||
else
|
||||
goto bad;
|
||||
switch (strtol (str, NULL, 10))
|
||||
{
|
||||
case 6:
|
||||
case 60:
|
||||
case 600:
|
||||
case 610:
|
||||
case 620:
|
||||
cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_6;
|
||||
break;
|
||||
default:
|
||||
goto bad;
|
||||
}
|
||||
break;
|
||||
|
||||
case '7':
|
||||
str++; /* eat the '7' */
|
||||
switch (strtol (str, & str, 10)) /* Eat the processor name */
|
||||
{
|
||||
case 7:
|
||||
case 70:
|
||||
case 700:
|
||||
case 710:
|
||||
case 7100:
|
||||
case 7500:
|
||||
break;
|
||||
default:
|
||||
goto bad;
|
||||
}
|
||||
cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_7;
|
||||
for (; *str; str++)
|
||||
{
|
||||
|
@ -6316,8 +6386,8 @@ arm_frob_label (sym)
|
|||
void
|
||||
arm_adjust_symtab ()
|
||||
{
|
||||
symbolS * sym;
|
||||
#ifdef OBJ_COFF
|
||||
symbolS * sym;
|
||||
|
||||
for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
|
||||
{
|
||||
|
@ -6354,39 +6424,44 @@ arm_adjust_symtab ()
|
|||
if (ARM_IS_INTERWORK (sym))
|
||||
coffsymbol(sym->bsym)->native->u.syment.n_flags = 0xFF;
|
||||
}
|
||||
#endif /* OBJ_COFF */
|
||||
#endif
|
||||
}
|
||||
#ifdef OBJ_ELF
|
||||
void
|
||||
armelf_adjust_symtab ()
|
||||
{
|
||||
symbolS * sym;
|
||||
elf_symbol_type *elf_sym;
|
||||
char bind;
|
||||
|
||||
for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
|
||||
{
|
||||
if (ARM_IS_THUMB (sym) && (THUMB_IS_FUNC (sym)))
|
||||
{
|
||||
elf_symbol_type * elf_sym;
|
||||
unsigned char bind;
|
||||
if (ARM_IS_THUMB (sym))
|
||||
{
|
||||
if (THUMB_IS_FUNC (sym))
|
||||
{
|
||||
elf_sym = elf_symbol(sym->bsym);
|
||||
bind = ELF_ST_BIND(elf_sym);
|
||||
elf_sym->internal_elf_sym.st_info = ELF_ST_INFO(bind, STT_ARM_TFUNC);
|
||||
}
|
||||
|
||||
elf_sym = elf_symbol (sym->bsym);
|
||||
bind = ELF_ST_BIND (elf_sym->internal_elf_sym.st_info);
|
||||
|
||||
elf_sym->internal_elf_sym.st_info = ELF_ST_INFO (bind, STT_ARM_TFUNC);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef OBJ_ELF
|
||||
void
|
||||
armelf_frob_symbol (symp, puntp)
|
||||
symbolS * symp;
|
||||
int * puntp;
|
||||
symbolS *symp;
|
||||
int *puntp;
|
||||
|
||||
{
|
||||
elf_frob_symbol (symp, puntp);
|
||||
}
|
||||
|
||||
#endif /* OBJ_ELF */
|
||||
|
||||
}
|
||||
#endif
|
||||
int
|
||||
arm_data_in_code ()
|
||||
{
|
||||
|
@ -6414,7 +6489,6 @@ arm_canonicalize_symbol_name (name)
|
|||
|
||||
return name;
|
||||
}
|
||||
/* start-sanitize-armelf */
|
||||
#ifdef OBJ_ELF
|
||||
/* Relocations against Thumb function names must be left unadjusted,
|
||||
so that the linker can use this information to correctly set the
|
||||
|
@ -6433,17 +6507,44 @@ boolean
|
|||
arm_fix_adjustable (fixP)
|
||||
fixS *fixP;
|
||||
{
|
||||
|
||||
if (fixP->fx_addsy == NULL)
|
||||
return 1;
|
||||
|
||||
/* Prevent all adjustments to global symbols. */
|
||||
if (S_IS_EXTERN (fixP->fx_addsy))
|
||||
return 0;
|
||||
if (S_IS_WEAK (fixP->fx_addsy))
|
||||
return 0;
|
||||
|
||||
if (THUMB_IS_FUNC (fixP->fx_addsy)
|
||||
&& fixP->fx_subsy == NULL)
|
||||
return 0;
|
||||
|
||||
/* We need the symbol name for the VTABLE entries */
|
||||
if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
|
||||
|| fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
#endif /* OBJ_ELF */
|
||||
/* end-sanitize-armelf */
|
||||
|
||||
#ifdef OBJ_ELF
|
||||
int
|
||||
elf32_arm_force_relocation (fixp)
|
||||
struct fix *fixp;
|
||||
{
|
||||
if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
|
||||
|| fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
|
||||
return 1;
|
||||
|
||||
if (fixp->fx_r_type == BFD_RELOC_ARM_PCREL_BRANCH)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
boolean
|
||||
arm_validate_fix (fixP)
|
||||
|
@ -6465,3 +6566,17 @@ arm_validate_fix (fixP)
|
|||
return false;
|
||||
}
|
||||
|
||||
const char *
|
||||
elf32_arm_target_format ()
|
||||
{
|
||||
if (target_big_endian)
|
||||
if (target_oabi)
|
||||
return "elf32-bigarm-oabi";
|
||||
else
|
||||
return "elf32-bigarm";
|
||||
else
|
||||
if (target_oabi)
|
||||
return "elf32-littlearm-oabi";
|
||||
else
|
||||
return "elf32-littlearm";
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* This file is tc-arm.h
|
||||
Copyright (C) 1994, 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
|
||||
Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
|
||||
Contributed by Richard Earnshaw (rwe@pegasus.esprit.ec.org)
|
||||
Modified by David Taylor (dtaylor@armltd.co.uk)
|
||||
|
||||
|
@ -72,14 +72,18 @@
|
|||
# endif
|
||||
#endif
|
||||
|
||||
/* start-sanitize-armelf */
|
||||
#ifdef OBJ_ELF
|
||||
#define TC_FORCE_RELOCATION(fixp) elf32_arm_force_relocation(fixp)
|
||||
extern int elf32_arm_force_relocation PARAMS ((struct fix *));
|
||||
#endif
|
||||
|
||||
#ifdef OBJ_ELF
|
||||
extern boolean arm_validate_fix ();
|
||||
#define TC_VALIDATE_FIX(fixP,segType,Label) if (arm_validate_fix (fixP)) add_symbolP = fixP->fx_addsy
|
||||
#define ARM_BI_ENDIAN
|
||||
#define TARGET_FORMAT (target_big_endian ? "elf32-bigarm" : "elf32-littlearm")
|
||||
#define TARGET_FORMAT elf32_arm_target_format()
|
||||
extern const char *elf32_arm_target_format PARAMS ((void));
|
||||
#endif
|
||||
/* end-sanitize-armelf */
|
||||
|
||||
#define md_convert_frag(b,s,f) {as_fatal (_("arm convert_frag\n"));}
|
||||
|
||||
|
@ -95,15 +99,11 @@ extern void arm_frob_label PARAMS ((struct symbol *));
|
|||
deliberately not been updated to mark assembler created stabs
|
||||
symbols as Thumb. */
|
||||
|
||||
/* start-sanitize-armelf */
|
||||
#ifdef OBJ_ELF
|
||||
#define obj_fix_adjustable(fixP) arm_fix_adjustable(fixP)
|
||||
#else
|
||||
/* end-sanitize-armelf */
|
||||
#define obj_fix_adjustable(fixP) 0
|
||||
/* start-sanitize-armelf */
|
||||
#endif
|
||||
/* end-sanitize-armelf */
|
||||
|
||||
/* We need to keep some local information on symbols. */
|
||||
|
||||
|
@ -151,10 +151,10 @@ char *arm_canonicalize_symbol_name PARAMS ((char *));
|
|||
|
||||
/* Finish processing the entire symbol table: */
|
||||
#ifdef OBJ_ELF
|
||||
#define obj_adjust_symtab armelf_adjust_symtab
|
||||
#define obj_adjust_symtab() armelf_adjust_symtab ()
|
||||
extern void armelf_adjust_symtab PARAMS ((void));
|
||||
#else
|
||||
#define obj_adjust_symtab arm_adjust_symtab
|
||||
#define obj_adjust_symtab() arm_adjust_symtab ()
|
||||
extern void arm_adjust_symtab PARAMS ((void));
|
||||
#endif
|
||||
|
||||
|
|
2
gas/configure
vendored
2
gas/configure
vendored
|
@ -1644,6 +1644,8 @@ for this_target in $target $canon_targets ; do
|
|||
arm-*-aout) fmt=aout ;;
|
||||
arm-*-coff | thumb-*-coff) fmt=coff ;;
|
||||
arm-*-elf | thumb-*-elf) fmt=elf ;;
|
||||
arm-*-oabi | thumb-*-oabi) fmt=elf ;;
|
||||
arm-*-linux* | armv*-*-linux-gnu) fmt=elf em=linux ;;
|
||||
arm-*-riscix*) fmt=aout ;;
|
||||
arm-*-pe | thumb-*-pe) fmt=coff em=pe ;;
|
||||
|
||||
|
|
|
@ -137,6 +137,7 @@ changequote([,])dnl
|
|||
arm-*-aout) fmt=aout ;;
|
||||
arm-*-coff | thumb-*-coff) fmt=coff ;;
|
||||
arm-*-elf | thumb-*-elf) fmt=elf ;;
|
||||
arm-*-oabi | thumb-*-oabi) fmt=elf ;;
|
||||
arm-*-riscix*) fmt=aout ;;
|
||||
arm-*-pe | thumb-*-pe) fmt=coff em=pe ;;
|
||||
|
||||
|
|
Loading…
Reference in a new issue