a couple of gas MIPS ABI issues.
Eric Christopher
echristo@twigboy.cygnus.com
Thu Nov 1 03:19:00 GMT 2001
Looks good. Go ahead.
-eric
>
>
> 11-11-2001 Thiemo Seufer <seufer@csv.ica.uni-stuttgart.de>
>
> /gas/ChangeLog
> * config/tc-mips.c (mips_abi_level): Move in front of
> mips_set_options.
> (mips_set_options): Add members gp32, fp32, abi.
> (file_mips_gp32): New flag.
> (file_mips_fp32): New flag.
> (mips_opts): Initialize the new members.
> (mips_gp32): Remove.
> (mips_fp32): Remove.
> (HAVE_32BIT_GPRS): Use the new values from mips_opts.
> (HAVE_32BIT_FPRS): Likewise.
> (HAVE_NEWABI): Likewise.
> (HAVE_64BIT_OBJECTS): Likewise.
> (md_begin): Likewise. Save default (file) values.
> (md_parse_option): Use the new values from mips_opts.
> (s_mipsset): Likewise. Fix logic to keep the ABI selection if
> possible. Let .set mipsN work together with .set push/pop.
> Enhance error messages.
> (mips_elf_final_processing): Use file_mips_* for header processing.
>
>
> diff -BurpNX /bigdisk/src/binutils-exclude src-orig/gas/config/tc-mips.c src/gas/config/tc-mips.c
> --- src-orig/gas/config/tc-mips.c Wed Nov 7 16:07:00 2001
> +++ src/gas/config/tc-mips.c Thu Nov 8 02:24:42 2001
> @@ -113,6 +113,20 @@ extern int target_big_endian;
> ? ".rodata" \
> : (abort (), ""))
>
> +/* The ABI to use. */
> +enum mips_abi_level
> +{
> + NO_ABI = 0,
> + O32_ABI,
> + O64_ABI,
> + N32_ABI,
> + N64_ABI,
> + EABI_ABI
> +};
> +
> +/* MIPS ABI we are using for this output file. */
> +static enum mips_abi_level file_mips_abi = NO_ABI;
> +
> /* This is the set of options which may be modified by the .set
> pseudo-op. We use a struct so that .set push and .set pop are more
> reliable. */
> @@ -149,15 +163,29 @@ struct mips_set_options
> /* Non-zero if we should not autoextend mips16 instructions.
> Changed by `.set autoextend' and `.set noautoextend'. */
> int noautoextend;
> + /* Restrict general purpose registers and floating point registers
> + to 32 bit. This is initially determined when -mgp32 or -mfp32
> + is passed but can changed if the assembler code uses .set mipsN. */
> + int gp32;
> + int fp32;
> + /* The ABI currently in use. This is changed by .set mipsN to loosen
> + restrictions and doesn't affect the whole file. */
> + enum mips_abi_level abi;
> };
>
> +/* True if -mgp32 was passed. */
> +static int file_mips_gp32 = 0;
> +
> +/* True if -mfp32 was passed. */
> +static int file_mips_fp32 = 0;
> +
> /* This is the struct we use to hold the current set of options. Note
> that we must set the isa field to ISA_UNKNOWN and the mips16 field to
> -1 to indicate that they have not been initialized. */
>
> static struct mips_set_options mips_opts =
> {
> - ISA_UNKNOWN, -1, 0, 0, 0, 0, 0, 0
> + ISA_UNKNOWN, -1, 0, 0, 0, 0, 0, 0, 0, 0, NO_ABI
> };
>
> /* These variables are filled in with the masks of registers used.
> @@ -179,19 +207,6 @@ static int mips_arch = CPU_UNKNOWN;
> are optimizing. */
> static int mips_tune = CPU_UNKNOWN;
>
> -/* The ABI to use. */
> -enum mips_abi_level
> -{
> - NO_ABI = 0,
> - O32_ABI,
> - O64_ABI,
> - N32_ABI,
> - N64_ABI,
> - EABI_ABI
> -};
> -
> -static enum mips_abi_level mips_abi = NO_ABI;
> -
> /* Whether we should mark the file EABI64 or EABI32. */
> static int mips_eabi64 = 0;
>
> @@ -199,12 +214,6 @@ static int mips_eabi64 = 0;
> mips3 or greater, then mark the object file 32BITMODE. */
> static int mips_32bitmode = 0;
>
> -/* True if -mgp32 was passed. */
> -static int mips_gp32 = 0;
> -
> -/* True if -mfp32 was passed. */
> -static int mips_fp32 = 0;
> -
> /* Some ISA's have delay slots for instructions which read or write
> from a coprocessor (eg. mips1-mips3); some don't (eg mips4).
> Return true if instructions marked INSN_LOAD_COPROC_DELAY,
> @@ -228,21 +237,21 @@ static int mips_fp32 = 0;
> )
>
> #define HAVE_32BIT_GPRS \
> - (mips_gp32 \
> - || mips_abi == O32_ABI \
> + (mips_opts.gp32 \
> + || mips_opts.abi == O32_ABI \
> || ! ISA_HAS_64BIT_REGS (mips_opts.isa))
>
> #define HAVE_32BIT_FPRS \
> - (mips_fp32 \
> - || mips_abi == O32_ABI \
> + (mips_opts.fp32 \
> + || mips_opts.abi == O32_ABI \
> || ! ISA_HAS_64BIT_REGS (mips_opts.isa))
>
> #define HAVE_64BIT_GPRS (! HAVE_32BIT_GPRS)
> #define HAVE_64BIT_FPRS (! HAVE_32BIT_FPRS)
>
> -#define HAVE_NEWABI (mips_abi == N32_ABI || mips_abi == N64_ABI)
> +#define HAVE_NEWABI (mips_opts.abi == N32_ABI || mips_opts.abi == N64_ABI)
>
> -#define HAVE_64BIT_OBJECTS (mips_abi == N64_ABI)
> +#define HAVE_64BIT_OBJECTS (mips_opts.abi == N64_ABI)
>
> /* We can only have 64bit addresses if the object file format
> supports it. */
> @@ -1123,7 +1143,7 @@ md_begin ()
> to change the ISA with directives. This isn't really
> the best, but then neither is basing the abi on the isa. */
> if (ISA_HAS_64BIT_REGS (mips_opts.isa)
> - && mips_abi == EABI_ABI)
> + && mips_opts.abi == EABI_ABI)
> mips_eabi64 = 1;
>
> /* If they asked for mips1 or mips2 and a cpu that is
> @@ -1137,6 +1157,9 @@ md_begin ()
> as_warn (_("Could not set architecture and machine"));
>
> file_mips_isa = mips_opts.isa;
> + file_mips_abi = mips_opts.abi;
> + mips_opts.gp32 = file_mips_gp32;
> + mips_opts.fp32 = file_mips_fp32;
>
> op_hash = hash_new ();
>
> @@ -9802,55 +9802,55 @@ md_parse_option (c, arg)
> /* The -32 and -64 options tell the assembler to output the 32
> bit or the 64 bit MIPS ELF format. */
> case OPTION_32:
> - mips_abi = O32_ABI;
> + mips_opts.abi = O32_ABI;
> break;
>
> case OPTION_N32:
> - mips_abi = N32_ABI;
> + mips_opts.abi = N32_ABI;
> break;
>
> case OPTION_64:
> - mips_abi = N64_ABI;
> + mips_opts.abi = N64_ABI;
> if (! support_64bit_objects())
> as_fatal (_("No compiled in support for 64 bit object file format"));
> break;
>
> case OPTION_GP32:
> - mips_gp32 = 1;
> - if (mips_abi != O32_ABI)
> - mips_abi = NO_ABI;
> + file_mips_gp32 = 1;
> + if (mips_opts.abi != O32_ABI)
> + mips_opts.abi = NO_ABI;
> break;
>
> case OPTION_GP64:
> - mips_gp32 = 0;
> - if (mips_abi == O32_ABI)
> - mips_abi = NO_ABI;
> + file_mips_gp32 = 0;
> + if (mips_opts.abi == O32_ABI)
> + mips_opts.abi = NO_ABI;
> break;
>
> case OPTION_FP32:
> - mips_fp32 = 1;
> - if (mips_abi != O32_ABI)
> - mips_abi = NO_ABI;
> + file_mips_fp32 = 1;
> + if (mips_opts.abi != O32_ABI)
> + mips_opts.abi = NO_ABI;
> break;
>
> case OPTION_MABI:
> if (strcmp (arg, "32") == 0)
> - mips_abi = O32_ABI;
> + mips_opts.abi = O32_ABI;
> else if (strcmp (arg, "o64") == 0)
> - mips_abi = O64_ABI;
> + mips_opts.abi = O64_ABI;
> else if (strcmp (arg, "n32") == 0)
> - mips_abi = N32_ABI;
> + mips_opts.abi = N32_ABI;
> else if (strcmp (arg, "64") == 0)
> {
> - mips_abi = N64_ABI;
> + mips_opts.abi = N64_ABI;
> if (! support_64bit_objects())
> as_fatal (_("No compiled in support for 64 bit object file "
> "format"));
> }
> else if (strcmp (arg, "eabi") == 0)
> - mips_abi = EABI_ABI;
> + mips_opts.abi = EABI_ABI;
> else
> - mips_abi = NO_ABI;
> + mips_opts.abi = NO_ABI;
> break;
> #endif /* OBJ_ELF */
>
> @@ -11012,10 +11203,6 @@ s_mipsset (x)
> else if (strncmp (name, "mips", 4) == 0)
> {
> int isa;
> - static int saved_mips_gp32;
> - static int saved_mips_fp32;
> - static enum mips_abi_level saved_mips_abi;
> - static int is_saved;
>
> /* Permit the user to change the ISA on the fly. Needless to
> say, misuse can cause serious problems. */
> @@ -11023,41 +11210,28 @@ s_mipsset (x)
> switch (isa)
> {
> case 0:
> - mips_gp32 = saved_mips_gp32;
> - mips_fp32 = saved_mips_fp32;
> - mips_abi = saved_mips_abi;
> - is_saved = 0;
> + mips_opts.gp32 = file_mips_gp32;
> + mips_opts.fp32 = file_mips_fp32;
> + mips_opts.abi = file_mips_abi;
> break;
> case 1:
> case 2:
> case 32:
> - if (! is_saved)
> - {
> - saved_mips_gp32 = mips_gp32;
> - saved_mips_fp32 = mips_fp32;
> - saved_mips_abi = mips_abi;
> - }
> - mips_gp32 = 1;
> - mips_fp32 = 1;
> - is_saved = 1;
> + mips_opts.gp32 = 1;
> + mips_opts.fp32 = 1;
> break;
> case 3:
> case 4:
> case 5:
> case 64:
> - if (! is_saved)
> - {
> - saved_mips_gp32 = mips_gp32;
> - saved_mips_fp32 = mips_fp32;
> - saved_mips_abi = mips_abi;
> - }
> - mips_gp32 = 0;
> - mips_fp32 = 0;
> - mips_abi = NO_ABI;
> - is_saved = 1;
> + /* Loosen ABI register width restriction. */
> + if (mips_opts.abi == O32_ABI)
> + mips_opts.abi = NO_ABI;
> + mips_opts.gp32 = 0;
> + mips_opts.fp32 = 0;
> break;
> default:
> - as_bad (_("unknown ISA level"));
> + as_bad (_("unknown ISA level %s"), name + 4);
> break;
> }
>
> @@ -11071,7 +11244,7 @@ s_mipsset (x)
> case 5: mips_opts.isa = ISA_MIPS5; break;
> case 32: mips_opts.isa = ISA_MIPS32; break;
> case 64: mips_opts.isa = ISA_MIPS64; break;
> - default: as_bad (_("unknown ISA level")); break;
> + default: as_bad (_("unknown ISA level %s"), name + 4); break;
> }
> }
> else if (strcmp (name, "autoextend") == 0)
> @@ -12477,20 +12477,20 @@ mips_elf_final_processing ()
> elf_elfheader (stdoutput)->e_flags |= EF_MIPS_PIC;
>
> /* Set the MIPS ELF ABI flags. */
> - if (mips_abi == NO_ABI)
> + if (file_mips_abi == NO_ABI)
> ;
> - else if (mips_abi == O32_ABI)
> + else if (file_mips_abi == O32_ABI)
> elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O32;
> - else if (mips_abi == O64_ABI)
> + else if (file_mips_abi == O64_ABI)
> elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O64;
> - else if (mips_abi == EABI_ABI)
> + else if (file_mips_abi == EABI_ABI)
> {
> if (mips_eabi64)
> elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI64;
> else
> elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI32;
> }
> - else if (mips_abi == N32_ABI)
> + else if (file_mips_abi == N32_ABI)
> elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ABI2;
>
> /* Nothing to do for "64". */
>
--
Fridays are not "pants optional"
More information about the Binutils
mailing list