dynasm/assembler

Search:
Group by:

Assemblers: SimpleAssembler, VecAssembler, Assembler (JIT). Mirrors runtime/src/lib.rs + components.rs (SimpleRelocation plus AArch64 arch-specific relocations).

Types

Assembler = object
  staging*: seq[byte]
  committed*: seq[byte]
  labels*: LabelRegistry
  staticTargets*: seq[tuple[loc: PatchLoc, label: StaticLabel]]
  dynamicTargets*: seq[tuple[loc: PatchLoc, id: DynamicLabel]]
  managed*: Table[int, PatchLoc]
  error*: ref DynasmError
  execBuf*: ExecutableBuffer
  arch*: ArchKind
PatchLoc = object
  location*: int             ## absolute offset just past the patched field
  fieldOffset*: int          ## bytes backwards to field start
  refOffset*: int            ## bytes backwards to reference point (usually end)
  relocation*: SimpleRelocation
  targetOffset*: int
SimpleAssembler = object
  ops*: seq[byte]
VecAssembler = object
  ops*: seq[byte]
  baseAddr*: int
  labels*: LabelRegistry
  staticTargets*: seq[tuple[loc: PatchLoc, label: StaticLabel]]
  dynamicTargets*: seq[tuple[loc: PatchLoc, id: DynamicLabel]]
  error*: ref DynasmError

Procs

proc adjustAt(loc: PatchLoc; buf: var openArray[byte]; bufOffset: int;
              adjustment: int) {....raises: [DynasmError], tags: [], forbids: [].}
proc align(a: var Assembler; alignment: int; with: byte = 0x00000090) {.
    ...raises: [], tags: [], forbids: [].}
proc align(a: var SimpleAssembler; alignment: int; with: byte = 0x00000090) {.
    ...raises: [], tags: [], forbids: [].}
proc align(a: var VecAssembler; alignment: int; with: byte = 0x00000090) {.
    ...raises: [], tags: [], forbids: [].}
proc backwardReloc(a: var Assembler; name: string; targetOffset: int;
                   fieldOffset, refOffset: int; enc: uint8) {.
    ...raises: [ValueError, KeyError], tags: [], forbids: [].}
proc backwardReloc(a: var VecAssembler; name: string; targetOffset: int;
                   fieldOffset, refOffset: int; enc: uint8) {.
    ...raises: [ValueError, KeyError], tags: [], forbids: [].}
proc commit(a: var Assembler) {....raises: [DynasmError, KeyError, IOError],
                                tags: [], forbids: [].}
proc commit(a: var VecAssembler) {....raises: [DynasmError, KeyError, DynasmError,
    DynasmError], tags: [], forbids: [].}
proc committedBytes(a: Assembler): seq[byte] {....raises: [], tags: [], forbids: [].}
proc dynamicLabel(a: var Assembler; id: DynamicLabel) {....raises: [], tags: [],
    forbids: [].}
proc dynamicLabel(a: var VecAssembler; id: DynamicLabel) {....raises: [], tags: [],
    forbids: [].}
proc dynamicReloc(a: var Assembler; id: DynamicLabel; targetOffset: int;
                  fieldOffset, refOffset: int; enc: uint8) {.
    ...raises: [ValueError], tags: [], forbids: [].}
proc dynamicReloc(a: var VecAssembler; id: DynamicLabel; targetOffset: int;
                  fieldOffset, refOffset: int; enc: uint8) {.
    ...raises: [ValueError], tags: [], forbids: [].}
proc encodeRelocs(a: var Assembler) {....raises: [DynasmError, KeyError,
    DynasmError, DynasmError], tags: [], forbids: [].}
proc ensureExecCapacity(a: var Assembler; need: int) {.
    ...raises: [IOError, DynasmError], tags: [], forbids: [].}
proc execAddr(a: Assembler): int {....raises: [], tags: [], forbids: [].}
proc extendBytes(a: var Assembler; data: openArray[byte]) {....raises: [],
    tags: [], forbids: [].}
proc extendBytes(a: var SimpleAssembler; data: openArray[byte]) {....raises: [],
    tags: [], forbids: [].}
proc extendBytes(a: var VecAssembler; data: openArray[byte]) {....raises: [],
    tags: [], forbids: [].}
proc fieldStart(loc: PatchLoc; bufOffset: int): int {....raises: [], tags: [],
    forbids: [].}
proc finalize(a: SimpleAssembler): seq[byte] {....raises: [], tags: [], forbids: [].}
proc finalize(a: var Assembler): ExecutableBuffer {.
    ...raises: [DynasmError, KeyError, IOError], tags: [], forbids: [].}
proc finalize(a: var VecAssembler): seq[byte] {....raises: [DynasmError, KeyError],
    tags: [], forbids: [].}
proc forwardReloc(a: var Assembler; name: string; targetOffset: int;
                  fieldOffset, refOffset: int; enc: uint8) {.
    ...raises: [ValueError, KeyError], tags: [], forbids: [].}
proc forwardReloc(a: var VecAssembler; name: string; targetOffset: int;
                  fieldOffset, refOffset: int; enc: uint8) {.
    ...raises: [ValueError, KeyError], tags: [], forbids: [].}
proc globalLabel(a: var Assembler; name: string) {....raises: [], tags: [],
    forbids: [].}
proc globalLabel(a: var VecAssembler; name: string) {....raises: [], tags: [],
    forbids: [].}
