@@ -10,11 +10,11 @@ import (
10
10
"tinygo.org/x/go-llvm"
11
11
)
12
12
13
- // createSyscall emits an inline system call instruction, depending on the
14
- // target OS/arch.
15
- func (b * builder ) createSyscall (call * ssa.CallCommon ) (llvm.Value , error ) {
13
+ // createRawSyscall creates a system call with the provided system call number
14
+ // and returns the result as a single integer (the system call result). The
15
+ // result is not further interpreted.
16
+ func (b * builder ) createRawSyscall (call * ssa.CallCommon ) (llvm.Value , error ) {
16
17
num := b .getValue (call .Args [0 ])
17
- var syscallResult llvm.Value
18
18
switch {
19
19
case b .GOARCH == "amd64" :
20
20
if b .GOOS == "darwin" {
@@ -57,7 +57,7 @@ func (b *builder) createSyscall(call *ssa.CallCommon) (llvm.Value, error) {
57
57
constraints += ",~{rcx},~{r11}"
58
58
fnType := llvm .FunctionType (b .uintptrType , argTypes , false )
59
59
target := llvm .InlineAsm (fnType , "syscall" , constraints , true , false , llvm .InlineAsmDialectIntel )
60
- syscallResult = b .CreateCall (target , args , "" )
60
+ return b .CreateCall (target , args , "" ), nil
61
61
case b .GOARCH == "386" && b .GOOS == "linux" :
62
62
// Sources:
63
63
// syscall(2) man page
@@ -83,7 +83,7 @@ func (b *builder) createSyscall(call *ssa.CallCommon) (llvm.Value, error) {
83
83
}
84
84
fnType := llvm .FunctionType (b .uintptrType , argTypes , false )
85
85
target := llvm .InlineAsm (fnType , "int 0x80" , constraints , true , false , llvm .InlineAsmDialectIntel )
86
- syscallResult = b .CreateCall (target , args , "" )
86
+ return b .CreateCall (target , args , "" ), nil
87
87
case b .GOARCH == "arm" && b .GOOS == "linux" :
88
88
// Implement the EABI system call convention for Linux.
89
89
// Source: syscall(2) man page.
@@ -115,7 +115,7 @@ func (b *builder) createSyscall(call *ssa.CallCommon) (llvm.Value, error) {
115
115
}
116
116
fnType := llvm .FunctionType (b .uintptrType , argTypes , false )
117
117
target := llvm .InlineAsm (fnType , "svc #0" , constraints , true , false , 0 )
118
- syscallResult = b .CreateCall (target , args , "" )
118
+ return b .CreateCall (target , args , "" ), nil
119
119
case b .GOARCH == "arm64" && b .GOOS == "linux" :
120
120
// Source: syscall(2) man page.
121
121
args := []llvm.Value {}
@@ -147,10 +147,19 @@ func (b *builder) createSyscall(call *ssa.CallCommon) (llvm.Value, error) {
147
147
constraints += ",~{x16},~{x17}" // scratch registers
148
148
fnType := llvm .FunctionType (b .uintptrType , argTypes , false )
149
149
target := llvm .InlineAsm (fnType , "svc #0" , constraints , true , false , 0 )
150
- syscallResult = b .CreateCall (target , args , "" )
150
+ return b .CreateCall (target , args , "" ), nil
151
151
default :
152
152
return llvm.Value {}, b .makeError (call .Pos (), "unknown GOOS/GOARCH for syscall: " + b .GOOS + "/" + b .GOARCH )
153
153
}
154
+ }
155
+
156
+ // createSyscall emits instructions for the syscall.Syscall* family of
157
+ // functions, depending on the target OS/arch.
158
+ func (b * builder ) createSyscall (call * ssa.CallCommon ) (llvm.Value , error ) {
159
+ syscallResult , err := b .createRawSyscall (call )
160
+ if err != nil {
161
+ return syscallResult , err
162
+ }
154
163
switch b .GOOS {
155
164
case "linux" , "freebsd" :
156
165
// Return values: r0, r1 uintptr, err Errno
@@ -190,3 +199,16 @@ func (b *builder) createSyscall(call *ssa.CallCommon) (llvm.Value, error) {
190
199
return llvm.Value {}, b .makeError (call .Pos (), "unknown GOOS/GOARCH for syscall: " + b .GOOS + "/" + b .GOARCH )
191
200
}
192
201
}
202
+
203
+ // createRawSyscallNoError emits instructions for the Linux-specific
204
+ // syscall.rawSyscallNoError function.
205
+ func (b * builder ) createRawSyscallNoError (call * ssa.CallCommon ) (llvm.Value , error ) {
206
+ syscallResult , err := b .createRawSyscall (call )
207
+ if err != nil {
208
+ return syscallResult , err
209
+ }
210
+ retval := llvm .ConstNull (b .ctx .StructType ([]llvm.Type {b .uintptrType , b .uintptrType }, false ))
211
+ retval = b .CreateInsertValue (retval , syscallResult , 0 , "" )
212
+ retval = b .CreateInsertValue (retval , llvm .ConstInt (b .uintptrType , 0 , false ), 1 , "" )
213
+ return retval , nil
214
+ }
0 commit comments