Blame java-1.7.0-openjdk-fixZeroAllocFailure.patch

Jiri Vanek 6b8f891
# HG changeset patch
Jiri Vanek 6b8f891
# User chrisphi
Jiri Vanek 6b8f891
# Date 1363879033 14400
Jiri Vanek 6b8f891
# Node ID 4e4dd75d54e74827348e844bb7b08b25eb998a08
Jiri Vanek 6b8f891
# Parent  f6f4d5e6c1ddf7dd06d2dd99bbcca3f1460d8ad1
Jiri Vanek 6b8f891
Bug       : Fedora 19 / rawhide FTBFS SIGILL
Jiri Vanek 6b8f891
Summary: Changed thumb2 PUSH & POP to inline functions ,
Jiri Vanek 6b8f891
         added detection of reg alloc failure, fails compile of method.
Jiri Vanek 6b8f891
Jiri Vanek 6b8f891
diff --git openjdk/hotspot/src/cpu/zero/vm/thumb2.cpp openjdk/hotspot/src/cpu/zero/vm/thumb2.cpp
Jiri Vanek 6b8f891
--- openjdk/hotspot/src/cpu/zero/vm/thumb2.cpp
Jiri Vanek 6b8f891
+++ openjdk/hotspot/src/cpu/zero/vm/thumb2.cpp
Jiri Vanek 6b8f891
@@ -1,6 +1,6 @@
Jiri Vanek 6b8f891
 /*
Jiri Vanek 6b8f891
  * Copyright 2009, 2010 Edward Nevill
Jiri Vanek 6b8f891
- * Copyright 2012, Red Hat
Jiri Vanek 6b8f891
+ * Copyright 2012, 2013 Red Hat
Jiri Vanek 6b8f891
  *
Jiri Vanek 6b8f891
  * This code is free software; you can redistribute it and/or modify it
Jiri Vanek 6b8f891
  * under the terms of the GNU General Public License version 2 only, as
Jiri Vanek 6b8f891
@@ -426,6 +426,8 @@
Jiri Vanek 6b8f891
 
Jiri Vanek 6b8f891
 static jmp_buf compiler_error_env;
Jiri Vanek 6b8f891
 
Jiri Vanek 6b8f891
+#define J_BogusImplementation() longjmp(compiler_error_env, COMPILER_RESULT_FAILED)
Jiri Vanek 6b8f891
+
Jiri Vanek 6b8f891
 #ifdef PRODUCT
Jiri Vanek 6b8f891
 
Jiri Vanek 6b8f891
 #define JASSERT(cond, msg)	0
Jiri Vanek 6b8f891
@@ -3245,8 +3247,6 @@
Jiri Vanek 6b8f891
 #define TOSM2(jstack)	((jstack)->stack[(jstack)->depth-3])
Jiri Vanek 6b8f891
 #define TOSM3(jstack)	((jstack)->stack[(jstack)->depth-4])
Jiri Vanek 6b8f891
 
Jiri Vanek 6b8f891
-#define POP(jstack)		((jstack)->stack[--(jstack)->depth])
Jiri Vanek 6b8f891
-#define PUSH(jstack, r)		((jstack)->stack[(jstack)->depth++] = (r))
Jiri Vanek 6b8f891
 #define SWAP(jstack) do { \
Jiri Vanek 6b8f891
 		      Reg r = (jstack)->stack[(jstack)->depth-1]; \
Jiri Vanek 6b8f891
 		      (jstack)->stack[(jstack)->depth-1] = (jstack)->stack[(jstack)->depth-2]; \
Jiri Vanek 6b8f891
@@ -3256,6 +3256,17 @@
Jiri Vanek 6b8f891
 #define JSTACK_REG(jstack)		jstack_reg(jstack)
Jiri Vanek 6b8f891
 #define JSTACK_PREFER(jstack, prefer)	jstack_prefer(jstack, prefer)
Jiri Vanek 6b8f891
 
Jiri Vanek 6b8f891
+int PUSH(Thumb2_Stack *jstack, unsigned reg) {
Jiri Vanek 6b8f891
+  jstack->stack[jstack->depth] = reg;
Jiri Vanek 6b8f891
+  jstack->depth++;
Jiri Vanek 6b8f891
+  return reg;
Jiri Vanek 6b8f891
+}
Jiri Vanek 6b8f891
+
Jiri Vanek 6b8f891
+int POP(Thumb2_Stack *jstack) {
Jiri Vanek 6b8f891
+  jstack->depth--;
Jiri Vanek 6b8f891
+  return jstack->stack[jstack->depth];
Jiri Vanek 6b8f891
+}
Jiri Vanek 6b8f891
+
Jiri Vanek 6b8f891
 static const unsigned last_clear_bit[] = {
Jiri Vanek 6b8f891
 	3,	//	0000
Jiri Vanek 6b8f891
 	3,	//	0001
Jiri Vanek 6b8f891
@@ -3272,11 +3283,13 @@
Jiri Vanek 6b8f891
 	1,	//	1100
Jiri Vanek 6b8f891
 	1,	//	1101
Jiri Vanek 6b8f891
 	0,	//	1110
Jiri Vanek 6b8f891
-	0,	//	1111
Jiri Vanek 6b8f891
+	0,	//	1111 // No registers available...
Jiri Vanek 6b8f891
 };
Jiri Vanek 6b8f891
 
Jiri Vanek 6b8f891
 #define LAST_CLEAR_BIT(mask) last_clear_bit[mask]
Jiri Vanek 6b8f891
 
Jiri Vanek 6b8f891
+unsigned long thumb2_register_allocation_failures = 0;
Jiri Vanek 6b8f891
+
Jiri Vanek 6b8f891
 unsigned jstack_reg(Thumb2_Stack *jstack)
Jiri Vanek 6b8f891
 {
Jiri Vanek 6b8f891
   unsigned *stack = jstack->stack;
Jiri Vanek 6b8f891
@@ -3287,7 +3300,10 @@
Jiri Vanek 6b8f891
 
Jiri Vanek 6b8f891
   for (i = 0; i < depth; i++) mask |= 1 << stack[i];
Jiri Vanek 6b8f891
   mask &= (1 << STACK_REGS) - 1;
Jiri Vanek 6b8f891
-  JASSERT(mask != (1 << STACK_REGS) - 1, "No free reg in push");
Jiri Vanek 6b8f891
+  if (mask >= (1 << STACK_REGS) - 1)  { // No free registers
Jiri Vanek 6b8f891
+    thumb2_register_allocation_failures++;
Jiri Vanek 6b8f891
+    J_BogusImplementation();
Jiri Vanek 6b8f891
+  }
Jiri Vanek 6b8f891
   r = LAST_CLEAR_BIT(mask);
Jiri Vanek 6b8f891
   return r;
Jiri Vanek 6b8f891
 }
Jiri Vanek 6b8f891
@@ -3303,7 +3319,10 @@
Jiri Vanek 6b8f891
   for (i = 0; i < depth; i++) mask |= 1 << stack[i];
Jiri Vanek 6b8f891
   mask &= (1 << STACK_REGS) - 1;
Jiri Vanek 6b8f891
   if ((prefer & ~mask) & 0x0f) mask |= (~prefer & ((1 << STACK_REGS) - 1));
Jiri Vanek 6b8f891
-  JASSERT(mask != (1 << STACK_REGS) - 1, "No free reg in push");
Jiri Vanek 6b8f891
+  if (mask >= (1 << STACK_REGS) - 1)  { // No free registers
Jiri Vanek 6b8f891
+    thumb2_register_allocation_failures++;
Jiri Vanek 6b8f891
+    J_BogusImplementation();
Jiri Vanek 6b8f891
+  }
Jiri Vanek 6b8f891
   r = LAST_CLEAR_BIT(mask);
Jiri Vanek 6b8f891
   return r;
Jiri Vanek 6b8f891
 }