b9a83c8a10
[INTERPRETER] * NEW: Support for error management in JIT methods. [COMPILER] * BUG: Fix Error() function metadata. [GB.JIT] * NEW: Support for error management. * NEW: TRY instruction. * BUG: Correct support of NULL.
123 lines
3 KiB
Text
123 lines
3 KiB
Text
' Gambas module file
|
|
|
|
Export
|
|
Class __Jit
|
|
|
|
Private $sCompiler As String
|
|
|
|
Private Sub Init()
|
|
|
|
$sCompiler = System.Find("gcc")
|
|
|
|
End
|
|
|
|
Public Sub Compile(sArch As String) As String
|
|
|
|
Dim sFile As String
|
|
Dim sDir As String
|
|
Dim sName As String
|
|
Dim sPath As String
|
|
Dim hFile As File
|
|
Dim sResult As String
|
|
Dim sPathO As String
|
|
Dim sPathSO As String
|
|
Dim fTime As Float
|
|
Dim sFlag As String
|
|
Dim bDebug As Boolean
|
|
|
|
Try bDebug = CInt(Env["GB_JIT_DEBUG"])
|
|
|
|
If bDebug Then
|
|
fTime = Timer
|
|
Error "gb.jit: translating "; If(sArch, sArch, "project")
|
|
Endif
|
|
|
|
sName = sArch
|
|
If Not sName Then sName = "gb"
|
|
|
|
sDir = File.Dir(Temp$()) &/ "jit"
|
|
Try Mkdir sDir
|
|
sPath = sDir &/ sName & ".c"
|
|
|
|
If bDebug Then Error "gb.jit: generating "; sPath
|
|
|
|
hFile = Open sPath For Output Create
|
|
|
|
Print #hFile, "#define NO_CONFIG_H"
|
|
Print #hFile, File.Load("gambas.h");
|
|
Print #hFile, File.Load("jit.h");
|
|
Print #hFile, File.Load("gb_error_common.h");
|
|
Print #hFile, File.Load("gb.jit.h");
|
|
|
|
Print #hFile, "GB_INTERFACE * GB_PTR;"
|
|
Print #hFile, "#define GB (*GB_PTR)"
|
|
Print #hFile, "JIT_INTERFACE * JIT_PTR;"
|
|
Print #hFile, "#define JIT (*JIT_PTR)"
|
|
|
|
If sArch Then
|
|
sDir = "." &/ sArch
|
|
Else
|
|
sDir = "..."
|
|
Endif
|
|
|
|
For Each sFile In Dir(sDir &/ ".gambas")
|
|
ClassStat.Stat(sDir, sFile)
|
|
If Not ClassStat.HasFast Then Continue
|
|
sFile = ClassStat.Name
|
|
If bDebug Then Error "gb.jit: translating class "; sFile
|
|
Print #hFile, __Jit.Translate(sFile, sArch)
|
|
Next
|
|
|
|
Close #hFile
|
|
|
|
If bDebug Then
|
|
Try Kill "/tmp/" & File.Name(sPath)
|
|
Copy sPath To "/tmp/" & File.Name(sPath)
|
|
Endif
|
|
|
|
sPathO = File.SetExt(sPath, "o")
|
|
sPathSO = File.SetExt(sPath, "so")
|
|
|
|
If Not $sCompiler Then Init
|
|
|
|
' Error "gb.jit: preprocessing:"
|
|
'
|
|
' Shell $sCompiler & " -E " & Shell(sPath) & " 2>&1" To sResult
|
|
' Error sResult
|
|
|
|
If bDebug Then Error "gb.jit: compiling to "; sPathO
|
|
|
|
sFlag = Env["GB_JIT_CFLAGS"]
|
|
If Not sFlag Then sFlag = "-O3"
|
|
|
|
'Shell $sCompiler & " -E " & Shell(sPath) & " 2>&1" To sResult
|
|
'Error sResult
|
|
|
|
'gcc -c -fPIC -o foo.o foo.c
|
|
'Exec [$sCompiler, "-c", "-fPIC", "-o", File.SetExt(sPath, "o"), sPath] To sResult
|
|
Shell $sCompiler & " -c -fPIC " & sFlag & " -o " & Shell(sPathO) & " " & Shell(sPath) & " 2>&1" To sResult
|
|
If Not Exist(sPathO) Then
|
|
Error "gb.jit: error: unable to compile JIT code:"
|
|
Error sResult
|
|
Return
|
|
Endif
|
|
|
|
If bDebug Then Error "gb.jit: linking to "; sPathSO
|
|
|
|
'gcc -shared -o libfoo.so foo.o
|
|
'Exec [$sCompiler, "-shared", "-o", File.SetExt(sPath, "so"), File.SetExt(sPath, "o")] To sResult
|
|
Shell $sCompiler & " -shared " & sFlag & " -lm -o " & Shell(sPathSO) & " " & Shell(sPathO) & " 2>&1" To sResult
|
|
If Not Exist(sPathSO) Then
|
|
Error "gb.jit: warning: unable to link JIT code:"
|
|
Error sResult
|
|
Return
|
|
Endif
|
|
|
|
If bDebug Then Error "gb.jit: done in "; Format(Timer - fTime, "0.000"); "s"
|
|
|
|
' Shell "objdump -S " & Shell(sPathSO) To sResult
|
|
' Error sResult
|
|
|
|
Return sPathSO
|
|
|
|
End
|