[Buildroot] [PATCH v3 2/2] ext-toolchain-wrapper: fix uboot/linux with hardfp

Peter Korsgaard jacmet at uclibc.org
Sat Jul 20 22:59:34 UTC 2013


>>>>> "Spenser" == Spenser Gilliland <spenser at gillilanding.com> writes:

 Spenser> The linux kernel and uboot specify -msoft-float in order to
 Spenser> prevent floating point code from being generated.  This causes
 Spenser> a conflict when -mfloat-abi=hard or -mfloat-abi options are
 Spenser> specified in the wrapper. This patch removes the -mfloat-abi
 Spenser> option from the options generated by the wrapper only when
 Spenser> -msoft-float, -mhard-float or -mfloat-abi are specified by the
 Spenser> user.

Committed with some changes (see below) - Thanks.

 Spenser> +/* use_default_float_abi - determine if the user is trying to override the
 Spenser> + * floating point abi.
 Spenser> + *  return 0 if the user is attempting to override the float abi
 Spenser> + *  otherwise return 1
 Spenser> + */
 Spenser> +int use_default_float_abi(int argc, char **argv) {
 Spenser> +	int arg;
 Spenser> +	for (arg = 1; arg < argc; arg++) {
 Spenser> +		if (strncmp(argv[arg],"-mfloat-abi=", sizeof("-mfloat-abi=")/sizeof(char)-1) == 0 ||
 Spenser> +			strcmp(argv[arg],"-msoft-float") == 0 ||
 Spenser> +			strcmp(argv[arg],"-mhard-float") == 0 ) {
 Spenser> +			printf("DETECTED FLOAT ABI\n");

This debug line shouldn't be here.

The entire function should be inside an #ifdef BR_FLOAT_ABI so we don't
get warnings about unused functions on !arm.

 Spenser> +			return 0;
 Spenser> +		}
 Spenser> +	}
 Spenser> +	
 Spenser> +	return 1;
 Spenser> +}
 Spenser> +
 Spenser>  int main(int argc, char **argv)
 Spenser>  {
 Spenser>  	char **args, **cur;
 Spenser> @@ -68,6 +85,11 @@ int main(int argc, char **argv)
 Spenser>  	char *progpath = argv[0];
 Spenser>  	char *basename;
 Spenser>  	int ret, i, count = 0;
 Spenser> +	int set_float_abi = 0;
 Spenser> +
 Spenser> +#ifdef BR_FLOAT_ABI
 Spenser> +	set_float_abi = use_default_float_abi(argc,argv);
 Spenser> +#endif
 
 Spenser>  	/* Calculate the relative paths */
 Spenser>  	basename = strrchr(progpath, '/');
 Spenser> @@ -119,7 +141,8 @@ int main(int argc, char **argv)
 Spenser>  		return 3;
 Spenser>  	}
 
 Spenser> -	cur = args = malloc(sizeof(predef_args) + (sizeof(char *) * argc));
 Spenser> +	cur = args = malloc(sizeof(predef_args) +
 Spenser> +		(sizeof(char *) * (argc + set_float_abi)));
 Spenser>  	if (args == NULL) {
 Spenser>  		perror(__FILE__ ": malloc");
 Spenser>  		return 2;
 Spenser> @@ -129,6 +152,12 @@ int main(int argc, char **argv)
 Spenser>  	memcpy(cur, predef_args, sizeof(predef_args));
 Spenser>  	cur += sizeof(predef_args) / sizeof(predef_args[0]);
 
 Spenser> +	/* add float abi if neccessary */

It's more 'if not overridden by the wrapper arguments'

 Spenser> +	if (set_float_abi) {
 Spenser> +		*cur = "-mfloat-abi=" BR_FLOAT_ABI;
 Spenser> +		cur++;
 Spenser> +	}

This should also have been inside an #ifdef BR_FLOAT_ABI, because now it
won't build on archs not using BR_FLOAT_ABI.

To limit the number of ifdefs, I simply moved the
use_default_float_abi() function inline here.

-- 
Bye, Peter Korsgaard



More information about the buildroot mailing list