RISC-V: Allow multi-lib build with different code model

Message ID 20210721084523.64629-1-kito.cheng@sifive.com
State New
Headers show
Series
  • RISC-V: Allow multi-lib build with different code model
Related show

Commit Message

Kito Cheng July 21, 2021, 8:45 a.m.
--with-multilib-generator was only support for different ISA/ABI
combination, however code model is effect the code gen a lots it
should able to handled in multilib mechanism.

Adding `--cmodel=` option to `--with-multilib-generator` to generating
multilib combination with different code model.

E.g.
--with-multilib-generator="rv64ima-lp64--;--cmodel=medlow,medany"
will generate 3 multi-lib suppport:
1) rv64ima with lp64
2) rv64ima with lp64 and medlow code model
3) rv64ima with lp64 and medany code model

gcc/

	* config/riscv/multilib-generator: Support code model option for
	multi-lib.
	* doc/install.texi: Add document of new option for
	--with-multilib-generator.
---
 gcc/config/riscv/multilib-generator | 86 +++++++++++++++++++----------
 gcc/doc/install.texi                | 17 ++++++
 2 files changed, 73 insertions(+), 30 deletions(-)

-- 
2.31.1

Comments

Kito Cheng Aug. 16, 2021, 4:32 a.m. | #1
Committed to trunk.

On Wed, Jul 21, 2021 at 4:45 PM Kito Cheng <kito.cheng@sifive.com> wrote:
>

> --with-multilib-generator was only support for different ISA/ABI

> combination, however code model is effect the code gen a lots it

> should able to handled in multilib mechanism.

>

> Adding `--cmodel=` option to `--with-multilib-generator` to generating

> multilib combination with different code model.

>

> E.g.

> --with-multilib-generator="rv64ima-lp64--;--cmodel=medlow,medany"

> will generate 3 multi-lib suppport:

> 1) rv64ima with lp64

> 2) rv64ima with lp64 and medlow code model

> 3) rv64ima with lp64 and medany code model

>

> gcc/

>

>         * config/riscv/multilib-generator: Support code model option for

>         multi-lib.

>         * doc/install.texi: Add document of new option for

>         --with-multilib-generator.

> ---

>  gcc/config/riscv/multilib-generator | 86 +++++++++++++++++++----------

>  gcc/doc/install.texi                | 17 ++++++

>  2 files changed, 73 insertions(+), 30 deletions(-)

>

> diff --git a/gcc/config/riscv/multilib-generator b/gcc/config/riscv/multilib-generator

> index fe115b3184f..1164d1c5c8e 100755

> --- a/gcc/config/riscv/multilib-generator

> +++ b/gcc/config/riscv/multilib-generator

> @@ -40,6 +40,7 @@ import collections

>  import itertools

>  from functools import reduce

>  import subprocess

> +import argparse

>

>  #

>  # TODO: Add test for this script.

> @@ -127,44 +128,69 @@ def expand_combination(ext):

>

>    return ext

>

> -for cfg in sys.argv[1:]:

> -  try:

> -    (arch, abi, extra, ext) = cfg.split('-')

> -  except:

> -    print ("Invalid configure string %s, <arch>-<abi>-<extra>-<extensions>\n"

> -           "<extra> and <extensions> can be empty, "

> -           "e.g. rv32imafd-ilp32--" % cfg)

> -    sys.exit(1)

> -

> -  arch = arch_canonicalize (arch)

> -  arches[arch] = 1

> -  abis[abi] = 1

> -  extra = list(filter(None, extra.split(',')))

> -  ext_combs = expand_combination(ext)

> -  alts = sum([[x] + [x + y for y in ext_combs] for x in [arch] + extra], [])

> -  alts = list(map(arch_canonicalize, alts))

> +multilib_cfgs = filter(lambda x:not x.startswith("--"), sys.argv[1:])

> +options = filter(lambda x:x.startswith("--"), sys.argv[1:])

> +

> +parser = argparse.ArgumentParser()

> +parser.add_argument("--cmodel", type=str)

> +parser.add_argument("cfgs", type=str, nargs='*')

> +args = parser.parse_args()

> +

> +if args.cmodel:

> +  cmodels = [None] + args.cmodel.split(",")

> +else:

> +  cmodels = [None]

> +

> +cmodel_options = '/'.join(['mcmodel=%s' % x for x in cmodels[1:]])

> +cmodel_dirnames = ' \\\n'.join(cmodels[1:])

> +

> +for cmodel in cmodels:

> +  for cfg in args.cfgs:

> +    try:

> +      (arch, abi, extra, ext) = cfg.split('-')

> +    except:

> +      print ("Invalid configure string %s, <arch>-<abi>-<extra>-<extensions>\n"

> +             "<extra> and <extensions> can be empty, "

> +             "e.g. rv32imafd-ilp32--" % cfg)

> +      sys.exit(1)

> +

> +    # Compact code model only support rv64.

> +    if cmodel == "compact" and arch.startswith("rv32"):

> +      continue

>

> -  # Drop duplicated entry.

> -  alts = unique(alts)

> +    arch = arch_canonicalize (arch)

> +    arches[arch] = 1

> +    abis[abi] = 1

> +    extra = list(filter(None, extra.split(',')))

> +    ext_combs = expand_combination(ext)

> +    alts = sum([[x] + [x + y for y in ext_combs] for x in [arch] + extra], [])

> +    alts = list(map(arch_canonicalize, alts))

>

> -  for alt in alts:

> -    if alt == arch:

> -      continue

> -    arches[alt] = 1

> -    reuse.append('march.%s/mabi.%s=march.%s/mabi.%s' % (arch, abi, alt, abi))

> -  required.append('march=%s/mabi=%s' % (arch, abi))

> +    # Drop duplicated entry.

> +    alts = unique(alts)

> +

> +    for alt in alts[1:]:

> +      if alt == arch:

> +        continue

> +      arches[alt] = 1

> +      reuse.append('march.%s/mabi.%s=march.%s/mabi.%s' % (arch, abi, alt, abi))

> +

> +    if cmodel:

> +      required.append('march=%s/mabi=%s/mcmodel=%s' % (arch, abi, cmodel))

> +    else:

> +      required.append('march=%s/mabi=%s' % (arch, abi))

>

> -arch_options = '/'.join(['march=%s' % x for x in arches.keys()])

> -arch_dirnames = ' \\\n'.join(arches.keys())

> +  arch_options = '/'.join(['march=%s' % x for x in arches.keys()])

> +  arch_dirnames = ' \\\n'.join(arches.keys())

>

> -abi_options = '/'.join(['mabi=%s' % x for x in abis.keys()])

> -abi_dirnames = ' \\\n'.join(abis.keys())

> +  abi_options = '/'.join(['mabi=%s' % x for x in abis.keys()])

> +  abi_dirnames = ' \\\n'.join(abis.keys())

>

>  prog = sys.argv[0].split('/')[-1]

>  print('# This file was generated by %s with the command:' % prog)

>  print('#  %s' % ' '.join(sys.argv))

>

> -print('MULTILIB_OPTIONS = %s %s' % (arch_options, abi_options))

> -print('MULTILIB_DIRNAMES = %s %s' % (arch_dirnames, abi_dirnames))

> +print('MULTILIB_OPTIONS = %s %s %s' % (arch_options, abi_options, cmodel_options))

> +print('MULTILIB_DIRNAMES = %s %s %s' % (arch_dirnames, abi_dirnames, cmodel_dirnames))

>  print('MULTILIB_REQUIRED = %s' % ' \\\n'.join(required))

>  print('MULTILIB_REUSE = %s' % ' \\\n'.join(reuse))

> diff --git a/gcc/doc/install.texi b/gcc/doc/install.texi

> index 6eee1bb43d4..8e974d2952e 100644

> --- a/gcc/doc/install.texi

> +++ b/gcc/doc/install.texi

> @@ -1328,6 +1328,23 @@ rv64imac with lp64 and rv64imafc with lp64 will reuse this multi-lib set.

>  rv64ima-lp64--f,c,fc

>  @end smallexample

>

> +@option{--with-multilib-generator} have an optional configuration argument

> +@option{--cmodel=val} for code model, this option will expand with other

> +config options, @var{val} is a comma separated list of possible code model,

> +currently we support medlow and medany.

> +

> +Example 5: Add multi-lib suppport for rv64ima with lp64; rv64ima with lp64 and

> +medlow code model

> +@smallexample

> +rv64ima-lp64--;--cmodel=medlow

> +@end smallexample

> +

> +Example 6: Add multi-lib suppport for rv64ima with lp64; rv64ima with lp64 and

> +medlow code model; rv64ima with lp64 and medany code model

> +@smallexample

> +rv64ima-lp64--;--cmodel=medlow,medany

> +@end smallexample

> +

>  @item --with-endian=@var{endians}

>  Specify what endians to use.

>  Currently only implemented for sh*-*-*.

> --

> 2.31.1

>

Patch

diff --git a/gcc/config/riscv/multilib-generator b/gcc/config/riscv/multilib-generator
index fe115b3184f..1164d1c5c8e 100755
--- a/gcc/config/riscv/multilib-generator
+++ b/gcc/config/riscv/multilib-generator
@@ -40,6 +40,7 @@  import collections
 import itertools
 from functools import reduce
 import subprocess
+import argparse
 
 #
 # TODO: Add test for this script.
@@ -127,44 +128,69 @@  def expand_combination(ext):
 
   return ext
 
-for cfg in sys.argv[1:]:
-  try:
-    (arch, abi, extra, ext) = cfg.split('-')
-  except:
-    print ("Invalid configure string %s, <arch>-<abi>-<extra>-<extensions>\n"
-           "<extra> and <extensions> can be empty, "
-           "e.g. rv32imafd-ilp32--" % cfg)
-    sys.exit(1)
-
-  arch = arch_canonicalize (arch)
-  arches[arch] = 1
-  abis[abi] = 1
-  extra = list(filter(None, extra.split(',')))
-  ext_combs = expand_combination(ext)
-  alts = sum([[x] + [x + y for y in ext_combs] for x in [arch] + extra], [])
-  alts = list(map(arch_canonicalize, alts))
+multilib_cfgs = filter(lambda x:not x.startswith("--"), sys.argv[1:])
+options = filter(lambda x:x.startswith("--"), sys.argv[1:])
+
+parser = argparse.ArgumentParser()
+parser.add_argument("--cmodel", type=str)
+parser.add_argument("cfgs", type=str, nargs='*')
+args = parser.parse_args()
+
+if args.cmodel:
+  cmodels = [None] + args.cmodel.split(",")
+else:
+  cmodels = [None]
+
+cmodel_options = '/'.join(['mcmodel=%s' % x for x in cmodels[1:]])
+cmodel_dirnames = ' \\\n'.join(cmodels[1:])
+
+for cmodel in cmodels:
+  for cfg in args.cfgs:
+    try:
+      (arch, abi, extra, ext) = cfg.split('-')
+    except:
+      print ("Invalid configure string %s, <arch>-<abi>-<extra>-<extensions>\n"
+             "<extra> and <extensions> can be empty, "
+             "e.g. rv32imafd-ilp32--" % cfg)
+      sys.exit(1)
+
+    # Compact code model only support rv64.
+    if cmodel == "compact" and arch.startswith("rv32"):
+      continue
 
-  # Drop duplicated entry.
-  alts = unique(alts)
+    arch = arch_canonicalize (arch)
+    arches[arch] = 1
+    abis[abi] = 1
+    extra = list(filter(None, extra.split(',')))
+    ext_combs = expand_combination(ext)
+    alts = sum([[x] + [x + y for y in ext_combs] for x in [arch] + extra], [])
+    alts = list(map(arch_canonicalize, alts))
 
-  for alt in alts:
-    if alt == arch:
-      continue
-    arches[alt] = 1
-    reuse.append('march.%s/mabi.%s=march.%s/mabi.%s' % (arch, abi, alt, abi))
-  required.append('march=%s/mabi=%s' % (arch, abi))
+    # Drop duplicated entry.
+    alts = unique(alts)
+
+    for alt in alts[1:]:
+      if alt == arch:
+        continue
+      arches[alt] = 1
+      reuse.append('march.%s/mabi.%s=march.%s/mabi.%s' % (arch, abi, alt, abi))
+
+    if cmodel:
+      required.append('march=%s/mabi=%s/mcmodel=%s' % (arch, abi, cmodel))
+    else:
+      required.append('march=%s/mabi=%s' % (arch, abi))
 
-arch_options = '/'.join(['march=%s' % x for x in arches.keys()])
-arch_dirnames = ' \\\n'.join(arches.keys())
+  arch_options = '/'.join(['march=%s' % x for x in arches.keys()])
+  arch_dirnames = ' \\\n'.join(arches.keys())
 
-abi_options = '/'.join(['mabi=%s' % x for x in abis.keys()])
-abi_dirnames = ' \\\n'.join(abis.keys())
+  abi_options = '/'.join(['mabi=%s' % x for x in abis.keys()])
+  abi_dirnames = ' \\\n'.join(abis.keys())
 
 prog = sys.argv[0].split('/')[-1]
 print('# This file was generated by %s with the command:' % prog)
 print('#  %s' % ' '.join(sys.argv))
 
-print('MULTILIB_OPTIONS = %s %s' % (arch_options, abi_options))
-print('MULTILIB_DIRNAMES = %s %s' % (arch_dirnames, abi_dirnames))
+print('MULTILIB_OPTIONS = %s %s %s' % (arch_options, abi_options, cmodel_options))
+print('MULTILIB_DIRNAMES = %s %s %s' % (arch_dirnames, abi_dirnames, cmodel_dirnames))
 print('MULTILIB_REQUIRED = %s' % ' \\\n'.join(required))
 print('MULTILIB_REUSE = %s' % ' \\\n'.join(reuse))
diff --git a/gcc/doc/install.texi b/gcc/doc/install.texi
index 6eee1bb43d4..8e974d2952e 100644
--- a/gcc/doc/install.texi
+++ b/gcc/doc/install.texi
@@ -1328,6 +1328,23 @@  rv64imac with lp64 and rv64imafc with lp64 will reuse this multi-lib set.
 rv64ima-lp64--f,c,fc
 @end smallexample
 
+@option{--with-multilib-generator} have an optional configuration argument
+@option{--cmodel=val} for code model, this option will expand with other
+config options, @var{val} is a comma separated list of possible code model,
+currently we support medlow and medany.
+
+Example 5: Add multi-lib suppport for rv64ima with lp64; rv64ima with lp64 and
+medlow code model
+@smallexample
+rv64ima-lp64--;--cmodel=medlow
+@end smallexample
+
+Example 6: Add multi-lib suppport for rv64ima with lp64; rv64ima with lp64 and
+medlow code model; rv64ima with lp64 and medany code model
+@smallexample
+rv64ima-lp64--;--cmodel=medlow,medany
+@end smallexample
+
 @item --with-endian=@var{endians}
 Specify what endians to use.
 Currently only implemented for sh*-*-*.