Index: src/platform-linux.cc |
diff --git a/src/platform-linux.cc b/src/platform-linux.cc |
index 1ecd8fc81b08b05a7dad8f2495255ec37db95091..d857cd90590dd74db84a6df1bebc2bffad42f930 100644 |
--- a/src/platform-linux.cc |
+++ b/src/platform-linux.cc |
@@ -87,6 +87,25 @@ void OS::Setup() { |
uint64_t seed = static_cast<uint64_t>(TimeCurrentMillis()); |
srandom(static_cast<unsigned int>(seed)); |
limit_mutex = CreateMutex(); |
+ |
+#ifdef __arm__ |
+ // When running on ARM hardware check that the EABI used by V8 and |
+ // by the C code is the same. |
+ bool hard_float = OS::ArmUsingHardFloat(); |
+ if (hard_float) { |
+#if !USE_EABI_HARDFLOAT |
+ PrintF("ERROR: Binary compiled with -mfloat-abi=hard but without " |
+ "-DUSE_EABI_HARDFLOAT\n"); |
+ exit(1); |
+#endif |
+ } else { |
+#if USE_EABI_HARDFLOAT |
+ PrintF("ERROR: Binary not compiled with -mfloat-abi=hard but with " |
+ "-DUSE_EABI_HARDFLOAT\n"); |
+ exit(1); |
+#endif |
+ } |
+#endif |
} |
@@ -142,6 +161,7 @@ static bool CPUInfoContainsString(const char * search_string) { |
return false; |
} |
+ |
bool OS::ArmCpuHasFeature(CpuFeature feature) { |
const char* search_string = NULL; |
// Simple detection of VFP at runtime for Linux. |
@@ -177,6 +197,28 @@ bool OS::ArmCpuHasFeature(CpuFeature feature) { |
return false; |
} |
+ |
+ |
+// Simple helper function to detect whether the C code is compiled with |
+// option -mfloat-abi=hard. The register d0 is loaded with 1.0 and the register |
+// pair r0, r1 is loaded with 0.0. If -mfloat-abi=hard is pased to GCC then |
+// calling this will return 1.0 and otherwise 0.0. |
+static void ArmUsingHardFloatHelper() { |
+ asm("mov r0, #0"); |
+ asm("mov r1, #0"); |
+ asm("movt r1, #16368"); |
+ asm("vmov d0, r0, r1"); |
+ asm("mov r0, #0"); |
+ asm("mov r1, #0"); |
+} |
+ |
+ |
+bool OS::ArmUsingHardFloat() { |
+ // Cast helper function from returning void to returning double. |
+ typedef double (*F)(); |
+ F f = FUNCTION_CAST<F>(FUNCTION_ADDR(ArmUsingHardFloatHelper)); |
+ return f() == 1.0; |
+} |
#endif // def __arm__ |