proc globalReloc(a: var Assembler; name: string; targetOffset: int;
                 fieldOffset, refOffset: int; enc: uint8) {.
    ...raises: [ValueError], tags: [], forbids: [].}
proc globalReloc(a: var VecAssembler; name: string; targetOffset: int;
                 fieldOffset, refOffset: int; enc: uint8) {.
    ...raises: [ValueError], tags: [], forbids: [].}
proc initAssembler(arch: ArchKind = akX64; initialSize: int = DefaultPageSize): Assembler {.
    ...raises: [IOError], tags: [], forbids: [].}
proc initSimpleAssembler(): SimpleAssembler {....raises: [], tags: [], forbids: [].}
proc initVecAssembler(baseAddr: int = 0): VecAssembler {....raises: [], tags: [],
    forbids: [].}
proc localLabel(a: var Assembler; name: string) {....raises: [KeyError], tags: [],
    forbids: [].}
proc localLabel(a: var VecAssembler; name: string) {....raises: [KeyError],
    tags: [], forbids: [].}
proc needsAdjustment(loc: PatchLoc): bool {....raises: [], tags: [], forbids: [].}
proc newAssembler(arch: ArchKind = akX64): Assembler {....raises: [IOError],
    tags: [], forbids: [].}
proc newDynamicLabel(a: var Assembler): DynamicLabel {....raises: [], tags: [],
    forbids: [].}
proc newDynamicLabel(a: var VecAssembler): DynamicLabel {....raises: [], tags: [],
    forbids: [].}
proc newPatchLoc(location, targetOffset, fieldOffset, refOffset: int;
                 r: SimpleRelocation): PatchLoc {....raises: [], tags: [],
    forbids: [].}
proc offset(a: Assembler): AssemblyOffset {....raises: [], tags: [], forbids: [].}
proc offset(a: SimpleAssembler): AssemblyOffset {....raises: [], tags: [],
    forbids: [].}
proc offset(a: VecAssembler): AssemblyOffset {....raises: [], tags: [], forbids: [].}
proc patchAt(loc: PatchLoc; buf: var openArray[byte]; bufOffset: int;
             bufAddr, target: int) {....raises: [DynasmError], tags: [],
                                     forbids: [].}
proc patchRange(loc: PatchLoc; bufOffset: int): tuple[start, len: int] {.
    ...raises: [], tags: [], forbids: [].}
proc push(a: var Assembler; b: byte) {....raises: [], tags: [], forbids: [].}
proc push(a: var SimpleAssembler; b: byte) {....raises: [], tags: [], forbids: [].}
proc push(a: var VecAssembler; b: byte) {....raises: [], tags: [], forbids: [].}
proc pushI8(a: var Assembler; v: int8) {....raises: [], tags: [], forbids: [].}
proc pushI8(a: var SimpleAssembler; v: int8) {....raises: [], tags: [], forbids: [].}
proc pushI8(a: var VecAssembler; v: int8) {....raises: [], tags: [], forbids: [].}
proc pushI16(a: var Assembler; v: int16) {....raises: [], tags: [], forbids: [].}
proc pushI16(a: var SimpleAssembler; v: int16) {....raises: [], tags: [],
    forbids: [].}
proc pushI16(a: var VecAssembler; v: int16) {....raises: [], tags: [], forbids: [].}
proc pushI32(a: var Assembler; v: int32) {....raises: [], tags: [], forbids: [].}
proc pushI32(a: var SimpleAssembler; v: int32) {....raises: [], tags: [],
    forbids: [].}
proc pushI32(a: var VecAssembler; v: int32) {....raises: [], tags: [], forbids: [].}
proc pushI64(a: var Assembler; v: int64) {....raises: [], tags: [], forbids: [].}
proc pushI64(a: var SimpleAssembler; v: int64) {....raises: [], tags: [],
    forbids: [].}
proc pushI64(a: var VecAssembler; v: int64) {....raises: [], tags: [], forbids: [].}
proc pushU16(a: var Assembler; v: uint16) {....raises: [], tags: [], forbids: [].}
proc pushU16(a: var SimpleAssembler; v: uint16) {....raises: [], tags: [],
    forbids: [].}
proc pushU16(a: var VecAssembler; v: uint16) {....raises: [], tags: [], forbids: [].}
proc pushU32(a: var Assembler; v: uint32) {....raises: [], tags: [], forbids: [].}
proc pushU32(a: var SimpleAssembler; v: uint32) {....raises: [], tags: [],
    forbids: [].}
proc pushU32(a: var VecAssembler; v: uint32) {....raises: [], tags: [], forbids: [].}
proc pushU64(a: var Assembler; v: uint64) {....raises: [], tags: [], forbids: [].}
proc pushU64(a: var SimpleAssembler; v: uint64) {....raises: [], tags: [],
    forbids: [].}
proc pushU64(a: var VecAssembler; v: uint64) {....raises: [], tags: [], forbids: [].}
proc readerPtr(a: Assembler; off: AssemblyOffset): pointer {....raises: [],
    tags: [], forbids: [].}
proc relocValue(loc: PatchLoc; target, bufAddr: int): int64 {....raises: [],
    tags: [], forbids: [].}
proc valueReloc(a: var Assembler; value: int; fieldOffset, refOffset: int;
                enc: uint8) {....raises: [ValueError], tags: [], forbids: [].}
proc valueReloc(a: var VecAssembler; value: int; fieldOffset, refOffset: int;
                enc: uint8) {....raises: [ValueError], tags: [], forbids: [].}