a couple of gas MIPS ABI issues.
Eric Christopher
echristo@twigboy.cygnus.com
Thu Nov 1 03:19:00 GMT 2001
More information about the Binutils mailing list
Thu Nov 1 03:19:00 GMT 2001
- Previous message (by thread): a couple of gas MIPS ABI issues.
- Next message (by thread): PATCH: Fix the MIPS/Sparc64 ELF linker
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
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"
- Previous message (by thread): a couple of gas MIPS ABI issues.
- Next message (by thread): PATCH: Fix the MIPS/Sparc64 ELF linker
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Binutils mailing list