RISC-V: Allow to link the objects with unknown prefixed extensions.
authorNelson Chu <nelson.chu@sifive.com>
Wed, 26 May 2021 02:34:13 +0000 (10:34 +0800)
committerNelson Chu <nelson.chu@sifive.com>
Wed, 26 May 2021 03:02:29 +0000 (11:02 +0800)
Since the policies of GNU and llvm toolchain are different for now,
current binutils mainline cannot accept any draft extensions, including
rvv, zfh, ....  The Clang/LLVM allows these draft stuff on mainline,
but the GNU ld might be used with them, so this causes the link time
problems.

The patch allows ld to link the objects with unknown prefixed extensions,
which are probably generated by LLVM or customized toolchains.

bfd/
    * elfxx-riscv.h (check_unknown_prefixed_ext): New bool.
    * elfxx-riscv.c (riscv_parse_prefixed_ext): Do not check the
    prefixed extension name if check_unknown_prefixed_ext is false.
    * elfnn-riscv.c (riscv_merge_arch_attr_info): Set
    check_unknown_prefixed_ext to false for linker.
gas/
    * config/tc-riscv.c (riscv_set_arch): Set
    check_unknown_prefixed_ext to true for assembler.

bfd/ChangeLog
bfd/elfnn-riscv.c
bfd/elfxx-riscv.c
bfd/elfxx-riscv.h
gas/ChangeLog
gas/config/tc-riscv.c

index fec2dcbb6811c4b483899eb9ecd380ab76f6a841..608ea545ad7c765860d3090036e1be201ae13c94 100644 (file)
@@ -1,3 +1,11 @@
+2021-05-26  Nelson Chu  <nelson.chu@sifive.com>
+
+       * elfxx-riscv.h (check_unknown_prefixed_ext): New bool.
+       * elfxx-riscv.c (riscv_parse_prefixed_ext): Do not check the
+       prefixed extension name if check_unknown_prefixed_ext is false.
+       * elfnn-riscv.c (riscv_merge_arch_attr_info): Set
+       check_unknown_prefixed_ext to false for linker.
+
 2021-05-25  Nick Clifton  <nickc@redhat.com>
 
        * elf32-arn.c (struct elf_arm_obj_tdata): Add num_entries field.
index 2068edebdb6aa98cd61f395460d58a2ab125ebbe..d2781f3099350859d413cb855d034d90d17d3b17 100644 (file)
@@ -3558,11 +3558,13 @@ riscv_merge_arch_attr_info (bfd *ibfd, char *in_arch, char *out_arch)
   rpe_in.error_handler = _bfd_error_handler;
   rpe_in.xlen = &xlen_in;
   rpe_in.get_default_version = NULL;
+  rpe_in.check_unknown_prefixed_ext = false;
 
   rpe_out.subset_list = &out_subsets;
   rpe_out.error_handler = _bfd_error_handler;
   rpe_out.xlen = &xlen_out;
   rpe_out.get_default_version = NULL;
+  rpe_out.check_unknown_prefixed_ext = false;
 
   if (in_arch == NULL && out_arch == NULL)
     return NULL;
index 7206ec8573bdef6bada4e54fea20195d6c4ea118..39b69e2b0a54449b98bed53e2fa4e039bda0e3d1 100644 (file)
@@ -1681,7 +1681,8 @@ riscv_parse_prefixed_ext (riscv_parse_subset_t *rps,
         and cannot simply be the prefixed name.  */
 
       /* Check that the extension name is well-formed.  */
-      if (!riscv_valid_prefixed_ext (subset))
+      if (rps->check_unknown_prefixed_ext
+         && !riscv_valid_prefixed_ext (subset))
        {
          rps->error_handler
            (_("-march=%s: unknown prefixed ISA extension `%s'"),
index ff18ff6f0b86d46fcb2c044c86d7adb0634155f9..c2fff92608624f71406b0ca66a1f6c8e2a6a910f 100644 (file)
@@ -74,6 +74,7 @@ typedef struct
   void (*get_default_version) (const char *,
                               int *,
                               int *);
+  bool check_unknown_prefixed_ext;
 } riscv_parse_subset_t;
 
 extern bool
index 45cce1b99d046532f11871442c3143899080ba1b..eac946f13c14ff6c3891e183c280fe5617fa39d5 100644 (file)
@@ -1,3 +1,8 @@
+2021-05-26  Nelson Chu  <nelson.chu@sifive.com>
+
+       * config/tc-riscv.c (riscv_set_arch): Set
+       check_unknown_prefixed_ext to true for assembler.
+
 2021-05-25  Tamar Christina  <tamar.christina@arm.com>
 
        PR gas/25235
index a76e53d51c305cd26f242e596e582e793a8bfd12..42e575293691ea481679a9845f96a8785b63456e 100644 (file)
@@ -410,6 +410,7 @@ riscv_set_arch (const char *s)
   rps.error_handler = as_bad;
   rps.xlen = &xlen;
   rps.get_default_version = riscv_get_default_ext_version;
+  rps.check_unknown_prefixed_ext = true;
 
   if (s == NULL)
     return;