46 lines
1 KiB
Go
46 lines
1 KiB
Go
package asmc
|
|
|
|
import (
|
|
"git.urbach.dev/cli/q/src/arm"
|
|
"git.urbach.dev/cli/q/src/asm"
|
|
"git.urbach.dev/cli/q/src/config"
|
|
"git.urbach.dev/cli/q/src/dll"
|
|
)
|
|
|
|
// Finalize generates the final machine code.
|
|
func Finalize(a asm.Assembler, dlls dll.List) ([]byte, []byte) {
|
|
data, dataLabels := a.Data.Finalize()
|
|
|
|
if config.TargetOS == config.Windows && len(data) == 0 {
|
|
data = []byte{0}
|
|
}
|
|
|
|
c := compiler{
|
|
code: make([]byte, 0, len(a.Instructions)*8),
|
|
codeLabels: make(map[string]Address, 32),
|
|
codePointers: make([]*pointer, 0, len(a.Instructions)*8),
|
|
codeStart: codeOffset(),
|
|
data: data,
|
|
dataLabels: dataLabels,
|
|
dlls: dlls,
|
|
}
|
|
|
|
switch config.TargetArch {
|
|
case config.ARM:
|
|
for _, x := range a.Instructions {
|
|
c.compileARM(x)
|
|
}
|
|
|
|
c.code = arm.MoveRegisterNumber(c.code, arm.X0, 0)
|
|
c.code = arm.MoveRegisterNumber(c.code, arm.X8, 0x5D)
|
|
c.code = arm.Syscall(c.code)
|
|
|
|
case config.X86:
|
|
for _, x := range a.Instructions {
|
|
c.compileX86(x)
|
|
}
|
|
}
|
|
|
|
c.resolvePointers()
|
|
return c.code, c.data
|
|
}
|