mirror of
https://github.com/BepInEx/Dobby.git
synced 2026-11-13 20:06:11 -10:00
103 lines
1.7 KiB
C++
103 lines
1.7 KiB
C++
#ifndef CORE_ASSEMBLER_H
|
|
#define CORE_ASSEMBLER_H
|
|
|
|
#include "MemoryAllocator/CodeBuffer/CodeBufferBase.h"
|
|
|
|
class CodeBuffer;
|
|
|
|
namespace zz {
|
|
|
|
class Label {
|
|
public:
|
|
Label() : pos_(0), near_link_pos_(0) {
|
|
}
|
|
|
|
public:
|
|
bool is_bound() const;
|
|
|
|
bool is_unused() const;
|
|
|
|
bool is_linked() const;
|
|
|
|
bool is_near_linked() const;
|
|
|
|
int pos() const;
|
|
|
|
void bind_to(int pos);
|
|
|
|
void link_to(int pos);
|
|
|
|
private:
|
|
// pos_: "< 0", indicate the Label is Binded, "> 0", indicate the Label is Linked, "= 0" indicate the Label is
|
|
// iter-terminal or unused
|
|
int pos_;
|
|
int near_link_pos_;
|
|
};
|
|
|
|
class ExternalReference {
|
|
public:
|
|
explicit ExternalReference(void *address) : address_(address) {
|
|
#if __APPLE__
|
|
#if __has_feature(ptrauth_calls)
|
|
address_ = __builtin_ptrauth_strip(address, ptrauth_key_asia);
|
|
#endif
|
|
#endif
|
|
}
|
|
|
|
const void *address();
|
|
|
|
private:
|
|
const void *address_;
|
|
};
|
|
|
|
class AssemblerBase {
|
|
public:
|
|
explicit AssemblerBase(void *address);
|
|
|
|
~AssemblerBase();
|
|
|
|
// === IP / PC register ===
|
|
|
|
int ip_offset() const;
|
|
|
|
int pc_offset() const;
|
|
|
|
// === CodeBuffer ===
|
|
|
|
CodeBuffer *GetCodeBuffer();
|
|
|
|
// === Realized Address ===
|
|
|
|
virtual void *GetRealizedAddress();
|
|
|
|
virtual void SetRealizedAddress(void *address);
|
|
|
|
// === CPU Cache ===
|
|
|
|
static void FlushICache(addr_t start, int size);
|
|
|
|
static void FlushICache(addr_t start, addr_t end);
|
|
|
|
protected:
|
|
CodeBuffer *buffer_;
|
|
|
|
void *realized_address_;
|
|
};
|
|
|
|
} // namespace zz
|
|
|
|
#if 0
|
|
#include "globals.h"
|
|
#if TARGET_ARCH_ARM
|
|
#include "core/modules/assembler/assembler-arm.h"
|
|
#elif TARGET_ARCH_ARM64
|
|
#include "core/modules/assembler/assembler-arm64.h"
|
|
#elif TARGET_ARCH_X64
|
|
#include "core/modules/assembler/assembler-x64.h"
|
|
#else
|
|
#error "unsupported architecture"
|
|
#endif
|
|
#endif
|
|
|
|
#endif
|