|
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 |
}
|