diff options
author | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2019-02-17 23:26:13 +0100 |
---|---|---|
committer | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2019-11-27 00:18:45 +0100 |
commit | 532f662121d79ef50408cd4f67d0d379e55c2fa8 (patch) | |
tree | d9767294b5886a8cba93311ce6e459f0faad09bc | |
parent | 16df5da6daa81ee91fda2fe7316fab7d966c1ec7 (diff) | |
download | sparse-532f662121d79ef50408cd4f67d0d379e55c2fa8.tar.gz |
fp-abi: teach sparse about -mfloat-abi on ARM
Teach sparse about the -mfloat-abi option and set the
related predefines for ARM accordingly.
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
-rw-r--r-- | lib.c | 23 | ||||
-rw-r--r-- | lib.h | 1 | ||||
-rw-r--r-- | machine.h | 15 | ||||
-rw-r--r-- | validation/arch/arm-predef-float-abi-hard.c | 1 | ||||
-rw-r--r-- | validation/arch/arm-predef-float-abi-mixed.c | 1 | ||||
-rw-r--r-- | validation/arch/arm-predef-float-abi-soft.c | 1 | ||||
-rw-r--r-- | validation/arch/arm-predef-soft-float.c | 1 |
7 files changed, 39 insertions, 4 deletions
@@ -329,6 +329,7 @@ static int arch_msize_long = 0; int arch_m64 = ARCH_M64_DEFAULT; int arch_big_endian = ARCH_BIG_ENDIAN; int arch_mach = MACH_NATIVE; +int arch_fp_abi = FP_ABI_NATIVE; int arch_cmodel = CMODEL_UNKNOWN; @@ -679,6 +680,15 @@ static int handle_cmodel(const char *opt, const char *arg, const struct flag *fl return handle_subopt_val(opt, arg, cmodels, flag->flag); } +static int handle_float_abi(const char *opt, const char *arg, const struct flag *flag, int options) { + static const struct val_map fp_abis[] = { + { "hard", FP_ABI_HARD }, + { "soft", FP_ABI_SOFT }, + { "softfp", FP_ABI_HYBRID }, + { "?" }, + }; + return handle_subopt_val(opt, arg, fp_abis, flag->flag); +} static const struct flag mflags[] = { { "64", &arch_m64, NULL, OPT_VAL, ARCH_LP64 }, @@ -691,6 +701,7 @@ static const struct flag mflags[] = { { "big-endian", &arch_big_endian, NULL }, { "little-endian", &arch_big_endian, NULL, OPT_INVERSE }, { "cmodel", &arch_cmodel, handle_cmodel }, + { "float-abi", &arch_fp_abi, handle_float_abi }, { } }; @@ -1519,6 +1530,18 @@ static void predefined_macros(void) break; case MACH_ARM: predefine("__arm__", 1, "1"); + switch (arch_fp_abi) { + case FP_ABI_HARD: + predefine("__ARM_PCS_VFP", 1, "1"); + break; + case FP_ABI_SOFT: + predefine("__SOFTFP__", 1, "1"); + /* fall-through */ + case FP_ABI_HYBRID: + predefine("__ARM_PCS", 1, "1"); + break; + } + predefine("__VFP_FP__", 1, "1"); break; case MACH_M68K: predefine("__m68k__", 1, "1"); @@ -207,6 +207,7 @@ extern int funsigned_char; extern int arch_m64; extern int arch_big_endian; extern int arch_mach; +extern int arch_fp_abi; enum { CMODEL_UNKNOWN, @@ -76,4 +76,19 @@ enum machine { #define UNSIGNED_CHAR 0 #endif + +enum fp_abi { + FP_ABI_HARD, + FP_ABI_SOFT, + FP_ABI_HYBRID, +}; + +#if defined(__ARM_PCS_VFP) +#define FP_ABI_NATIVE FP_ABI_HARD +#elif defined(__ARM_PCS) && !defined(__SOFTFP__) +#define FP_ABI_NATIVE FP_ABI_HYBRID +#else +#define FP_ABI_NATIVE FP_ABI_SOFT +#endif + #endif diff --git a/validation/arch/arm-predef-float-abi-hard.c b/validation/arch/arm-predef-float-abi-hard.c index 73e89e84..b5ad32f2 100644 --- a/validation/arch/arm-predef-float-abi-hard.c +++ b/validation/arch/arm-predef-float-abi-hard.c @@ -5,5 +5,4 @@ /* * check-name: arm-predef-float-abi-hard * check-command: sparse --arch=arm -mfloat-abi=hard $file - * check-known-to-fail */ diff --git a/validation/arch/arm-predef-float-abi-mixed.c b/validation/arch/arm-predef-float-abi-mixed.c index c339bf6a..b401de35 100644 --- a/validation/arch/arm-predef-float-abi-mixed.c +++ b/validation/arch/arm-predef-float-abi-mixed.c @@ -5,5 +5,4 @@ /* * check-name: arm-predef-float-abi-mixed * check-command: sparse --arch=arm -mfloat-abi=softfp $file - * check-known-to-fail */ diff --git a/validation/arch/arm-predef-float-abi-soft.c b/validation/arch/arm-predef-float-abi-soft.c index 42764fd7..ee5accd1 100644 --- a/validation/arch/arm-predef-float-abi-soft.c +++ b/validation/arch/arm-predef-float-abi-soft.c @@ -5,5 +5,4 @@ /* * check-name: arm-predef-float-abi-soft * check-command: sparse --arch=arm -mfloat-abi=soft $file - * check-known-to-fail */ diff --git a/validation/arch/arm-predef-soft-float.c b/validation/arch/arm-predef-soft-float.c index d310ea5f..c25a5f1d 100644 --- a/validation/arch/arm-predef-soft-float.c +++ b/validation/arch/arm-predef-soft-float.c @@ -5,5 +5,4 @@ /* * check-name: arm-predef-soft-float * check-command: sparse --arch=arm -msoft-float $file - * check-known-to-fail */ |