Implement print() and println() in Go
Этот коммит содержится в:
родитель
ff9e7a8b77
коммит
45e7376f39
4 изменённых файлов: 48 добавлений и 43 удалений
2
Makefile
2
Makefile
|
@ -12,7 +12,7 @@ build/tgo: *.go
|
||||||
@mkdir -p build
|
@mkdir -p build
|
||||||
@go build -o build/tgo -i .
|
@go build -o build/tgo -i .
|
||||||
|
|
||||||
build/hello.o: build/tgo src/examples/hello/*.go
|
build/hello.o: build/tgo src/examples/hello/*.go src/runtime/*.go
|
||||||
@./build/tgo -printir -o build/hello.o examples/hello
|
@./build/tgo -printir -o build/hello.o examples/hello
|
||||||
|
|
||||||
build/runtime.o: src/runtime/*.c src/runtime/*.h
|
build/runtime.o: src/runtime/*.c src/runtime/*.h
|
||||||
|
|
|
@ -1,43 +1,6 @@
|
||||||
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include "runtime.h"
|
#include "runtime.h"
|
||||||
|
|
||||||
void __go_printstring(string_t str) {
|
|
||||||
for (int i = 0; i < str.len; i++) {
|
|
||||||
putchar(str.buf[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void __go_printint(intgo_t n) {
|
|
||||||
// Print integer in signed big-endian base-10 notation, for humans to
|
|
||||||
// read.
|
|
||||||
// TODO: don't recurse, but still be compact (and don't divide/mod
|
|
||||||
// more than necessary).
|
|
||||||
if (n < 0) {
|
|
||||||
putchar('-');
|
|
||||||
n = -n;
|
|
||||||
}
|
|
||||||
intgo_t prevdigits = n / 10;
|
|
||||||
if (prevdigits != 0) {
|
|
||||||
__go_printint(prevdigits);
|
|
||||||
}
|
|
||||||
putchar((n % 10) + '0');
|
|
||||||
}
|
|
||||||
|
|
||||||
void __go_printbyte(uint8_t c) {
|
|
||||||
putchar(c);
|
|
||||||
}
|
|
||||||
|
|
||||||
void __go_printspace() {
|
|
||||||
putchar(' ');
|
|
||||||
}
|
|
||||||
|
|
||||||
void __go_printnl() {
|
|
||||||
putchar('\n');
|
|
||||||
}
|
|
||||||
|
|
||||||
void go_main() __asm__("main.main");
|
void go_main() __asm__("main.main");
|
||||||
|
|
||||||
void __go_runtime_main() {
|
void __go_runtime_main() {
|
||||||
|
|
41
src/runtime/runtime.go
Обычный файл
41
src/runtime/runtime.go
Обычный файл
|
@ -0,0 +1,41 @@
|
||||||
|
|
||||||
|
package runtime
|
||||||
|
|
||||||
|
// #include <stdio.h>
|
||||||
|
import "C"
|
||||||
|
|
||||||
|
const Compiler = "tgo"
|
||||||
|
|
||||||
|
func printstring(s string) {
|
||||||
|
for i := 0; i < len(s); i++ {
|
||||||
|
C.putchar(C.int(s[i]))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func printint(n int) {
|
||||||
|
// Print integer in signed big-endian base-10 notation, for humans to
|
||||||
|
// read.
|
||||||
|
// TODO: don't recurse, but still be compact (and don't divide/mod
|
||||||
|
// more than necessary).
|
||||||
|
if n < 0 {
|
||||||
|
C.putchar('-')
|
||||||
|
n = -n
|
||||||
|
}
|
||||||
|
prevdigits := n / 10
|
||||||
|
if prevdigits != 0 {
|
||||||
|
printint(prevdigits)
|
||||||
|
}
|
||||||
|
C.putchar(C.int((n % 10) + '0'))
|
||||||
|
}
|
||||||
|
|
||||||
|
func printbyte(c uint8) {
|
||||||
|
C.putchar(C.int(c))
|
||||||
|
}
|
||||||
|
|
||||||
|
func printspace() {
|
||||||
|
C.putchar(' ')
|
||||||
|
}
|
||||||
|
|
||||||
|
func printnl() {
|
||||||
|
C.putchar('\n')
|
||||||
|
}
|
11
tgo.go
11
tgo.go
|
@ -97,15 +97,15 @@ func NewCompiler(pkgName, triple string) (*Compiler, error) {
|
||||||
c.typeassertType = llvm.StructType([]llvm.Type{llvm.PointerType(llvm.Int8Type(), 0), llvm.Int1Type()}, false)
|
c.typeassertType = llvm.StructType([]llvm.Type{llvm.PointerType(llvm.Int8Type(), 0), llvm.Int1Type()}, false)
|
||||||
|
|
||||||
printstringType := llvm.FunctionType(llvm.VoidType(), []llvm.Type{c.stringType}, false)
|
printstringType := llvm.FunctionType(llvm.VoidType(), []llvm.Type{c.stringType}, false)
|
||||||
c.printstringFunc = llvm.AddFunction(c.mod, "__go_printstring", printstringType)
|
c.printstringFunc = llvm.AddFunction(c.mod, "runtime.printstring", printstringType)
|
||||||
printintType := llvm.FunctionType(llvm.VoidType(), []llvm.Type{c.intType}, false)
|
printintType := llvm.FunctionType(llvm.VoidType(), []llvm.Type{c.intType}, false)
|
||||||
c.printintFunc = llvm.AddFunction(c.mod, "__go_printint", printintType)
|
c.printintFunc = llvm.AddFunction(c.mod, "runtime.printint", printintType)
|
||||||
printbyteType := llvm.FunctionType(llvm.VoidType(), []llvm.Type{llvm.Int8Type()}, false)
|
printbyteType := llvm.FunctionType(llvm.VoidType(), []llvm.Type{llvm.Int8Type()}, false)
|
||||||
c.printbyteFunc = llvm.AddFunction(c.mod, "__go_printbyte", printbyteType)
|
c.printbyteFunc = llvm.AddFunction(c.mod, "runtime.printbyte", printbyteType)
|
||||||
printspaceType := llvm.FunctionType(llvm.VoidType(), nil, false)
|
printspaceType := llvm.FunctionType(llvm.VoidType(), nil, false)
|
||||||
c.printspaceFunc = llvm.AddFunction(c.mod, "__go_printspace", printspaceType)
|
c.printspaceFunc = llvm.AddFunction(c.mod, "runtime.printspace", printspaceType)
|
||||||
printnlType := llvm.FunctionType(llvm.VoidType(), nil, false)
|
printnlType := llvm.FunctionType(llvm.VoidType(), nil, false)
|
||||||
c.printnlFunc = llvm.AddFunction(c.mod, "__go_printnl", printnlType)
|
c.printnlFunc = llvm.AddFunction(c.mod, "runtime.printnl", printnlType)
|
||||||
|
|
||||||
return c, nil
|
return c, nil
|
||||||
}
|
}
|
||||||
|
@ -126,6 +126,7 @@ func (c *Compiler) Parse(pkgName string) error {
|
||||||
},
|
},
|
||||||
AllowErrors: true,
|
AllowErrors: true,
|
||||||
}
|
}
|
||||||
|
config.Import("runtime")
|
||||||
config.Import(pkgName)
|
config.Import(pkgName)
|
||||||
lprogram, err := config.Load()
|
lprogram, err := config.Load()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче