Committed to trunk.
On Wed, Jul 21, 2021 at 4:45 PM Kito Cheng <kito.ch...@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 >