From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from loongson.cn (mail.loongson.cn [114.242.206.163]) by sourceware.org (Postfix) with ESMTP id 3E8F4385ED4B for ; Sat, 12 Mar 2022 07:44:32 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 3E8F4385ED4B Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=loongson.cn Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=loongson.cn Received: from 5.5.5 (unknown [10.2.5.5]) by mail.loongson.cn (Coremail) with SMTP id AQAAf9AxGsxaTyxichEIAA--.4164S2; Sat, 12 Mar 2022 15:44:30 +0800 (CST) From: liuzhensong To: binutils@sourceware.org Cc: liuzhensong Subject: [PATCH] LoongArch: Update ABI eflag in elf header. Date: Sat, 12 Mar 2022 15:44:24 +0800 Message-Id: <20220312074424.3865421-1-liuzhensong@loongson.cn> X-Mailer: git-send-email 2.31.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-CM-TRANSID: AQAAf9AxGsxaTyxichEIAA--.4164S2 X-Coremail-Antispam: 1UD129KBjvJXoW3Gw1kWw1fJr1kZrWxuw13XFb_yoWxKr18pw 1jyr45Ar1rKFsxGF48JFn09rnrKF4xZrWYyry7JF40qryqvry8Jw4qgrs3GF1rCF4UXas7 uwn7Aw4jvFWkXw7anT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUkS14x267AKxVWUJVW8JwAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2ocxC64kIII0Yj41l84x0c7CEw4AK67xGY2AK02 1l84ACjcxK6xIIjxv20xvE14v26r1j6r1xM28EF7xvwVC0I7IYx2IY6xkF7I0E14v26r1j 6r4UM28EF7xvwVC2z280aVAFwI0_Gr1j6F4UJwA2z4x0Y4vEx4A2jsIEc7CjxVAFwI0_Gr 1j6F4UJwAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv 7VC0I7IYx2IY67AKxVWUAVWUtwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r 1j6r4UM4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwCY02Avz4vE-syl 42xK82IYc2Ij64vIr41l4I8I3I0E4IkC6x0Yz7v_Jr0_Gr1lx2IqxVAqx4xG67AKxVWUJV WUGwC20s026x8GjcxK67AKxVWUGVWUWwC2zVAF1VAY17CE14v26r1Y6r17MIIYrxkI7VAK I48JMIIF0xvE2Ix0cI8IcVAFwI0_Jr0_JF4lIxAIcVC0I7IYx2IY6xkF7I0E14v26r1j6r 4UMIIF0xvE42xK8VAvwI8IcIk0rVW8JVW3JwCI42IY6I8E87Iv67AKxVW8JVWxJwCI42IY 6I8E87Iv6xkF7I0E14v26r4j6r4UJbIYCTnIWIevJa73UjIFyTuYvjfUYwIDUUUUU X-CM-SenderInfo: holx6xphqv003j6o00pqjv00gofq/ X-Spam-Status: No, score=-13.4 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, SPF_HELO_PASS, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: binutils@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Binutils mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 12 Mar 2022 07:44:34 -0000 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. --- bfd/elfnn-loongarch.c | 2 +- gas/config/tc-loongarch.c | 46 +++++++++++++++++---------------------- include/elf/loongarch.h | 37 +++++++++++++++++++------------ 3 files changed, 44 insertions(+), 41 deletions(-) diff --git a/bfd/elfnn-loongarch.c b/bfd/elfnn-loongarch.c index e7861894c07..ed5d2641783 100644 --- a/bfd/elfnn-loongarch.c +++ b/bfd/elfnn-loongarch.c @@ -401,7 +401,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; diff --git a/gas/config/tc-loongarch.c b/gas/config/tc-loongarch.c index 3f7aa996f3f..15fc4fa5e41 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; } diff --git a/include/elf/loongarch.h b/include/elf/loongarch.h index 1893ef5faae..b7aa4ff069c 100644 --- a/include/elf/loongarch.h +++ b/include/elf/loongarch.h @@ -93,27 +93,36 @@ 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 0x1 -#define EF_LOONGARCH_ABI_LP64 0x3 -#define EF_LOONGARCH_ABI_MASK 0x3 +/*The flag lp64s/lp64f/lp64d/ilp32s/ilp32f/ilp32d 3bits. */ +#define EF_LOONGARCH_ABI_LP64_SOFT_FLOAT 0x1 +#define EF_LOONGARCH_ABI_LP64_SINGLE_FLOAT 0x2 +#define EF_LOONGARCH_ABI_LP64_DOUBLE_FLOAT 0x3 -#define EF_LOONGARCH_FLOAT_ABI_SOFT 0x0c -#define EF_LOONGARCH_FLOAT_ABI_SINGLE 0x08 -#define EF_LOONGARCH_FLOAT_ABI_DOUBLE 0x00 -#define EF_LOONGARCH_FLOAT_ABI_MASK 0x3c +#define EF_LOONGARCH_ABI_ILP32_SOFT_FLOAT 0x5 +#define EF_LOONGARCH_ABI_ILP32_SINGLE_FLOAT 0x6 +#define EF_LOONGARCH_ABI_ILP32_DOUBLE_FLOAT 0x7 + +#define EF_LOONGARCH_ABI_MASK 0x7 +#define EF_LOONGARCH_ABI_ILP32_MASK 0x4 +#define EF_LOONGARCH_ABI_FLOAT_MASK 0x3 +#define EF_LOONGARCH_ABI_SOFT_FLOAT_MASK 0x1 +#define EF_LOONGARCH_ABI_SINGLE_FLOAT_MASK 0x2 +#define EF_LOONGARCH_ABI_DOUBLE_FLOAT_MASK 0x3 + +#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) + (EF_LOONGARCH_ABI(abi) && (!(EF_LOONGARCH_ABI(abi) & EF_LOONGARCH_ABI_ILP32_MASK))) #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_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) -#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_SINGLE_FLOAT_MASK)) -#define EF_LOONGARCH_ABI (EF_LOONGARCH_ABI_MASK | EF_LOONGARCH_FLOAT_ABI_MASK) +#define EF_LOONGARCH_IS_DOUBLE_FLOAT(abi) \ + (!((EF_LOONGARCH_ABI(abi) & EF_LOONGARCH_ABI_FLOAT_MASK) ^ EF_LOONGARCH_ABI_DOUBLE_FLOAT_MASK)) #endif /* _ELF_LOONGARCH_H */ -- 2.31.1