Message ID | 20210721084523.64629-1-kito.cheng@sifive.com |
---|---|
State | New |
Headers | show |
Series | RISC-V: Allow multi-lib build with different code model | expand |
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 >
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*-*-*.