Hi all,
While doing some experimentation with options
in arm-cpus.in I hit an assembler error where
the alphabetical sorting in arm_rewrite_selected_arch
would not sort the string "+simd+fp16" properly
into "+fp16+simd" like gas expects.
The way the comparator function compare_opt_names
is written it can never return false as the for-loop starts
from 0 and doesn't have an exit condition and its only
exit point is a "return true;".
I think it also hits undefined behaviour if the second string
is shorter than the first.
In any case, what we need is a strcmp to perform a normal
alphabetical comparison, which is what this patch does.
With this we canonicalise "+simd+fp16" to "+fp16+simd" as expected.
Bootstrapped and tested on arm-none-linux-gnueabihf.
Committed to trunk.
Thanks,
Kyrill
2017-12-21 Kyrylo Tkachov <[email protected]>
* common/config/arm/arm-common.c (compare_opt_names): Add function
comment. Use strcmp instead of manual loop.
diff --git a/gcc/common/config/arm/arm-common.c b/gcc/common/config/arm/arm-common.c
index d6374276a109cb8bc0dbe8640af4accc57a81496..6a1683e38aef62ff197b64776483f1b0b70b08ef 100644
--- a/gcc/common/config/arm/arm-common.c
+++ b/gcc/common/config/arm/arm-common.c
@@ -116,14 +116,14 @@ arm_rewrite_mcpu (int argc, const char **argv)
return arm_rewrite_selected_cpu (argv[argc - 1]);
}
+/* Comparator for arm_rewrite_selected_arch. Compare the two arch extension
+ strings FIRST and SECOND and return TRUE if FIRST is less than SECOND
+ alphabetically. */
+
static bool
compare_opt_names (const char *first, const char *second)
{
- for (int i = 0; ; i++)
- if (first[i] == 0
- || first[i] < second[i])
- return true;
- return false;
+ return strcmp (first, second) <= 0;
}
/* Rewrite the architecture string for passing to the assembler.