Assertion failure in non-JIT'ed LLInt on ARM Thumb.
authormark.lam@apple.com <mark.lam@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 3 Nov 2013 21:52:56 +0000 (21:52 +0000)
committermark.lam@apple.com <mark.lam@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 3 Nov 2013 21:52:56 +0000 (21:52 +0000)
https://bugs.webkit.org/show_bug.cgi?id=97569.

Reviewed by Geoffrey Garen.

* assembler/MacroAssemblerCodeRef.h:
- Thumb2 alignment assertions do not apply to the C Loop LLINT because
  the arguments passed to those assertions are actually OpcodeIDs
  masquerading as addresses.
* llint/LLIntOfflineAsmConfig.h:
- Some of the #defines belong in the !ENABLE(LLINT_C_LOOP) section.
  Moving them there.
* llint/LowLevelInterpreter.cpp:
- Keep the compiler happy from some unreferenced C Loop labels.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@158541 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/assembler/MacroAssemblerCodeRef.h
Source/JavaScriptCore/llint/LLIntOfflineAsmConfig.h
Source/JavaScriptCore/llint/LowLevelInterpreter.cpp

index d6c2be6..5045ff1 100644 (file)
@@ -1,3 +1,20 @@
+2013-11-02  Mark Lam  <mark.lam@apple.com>
+
+        Assertion failure in non-JIT'ed LLInt on ARM Thumb.
+        https://bugs.webkit.org/show_bug.cgi?id=97569.
+
+        Reviewed by Geoffrey Garen.
+
+        * assembler/MacroAssemblerCodeRef.h:
+        - Thumb2 alignment assertions do not apply to the C Loop LLINT because
+          the arguments passed to those assertions are actually OpcodeIDs
+          masquerading as addresses.
+        * llint/LLIntOfflineAsmConfig.h:
+        - Some of the #defines belong in the !ENABLE(LLINT_C_LOOP) section.
+          Moving them there.
+        * llint/LowLevelInterpreter.cpp:
+        - Keep the compiler happy from some unreferenced C Loop labels.
+
 2013-11-02  Filip Pizlo  <fpizlo@apple.com>
 
         FTL should use LLVM intrinsics for OSR exit, watchpoints, inline caches, and stack layout
index 87d7cb0..5e0c580 100644 (file)
@@ -36,7 +36,7 @@
 
 // ASSERT_VALID_CODE_POINTER checks that ptr is a non-null pointer, and that it is a valid
 // instruction address on the platform (for example, check any alignment requirements).
-#if CPU(ARM_THUMB2)
+#if CPU(ARM_THUMB2) && !ENABLE(LLINT_C_LOOP)
 // ARM/thumb instructions must be 16-bit aligned, but all code pointers to be loaded
 // into the processor are decorated with the bottom bit set, indicating that this is
 // thumb code (as oposed to 32-bit traditional ARM).  The first test checks for both
index 9a2d68f..69a9b1f 100644 (file)
@@ -38,6 +38,7 @@
 #define OFFLINE_ASM_ARM 0
 #define OFFLINE_ASM_ARMv7 0
 #define OFFLINE_ASM_ARMv7_TRADITIONAL 0
+#define OFFLINE_ASM_ARM64 0
 #define OFFLINE_ASM_X86_64 0
 #define OFFLINE_ASM_ARMv7s 0
 #define OFFLINE_ASM_MIPS 0
 #define OFFLINE_ASM_SH4 0
 #endif
 
-#endif // !ENABLE(LLINT_C_LOOP)
-
 #if CPU(ARM64)
 #define OFFLINE_ASM_ARM64 1
 #else
 #define OFFLINE_ASM_ARM64 0
 #endif
 
+#if CPU(MIPS)
+#ifdef WTF_MIPS_PIC
+#define S(x) #x
+#define SX(x) S(x)
+#define OFFLINE_ASM_CPLOAD(reg) \
+    ".set noreorder\n" \
+    ".cpload " SX(reg) "\n" \
+    ".set reorder\n"
+#else
+#define OFFLINE_ASM_CPLOAD(reg)
+#endif
+#endif
+
+#endif // !ENABLE(LLINT_C_LOOP)
+
 #if USE(JSVALUE64)
 #define OFFLINE_ASM_JSVALUE64 1
 #else
 #define OFFLINE_ASM_VALUE_PROFILER 0
 #endif
 
-#if CPU(MIPS)
-#ifdef WTF_MIPS_PIC
-#define S(x) #x
-#define SX(x) S(x)
-#define OFFLINE_ASM_CPLOAD(reg) \
-    ".set noreorder\n" \
-    ".cpload " SX(reg) "\n" \
-    ".set reorder\n"
-#else
-#define OFFLINE_ASM_CPLOAD(reg)
-#endif
-#endif
-
 #endif // LLIntOfflineAsmConfig_h
index 6cc050a..760accc 100644 (file)
@@ -90,18 +90,22 @@ using namespace JSC::LLInt;
 #define OFFLINE_ASM_BEGIN
 #define OFFLINE_ASM_END
 
+// To keep compilers happy in case of unused labels, force usage of the label:
+#define USE_LABEL(label) \
+    do { \
+        if (false) \
+            goto label; \
+    } while (false)
+
+#define OFFLINE_ASM_OPCODE_LABEL(opcode) DEFINE_OPCODE(opcode) USE_LABEL(opcode);
 
-#define OFFLINE_ASM_OPCODE_LABEL(opcode) DEFINE_OPCODE(opcode)
 #if ENABLE(COMPUTED_GOTO_OPCODES)
-    #define OFFLINE_ASM_GLUE_LABEL(label)  label:
+#define OFFLINE_ASM_GLUE_LABEL(label)  label: USE_LABEL(label);
 #else
-    #define OFFLINE_ASM_GLUE_LABEL(label)  case label: label:
+#define OFFLINE_ASM_GLUE_LABEL(label)  case label: label: USE_LABEL(label);
 #endif
 
-#define OFFLINE_ASM_LOCAL_LABEL(label) \
-    label: \
-        if (false) \
-            goto label;
+#define OFFLINE_ASM_LOCAL_LABEL(label) label: USE_LABEL(label);
 
 
 //============================================================================