diff options
author | liuzhensong <liuzhensong@loongson.cn> | 2022-02-21 14:28:29 +0800 |
---|---|---|
committer | liuzhensong <liuzhensong@loongson.cn> | 2022-03-20 09:37:12 +0800 |
commit | 3b14682a432e61c756ec9ad0b5bf5f8136e2cdce (patch) | |
tree | f6902033039cad8bc0a80090702d2c8e149f6145 /gas | |
parent | 1848a40fdd134c5579e743d93f1ca9acc0b4b486 (diff) | |
download | gdb-3b14682a432e61c756ec9ad0b5bf5f8136e2cdce.zip gdb-3b14682a432e61c756ec9ad0b5bf5f8136e2cdce.tar.gz gdb-3b14682a432e61c756ec9ad0b5bf5f8136e2cdce.tar.bz2 |
LoongArch: Update ABI eflag in elf header.
Update LoongArch ABI eflag in elf header.
ilp32s 0x5
ilp32f 0x6
ilp32d 0x7
lp64s 0x1
lp64f 0x2
lp64d 0x3
bfd/
* elfnn-loongarch.c Check object flags while ld.
gas/
* tc-loongarch.c Write eflag to elf header.
include/elf
* loongarch.h Define ABI number.
Diffstat (limited to 'gas')
-rw-r--r-- | gas/config/tc-loongarch.c | 46 |
1 files changed, 20 insertions, 26 deletions
diff --git a/gas/config/tc-loongarch.c b/gas/config/tc-loongarch.c index 3f7aa99..15fc4fa 100644 --- a/gas/config/tc-loongarch.c +++ b/gas/config/tc-loongarch.c @@ -123,7 +123,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 }, @@ -140,35 +139,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; @@ -215,31 +215,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 @@ -1306,5 +1300,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; } |