-mstackrealign combined with -m32 can bring great amounts of sadness under MacOS 10.4.x if you are building 32-bit code.
Generally, the program will crash with a SIGILL result code. From a small snippet of code from SoyLatte, I got this dump from GDB:
(gdb) run -q -T ../generated/adfiles/bsd_i486.ad -c../generated/adfiles/mktmp14425/ad_i486.cpp -h../generated/adfiles/mktmp14425/ad_i486.hpp -a../generated/adfiles/mktmp14425/dfa_i486.cpp -v../generated/adfiles/mktmp14425/adGlobals_i486.hpp
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /Users/edcarrel/Desktop/jdk6_devpreview_r1/control/build/bsd-i586-debug/hotspot/outputdir/bsd_i486_compiler2/generated/adfiles/adlc -q -T ../generated/adfiles/bsd_i486.ad -c../generated/adfiles/mktmp14425/ad_i486.cpp -h../generated/adfiles/mktmp14425/ad_i486.hpp -a../generated/adfiles/mktmp14425/dfa_i486.cpp -v../generated/adfiles/mktmp14425/adGlobals_i486.hpp
Breakpoint 1, main (argc=751405, argv=0x90b8f092) at /Users/edcarrel/Desktop/jdk6_devpreview_r1/hotspot/src/share/vm/adlc/main.cpp:26
26 if( argc == 1 ) usage(AD); // No arguments? Then print usage
(gdb) bt
(gdb) run -q -T ../generated/adfiles/bsd_i486.ad -c../generated/adfiles/mktmp14425/ad_i486.cpp -h../generated/adfiles/mktmp14425/ad_i486.hpp -a../generated/adfiles/mktmp14425/dfa_i486.cpp -v../generated/adfiles/mktmp14425/adGlobals_i486.hpp
Starting program: /Users/edcarrel/Desktop/jdk6_devpreview_r1/control/build/bsd-i586-debug/hotspot/outputdir/bsd_i486_compiler2/generated/adfiles/adlc -q -T ../generated/adfiles/bsd_i486.ad -c../generated/adfiles/mktmp14425/ad_i486.cpp -h../generated/adfiles/mktmp14425/ad_i486.hpp -a../generated/adfiles/mktmp14425/dfa_i486.cpp -v../generated/adfiles/mktmp14425/adGlobals_i486.hpp
Breakpoint 2, main (argc=7874, argv=0x8) at /Users/edcarrel/Desktop/jdk6_devpreview_r1/hotspot/src/share/vm/adlc/main.cpp:19
19 int main(int argc, char *argv[])
(gdb) The program is running. Exit anyway? (y or n) y
I ran into this recently under MacOS 10.4 while working on SoyLatte.
Here's the command used to build this program:
g++ -m32 -march=i586 -mstackrealign -m32 -march=i586 -mstackrealign -g -o ../generated/adfiles/adlc ../generated/adfiles/adlparse.o ../generated/adfiles/archDesc.o ../generated/adfiles/arena.o ../generated/adfiles/dfa.o ../generated/adfiles/dict2.o ../generated/adfiles/filebuff.o ../generated/adfiles/forms.o ../generated/adfiles/formsopt.o ../generated/adfiles/formssel.o ../generated/adfiles/main.o ../generated/adfiles/adlc-opcodes.o ../generated/adfiles/output_c.o ../generated/adfiles/output_h.o -lm
Notice that argc in both cases is off in no man's land, and argv has a mysteriously small pointer address for pointing to heap storage.
Turning off -mstackrealign will allow adlc to run crash free, but code elsewhere in SoyLatte -- specifically within JNI -- depends on this flag. Nevertheless, setting a flag that causes a stack realignment should preserve the values of the variables stored on the stack. At least in the case above, this invariant is violated. There appears to be a bug already filed with Apple by Ladd Van Tol for a similar problem. Landon Fuller, the lead developer of SoyLatte, mentioned that this is a known bug, so perhaps there are bug reports into Apple that don't have an associated mailing list submission.
Subscribe to:
Post Comments (Atom)
0 comments:
Post a Comment