diff options
author | Geng Qi <gengqi@linux.alibaba.com> | 2021-01-18 14:09:27 +0800 |
---|---|---|
committer | Kito Cheng <kito.cheng@sifive.com> | 2021-01-19 11:44:47 +0800 |
commit | 9ee33d7c33fa757d7011addfa6bdd0ccb6212181 (patch) | |
tree | 6d289384d757b5782758fef8d9c925ea6add286d | |
parent | c907e4394133b3f4b58feccfb3a415f9ae5ee1f4 (diff) | |
download | gcc-9ee33d7c33fa757d7011addfa6bdd0ccb6212181.zip gcc-9ee33d7c33fa757d7011addfa6bdd0ccb6212181.tar.gz gcc-9ee33d7c33fa757d7011addfa6bdd0ccb6212181.tar.bz2 |
RISC-V: The 'multilib-generator' enhancement.
Think about this case:
./multilib-generator rv32imc-ilp32-rv32imac,rv32imacxthead-f
Here are 2 problems:
1. A unexpected 'xtheadf' extension was made.
2. The arch 'rv32imac' was not be created.
This modification fix these two, and also sorts 'multi-letter'.
gcc/ChangeLog:
* config/riscv/arch-canonicalize (longext_sort): New function for
sorting 'multi-letter'.
* config/riscv/multilib-generator: Adjusting the loop of 'alt' in
'alts'. The 'arch' may not be the first of 'alts'.
(_expand_combination): Add underline for the 'ext' without '*'.
This is because, a single-letter extension can always be treated well
with a '_' prefix, but it cannot be separated out if it is appended
to a multi-letter.
-rwxr-xr-x | gcc/config/riscv/arch-canonicalize | 14 | ||||
-rwxr-xr-x | gcc/config/riscv/multilib-generator | 12 |
2 files changed, 20 insertions, 6 deletions
diff --git a/gcc/config/riscv/arch-canonicalize b/gcc/config/riscv/arch-canonicalize index 057a803..ea95a06 100755 --- a/gcc/config/riscv/arch-canonicalize +++ b/gcc/config/riscv/arch-canonicalize @@ -74,8 +74,20 @@ def arch_canonicalize(arch): # becasue we just append extensions list to the arch string. std_exts += list(filter(lambda x:len(x) == 1, long_exts)) + def longext_sort (exts): + if not exts.startswith("zxm") and exts.startswith("z"): + # If "Z" extensions are named, they should be ordered first by CANONICAL. + if exts[1] not in CANONICAL_ORDER: + raise Exception("Unsupported extension `%s`" % exts) + canonical_sort = CANONICAL_ORDER.index(exts[1]) + else: + canonical_sort = -1 + return (exts.startswith("x"), exts.startswith("zxm"), + LONG_EXT_PREFIXES.index(exts[0]), canonical_sort, exts[1:]) + # Multi-letter extension must be in lexicographic order. - long_exts = list(sorted(filter(lambda x:len(x) != 1, long_exts))) + long_exts = list(sorted(filter(lambda x:len(x) != 1, long_exts), + key=longext_sort)) # Put extensions in canonical order. for ext in CANONICAL_ORDER: diff --git a/gcc/config/riscv/multilib-generator b/gcc/config/riscv/multilib-generator index 7fc6cc2..a204543 100755 --- a/gcc/config/riscv/multilib-generator +++ b/gcc/config/riscv/multilib-generator @@ -68,15 +68,15 @@ def arch_canonicalize(arch): def _expand_combination(ext): exts = list(ext.split("*")) - # No need to expand if there is no `*`. - if len(exts) == 1: - return [(exts[0],)] - # Add underline to every extension. # e.g. # _b * zvamo => _b * _zvamo exts = list(map(lambda x: '_' + x, exts)) + # No need to expand if there is no `*`. + if len(exts) == 1: + return [(exts[0],)] + # Generate combination! ext_combs = [] for comb_len in range(1, len(exts)+1): @@ -147,7 +147,9 @@ for cfg in sys.argv[1:]: # Drop duplicated entry. alts = unique(alts) - for alt in alts[1:]: + 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)) |