arm: Determine the abi from compiler if not specified on command line
authorAshwin Sekhar T K <ashwin.sekhar@cavium.com>
Fri, 30 Jun 2017 07:13:13 +0000 (12:43 +0530)
committerAshwin Sekhar T K <ashwin.sekhar@cavium.com>
Fri, 30 Jun 2017 12:50:59 +0000 (18:20 +0530)
If ARM abi is not explicitly mentioned on the command line, then set the
arm abi to softfp or hard according to the compiler environment.
This assumes that compiler sets the defines __ARM_PCS and __ARM_PCS_VFP
accordingly.

Makefile.arm
Makefile.system
c_check
common_arm.h

index c189b0c..eedd39b 100644 (file)
@@ -1,5 +1,4 @@
-#ifeq logical or
-ifeq ($(CORE), $(filter $(CORE),CORTEXA9 CORTEXA15))
+ifeq ($(CORE), $(filter $(CORE),ARMV7 CORTEXA9 CORTEXA15))
 ifeq ($(OSNAME), Android)
 CCOMMON_OPT += -mfpu=neon  -march=armv7-a
 FCOMMON_OPT += -mfpu=neon  -march=armv7-a
@@ -9,28 +8,12 @@ FCOMMON_OPT += -mfpu=vfpv3 -march=armv7-a
 endif
 endif
 
-ifeq ($(CORE), ARMV7)
-ifeq ($(OSNAME), Android)
-ifeq ($(ARM_SOFTFP_ABI), 1)
-CCOMMON_OPT += -mfpu=neon -march=armv7-a
-FCOMMON_OPT += -mfpu=neon -march=armv7-a
-else
-CCOMMON_OPT += -mfpu=neon -march=armv7-a -Wl,--no-warn-mismatch
-FCOMMON_OPT += -mfpu=neon -march=armv7-a -Wl,--no-warn-mismatch
-endif
-else
-CCOMMON_OPT += -mfpu=vfpv3 -march=armv7-a
-FCOMMON_OPT += -mfpu=vfpv3 -march=armv7-a
-endif
-endif
-
 ifeq ($(CORE), ARMV6)
 CCOMMON_OPT += -mfpu=vfp -march=armv6
 FCOMMON_OPT += -mfpu=vfp -march=armv6
 endif
 
-
 ifeq ($(CORE), ARMV5)
-CCOMMON_OPT += -marm -march=armv5
-FCOMMON_OPT += -marm -march=armv5
+CCOMMON_OPT += -march=armv5
+FCOMMON_OPT += -march=armv5
 endif
index 29d3efd..2cae5f1 100644 (file)
@@ -242,6 +242,10 @@ EXTRALIB   += -lm
 NO_EXPRECISION = 1
 endif
 
+ifeq ($(OSNAME), Android)
+EXTRALIB       += -lm
+endif
+
 ifeq ($(OSNAME), AIX)
 EXTRALIB       += -lm
 endif
@@ -483,16 +487,20 @@ ifeq ($(ARCH), arm)
 NO_BINARY_MODE  = 1
 BINARY_DEFINED  = 1
 
-CCOMMON_OPT += -marm
-FCOMMON_OPT += -marm
-
-ifeq ($(ARM_SOFTFP_ABI), 1)
-CCOMMON_OPT += -mfloat-abi=softfp -DARM_SOFTFP_ABI
-FCOMMON_OPT += -mfloat-abi=softfp -DARM_SOFTFP_ABI
+# If ABI is specified on command line use it. Else use the automatically detected ABI.
+ifeq ($(ARM_SOFTFP_ABI),1)
+ARM_ABI = softfp
 else
-CCOMMON_OPT += -mfloat-abi=hard
-FCOMMON_OPT += -mfloat-abi=hard
+ifeq ($(ARM_HARD_ABI),1)
+ARM_ABI = hard
+else
+ARM_ABI=$(ARM_ABI_AUTO)
+endif
 endif
+export ARM_ABI_AUTO
+CCOMMON_OPT += -marm -mfloat-abi=$(ARM_ABI)
+FCOMMON_OPT += -marm -mfloat-abi=$(ARM_ABI)
+
 endif
 
 ifeq ($(ARCH), arm64)
diff --git a/c_check b/c_check
index 20da288..2e7e08c 100644 (file)
--- a/c_check
+++ b/c_check
@@ -94,7 +94,17 @@ if ($architecture eq "mips64") {
     $defined = 1;
 }
 
-if (($architecture eq "arm") || ($architecture eq "arm64")) {
+if ($architecture eq "arm") {
+    $defined = 1;
+    $data = `$compiler_name -dM -E ctest2.c | grep -w __ARM_PCS_VFP`;
+    if ($data ne "") {
+       $abi = "hard";
+    } else {
+       $abi = "softfp";
+    }
+}
+
+if ($architecture eq "arm64") {
     $defined = 1;
 }
 
@@ -287,6 +297,10 @@ print MAKEFILE "CEXTRALIB=$linker_L $linker_l $linker_a\n";
 print MAKEFILE "HAVE_MSA=1\n" if $have_msa eq 1;
 print MAKEFILE "MSA_FLAGS=$msa_flags\n" if $have_msa eq 1;
 
+if ($architecture eq "arm") {
+       print MAKEFILE "ARM_ABI_AUTO=$abi\n";
+}
+
 $os           =~ tr/[a-z]/[A-Z]/;
 $architecture =~ tr/[a-z]/[A-Z]/;
 $compiler     =~ tr/[a-z]/[A-Z]/;
index a17acb4..27fa76b 100644 (file)
@@ -111,11 +111,6 @@ REALNAME:
 
 #define PROFCODE
 
-#ifdef __ARM_PCS
-//-mfloat-abi=softfp
-#define SOFT_FLOAT_ABI
-#endif
-
 #endif