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@openjdk.java.net
http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev

_______________________________________________
mlvm-dev mailing list
mlvm-dev@openjdk.java.net
http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev

Reply via email to