diff options
author | Spenser Gilliland <spenser@gillilanding.com> | 2013-07-19 18:31:58 -0500 |
---|---|---|
committer | Peter Korsgaard <jacmet@sunsite.dk> | 2013-07-21 00:58:55 +0200 |
commit | aa86b52ca35b6bd9ebf352c55d4fb3c940c44527 (patch) | |
tree | 8c882edd5be17fe3035bff46b4c18fd4e646836f | |
parent | 27c9370344692b7605072f51eaf0275654faa093 (diff) | |
download | buildroot-aa86b52ca35b6bd9ebf352c55d4fb3c940c44527.tar.gz buildroot-aa86b52ca35b6bd9ebf352c55d4fb3c940c44527.zip |
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.c | 29 |
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 247df6da87..565e36bfd1 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; |