Illegal Instruction in debug_build

Michael Barker mikeb01 at gmail.com
Thu Nov 24 01:00:48 PST 2011


Hi,

Yes I'm compiling mlvm which is a set of patches on the hotspot tree.
I noticed that fix has recently made it's way through to the hotspot
branch.  However, I'm compiling against gcc 4.2 therefore the compiler
falls through to the default case on the ifdef and hits the illegal
instruction bug.  The fix I'm using locally looks like:

address os::current_stack_pointer() {
#if defined(SPARC_WORKS)
  register void *esp;
  __asm__("mov %%"SPELL_REG_SP", %0":"=r"(esp));
  return (address) ((char*)esp + sizeof(long)*2);
#else
  register void *esp;
  __asm__("mov %%"SPELL_REG_SP", %0":"=r"(esp));
  return (address) esp;
#endif
}

And similar for "_get_previous_fp()" in os_bsd_x86.cpp.  I'm not sure
what the correct fix is here.  Should I be using clang instead of gcc
4.2 or should there be an additional option on the #ifdef, e.g. if
defined(__clang__) || defined(__llvm__) || defined(__gcc42__)?

Mike.

On Thu, Nov 24, 2011 at 6:36 AM, Alexander Strange <astrange at apple.com> wrote:
> 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
>>
>
> _______________________________________________
> 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