0 | {--
 1 | Copyright (C) 2025  Joel Berkeley
 2 |
 3 | This program is free software: you can redistribute it and/or modify
 4 | it under the terms of the GNU Affero General Public License as published
 5 | by the Free Software Foundation, either version 3 of the License, or
 6 | (at your option) any later version.
 7 |
 8 | This program is distributed in the hope that it will be useful,
 9 | but WITHOUT ANY WARRANTY; without even the implied warranty of
10 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 | GNU Affero General Public License for more details.
12 |
13 | You should have received a copy of the GNU Affero General Public License
14 | along with this program.  If not, see <https://www.gnu.org/licenses/>.
15 | --}
16 | ||| For internal spidr use only.
17 | module Compiler.MLIR.Pass.PassManager
18 |
19 | import Compiler.MLIR.IR.MLIRContext
20 | import Compiler.MLIR.IR.Operation
21 | import Compiler.FFI
22 |
23 | ffi : String -> String
24 | ffi = libxla "c/mlir/Pass/PassManager.h"
25 |
26 | public export
27 | data PassManager = MkPassManager GCAnyPtr
28 |
29 | %foreign (ffi "PassManager_new")
30 | prim__mkPassManager : AnyPtr -> PrimIO AnyPtr
31 |
32 | %foreign (ffi "PassManager_delete")
33 | prim__delete : AnyPtr -> PrimIO ()
34 |
35 | export
36 | mkPassManager : HasIO io => MLIRContext -> io PassManager
37 | mkPassManager (MkMLIRContext ctx) = do
38 |   manager <- primIO $ prim__mkPassManager ctx
39 |   manager <- onCollectAny' manager (primIO . PassManager.prim__delete)
40 |   pure (MkPassManager manager)
41 |
42 | %foreign (ffi "PassManager_dump")
43 | prim__passManagerDump : GCAnyPtr -> PrimIO ()
44 |
45 | export
46 | dump : HasIO io => PassManager -> io ()
47 | dump (MkPassManager manager) = primIO $ prim__passManagerDump manager
48 |
49 | %foreign (ffi "PassManager_run")
50 | prim__passManagerRun : GCAnyPtr -> AnyPtr -> PrimIO Int
51 |
52 | export
53 | run : HasIO io => PassManager -> Operation -> io Bool
54 | run (MkPassManager manager) (MkOperation op) = do
55 |   ok <- primIO $ prim__passManagerRun manager op
56 |   pure (cIntToBool ok)
57 |