aboutsummaryrefslogtreecommitdiff
path: root/client/src/assembler/assembler.h
blob: 390cd425f203548c1e2d40abafe73ba0866c9c5f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#pragma once

#include <asmjit/src/asmjit/asmjit.h>

using namespace asmjit;

namespace assembler {

class assembler {
  std::vector<uint8_t> m_buf;

  CodeHolder m_code;
  JitRuntime m_runtime;
  x86::Assembler m_assembler;

 public:
  assembler(const bool x64 = false) {
    Environment env(x64 ? Environment::kArchX64 : Environment::kArchX86);

    m_code.init(env);
    m_code.attach(&m_assembler);
  }
  void start();
  void push(const std::vector<uintptr_t> &args);
  void call(const uintptr_t addr);
  void save_ret(const uintptr_t addr);
  void end();

  auto &operator()() const { return m_buf; }
  auto &operator->() const { return m_assembler; }
};

};  // namespace assembler