tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

testsJit.cpp (2222B)


      1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
      2 * vim: set ts=8 sts=2 et sw=2 tw=80:
      3 * This Source Code Form is subject to the terms of the Mozilla Public
      4 * License, v. 2.0. If a copy of the MPL was not distributed with this
      5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      6 
      7 #include "jsapi-tests/testsJit.h"
      8 
      9 #include "jit/JitCommon.h"
     10 #include "jit/Linker.h"
     11 
     12 #include "jit/MacroAssembler-inl.h"
     13 
     14 // On entry to the JIT code, save every register.
     15 void PrepareJit(js::jit::MacroAssembler& masm) {
     16  using namespace js::jit;
     17 #if defined(JS_CODEGEN_ARM64)
     18  masm.Mov(PseudoStackPointer64, sp);
     19  masm.SetStackPointer64(PseudoStackPointer64);
     20 #endif
     21  AllocatableRegisterSet regs(RegisterSet::All());
     22  LiveRegisterSet save(regs.asLiveSet());
     23 #if defined(JS_CODEGEN_ARM)
     24  save.add(js::jit::d15);
     25 #endif
     26 #if defined(JS_CODEGEN_MIPS64) || defined(JS_CODEGEN_LOONG64) || \
     27    defined(JS_CODEGEN_RISCV64)
     28  save.add(js::jit::ra);
     29 #elif defined(JS_USE_LINK_REGISTER)
     30  save.add(js::jit::lr);
     31 #endif
     32  masm.PushRegsInMask(save);
     33 }
     34 
     35 // Generate the exit path of the JIT code, which restores every register. Then,
     36 // make it executable and run it.
     37 bool ExecuteJit(JSContext* cx, js::jit::MacroAssembler& masm) {
     38  using namespace js::jit;
     39  AllocatableRegisterSet regs(RegisterSet::All());
     40  LiveRegisterSet save(regs.asLiveSet());
     41 #if defined(JS_CODEGEN_ARM)
     42  save.add(js::jit::d15);
     43 #endif
     44 #if defined(JS_CODEGEN_MIPS64) || defined(JS_CODEGEN_LOONG64) || \
     45    defined(JS_CODEGEN_RISCV64)
     46  save.add(js::jit::ra);
     47 #elif defined(JS_USE_LINK_REGISTER)
     48  save.add(js::jit::lr);
     49 #endif
     50  masm.PopRegsInMask(save);
     51 #if defined(JS_CODEGEN_ARM64)
     52  // Return using the value popped into x30.
     53  masm.abiret();
     54 
     55  // Reset stack pointer.
     56  masm.SetStackPointer64(PseudoStackPointer64);
     57 #else
     58  // Exit the JIT-ed code using the ABI return style.
     59  masm.abiret();
     60 #endif
     61 
     62  if (masm.oom()) {
     63    return false;
     64  }
     65 
     66  JitCode* code = nullptr;
     67  {
     68    Linker linker(masm);
     69    code = linker.newCode(cx, CodeKind::Other);
     70    if (!code) {
     71      return false;
     72    }
     73  }
     74 
     75  JS::AutoSuppressGCAnalysis suppress;
     76  EnterTest test = code->as<EnterTest>();
     77  CALL_GENERATED_0(test);
     78  return true;
     79 }