@@ -14,6 +14,7 @@ import Data.Maybe (fromJust)
14
14
15
15
import Foreign
16
16
import Foreign.C.Types
17
+ import Unsafe.Coerce
17
18
18
19
import JVM.ClassFile
19
20
import JVM.Assembler
@@ -27,7 +28,10 @@ import MateVMRuntime.ClassPool
27
28
import MateVMRuntime.NativeMethods
28
29
29
30
import qualified LLVM.AST as AST
31
+ import qualified LLVM.AST.Global as LG
32
+ import qualified LLVM.AST.Linkage as LL
30
33
import qualified LLVM.ExecutionEngine as EE
34
+ import qualified LLVM.AST.Constant as LC
31
35
import LLVM.Context
32
36
import LLVM.CodeModel
33
37
import LLVM.Target
@@ -96,6 +100,20 @@ insertCompiledMethod entry (MethodInfo mmname _ msig) clsnames = do
96
100
initModule :: AST. Module
97
101
initModule = AST. defaultModule { AST. moduleName = " dummy" }
98
102
103
+ mkName' :: B. ByteString -> AST. Name
104
+ mkName' = AST. mkName . map unsafeCoerce . B. unpack
105
+
106
+ parseFields :: Class Direct -> [AST. Definition ]
107
+ parseFields cls =
108
+ flip map (classFields cls) $ \ field ->
109
+ let nameType = fieldNameType field in
110
+ AST. GlobalDefinition $ LG. globalVariableDefaults {
111
+ LG. name = mkName' $ ntName nameType,
112
+ LG. type' = jvm2llvmType $ ntSignature nameType,
113
+ LG. linkage = LL. Private ,
114
+ LG. initializer = Just $ LC. Int 32 0
115
+ }
116
+
99
117
-- Stubbed for now...
100
118
-- TODO: Do LLVM
101
119
compileMethod :: B. ByteString -> MethodSignature -> Class Direct -> IO (a ,b )
@@ -105,7 +123,7 @@ compileMethod name sig cls = do
105
123
106
124
cfg <- pipeline cls meth (codeInstructions . decodeMethod $ code)
107
125
-- cfg <- parseCFG (decodeMethod code)
108
- let mod = AST. defaultModule { AST. moduleDefinitions = [defineFn (returnType sig) " main" (M. elems $ basicBlocks cfg)], AST. moduleName = " Dummy" }
126
+ let mod = AST. defaultModule { AST. moduleDefinitions = parseFields cls ++ [defineFn (returnType sig) " main" (M. elems $ basicBlocks cfg)], AST. moduleName = " Dummy" }
109
127
ast <- compileMethod' mod
110
128
error . show $ ast
111
129
@@ -135,7 +153,8 @@ compileMethod' mod =
135
153
case mainfn of
136
154
Just fn -> do
137
155
result <- code_int (castFunPtr fn :: FunPtr (IO Int ))
138
- printfJit $ " Evaluated to: " ++ show result
156
+ printfJit . show $ result
157
+
139
158
Nothing -> return ()
140
159
141
160
-- Optimized module used only in next pass...
0 commit comments