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/MacroAssembler.h

    r143408 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
     
    572572        return MacroAssemblerBase::branchTest8(cond, Address(address.base, address.offset), mask);
    573573    }
    574 #else
     574
     575#else // !CPU(X86_64)
     576
    575577    void addPtr(RegisterID src, RegisterID dest)
    576578    {
     
    10681070    }
    10691071
    1070 #endif
     1072#endif // ENABLE(JIT_CONSTANT_BLINDING)
    10711073
    10721074#endif // !CPU(X86_64)
     
    10801082        // if we've broken blinding during patch development.
    10811083        return true;
    1082 #else
     1084#else // ENABLE(FORCED_JIT_BLINDING)
    10831085
    10841086        // First off we'll special case common, "safe" values to avoid hurting
     
    11011103
    11021104        return shouldBlindForSpecificArch(value);
    1103 #endif
     1105#endif // ENABLE(FORCED_JIT_BLINDING)
    11041106    }
    11051107
     
    12721274        store64(value, addressForPoke(index));
    12731275    }
    1274 #endif
     1276#endif // CPU(X86_64)
    12751277   
    12761278    void store32(Imm32 imm, Address dest)
     
    12811283            store32(blind.value1, dest);
    12821284            xor32(blind.value2, dest);
    1283 #else
     1285#else // CPU(X86) || CPU(X86_64)
    12841286            if (RegisterID scratchRegister = (RegisterID)scratchRegisterForBlinding()) {
    12851287                loadXorBlindedConstant(xorBlindConstant(imm), scratchRegister);
     
    12931295                store32(imm.asTrustedImm32(), dest);
    12941296            }
    1295 #endif
     1297#endif // CPU(X86) || CPU(X86_64)
    12961298        } else
    12971299            store32(imm.asTrustedImm32(), dest);
     
    14411443        urshift32(src, trustedImm32ForShift(amount), dest);
    14421444    }
    1443 #endif
     1445#endif // ENABLE(JIT_CONSTANT_BLINDING)
    14441446};
    14451447
Note: See TracChangeset for help on using the changeset viewer.