Minor changes
This commit is contained in:
parent
506d1e30bf
commit
aab33fe86d
@ -6,6 +6,7 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
"git.akyoto.dev/cli/q/build/elf"
|
"git.akyoto.dev/cli/q/build/elf"
|
||||||
|
"git.akyoto.dev/cli/q/cli/log"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Build describes a compiler build.
|
// Build describes a compiler build.
|
||||||
@ -23,6 +24,23 @@ func New(directory string) (*Build, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
file, err := os.Open(directory)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
defer file.Close()
|
||||||
|
files, err := file.Readdirnames(0)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, name := range files {
|
||||||
|
log.Info.Println(name)
|
||||||
|
}
|
||||||
|
|
||||||
executableName := filepath.Base(directory)
|
executableName := filepath.Base(directory)
|
||||||
|
|
||||||
build := &Build{
|
build := &Build{
|
||||||
@ -36,29 +54,34 @@ func New(directory string) (*Build, error) {
|
|||||||
|
|
||||||
// Run parses the input files and generates an executable file.
|
// Run parses the input files and generates an executable file.
|
||||||
func (build *Build) Run() error {
|
func (build *Build) Run() error {
|
||||||
|
code := build.Compile()
|
||||||
|
|
||||||
if build.WriteExecutable {
|
if build.WriteExecutable {
|
||||||
sampleCode := []byte{
|
return writeToDisk(build.ExecutablePath, code)
|
||||||
0xb8, 0x01, 0x00, 0x00, 0x00, // mov eax, 1
|
|
||||||
0xbf, 0x01, 0x00, 0x00, 0x00, // mov edi, 1
|
|
||||||
0xbe, 0x80 + 0x22, 0x00, 0x40, 0x00, // mov esi, 0x4000A2
|
|
||||||
0xba, 0x06, 0x00, 0x00, 0x00, // mov edx, 6
|
|
||||||
0x0f, 0x05, // syscall
|
|
||||||
|
|
||||||
0xb8, 0x3c, 0x00, 0x00, 0x00, // mov eax, 60
|
|
||||||
0xbf, 0x00, 0x00, 0x00, 0x00, // mov edi, 0
|
|
||||||
0x0f, 0x05, // syscall
|
|
||||||
|
|
||||||
'H', 'e', 'l', 'l', 'o', '\n',
|
|
||||||
}
|
|
||||||
|
|
||||||
return writeToDisk(build.ExecutablePath, sampleCode, nil)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Compile compiles all the functions.
|
||||||
|
func (build *Build) Compile() []byte {
|
||||||
|
return []byte{
|
||||||
|
0xb8, 0x01, 0x00, 0x00, 0x00, // mov eax, 1
|
||||||
|
0xbf, 0x01, 0x00, 0x00, 0x00, // mov edi, 1
|
||||||
|
0xbe, 0xa2, 0x00, 0x40, 0x00, // mov esi, 0x4000a2
|
||||||
|
0xba, 0x06, 0x00, 0x00, 0x00, // mov edx, 6
|
||||||
|
0x0f, 0x05, // syscall
|
||||||
|
|
||||||
|
0xb8, 0x3c, 0x00, 0x00, 0x00, // mov eax, 60
|
||||||
|
0xbf, 0x00, 0x00, 0x00, 0x00, // mov edi, 0
|
||||||
|
0x0f, 0x05, // syscall
|
||||||
|
|
||||||
|
'H', 'e', 'l', 'l', 'o', '\n',
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// writeToDisk writes the executable file to disk.
|
// writeToDisk writes the executable file to disk.
|
||||||
func writeToDisk(filePath string, code []byte, data []byte) error {
|
func writeToDisk(filePath string, code []byte) error {
|
||||||
file, err := os.Create(filePath)
|
file, err := os.Create(filePath)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -6,7 +6,8 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
baseAddress = 0x400000
|
minAddress = 0x10000
|
||||||
|
baseAddress = 0x40 * minAddress
|
||||||
)
|
)
|
||||||
|
|
||||||
// ELF64 represents an ELF 64-bit file.
|
// ELF64 represents an ELF 64-bit file.
|
||||||
|
16
cli/Build.go
16
cli/Build.go
@ -1,10 +1,8 @@
|
|||||||
package cli
|
package cli
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"os"
|
|
||||||
|
|
||||||
"git.akyoto.dev/cli/q/build"
|
"git.akyoto.dev/cli/q/build"
|
||||||
"git.akyoto.dev/cli/q/log"
|
"git.akyoto.dev/cli/q/cli/log"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Build(args []string) int {
|
func Build(args []string) int {
|
||||||
@ -14,18 +12,6 @@ func Build(args []string) int {
|
|||||||
directory = args[0]
|
directory = args[0]
|
||||||
}
|
}
|
||||||
|
|
||||||
stat, err := os.Stat(directory)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
log.Error.Println(err)
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
|
|
||||||
if !stat.IsDir() {
|
|
||||||
log.Error.Println("Build path must be a directory")
|
|
||||||
return 2
|
|
||||||
}
|
|
||||||
|
|
||||||
b, err := build.New(directory)
|
b, err := build.New(directory)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
package cli
|
package cli
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"git.akyoto.dev/cli/q/log"
|
"git.akyoto.dev/cli/q/cli/log"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Help(args []string) int {
|
func Help(args []string) int {
|
||||||
|
@ -4,7 +4,7 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"runtime"
|
"runtime"
|
||||||
|
|
||||||
"git.akyoto.dev/cli/q/log"
|
"git.akyoto.dev/cli/q/cli/log"
|
||||||
)
|
)
|
||||||
|
|
||||||
func System(args []string) int {
|
func System(args []string) int {
|
||||||
|
@ -18,7 +18,7 @@ func TestCLI(t *testing.T) {
|
|||||||
{[]string{"invalid"}, 2},
|
{[]string{"invalid"}, 2},
|
||||||
{[]string{"system"}, 0},
|
{[]string{"system"}, 0},
|
||||||
{[]string{"build", "non-existing-directory"}, 1},
|
{[]string{"build", "non-existing-directory"}, 1},
|
||||||
{[]string{"build", "examples/hello/hello.q"}, 2},
|
{[]string{"build", "examples/hello/hello.q"}, 1},
|
||||||
{[]string{"build", "examples/hello", "--invalid"}, 2},
|
{[]string{"build", "examples/hello", "--invalid"}, 2},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"git.akyoto.dev/cli/q/log"
|
"git.akyoto.dev/cli/q/cli/log"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestMain(m *testing.M) {
|
func TestMain(m *testing.M) {
|
||||||
|
Loading…
Reference in New Issue
Block a user