@@ -33,18 +33,17 @@ func (b *builder) createRawSyscall(call *ssa.CallCommon) (llvm.Value, error) {
33
33
"{r10}" ,
34
34
"{r8}" ,
35
35
"{r9}" ,
36
- "{r11}" ,
37
- "{r12}" ,
38
- "{r13}" ,
39
36
}[i ]
40
37
llvmValue := b .getValue (arg , getPos (call ))
41
38
args = append (args , llvmValue )
42
39
argTypes = append (argTypes , llvmValue .Type ())
43
40
}
41
+ // rcx and r11 are clobbered by the syscall, so make sure they are not used
44
42
constraints += ",~{rcx},~{r11}"
45
43
fnType := llvm .FunctionType (b .uintptrType , argTypes , false )
46
44
target := llvm .InlineAsm (fnType , "syscall" , constraints , true , false , llvm .InlineAsmDialectIntel , false )
47
45
return b .CreateCall (fnType , target , args , "" ), nil
46
+
48
47
case b .GOARCH == "386" && b .GOOS == "linux" :
49
48
// Sources:
50
49
// syscall(2) man page
@@ -71,6 +70,7 @@ func (b *builder) createRawSyscall(call *ssa.CallCommon) (llvm.Value, error) {
71
70
fnType := llvm .FunctionType (b .uintptrType , argTypes , false )
72
71
target := llvm .InlineAsm (fnType , "int 0x80" , constraints , true , false , llvm .InlineAsmDialectIntel , false )
73
72
return b .CreateCall (fnType , target , args , "" ), nil
73
+
74
74
case b .GOARCH == "arm" && b .GOOS == "linux" :
75
75
// Implement the EABI system call convention for Linux.
76
76
// Source: syscall(2) man page.
@@ -103,6 +103,7 @@ func (b *builder) createRawSyscall(call *ssa.CallCommon) (llvm.Value, error) {
103
103
fnType := llvm .FunctionType (b .uintptrType , argTypes , false )
104
104
target := llvm .InlineAsm (fnType , "svc #0" , constraints , true , false , 0 , false )
105
105
return b .CreateCall (fnType , target , args , "" ), nil
106
+
106
107
case b .GOARCH == "arm64" && b .GOOS == "linux" :
107
108
// Source: syscall(2) man page.
108
109
args := []llvm.Value {}
@@ -135,6 +136,7 @@ func (b *builder) createRawSyscall(call *ssa.CallCommon) (llvm.Value, error) {
135
136
fnType := llvm .FunctionType (b .uintptrType , argTypes , false )
136
137
target := llvm .InlineAsm (fnType , "svc #0" , constraints , true , false , 0 , false )
137
138
return b .CreateCall (fnType , target , args , "" ), nil
139
+
138
140
default :
139
141
return llvm.Value {}, b .makeError (call .Pos (), "unknown GOOS/GOARCH for syscall: " + b .GOOS + "/" + b .GOARCH )
140
142
}
@@ -217,6 +219,7 @@ func (b *builder) createSyscall(call *ssa.CallCommon) (llvm.Value, error) {
217
219
retval = b .CreateInsertValue (retval , syscallResult , 0 , "" )
218
220
retval = b .CreateInsertValue (retval , errResult , 2 , "" )
219
221
return retval , nil
222
+
220
223
default :
221
224
return llvm.Value {}, b .makeError (call .Pos (), "unknown GOOS/GOARCH for syscall: " + b .GOOS + "/" + b .GOARCH )
222
225
}
0 commit comments