Method: Voodoo::AMD64NasmGenerator#initialize

Defined in:
lib/voodoo/generators/amd64_nasm_generator.rb

#initialize(params = {}) ⇒ AMD64NasmGenerator

Returns a new instance of AMD64NasmGenerator.



64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'lib/voodoo/generators/amd64_nasm_generator.rb', line 64

def initialize params = {}
  # Number of bytes in a word
  @WORDSIZE_BITS = 3
  @WORDSIZE = 1 << @WORDSIZE_BITS
  # Word name in NASM lingo
  @WORD_NAME = 'qword'
  # Default alignment for code
  @CODE_ALIGNMENT = 0
  # Default alignment for data
  @DATA_ALIGNMENT = @WORDSIZE
  # Default alignment for functions
  @FUNCTION_ALIGNMENT = 16
  # Register used for return values
  @RETURN_REG = :rax
  # Stack alignment restrictions
  @STACK_ALIGNMENT_BITS = @WORDSIZE_BITS
  @STACK_ALIGNMENT = 1 << @STACK_ALIGNMENT_BITS
  @TEMPORARIES = [:r11]
  # Registers used for argument passing
  @ARG_REGS = [:rdi, :rsi, :rdx, :rcx, :r8, :r9]
  @NREG_ARGS = @ARG_REGS.length
  # Registers used to store locals
  @LOCAL_REGISTERS = [:r12, :r13, :r14, :r15]
  @NLOCAL_REGISTERS = @LOCAL_REGISTERS.length
  @LOCAL_REGISTERS_SET = Set.new @LOCAL_REGISTERS
  # Accumulator index
  @AX = :rax
  # Base index
  @BX = :rbx
  # Count index
  @CX = :rcx
  # Data index
  @DX = :rdx
  # Base pointer
  @BP = :rbp
  # Stack pointer
  @SP = :rsp
  @SAVE_FRAME_REGISTERS = [:rbx, :r12, :r13, :r14, :r15, :rsp, :rbp]
  @SAVED_FRAME_LAYOUT = {}
  @SAVE_FRAME_REGISTERS.each_with_index { |r,i| @SAVED_FRAME_LAYOUT[r] = i }
  super params
  @features.merge! \
    :'bits-per-word' => '64',
    :'byte-order' => 'little-endian',
    :'bytes-per-word' => '8'
  @saved_registers = []
  @function_end_label = nil
end