Illegal Instruction in debug_build

Alexander Strange astrange at apple.com
Wed Nov 23 22:36:21 PST 2011


I assume this thread is discussing building something besides macosx-port on OS X.

I fixed this in the debug build in macosx-port hotspot here:
http://hg.openjdk.java.net/macosx-port/macosx-port/hotspot/rev/51d10977410a

Your code seems to be failing because of a compiler bug. That said, the LLVM developers recommend against the use of register variables.

On Oct 15, 2011, at 7:23 PM, John Rose wrote:

> I don't know the ins and outs of asm and grabbing rsp on Mac, but the OS X port group probably know something about it.  -- John
> 
> On Oct 15, 2011, at 8:49 AM, Michael Barker wrote:
> 
>> Good luck!
> 
> Thanks.  I found where the problem is, it's in the
> os::current_stack_pointer method in os_bsd_x86.cpp and it depends on
> level of compilation.  If I compile the code below without
> optimisation e.g.:
> 
> #include <stdio.h>
> 
> class os {
> public:
>   void* current_stack_pointer();
> };
> 
> void* os::current_stack_pointer() {
> register void *esp __asm__ ("rsp");
> return esp;
> }
> 
> int main() {
> os o = os();
> printf("%p\n", o.current_stack_pointer());
> }
> 
> # g++ test.cc -o test
> 
> It will generate the following assembly:
> 
> __ZN2os21current_stack_pointerEv:
> 0000000000000000	pushq	%rbp
> 0000000000000001	movq	%rsp,%rbp
> 0000000000000004	movq	%rdi,0xf8(%rbp)
> 0000000000000008	movq	0xe0(%rbp),%rax
> 000000000000000c	movq	%rax,%rsp
> 000000000000000f	movq	%rsp,%rax
> 0000000000000012	movq	%rax,0xe8(%rbp)
> 0000000000000016	movq	0xe8(%rbp),%rax
> 000000000000001a	movq	%rax,0xf0(%rbp)
> 000000000000001e	movq	0xf0(%rbp),%rax
> 0000000000000022	popq	%rbp
> 
> And will fail with an illegal instruction.  If optimisation is added
> (-O1 is sufficient) it works fine:
> 
> # g++ -O1 test.cc -o test
> 
> And the generated assembly looks far more sane:
> 
> 0000000000000000	pushq	%rbp
> 0000000000000001	movq	%rsp,%rbp
> 0000000000000004	movq	%rsp,%rax
> 0000000000000007	popq	%rbp
> 0000000000000008	ret
> 
> So I've added -01 to the debug flags in
> hotspot/make/bsd/makefiles/gcc.make and it now seems to run okay.  I'm
> not sure that it's the best fix.  Is there are better way to get hold
> of the stack pointer?  I.e. one that doesn't get stomped over by a
> lack of optimisation :-).  Not sure if this specific to Mac OS 7 or
> gcc 4.2.
> 
> Mike.
> _______________________________________________
> mlvm-dev mailing list
> mlvm-dev at openjdk.java.net
> http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev
> 



More information about the mlvm-dev mailing list