Ignore:
Timestamp:
Jul 24, 2013, 9:00:16 PM (12 years ago)
Author:
[email protected]
Message:

fourthTier: Implement a probe mechanism for JIT generated code.
https://bugs.webkit.org/show_bug.cgi?id=115705.

Reviewed by Geoffrey Garen.

The probe is in the form of a MacroAssembler pseudo instruction.
It takes 3 arguments: a ProbeFunction, and 2 void* args.

When inserted into the JIT at some code generation site, the probe
pseudo "instruction" will emit a minimal amount of code to save the
stack pointer, 1 (or more) scratch register(s), and the probe
arguments into a ProbeContext record on the stack. The emitted code
will then call a probe trampoline to do the rest of the work, which
consists of:

  1. saving the remaining registers into the ProbeContext.
  2. calling the ProbeFunction, and passing it the ProbeContext pointer.
  3. restoring the registers from the ProbeContext after the ProbeFunction returns, and then returning to the JIT generated code.

The ProbeContext is stack allocated and is only valid for the duration
that the ProbeFunction is executing.

If the user supplied ProbeFunction alters the register values in the
ProbeContext, the new values will be installed into the registers upon
returning from the probe. This can be useful for some debugging or
testing purposes.

The probe mechanism is built conditional on USE(MASM_PROBE) which is
defined in config.h. USE(MASM_PROBE) will off by default.

This changeset only implements the probe mechanism for X86 and X86_64.

  • CMakeLists.txt:
  • GNUmakefile.list.am:
  • JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
  • JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
  • JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters:
  • JavaScriptCore.xcodeproj/project.pbxproj:
  • Target.pri:
  • assembler/MacroAssembler.h:

(MacroAssembler):
(JSC::MacroAssembler::shouldBlind):
(JSC::MacroAssembler::store32):

  • assembler/MacroAssemblerX86.h:

(MacroAssemblerX86):
(JSC::MacroAssemblerX86::trustedImm32FromPtr):
(JSC::MacroAssemblerX86::probe):

  • assembler/MacroAssemblerX86Common.cpp: Added.

(JSC::MacroAssemblerX86Common::ProbeContext::dumpCPURegisters):

  • CPU specific register dumper called by ProbeContext::dump().

(JSC::MacroAssemblerX86Common::ProbeContext::dump):

  • Prints the ProbeContext to the DataLog.
  • assembler/MacroAssemblerX86Common.h:

(MacroAssemblerX86Common):
(CPUState): Added.
(ProbeContext): Added.

  • assembler/MacroAssemblerX86_64.h:

(MacroAssemblerX86_64):
(JSC::MacroAssemblerX86_64::trustedImm64FromPtr):
(JSC::MacroAssemblerX86_64::probe):

  • assembler/X86Assembler.h:
  • config.h: Added WTF_USE_MASM_PROBE flag.
  • jit/JITStubs.cpp:
  • jit/JITStubs.h:
  • jit/JITStubsX86.h:
  • jit/JITStubsX86Common.h: Added.
  • jit/JITStubsX86_64.h:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/assembler/X86Assembler.h

    r148696 r153162  
    11/*
    2  * Copyright (C) 2008, 2012 Apple Inc. All rights reserved.
     2 * Copyright (C) 2008, 2012, 2013 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    3535#include <wtf/Vector.h>
    3636
     37#if USE(MASM_PROBE)
     38#include <xmmintrin.h>
     39#endif
     40
    3741namespace JSC {
    3842
     
    7276        xmm7,
    7377    } XMMRegisterID;
     78
     79#if USE(MASM_PROBE)
     80    #define FOR_EACH_CPU_REGISTER(V) \
     81        FOR_EACH_CPU_GPREGISTER(V) \
     82        FOR_EACH_CPU_FPREGISTER(V)
     83
     84    #define FOR_EACH_CPU_GPREGISTER(V) \
     85        V(void*, eax) \
     86        V(void*, ecx) \
     87        V(void*, edx) \
     88        V(void*, ebx) \
     89        V(void*, esp) \
     90        V(void*, ebp) \
     91        V(void*, esi) \
     92        V(void*, edi) \
     93        FOR_EACH_X86_64_CPU_GPREGISTER(V) \
     94        V(void*, eip)
     95
     96    #define FOR_EACH_CPU_FPREGISTER(V) \
     97        V(__m128, xmm0) \
     98        V(__m128, xmm1) \
     99        V(__m128, xmm2) \
     100        V(__m128, xmm3) \
     101        V(__m128, xmm4) \
     102        V(__m128, xmm5) \
     103        V(__m128, xmm6) \
     104        V(__m128, xmm7)
     105
     106#if CPU(X86)
     107    #define FOR_EACH_X86_64_CPU_GPREGISTER(V) // Nothing to add.
     108#elif CPU(X86_64)
     109    #define FOR_EACH_X86_64_CPU_GPREGISTER(V) \
     110        V(void*, r8) \
     111        V(void*, r9) \
     112        V(void*, r10) \
     113        V(void*, r11) \
     114        V(void*, r12) \
     115        V(void*, r13) \
     116        V(void*, r14) \
     117        V(void*, r15)
     118#endif // CPU(X86_64)
     119#endif // USE(MASM_PROBE)
    74120}
    75121
Note: See TracChangeset for help on using the changeset viewer.