@@ -49,14 +49,44 @@ trait GenExternal extends SymExeDefs {
4949 }
5050 }
5151
52+ def gen_open [T : Manifest ](ss : Rep [SS ], args : Rep [List [Value ]], k : (Rep [SS ], Rep [Value ]) => Rep [T ]): Rep [T ] = {
53+ val ptr = args(0 )
54+ val name : Rep [String ] = getString(ptr, ss)
55+ val flags = args(1 )
56+ // val mode = args(2) // how to handle optional argument?
57+ val fs : Rep [FS ] = ss.getFs
58+ val ret : Rep [Fd ] = fs.openFile(name, 0 )
59+ ss.setFs(fs)
60+ k(ss, IntV (ret, 32 ))
61+ }
62+
63+ def gen_openat [T : Manifest ](ss : Rep [SS ], args : Rep [List [Value ]], k : (Rep [SS ], Rep [Value ]) => Rep [T ]): Rep [T ] = {
64+ // TODO: implement this <2022-01-23, David Deng> //
65+ // int __fd_openat(int basefd, const char *pathname, int flags, mode_t mode);
66+ // if (fd == AT_FDCWD), call open
67+ k(ss, IntV (0 , 32 ))
68+ }
69+
5270 def llsc_assert (ss : Rep [SS ], args : Rep [List [Value ]]): Rep [List [(SS , Value )]] =
5371 gen_llsc_assert[List [(SS , Value )]](ss, args, { case (s, v) => List [(SS , Value )]((s, v)) })
5472
5573 def llsc_assert_k (ss : Rep [SS ], args : Rep [List [Value ]], k : Rep [Cont ]): Rep [Unit ] =
5674 gen_llsc_assert[Unit ](ss, args, { case (s, v) => k(s, v) })
75+
76+ def open (ss : Rep [SS ], args : Rep [List [Value ]]): Rep [List [(SS , Value )]] =
77+ gen_open[List [(SS , Value )]](ss, args, { case (s, v) => List [(SS , Value )]((s, v)) })
78+
79+ def open_k (ss : Rep [SS ], args : Rep [List [Value ]], k : Rep [Cont ]): Rep [Unit ] =
80+ gen_open[Unit ](ss, args, { case (s, v) => k(s, v) })
81+
82+ def openat (ss : Rep [SS ], args : Rep [List [Value ]]): Rep [List [(SS , Value )]] =
83+ gen_openat[List [(SS , Value )]](ss, args, { case (s, v) => List [(SS , Value )]((s, v)) })
84+
85+ def openat_k (ss : Rep [SS ], args : Rep [List [Value ]], k : Rep [Cont ]): Rep [Unit ] =
86+ gen_openat[Unit ](ss, args, { case (s, v) => k(s, v) })
5787}
5888
59- class ExternalLLSCDriver (folder : String = " ." ) extends SAISnippet [Int , Unit ] with SAIOps with GenExternal { q =>
89+ class ExternalLLSCDriver (folder : String = " ./headers/llsc " ) extends SAISnippet [Int , Unit ] with SAIOps with GenExternal { q =>
6090 import java .io .{File , PrintStream }
6191 import scala .collection .mutable .HashMap
6292
@@ -71,8 +101,12 @@ class ExternalLLSCDriver(folder: String = ".") extends SAISnippet[Int, Unit] wit
71101 val ng = init(g)
72102 run(name, ng)
73103 emitln(" /* LLSC - External utility functions and library modeling functions */" )
104+ emitln(" /* Generated by sai.llsc.TestGenerateExternal */" )
105+ emitln(" #ifndef LLSC_EXTERNAL_HEADERS_GEN" )
106+ emitln(" #define LLSC_EXTERNAL_HEADERS_GEN" )
74107 emitFunctionDecls(stream)
75108 emitFunctions(stream)
109+ emitln(" #endif // LLSC_EXTERNAL_HEADERS_GEN" )
76110 }
77111 }
78112
@@ -85,7 +119,7 @@ class ExternalLLSCDriver(folder: String = ".") extends SAISnippet[Int, Unit] wit
85119 // TODO: refactor into SAIOps <2022-01-18, David Deng> //
86120
87121 def hardTopFun [A : Manifest ,B : Manifest ](f : Rep [A ] => Rep [B ], s : String ): Rep [A => B ] = {
88- val unwrapped = __hardTopFun(f, 1 , xn => Unwrap (f(Wrap [A ](xn(0 )))))
122+ val unwrapped = __hardTopFun(f, 1 , xn => Unwrap (f(Wrap [A ](xn(0 )))), " inline " )
89123 if (! s.trim.isEmpty) {
90124 val n = unwrapped.asInstanceOf [Backend .Sym ].n
91125 funNameMap(n) = s
@@ -94,7 +128,7 @@ class ExternalLLSCDriver(folder: String = ".") extends SAISnippet[Int, Unit] wit
94128 }
95129
96130 def hardTopFun [A : Manifest ,B : Manifest ,C : Manifest ](f : (Rep [A ], Rep [B ]) => Rep [C ], s : String ): Rep [(A , B ) => C ] = {
97- val unwrapped = __hardTopFun(f, 2 , xn => Unwrap (f(Wrap [A ](xn(0 )), Wrap [B ](xn(1 )))))
131+ val unwrapped = __hardTopFun(f, 2 , xn => Unwrap (f(Wrap [A ](xn(0 )), Wrap [B ](xn(1 )))), " inline " )
98132 if (! s.trim.isEmpty) {
99133 val n = unwrapped.asInstanceOf [Backend .Sym ].n
100134 funNameMap(n) = s
@@ -103,7 +137,7 @@ class ExternalLLSCDriver(folder: String = ".") extends SAISnippet[Int, Unit] wit
103137 }
104138
105139 def hardTopFun [A : Manifest ,B : Manifest ,C : Manifest ,D : Manifest ](f : (Rep [A ], Rep [B ], Rep [C ]) => Rep [D ], s : String ): Rep [(A , B , C ) => D ] = {
106- val unwrapped = __hardTopFun(f, 3 , xn => Unwrap (f(Wrap [A ](xn(0 )), Wrap [B ](xn(1 )), Wrap [C ](xn(2 )))))
140+ val unwrapped = __hardTopFun(f, 3 , xn => Unwrap (f(Wrap [A ](xn(0 )), Wrap [B ](xn(1 )), Wrap [C ](xn(2 )))), " inline " )
107141 if (! s.trim.isEmpty) {
108142 val n = unwrapped.asInstanceOf [Backend .Sym ].n
109143 funNameMap(n) = s
@@ -112,8 +146,12 @@ class ExternalLLSCDriver(folder: String = ".") extends SAISnippet[Int, Unit] wit
112146 }
113147
114148 def snippet (u : Rep [Int ]) = {
115- hardTopFun(llsc_assert(_,_), " llsc_assert" )
116- hardTopFun(llsc_assert_k(_,_,_), " llsc_assert_k" )
149+ // TODO: generate function of same name with multiple signatures? <2022-01-23, David Deng> //
150+ // TODO: llsc_assert_k depends on sym_exit, which doesn't have a _k version right now <2022-01-23, David Deng> //
151+ // hardTopFun(llsc_assert(_,_), "llsc_assert")
152+ // hardTopFun(llsc_assert_k(_,_,_), "llsc_assert_k")
153+ hardTopFun(open(_,_), " open" )
154+ // hardTopFun(open_k(_,_,_), "open_k")
117155 ()
118156 }
119157}
0 commit comments