summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSpenser Gilliland <spenser@gillilanding.com>2013-07-19 23:31:58 (GMT)
committer Peter Korsgaard <jacmet@sunsite.dk>2013-07-20 22:58:55 (GMT)
commitaa86b52ca35b6bd9ebf352c55d4fb3c940c44527 (patch)
tree8c882edd5be17fe3035bff46b4c18fd4e646836f
parent27c9370344692b7605072f51eaf0275654faa093 (diff)
downloadbuildroot-aa86b52ca35b6bd9ebf352c55d4fb3c940c44527.tar.gz
buildroot-aa86b52ca35b6bd9ebf352c55d4fb3c940c44527.tar.bz2
ext-toolchain-wrapper: fix uboot/linux with hardfp
The linux kernel and uboot specify -msoft-float in order to prevent floating point code from being generated. This causes a conflict when -mfloat-abi=hard or -mfloat-abi options are specified in the wrapper. This patch removes the -mfloat-abi option from the options generated by the wrapper only when -msoft-float, -mhard-float or -mfloat-abi are specified by the user. [Peter: fix !BR_FLOAT_ABI case, simplify] Signed-off-by: Spenser Gilliland <spenser@gillilanding.com> Tested-by: "Yann E. MORIN" <yann.morin.1998@free.fr> Reviewed-by: "Yann E. MORIN" <yann.morin.1998@free.fr> Signed-off-by: Peter Korsgaard <jacmet@sunsite.dk>
-rw-r--r--toolchain/toolchain-external/ext-toolchain-wrapper.c29
1 files changed, 25 insertions, 4 deletions
diff --git a/toolchain/toolchain-external/ext-toolchain-wrapper.c b/toolchain/toolchain-external/ext-toolchain-wrapper.c
index 247df6d..565e36b 100644
--- a/toolchain/toolchain-external/ext-toolchain-wrapper.c
+++ b/toolchain/toolchain-external/ext-toolchain-wrapper.c
@@ -8,6 +8,7 @@
* (C) 2011 Peter Korsgaard <jacmet@sunsite.dk>
* (C) 2011 Daniel Nyström <daniel.nystrom@timeterminal.se>
* (C) 2012 Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
+ * (C) 2013 Spenser Gilliland <spenser@gillilanding.com>
*
* This file is licensed under the terms of the GNU General Public License
* version 2. This program is licensed "as is" without any warranty of any
@@ -23,6 +24,15 @@
static char path[PATH_MAX];
static char sysroot[PATH_MAX];
+/**
+ * GCC errors out with certain combinations of arguments (examples are
+ * -mabi-float={hard|soft} and -m{little|big}-endian), so we have to ensure
+ * that we only pass the predefined one to the real compiler if the inverse
+ * option isn't in the argument list.
+ * This specifies the worst case number of extra arguments we might pass
+ */
+#define EXCLUSIVE_ARGS 1
+
static char *predef_args[] = {
path,
"--sysroot", sysroot,
@@ -38,9 +48,6 @@ static char *predef_args[] = {
#ifdef BR_ABI
"-mabi=" BR_ABI,
#endif
-#ifdef BR_FLOAT_ABI
- "-mfloat-abi=" BR_FLOAT_ABI,
-#endif
#ifdef BR_FPU
"-mfpu=" BR_FPU,
#endif
@@ -119,7 +126,8 @@ int main(int argc, char **argv)
return 3;
}
- cur = args = malloc(sizeof(predef_args) + (sizeof(char *) * argc));
+ cur = args = malloc(sizeof(predef_args) +
+ (sizeof(char *) * (argc + EXCLUSIVE_ARGS)));
if (args == NULL) {
perror(__FILE__ ": malloc");
return 2;
@@ -129,6 +137,19 @@ int main(int argc, char **argv)
memcpy(cur, predef_args, sizeof(predef_args));
cur += sizeof(predef_args) / sizeof(predef_args[0]);
+#ifdef BR_FLOAT_ABI
+ /* add float abi if not overridden in args */
+ for (i = 1; i < argc; i++) {
+ if (!strncmp(argv[i], "-mfloat-abi=", strlen("-mfloat-abi=")) ||
+ !strcmp(argv[i], "-msoft-float") ||
+ !strcmp(argv[i], "-mhard-float"))
+ break;
+ }
+
+ if (i == argc)
+ *cur++ = "-mfloat-abi=" BR_FLOAT_ABI;
+#endif
+
/* append forward args */
memcpy(cur, &argv[1], sizeof(char *) * (argc - 1));
cur += argc - 1;