From d507cf36a6e8dd590757a05889cd9f2c1dd9aba5 Mon Sep 17 00:00:00 2001 From: Paul Brook Date: Tue, 23 Mar 2004 23:05:52 +0000 Subject: [PATCH] * bfd/elf32-arm.h (arm_print_private_bfd_data): Add EABI v3. * binutils/readelf.c (decode_ARM_machine_flags): Add EABI v3. * gas/config/tc-arm.c (meabi_flags): New variable. (arm_parse_eabi): New function. (md_begin): Set flags for EABI v3. (arm_eabis): Add. (arm_long_opts): Add meabi. * include/elf/arm.h (EF_ERM_BE8, EF_ARM_LE8, EF_ARM_EABI_VER3): Add. * doc/as.texinf : Document -meabi. * doc/c-arm.texi: Ditto. --- bfd/ChangeLog | 4 ++ bfd/elf32-arm.h | 12 ++++++ binutils/ChangeLog | 4 ++ binutils/readelf.c | 27 ++++++++++++ gas/ChangeLog | 10 +++++ gas/config/tc-arm.c | 98 +++++++++++++++++++++++++++++++------------ gas/doc/as.texinfo | 1 + gas/doc/c-arm.texi | 9 ++++ include/elf/ChangeLog | 4 ++ include/elf/arm.h | 5 +++ 10 files changed, 148 insertions(+), 26 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index dac6564204..6560ebc5d1 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,7 @@ +2004-03-23 Paul Brook + + * elf32-arm.h (arm_print_private_bfd_data): Add EABI v3. + 2004-03-22 Bob Wilson * elf32-xtensa.c (elf_xtensa_check_relocs): Remove code to read diff --git a/bfd/elf32-arm.h b/bfd/elf32-arm.h index 2f6c22e276..33f85bd609 100644 --- a/bfd/elf32-arm.h +++ b/bfd/elf32-arm.h @@ -2679,6 +2679,18 @@ elf32_arm_print_private_bfd_data (abfd, ptr) | EF_ARM_MAPSYMSFIRST); break; + case EF_ARM_EABI_VER3: + fprintf (file, _(" [Version3 EABI]")); + + if (flags & EF_ARM_BE8) + fprintf (file, _(" [BE8]")); + + if (flags & EF_ARM_LE8) + fprintf (file, _(" [LE8]")); + + flags &= ~(EF_ARM_LE8 | EF_ARM_BE8); + break; + default: fprintf (file, _(" ")); break; diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 2e41bc8b50..94d368c37b 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,7 @@ +2004-03-23 Paul Brook + + * readelf.c (decode_ARM_machine_flags): Add EABI v3. + 2004-03-21 Richard Henderson * readelf.c (display_debug_frames): Don't crash for mismatched diff --git a/binutils/readelf.c b/binutils/readelf.c index 3561eff0a6..c8d6ad902f 100644 --- a/binutils/readelf.c +++ b/binutils/readelf.c @@ -1740,6 +1740,33 @@ decode_ARM_machine_flags (unsigned e_flags, char buf[]) } break; + case EF_ARM_EABI_VER3: + strcat (buf, ", Version3 EABI"); + while (e_flags) + { + unsigned flag; + + /* Process flags one bit at a time. */ + flag = e_flags & - e_flags; + e_flags &= ~ flag; + + switch (flag) + { + case EF_ARM_BE8: + strcat (buf, ", BE8"); + break; + + case EF_ARM_LE8: + strcat (buf, ", LE8"); + break; + + default: + unknown = 1; + break; + } + } + break; + case EF_ARM_EABI_UNKNOWN: strcat (buf, ", GNU EABI"); while (e_flags) diff --git a/gas/ChangeLog b/gas/ChangeLog index ec4e566f31..f96a82883c 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,13 @@ +2004-03-23 Paul Brook + + * config/tc-arm.c (meabi_flags): New variable. + (arm_parse_eabi): New function. + (md_begin): Set flags for EABI v3. + (arm_eabis): Add. + (arm_long_opts): Add meabi. + * doc/as.texinf : Document -meabi. + * doc/c-arm.texi: Ditto. + 2004-03-22 Bob Wilson * config/tc-xtensa.c (xtensa_post_relax_hook): Create literal diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c index 69b2c21998..bcf57692d1 100644 --- a/gas/config/tc-arm.c +++ b/gas/config/tc-arm.c @@ -191,6 +191,7 @@ static int march_cpu_opt = -1; static int march_fpu_opt = -1; static int mfpu_opt = -1; static int mfloat_abi_opt = -1; +static int meabi_flags = EF_ARM_EABI_UNKNOWN; /* This array holds the chars that always start a comment. If the pre-processor is disabled, these aren't very useful. */ @@ -2551,6 +2552,7 @@ static int arm_parse_cpu PARAMS ((char *)); static int arm_parse_arch PARAMS ((char *)); static int arm_parse_fpu PARAMS ((char *)); static int arm_parse_float_abi PARAMS ((char *)); +static int arm_parse_eabi PARAMS ((char *)); #if 0 /* Suppressed - for now. */ #if defined OBJ_COFF || defined OBJ_ELF static void arm_add_note PARAMS ((const char *, const char *, unsigned int)); @@ -11687,37 +11689,49 @@ md_begin () #if defined OBJ_COFF || defined OBJ_ELF { - unsigned int flags = 0; - - /* Set the flags in the private structure. */ - if (uses_apcs_26) flags |= F_APCS26; - if (support_interwork) flags |= F_INTERWORK; - if (uses_apcs_float) flags |= F_APCS_FLOAT; - if (pic_code) flags |= F_PIC; - if ((cpu_variant & FPU_ANY) == FPU_NONE - || (cpu_variant & FPU_ANY) == FPU_ARCH_VFP) /* VFP layout only. */ - { - flags |= F_SOFT_FLOAT; - } - switch (mfloat_abi_opt) + unsigned int flags = meabi_flags; + + switch (meabi_flags) { - case ARM_FLOAT_ABI_SOFT: - case ARM_FLOAT_ABI_SOFTFP: - flags |= F_SOFT_FLOAT; - break; + case EF_ARM_EABI_UNKNOWN: + /* Set the flags in the private structure. */ + if (uses_apcs_26) flags |= F_APCS26; + if (support_interwork) flags |= F_INTERWORK; + if (uses_apcs_float) flags |= F_APCS_FLOAT; + if (pic_code) flags |= F_PIC; + if ((cpu_variant & FPU_ANY) == FPU_NONE + || (cpu_variant & FPU_ANY) == FPU_ARCH_VFP) /* VFP layout only. */ + { + flags |= F_SOFT_FLOAT; + } + switch (mfloat_abi_opt) + { + case ARM_FLOAT_ABI_SOFT: + case ARM_FLOAT_ABI_SOFTFP: + flags |= F_SOFT_FLOAT; + break; - case ARM_FLOAT_ABI_HARD: - if (flags & F_SOFT_FLOAT) - as_bad (_("hard-float conflicts with specified fpu")); - break; - } - /* Using VFP conventions (even if soft-float). */ - if (cpu_variant & FPU_VFP_EXT_NONE) flags |= F_VFP_FLOAT; + case ARM_FLOAT_ABI_HARD: + if (flags & F_SOFT_FLOAT) + as_bad (_("hard-float conflicts with specified fpu")); + break; + } + /* Using VFP conventions (even if soft-float). */ + if (cpu_variant & FPU_VFP_EXT_NONE) flags |= F_VFP_FLOAT; #if defined OBJ_ELF - if (cpu_variant & FPU_ARCH_MAVERICK) - flags |= EF_ARM_MAVERICK_FLOAT; + if (cpu_variant & FPU_ARCH_MAVERICK) + flags |= EF_ARM_MAVERICK_FLOAT; #endif + break; + + case EF_ARM_EABI_VER3: + /* No additional flags to set. */ + break; + + default: + abort (); + } bfd_set_private_flags (stdoutput, flags); @@ -13450,6 +13464,20 @@ static struct arm_float_abi_option_table arm_float_abis[] = {NULL, 0} }; +struct arm_eabi_option_table +{ + char *name; + unsigned int value; +}; + +/* We only know hot to output GNU and ver 3 (AAELF) formats. */ +static struct arm_eabi_option_table arm_eabis[] = +{ + {"gnu", EF_ARM_EABI_UNKNOWN}, + {"3", EF_ARM_EABI_VER3}, + {NULL, 0} +}; + struct arm_long_option_table { char *option; /* Substring to match. */ @@ -13613,6 +13641,22 @@ arm_parse_float_abi (str) return 0; } +static int +arm_parse_eabi (str) + char * str; +{ + struct arm_eabi_option_table *opt; + + for (opt = arm_eabis; opt->name != NULL; opt++) + if (strcmp (opt->name, str) == 0) + { + meabi_flags = opt->value; + return 1; + } + as_bad (_("unknown EABI `%s'\n"), str); + return 0; +} + struct arm_long_option_table arm_long_opts[] = { {"mcpu=", N_("\t assemble for CPU "), @@ -13623,6 +13667,8 @@ struct arm_long_option_table arm_long_opts[] = arm_parse_fpu, NULL}, {"mfloat-abi=", N_("\t assemble for floating point ABI "), arm_parse_float_abi, NULL}, + {"meabi=", N_("\t assemble for eabi version "), + arm_parse_eabi, NULL}, {NULL, NULL, 0, NULL} }; diff --git a/gas/doc/as.texinfo b/gas/doc/as.texinfo index d9d23dff59..fc02bb729d 100644 --- a/gas/doc/as.texinfo +++ b/gas/doc/as.texinfo @@ -263,6 +263,7 @@ gcc(1), ld(1), and the Info entries for @file{binutils} and @file{ld}. [@b{-march}=@var{architecture}[+@var{extension}@dots{}]] [@b{-mfpu}=@var{floating-point-format}] [@b{-mfloat-abi}=@var{abi}] + [@b{-meabi}=@var{ver}] [@b{-mthumb}] [@b{-EB}|@b{-EL}] [@b{-mapcs-32}|@b{-mapcs-26}|@b{-mapcs-float}| diff --git a/gas/doc/c-arm.texi b/gas/doc/c-arm.texi index 23cd7bb3fe..e871d2821b 100644 --- a/gas/doc/c-arm.texi +++ b/gas/doc/c-arm.texi @@ -228,6 +228,15 @@ The following values are recognized: and @code{hard}. +@cindex @code{-eabi=} command line option, ARM +@item -meabi=@var{ver} +This option specifies which EABI version the produced object files should +conform to. +The following values are recognised: +@code{gnu} +and +@code{3}. + @cindex @code{-EB} command line option, ARM @item -EB This option specifies that the output generated by the assembler should diff --git a/include/elf/ChangeLog b/include/elf/ChangeLog index 6e4d604b2d..385b857e38 100644 --- a/include/elf/ChangeLog +++ b/include/elf/ChangeLog @@ -1,3 +1,7 @@ +2004-03-23 Paul Brook + + * arm.h (EF_ERM_BE8, EF_ARM_LE8, EF_ARM_EABI_VER3): Add. + 2003-03-03 Andrew Stubbs * sh.h: Add EF_SH4_NOMMU_NOFPU. diff --git a/include/elf/arm.h b/include/elf/arm.h index 181a9f0c5c..158a4b55e4 100644 --- a/include/elf/arm.h +++ b/include/elf/arm.h @@ -42,10 +42,15 @@ #define EF_ARM_MAPSYMSFIRST 0x10 /* NB conflicts with EF_APCS_FLOAT */ #define EF_ARM_EABIMASK 0xFF000000 +/* Constants defined in AAELF. */ +#define EF_ARM_BE8 0x00800000 +#define EF_ARM_LE8 0x00400000 + #define EF_ARM_EABI_VERSION(flags) ((flags) & EF_ARM_EABIMASK) #define EF_ARM_EABI_UNKNOWN 0x00000000 #define EF_ARM_EABI_VER1 0x01000000 #define EF_ARM_EABI_VER2 0x02000000 +#define EF_ARM_EABI_VER3 0x03000000 /* Local aliases for some flags to match names used by COFF port. */ #define F_INTERWORK EF_ARM_INTERWORK -- 2.34.1