[v2] RISC-V: Handle multi-letter extension for multilib-generator

Message ID 20200701071310.87172-1-kito.cheng@sifive.com
State New
Headers show
Series
  • [v2] RISC-V: Handle multi-letter extension for multilib-generator
Related show

Commit Message

Kito Cheng July 1, 2020, 7:13 a.m.
- The order of multi-lib config could be wrong if multi-ltter are
   used, e.g. `./multilib-generator rv32izfh-ilp32--c`, would expect
   rv32ic_zfh/ilp32 reuse rv32i_zfh/ilp32, however the multi-ltter is not
   handled correctly, it will generate reuse rule for rv32izfhc/ilp32
   which is invalid arch configuration.

 - Remove re-use rule gen for g/imafd, because we canonicalize the -march at
   gcc driver too, so we don't need handle 'g' for multilib now.

gcc/ChangeLog:

	* config/riscv/multilib-generator (arch_canonicalize): Handle
	multi-letter extension.
	Using underline as separator between different extensions.
---
 gcc/config/riscv/multilib-generator | 30 +++++++++++++++++++++--------
 1 file changed, 22 insertions(+), 8 deletions(-)

-- 
2.27.0

Comments

Jim Wilson July 1, 2020, 11:28 p.m. | #1
On Wed, Jul 1, 2020 at 12:13 AM Kito Cheng <kito.cheng@sifive.com> wrote:
>         * config/riscv/multilib-generator (arch_canonicalize): Handle

>         multi-letter extension.

>         Using underline as separator between different extensions.


Looks fine to me.  Though I was expecting you to just commit the patch
with or without the change I suggested.

Jim
Kito Cheng July 2, 2020, 2:40 a.m. | #2
Hi Jim:

Committed, thanks.

On Thu, Jul 2, 2020 at 7:28 AM Jim Wilson <jimw@sifive.com> wrote:
>

> On Wed, Jul 1, 2020 at 12:13 AM Kito Cheng <kito.cheng@sifive.com> wrote:

> >         * config/riscv/multilib-generator (arch_canonicalize): Handle

> >         multi-letter extension.

> >         Using underline as separator between different extensions.

>

> Looks fine to me.  Though I was expecting you to just commit the patch

> with or without the change I suggested.


Oh, OK, I'll treat `LGTM/This looks good to me.` as OK to commit
signals in future :)

>

> Jim

Patch

diff --git a/gcc/config/riscv/multilib-generator b/gcc/config/riscv/multilib-generator
index b9194e6d3cc1..8f4df183db21 100755
--- a/gcc/config/riscv/multilib-generator
+++ b/gcc/config/riscv/multilib-generator
@@ -39,12 +39,12 @@  reuse = []
 canonical_order = "mafdgqlcbjtpvn"
 
 def arch_canonicalize(arch):
-  # TODO: Support Z, S, H, or X extensions.
   # TODO: Support implied extensions, e.g. D implied F in latest spec.
   # TODO: Support extension version.
   new_arch = ""
   if arch[:5] in ['rv32e', 'rv32i', 'rv32g', 'rv64i', 'rv64g']:
-    new_arch = arch[:5]
+    # TODO: We should expand g to imadzifencei once we support newer spec.
+    new_arch = arch[:5].replace("g", "imafd")
   else:
     raise Exception("Unexpected arch: `%s`" % arch[:5])
 
@@ -56,30 +56,44 @@  def arch_canonicalize(arch):
   long_ext_prefixes_idx = list(filter(lambda x: x != -1, long_ext_prefixes_idx))
   if long_ext_prefixes_idx:
     first_long_ext_idx = min(long_ext_prefixes_idx)
-    long_exts = arch[first_long_ext_idx:]
+    long_exts = arch[first_long_ext_idx:].split("_")
     std_exts = arch[5:first_long_ext_idx]
   else:
-    long_exts = ""
+    long_exts = []
     std_exts = arch[5:]
 
+  # Single letter extension might appear in the long_exts list,
+  # becasue we just append extensions list to the arch string.
+  std_exts += "".join(filter(lambda x:len(x) == 1, long_exts))
+
+  # Multi-letter extension must be in lexicographic order.
+  long_exts = sorted(filter(lambda x:len(x) != 1, long_exts))
+
   # Put extensions in canonical order.
   for ext in canonical_order:
     if ext in std_exts:
       new_arch += ext
 
+  # Check every extension is processed.
+  for ext in std_exts:
+    if ext == '_':
+      continue
+    if ext not in canonical_order:
+      raise Exception("Unsupported extension `%s`" % ext)
+
   # Concat rest of the multi-char extensions.
-  new_arch += long_exts
+  if long_exts:
+    new_arch += "_" + "_".join(long_exts)
   return new_arch
 
 for cfg in sys.argv[1:]:
   (arch, abi, extra, ext) = cfg.split('-')
+  arch = arch_canonicalize (arch)
   arches[arch] = 1
   abis[abi] = 1
   extra = list(filter(None, extra.split(',')))
   ext = list(filter(None, ext.split(',')))
-  alts = sum([[x] + [x + y for y in ext] for x in [arch] + extra], [])
-  # TODO: We should expand g to imadzifencei once we support newer spec.
-  alts = alts + [x.replace('imafd', 'g') for x in alts if 'imafd' in x]
+  alts = sum([[x] + [x + "_" + y for y in ext] for x in [arch] + extra], [])
   alts = list(map(arch_canonicalize, alts))
   for alt in alts[1:]:
     arches[alt] = 1