aboutsummaryrefslogtreecommitdiff
path: root/gcc/gcc.c
diff options
context:
space:
mode:
authorKito Cheng <kito.cheng@sifive.com>2021-01-28 18:29:53 +0800
committerKito Cheng <kito.cheng@sifive.com>2021-02-05 14:26:16 +0800
commit072f20c555907cce38a424da47b6c1baa8330169 (patch)
tree43ccf27e79921db02fa15d9e2bbfe906308cc355 /gcc/gcc.c
parent8d0737d8f4b10bffe0411507ad2dc21ba7679883 (diff)
downloadgcc-072f20c555907cce38a424da47b6c1baa8330169.zip
gcc-072f20c555907cce38a424da47b6c1baa8330169.tar.gz
gcc-072f20c555907cce38a424da47b6c1baa8330169.tar.bz2
PR target/98878 - Incorrect multilib list for riscv*-rtems
- Multi-lib only check the default argument is appeared in the multilib flag list, but we didn't check the case that the flag is required but default argument didn't provide. - For example riscv*-rtems has a multilib set: rv32imafd/ilp32d;@march=rv32imafd@mabi=ilp32d And when we set the default argument of arch to rv32imafdc and ABI to ilp32d, gcc will check the ilp32d is matched, but it didn't check rv32imafd is not provided by default arguments, so it should not reuse default library. - The side effcet of this patch is csky-elf target will increase the number of multilib from 54 to 59, but it's because genmultilib didn't know the default argument for multilib, so I think it could be improved in future. gcc/ChangeLog: * gcc.c (print_multilib_info): Check all required argument is provided by default arg.
Diffstat (limited to 'gcc/gcc.c')
-rw-r--r--gcc/gcc.c27
1 files changed, 21 insertions, 6 deletions
diff --git a/gcc/gcc.c b/gcc/gcc.c
index aa5774a..76f1d42 100644
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -9909,12 +9909,14 @@ print_multilib_info (void)
last_path_len = p - this_path;
}
- /* If this directory requires any default arguments, we can skip
- it. We will already have printed a directory identical to
- this one which does not require that default argument. */
+ /* If all required arguments are default arguments, and no default
+ arguments appear in the ! argument list, then we can skip it.
+ We will already have printed a directory identical to this one
+ which does not require that default argument. */
if (! skip)
{
const char *q;
+ bool default_arg_ok = false;
q = p + 1;
while (*q != ';')
@@ -9946,16 +9948,29 @@ print_multilib_info (void)
list. */
if (not_arg)
{
- skip = 0;
+ default_arg_ok = false;
break;
}
- else
- skip = 1;
+
+ default_arg_ok = true;
+ }
+ else if (!not_arg)
+ {
+ /* Stop checking if any required argument is not provided by
+ default arguments. */
+ default_arg_ok = false;
+ break;
}
if (*q == ' ')
++q;
}
+
+ /* Make sure all default argument is OK for this multi-lib set. */
+ if (default_arg_ok)
+ skip = 1;
+ else
+ skip = 0;
}
if (! skip)