Skip to content

Commit

Permalink
binutils: change flags args and bits
Browse files Browse the repository at this point in the history
  bfd/elfnn-loongarch.c
  gas/config/tc-loongarch.c
  gdb/loongarch-tdep.c
  include/elf/loongarch.h
  • Loading branch information
lzshhxx committed Nov 26, 2021
1 parent 7d51804 commit aacb0bf
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 43 deletions.
2 changes: 1 addition & 1 deletion bfd/elfnn-loongarch.c
Original file line number Diff line number Diff line change
Expand Up @@ -403,7 +403,7 @@ elfNN_loongarch_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
}

/* Disallow linking different ABIs. */
if ((out_flags ^ in_flags) & EF_LOONGARCH_ABI)
if (EF_LOONGARCH_ABI(out_flags ^ in_flags) & EF_LOONGARCH_ABI_MASK)
{
_bfd_error_handler (_ ("%pB: can't link different ABI object."), ibfd);
goto fail;
Expand Down
46 changes: 20 additions & 26 deletions gas/config/tc-loongarch.c
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,6 @@ enum options
struct option md_longopts[] =
{
{ "mabi", required_argument, NULL, OPTION_ABI },
{ "mfloat-abi", required_argument, NULL, OPTION_FLOAT_ABI },

{ "mfpu", required_argument, NULL, OPTION_FLOAT_ISA },

Expand All @@ -139,35 +138,36 @@ int
md_parse_option (int c, const char *arg)
{
int ret = 1;
char lp64[256] = "";
char ilp32[256] = "";
unsigned char *suf = (unsigned char *)arg;

lp64['s'] = lp64['S'] = EF_LOONGARCH_ABI_LP64_SOFT_FLOAT;
lp64['f'] = lp64['F'] = EF_LOONGARCH_ABI_LP64_SINGLE_FLOAT;
lp64['d'] = lp64['D'] = EF_LOONGARCH_ABI_LP64_DOUBLE_FLOAT;

ilp32['s'] = ilp32['S'] = EF_LOONGARCH_ABI_ILP32_SOFT_FLOAT;
ilp32['f'] = ilp32['F'] = EF_LOONGARCH_ABI_ILP32_SINGLE_FLOAT;
ilp32['d'] = ilp32['D'] = EF_LOONGARCH_ABI_ILP32_DOUBLE_FLOAT;

switch (c)
{
case OPTION_ABI:
if (strcasecmp (arg, "lp64") == 0)
if (strncasecmp (arg, "lp64", 4) == 0 && lp64[suf[4]] != 0)
{
LARCH_opts.ase_abi |= EF_LOONGARCH_ABI_LP64;
LARCH_opts.ase_ilp32 = 1;
LARCH_opts.ase_lp64 = 1;
LARCH_opts.ase_abi = lp64[suf[4]];
}
else if (strcasecmp (arg, "ilp32") == 0)
else if (strncasecmp (arg, "ilp32", 5) == 0 && ilp32[suf[5]] != 0)
{
LARCH_opts.ase_abi |= EF_LOONGARCH_ABI_ILP32;
LARCH_opts.ase_abi = ilp32[suf[5]];
LARCH_opts.ase_ilp32 = 1;
}
else
ret = 0;
break;

case OPTION_FLOAT_ABI:
if (strcasecmp (arg, "soft") == 0)
LARCH_opts.ase_abi |= EF_LOONGARCH_FLOAT_ABI_SOFT;
else if (strcasecmp (arg, "single") == 0)
LARCH_opts.ase_abi |= EF_LOONGARCH_FLOAT_ABI_SINGLE;
else if (strcasecmp (arg, "double") == 0)
LARCH_opts.ase_abi |= EF_LOONGARCH_FLOAT_ABI_DOUBLE;
else
ret = 0;
break;

case OPTION_FLOAT_ISA:
if (strcasecmp (arg, "soft") == 0)
LARCH_opts.ase_nf = 1;
Expand Down Expand Up @@ -214,31 +214,25 @@ static struct htab *x_htab = NULL;
void
loongarch_after_parse_args ()
{
/* Set default ABI/ISA LP64. */
/* Set default ABI/ISA LP64D. */
if (!EF_LOONGARCH_IS_LP64(LARCH_opts.ase_abi)
&& !EF_LOONGARCH_IS_ILP32(LARCH_opts.ase_abi))
{
if (strcmp (default_arch, "loongarch64") == 0)
{
LARCH_opts.ase_abi |= EF_LOONGARCH_ABI_LP64;
LARCH_opts.ase_abi = EF_LOONGARCH_ABI_LP64_DOUBLE_FLOAT;
LARCH_opts.ase_ilp32 = 1;
LARCH_opts.ase_lp64 = 1;
}
else if (strcmp (default_arch, "loongarch32") == 0)
{
LARCH_opts.ase_abi |= EF_LOONGARCH_ABI_ILP32;
LARCH_opts.ase_abi = EF_LOONGARCH_ABI_ILP32_DOUBLE_FLOAT;
LARCH_opts.ase_ilp32 = 1;
}
else
as_bad ("unknown default architecture `%s'", default_arch);
}

/* Set default ABI double-float. */
if (!EF_LOONGARCH_IS_SOFT_FLOAT(LARCH_opts.ase_abi)
&& !EF_LOONGARCH_IS_SINGLE_FLOAT(LARCH_opts.ase_abi)
&& !EF_LOONGARCH_IS_DOUBLE_FLOAT(LARCH_opts.ase_abi))
LARCH_opts.ase_abi |= EF_LOONGARCH_FLOAT_ABI_DOUBLE;

/* Set default ISA double-float. */
if (!LARCH_opts.ase_nf
&& !LARCH_opts.ase_sf
Expand Down Expand Up @@ -1377,5 +1371,5 @@ loongarch_handle_align (fragS *fragp)
void
loongarch_elf_final_processing (void)
{
elf_elfheader (stdoutput)->e_flags |= LARCH_opts.ase_abi;
elf_elfheader (stdoutput)->e_flags = LARCH_opts.ase_abi;
}
4 changes: 2 additions & 2 deletions gdb/loongarch-tdep.c
Original file line number Diff line number Diff line change
Expand Up @@ -1516,8 +1516,8 @@ loongarch_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
if (info.abfd != NULL
&& bfd_get_flavour (info.abfd) == bfd_target_elf_flavour)
{
tdep->ef_abi = elf_elfheader (info.abfd)->e_flags & EF_LOONGARCH_ABI;
gdb_assert (0 != (tdep->ef_abi & EF_LOONGARCH_ABI_MASK));
tdep->ef_abi = EF_LOONGARCH_ABI(elf_elfheader (info.abfd)->e_flags);
gdb_assert (0 != tdep->ef_abi);

}

Expand Down
38 changes: 24 additions & 14 deletions include/elf/loongarch.h
Original file line number Diff line number Diff line change
Expand Up @@ -93,27 +93,37 @@ RELOC_NUMBER (R_LARCH_GNU_VTENTRY, 58)
END_RELOC_NUMBERS (R_LARCH_count)

/* Processor specific flags for the ELF header e_flags field. */
#define EF_LOONGARCH_ABI_ILP32 0b01
#define EF_LOONGARCH_ABI_LP64 0b11
#define EF_LOONGARCH_ABI_MASK 0b11
#define EF_LOONGARCH_ABI_LP64_SOFT_FLOAT 0b001
#define EF_LOONGARCH_ABI_LP64_SINGLE_FLOAT 0b010
#define EF_LOONGARCH_ABI_LP64_DOUBLE_FLOAT 0b011

#define EF_LOONGARCH_FLOAT_ABI_SOFT 0b001100
#define EF_LOONGARCH_FLOAT_ABI_SINGLE 0b001000
#define EF_LOONGARCH_FLOAT_ABI_DOUBLE 0b000000
#define EF_LOONGARCH_FLOAT_ABI_MASK 0b111100
#define EF_LOONGARCH_ABI_ILP32_SOFT_FLOAT 0b101
#define EF_LOONGARCH_ABI_ILP32_SINGLE_FLOAT 0b110
#define EF_LOONGARCH_ABI_ILP32_DOUBLE_FLOAT 0b111

#define EF_LOONGARCH_ABI_MASK 0x07U

#define EF_LOONGARCH_ABI_ILP32_MASK 0b100

#define EF_LOONGARCH_ABI_FLOAT_MASK 0x03U

#define EF_LOONGARCH_ABI_SOFT_FLOAT_MASK 0b001
#define EF_LOONGARCH_ABI_SINGLE_FLOAT_MASK 0b010
#define EF_LOONGARCH_ABI_DOUBLE_FLOAT_MASK 0b011

#define EF_LOONGARCH_ABI(abi) (EF_LOONGARCH_ABI_MASK & (abi))

#define EF_LOONGARCH_IS_LP64(abi) \
((abi & EF_LOONGARCH_ABI_MASK) == EF_LOONGARCH_ABI_LP64)
#define EF_LOONGARCH_IS_ILP32(abi) \
((abi & EF_LOONGARCH_ABI_MASK) == EF_LOONGARCH_ABI_ILP32)
(EF_LOONGARCH_ABI(abi) && (EF_LOONGARCH_ABI(abi) & EF_LOONGARCH_ABI_ILP32_MASK))
#define EF_LOONGARCH_IS_LP64(abi) \
(EF_LOONGARCH_ABI(abi) && (!(EF_LOONGARCH_ABI(abi) & EF_LOONGARCH_ABI_ILP32_MASK)))

#define EF_LOONGARCH_IS_SOFT_FLOAT(abi) \
((abi & EF_LOONGARCH_FLOAT_ABI_MASK) == EF_LOONGARCH_FLOAT_ABI_SOFT)
(!((EF_LOONGARCH_ABI(abi) & EF_LOONGARCH_ABI_FLOAT_MASK) ^ EF_LOONGARCH_ABI_SOFT_FLOAT_MASK))
#define EF_LOONGARCH_IS_SINGLE_FLOAT(abi) \
((abi & EF_LOONGARCH_FLOAT_ABI_MASK) == EF_LOONGARCH_FLOAT_ABI_SINGLE)
(!((EF_LOONGARCH_ABI(abi) & EF_LOONGARCH_ABI_FLOAT_MASK) ^ EF_LOONGARCH_ABI_SINGLE_FLOAT_MASK))
#define EF_LOONGARCH_IS_DOUBLE_FLOAT(abi) \
((abi & EF_LOONGARCH_FLOAT_ABI_MASK) == EF_LOONGARCH_FLOAT_ABI_DOUBLE)
(!((EF_LOONGARCH_ABI(abi) & EF_LOONGARCH_ABI_FLOAT_MASK) ^ EF_LOONGARCH_ABI_DOUBLE_FLOAT_MASK))

#define EF_LOONGARCH_ABI (EF_LOONGARCH_ABI_MASK | EF_LOONGARCH_FLOAT_ABI_MASK)

#endif /* _ELF_LOONGARCH_H */

0 comments on commit aacb0bf

Please sign in to comment.