зеркало из https://github.com/mozilla/gecko-dev.git
0fe98fa9ef
On win32, NS_InvokeByIndex is implemented with inline assembly. This inline assembly assumes that it is wrapped by the compiler with the standard x86 prologue and epilogue: push ebp mov ebp, esp [inline assembly that manipulates the stack pointer] pop ebp ret In particular, the last instruction of the inline assembly is: mov esp, ebp which cancels out the effects of the stack manipulation performed by all the inline assembly that proceeds the instruction. When compiling with clang-cl, however, the above assumption does not hold, as clang-cl inserts a more complex prologue and epilogue, something like: push ebp mov ebp, esp sub esp, frame_size [save registers into stack frame] [inline assembly that manipulates the stack pointer] [restore registers from stack frame] add esp, frame_size mov esp, ebp pop ebp ret Combining this more extensive prologue and epilogue with the assumptions of the inline assembly leads to interesting crashes when NS_InvokeByIndex is called: the inline assembly effectively deallocates the stack allocated by the inline assembly *and* the stack frame allocated by the compiler itself. The compiler-generated code then attemptes to deallocate the stack frame, leading to the crash, as the code now returns to an unspecified address. To avoid these sorts of problems in clang-cl and make the code more robust generally, let's move the NS_InvokeByIndex implementation to a separate assembly file. We can then write exactly what we need to have happen, safe from any manipulations of the compiler. Since we don't compile much (any?) code in Gecko with MASM, we need to add the /SAFESEH flag to the assembler invocation so that the object file with be appropriately marked as not containing exception handlers; the linker (which is invoked with the /SAFESEH flag itself) will then consent to link it into libxul. |
||
---|---|---|
.. | ||
xptcall | ||
xptinfo | ||
moz.build |