From 6900d3245c59cc4b4da026328e74beae66a05b9d Mon Sep 17 00:00:00 2001 From: Paul Iannetta Date: Thu, 17 Aug 2023 16:08:29 +0200 Subject: [PATCH] kvx: fix 32-bit build and validation gas/ChangeLog: 2023-08-22 Paul Iannetta * config/tc-kvx.h (struct token_s): Use int64_t and uint64_t instead of long long and unsigned long long. * config/tc-kvx.c (kvx_set_cpu): Use ELFOSABI_GNU for the kvx-linux target. (struct token_list): * config/kvx-parse.c (promote_token): Likewise. (print_token_list): Likewise. (get_token_class): Likewise and fix immediate selection on 32-bit hosts. bfd/ChangeLog: 2023-08-22 Paul Iannetta * Makefile.am: Move elf32-kvx.lo from BFD32_BACKENDS to BFD64_BACKENDS. Remove elfxx-kvx.lo from BFD32_BACKENDS. Remove elfxx-kvx.c from BFD32_BACKENDS_CFILES. * Makefile.in: Regenerate. * config.bfd: Adjust targ_defvec and targ_selvecs and gate them behing BFD64. * configure.ac: Add target_size=64 to kvx_elf64_*vec. * configure: Regenerate. * elfnn-kvx.c (elfNN_kvx_stub_name): Cast rel->r_addend to uint64_t. (elfNN_kvx_relocate_section): Likewise. ld/ChangeLog: 2023-08-22 Paul Iannetta * Makefile.am: Move eelf32kvx.c from ALL_EMULATION_SOURCES to ALL_64_EMULATION_SOURCES. * Makefile.in: Regenerate. * configure.tgt: Split long line. --- bfd/Makefile.am | 4 +--- bfd/Makefile.in | 4 +--- bfd/config.bfd | 9 ++++----- bfd/configure | 4 ++-- bfd/configure.ac | 4 ++-- bfd/elfnn-kvx.c | 10 +++++----- gas/config/kvx-parse.c | 26 +++++++++++++------------- gas/config/tc-kvx.c | 3 +++ gas/config/tc-kvx.h | 10 +++++----- ld/Makefile.am | 2 +- ld/Makefile.in | 2 +- ld/configure.tgt | 3 ++- 12 files changed, 40 insertions(+), 41 deletions(-) diff --git a/bfd/Makefile.am b/bfd/Makefile.am index 8b0761db582..378c13198d6 100644 --- a/bfd/Makefile.am +++ b/bfd/Makefile.am @@ -318,7 +318,6 @@ BFD32_BACKENDS = \ elf32-i386.lo \ elf32-ip2k.lo \ elf32-iq2000.lo \ - elf32-kvx.lo \ elf32-lm32.lo \ elf32-m32c.lo \ elf32-m32r.lo \ @@ -359,7 +358,6 @@ BFD32_BACKENDS = \ elf32-z80.lo \ elf32.lo \ elflink.lo \ - elfxx-kvx.lo \ elfxx-sparc.lo \ elfxx-tilegx.lo \ elfxx-x86.lo \ @@ -495,7 +493,6 @@ BFD32_BACKENDS_CFILES = \ elf32-z80.c \ elf32.c \ elflink.c \ - elfxx-kvx.c \ elfxx-sparc.c \ elfxx-tilegx.c \ elfxx-x86.c \ @@ -549,6 +546,7 @@ BFD64_BACKENDS = \ coff64-rs6000.lo \ elf32-aarch64.lo \ elf32-ia64.lo \ + elf32-kvx.lo \ elf32-loongarch.lo \ elf32-mips.lo \ elf32-riscv.lo \ diff --git a/bfd/Makefile.in b/bfd/Makefile.in index cca093e1fef..bb530271fca 100644 --- a/bfd/Makefile.in +++ b/bfd/Makefile.in @@ -774,7 +774,6 @@ BFD32_BACKENDS = \ elf32-i386.lo \ elf32-ip2k.lo \ elf32-iq2000.lo \ - elf32-kvx.lo \ elf32-lm32.lo \ elf32-m32c.lo \ elf32-m32r.lo \ @@ -815,7 +814,6 @@ BFD32_BACKENDS = \ elf32-z80.lo \ elf32.lo \ elflink.lo \ - elfxx-kvx.lo \ elfxx-sparc.lo \ elfxx-tilegx.lo \ elfxx-x86.lo \ @@ -951,7 +949,6 @@ BFD32_BACKENDS_CFILES = \ elf32-z80.c \ elf32.c \ elflink.c \ - elfxx-kvx.c \ elfxx-sparc.c \ elfxx-tilegx.c \ elfxx-x86.c \ @@ -1006,6 +1003,7 @@ BFD64_BACKENDS = \ coff64-rs6000.lo \ elf32-aarch64.lo \ elf32-ia64.lo \ + elf32-kvx.lo \ elf32-loongarch.lo \ elf32-mips.lo \ elf32-riscv.lo \ diff --git a/bfd/config.bfd b/bfd/config.bfd index 30927bdbe23..2a4622219ba 100644 --- a/bfd/config.bfd +++ b/bfd/config.bfd @@ -804,14 +804,13 @@ case "${targ}" in targ_selvecs=kvx_elf32_vec want64=true ;; -#endif kvx-*-*) - targ_defvec=kvx_elf32_vec -#ifdef BFD64 - targ64_selvecs=kvx_elf64_vec -#endif + targ_defvec=kvx_elf64_vec + targ_selvecs="kvx_elf64_vec kvx_elf32_vec" + want64=true ;; +#endif lm32-*-elf | lm32-*-rtems*) targ_defvec=lm32_elf32_vec diff --git a/bfd/configure b/bfd/configure index 489531c0a7f..d43754c4787 100755 --- a/bfd/configure +++ b/bfd/configure @@ -13960,8 +13960,8 @@ do ip2k_elf32_vec) tb="$tb elf32-ip2k.lo elf32.lo $elf" ;; iq2000_elf32_vec) tb="$tb elf32-iq2000.lo elf32.lo $elf" ;; kvx_elf32_vec) tb="$tb elf32-kvx.lo elfxx-kvx.lo elf32.lo $elf $ipa" ;; - kvx_elf64_vec) tb="$tb elf64-kvx.lo elfxx-kvx.lo elf64.lo $elf $ipa" ;; - kvx_elf64_linux_vec) tb="$tb elf64-kvx.lo elfxx-kvx.lo elf64.lo $elf $ipa" ;; + kvx_elf64_vec) tb="$tb elf64-kvx.lo elfxx-kvx.lo elf64.lo $elf $ipa"; target_size=64 ;; + kvx_elf64_linux_vec) tb="$tb elf64-kvx.lo elfxx-kvx.lo elf64.lo $elf $ipa"; target_size=64 ;; lm32_elf32_vec) tb="$tb elf32-lm32.lo elf32.lo $elf" ;; lm32_elf32_fdpic_vec) tb="$tb elf32-lm32.lo elf32.lo $elf" ;; loongarch_elf32_vec) tb="$tb elf32-loongarch.lo elfxx-loongarch.lo elf32.lo elf-ifunc.lo $elf" ;; diff --git a/bfd/configure.ac b/bfd/configure.ac index 0d1cd814af6..3fdd12fe22d 100644 --- a/bfd/configure.ac +++ b/bfd/configure.ac @@ -496,8 +496,8 @@ do ip2k_elf32_vec) tb="$tb elf32-ip2k.lo elf32.lo $elf" ;; iq2000_elf32_vec) tb="$tb elf32-iq2000.lo elf32.lo $elf" ;; kvx_elf32_vec) tb="$tb elf32-kvx.lo elfxx-kvx.lo elf32.lo $elf $ipa" ;; - kvx_elf64_vec) tb="$tb elf64-kvx.lo elfxx-kvx.lo elf64.lo $elf $ipa" ;; - kvx_elf64_linux_vec) tb="$tb elf64-kvx.lo elfxx-kvx.lo elf64.lo $elf $ipa" ;; + kvx_elf64_vec) tb="$tb elf64-kvx.lo elfxx-kvx.lo elf64.lo $elf $ipa"; target_size=64 ;; + kvx_elf64_linux_vec) tb="$tb elf64-kvx.lo elfxx-kvx.lo elf64.lo $elf $ipa"; target_size=64 ;; lm32_elf32_vec) tb="$tb elf32-lm32.lo elf32.lo $elf" ;; lm32_elf32_fdpic_vec) tb="$tb elf32-lm32.lo elf32.lo $elf" ;; loongarch_elf32_vec) tb="$tb elf32-loongarch.lo elfxx-loongarch.lo elf32.lo elf-ifunc.lo $elf" ;; diff --git a/bfd/elfnn-kvx.c b/bfd/elfnn-kvx.c index 77ff2483a28..a0a528ef9d2 100644 --- a/bfd/elfnn-kvx.c +++ b/bfd/elfnn-kvx.c @@ -740,7 +740,7 @@ elfNN_kvx_stub_name (const asection *input_section, snprintf (stub_name, len, "%08x_%s+%" PRIx64 "x", (unsigned int) input_section->id, hash->root.root.root.string, - rel->r_addend); + (uint64_t) rel->r_addend); } else { @@ -751,7 +751,7 @@ elfNN_kvx_stub_name (const asection *input_section, (unsigned int) input_section->id, (unsigned int) sym_sec->id, (unsigned int) ELFNN_R_SYM (rel->r_info), - rel->r_addend); + (uint64_t) rel->r_addend); } return stub_name; @@ -2588,11 +2588,11 @@ elfNN_kvx_relocate_section (bfd *output_bfd, (*_bfd_error_handler) ((sym_type == STT_TLS /* xgettext:c-format */ - ? _("%pB(%pA+%#lx): %s used with TLS symbol %s") + ? _("%pB(%pA+%#" PRIx64 "): %s used with TLS symbol %s") /* xgettext:c-format */ - : _("%pB(%pA+%#lx): %s used with non-TLS symbol %s")), + : _("%pB(%pA+%#" PRIx64 "): %s used with non-TLS symbol %s")), input_bfd, - input_section, (long) rel->r_offset, howto->name, name); + input_section, (uint64_t) rel->r_offset, howto->name, name); } /* Original aarch64 has relaxation handling for TLS here. */ diff --git a/gas/config/kvx-parse.c b/gas/config/kvx-parse.c index ec3f912c476..c386d3eb66d 100644 --- a/gas/config/kvx-parse.c +++ b/gas/config/kvx-parse.c @@ -396,10 +396,10 @@ print_token (struct token_s token, char *buf, int bufsz) buf[i] = 0; } -static long long +static int64_t promote_token (struct token_s tok) { - long long cur_class = tok.class_id & -tok.class_id; + int64_t cur_class = tok.class_id & -tok.class_id; switch (tok.category) { case CAT_REGISTER: @@ -414,8 +414,8 @@ promote_token (struct token_s tok) input_line_pointer = tok.insn + tok.begin; expression (&exp); input_line_pointer = ilp_save; - long long new_class_id = tok.class_id; - long long old_class_id = tok.class_id; + int64_t new_class_id = tok.class_id; + int64_t old_class_id = tok.class_id; while ((new_class_id = env.promote_immediate (old_class_id)) != old_class_id && ((exp.X_op == O_symbol && !has_relocation_of_size (str_hash_find (env.reloc_hash, TOKEN_NAME (new_class_id)))) || (exp.X_op == 64 && !kvx_get_pseudo_func2 (exp.X_op_symbol, str_hash_find (env.reloc_hash, TOKEN_NAME (new_class_id)))))) @@ -443,7 +443,7 @@ is_insn (const struct token_s *token, struct token_class *classes) return res; } -static long long +static int64_t get_token_class (struct token_s *token, struct token_classes *classes, int insn_p, int modifier_p) { int cur = 0; @@ -511,12 +511,12 @@ get_token_class (struct token_s *token, struct token_classes *classes, int insn_ if (class == classes->imm_classes) { - unsigned long long uval = token_val_p + uint64_t uval = token_val_p ? token->val : strtoull (tok + (tok[0] == '-') + (tok[0] == '+'), NULL, 0); - long long val = uval; - long long pval = val < 0 ? -val : val; - int neg_power2_p = val < 0 && !(pval & (pval - 1)); + uint64_t sign_bit = ((~0ULL >> 1) ^ ~0ULL); + int64_t pval = sign_bit & uval ? 1 + (~0ULL >> 1) - (~sign_bit & uval) : (~sign_bit & uval); + int neg_power2_p = (sign_bit & uval) && !(pval & (pval - 1)); unsigned int len = 8 * sizeof (pval) - __builtin_clzll (pval); for (; class[cur].class_id != -1 && ((unsigned int) (class[cur].sz < 0 ? - class[cur].sz - !neg_power2_p : class[cur].sz) < len @@ -652,11 +652,11 @@ print_token_list (struct token_list *lst) struct token_list *cur = lst; while (cur) { - printf_debug (1, "%s (%d : %s : %d) / ", + printf_debug (0, "%s (%lld : %s : %d) / ", cur->tok, cur->val, TOKEN_NAME (cur->class_id), cur->loc); cur = cur->next; } - printf_debug (1, "\n"); + printf_debug (0, "\n"); } void @@ -804,7 +804,7 @@ retry:; parse_with_restarts (tok, cur_rule[i].jump_target, rules, errs); /* While parsing fails but there is hope since the current token can be promoted. */ - while (!fst_part && tok.class_id != (long long) promote_token (tok)) + while (!fst_part && tok.class_id != (int64_t) promote_token (tok)) { free_token_list (fst_part); tok.class_id = promote_token (tok); @@ -854,7 +854,7 @@ retry:; printf_debug (1, "snd_part: Trying to match: %s\n", TOKEN_NAME (CLASS_ID (tok))); struct token_list *snd_part = parse_with_restarts (tok, cur_rule[i].stack_it, rules, errs); - while (!snd_part && tok.class_id != (long long) promote_token (tok)) + while (!snd_part && tok.class_id != (int64_t) promote_token (tok)) { tok.class_id = promote_token (tok); printf_debug (1, ">> Restart with %s?\n", TOKEN_NAME (CLASS_ID (tok))); diff --git a/gas/config/tc-kvx.c b/gas/config/tc-kvx.c index 3cf6b27976d..00aec6c858e 100644 --- a/gas/config/tc-kvx.c +++ b/gas/config/tc-kvx.c @@ -1419,6 +1419,9 @@ kvx_set_cpu (void) if (env.params.core == -1) env.params.core = kvx_core_info->elf_core; + if (!strcmp (TARGET_OS, "linux-gnu")) + env.params.osabi = ELFOSABI_GNU; + int kvx_bfd_mach; print_insn = kvx_print_insn; diff --git a/gas/config/tc-kvx.h b/gas/config/tc-kvx.h index 11787bf0532..f8587540ca5 100644 --- a/gas/config/tc-kvx.h +++ b/gas/config/tc-kvx.h @@ -43,15 +43,15 @@ struct token_s { char *insn; int begin, end; int category; - long long class_id; - unsigned long long val; + int64_t class_id; + uint64_t val; }; struct token_list { char *tok; - unsigned long long val; - long long class_id; + uint64_t val; + int64_t class_id; int category; int loc; struct token_list *next; @@ -61,7 +61,7 @@ struct token_list struct token_class { const char ** class_values; - long long class_id; + int64_t class_id; int sz; }; diff --git a/ld/Makefile.am b/ld/Makefile.am index 07fac968bb7..be456275748 100644 --- a/ld/Makefile.am +++ b/ld/Makefile.am @@ -237,7 +237,6 @@ ALL_EMULATION_SOURCES = \ eelf32ip2k.c \ eelf32iq10.c \ eelf32iq2000.c \ - eelf32kvx.c \ eelf32lm32.c \ eelf32lm32fd.c \ eelf32lppc.c \ @@ -408,6 +407,7 @@ ALL_64_EMULATION_SOURCES = \ eelf32ebmipvxworks.c \ eelf32elmip.c \ eelf32elmipvxworks.c \ + eelf32kvx.c \ eelf32l4300.c \ eelf32lmip.c \ eelf32loongarch.c \ diff --git a/ld/Makefile.in b/ld/Makefile.in index a2aa54b69d8..c6a79774f38 100644 --- a/ld/Makefile.in +++ b/ld/Makefile.in @@ -738,7 +738,6 @@ ALL_EMULATION_SOURCES = \ eelf32ip2k.c \ eelf32iq10.c \ eelf32iq2000.c \ - eelf32kvx.c \ eelf32lm32.c \ eelf32lm32fd.c \ eelf32lppc.c \ @@ -908,6 +907,7 @@ ALL_64_EMULATION_SOURCES = \ eelf32ebmipvxworks.c \ eelf32elmip.c \ eelf32elmipvxworks.c \ + eelf32kvx.c \ eelf32l4300.c \ eelf32lmip.c \ eelf32loongarch.c \ diff --git a/ld/configure.tgt b/ld/configure.tgt index f78ba07e5ca..ff0aaaae257 100644 --- a/ld/configure.tgt +++ b/ld/configure.tgt @@ -476,7 +476,8 @@ lm32-*-*) targ_emul=elf32lm32 kvx-*-linux*) targ_emul=elf64kvx_linux targ_extra_emuls="elf64kvx" ;; -kvx-*-*) targ_emul=elf64kvx; targ_extra_emuls="elf64kvx_linux elf32kvx" +kvx-*-*) targ_emul=elf64kvx; + targ_extra_emuls="elf64kvx_linux elf32kvx" ;; m32c-*-elf) targ_emul=elf32m32c -- 2.35.1.500.gb896f729e2