/comptime/SawMill/defs.scm

https://github.com/mbrock/bigloo-llvm · Scheme · 372 lines · 264 code · 30 blank · 78 comment · 0 complexity · 612a85522d157fe5038fc458a1ddc397 MD5 · raw file

  1. (module saw_defs
  2. (import engine_param
  3. tools_shape
  4. tools_trace
  5. type_type
  6. ast_var
  7. ast_node
  8. saw_lib)
  9. (export
  10. ;; Regs
  11. (final-class rtl_reg
  12. type::type ; ::type
  13. var ; ::(or local #f)
  14. (onexpr? (default #f))
  15. (name read-only (default (gensym)))
  16. (key read-only (default (gensym)))
  17. (hardware read-only (default #f)) )
  18. ;; Functions
  19. (class rtl_fun (loc (default #f)))
  20. ; dest = #f and no continuation (last instruction of terminals blocks)
  21. (class rtl_last::rtl_fun)
  22. (class rtl_return::rtl_last type::type)
  23. (class rtl_jumpexit::rtl_last)
  24. (class rtl_fail::rtl_last)
  25. ; dest = #f and multiple continuation (last instruction of blocks)
  26. (class rtl_notseq::rtl_fun)
  27. (class rtl_if::rtl_notseq)
  28. (class rtl_select::rtl_notseq type::type patterns)
  29. (class rtl_switch::rtl_select labels)
  30. (class rtl_ifeq::rtl_notseq then::block)
  31. (class rtl_ifne::rtl_notseq then::block)
  32. (class rtl_go::rtl_notseq to::block)
  33. ; doesn't make side effects
  34. (class rtl_pure::rtl_fun)
  35. (class rtl_nop::rtl_pure)
  36. (class rtl_mov::rtl_pure)
  37. (class rtl_loadi::rtl_pure constant::atom)
  38. (class rtl_loadg::rtl_pure var::global)
  39. (class rtl_loadfun::rtl_pure var::global)
  40. (class rtl_globalref::rtl_pure var::global)
  41. (class rtl_getfield::rtl_pure name::bstring objtype::type type::type)
  42. (class rtl_valloc::rtl_pure type::type vtype::type)
  43. (class rtl_vref::rtl_pure type::type vtype::type)
  44. (class rtl_vlength::rtl_pure type::type)
  45. (class rtl_isa::rtl_pure type::type)
  46. (class rtl_makebox::rtl_pure)
  47. (class rtl_boxref::rtl_pure)
  48. ; dest = #f and make side-effect
  49. (class rtl_effect::rtl_fun)
  50. (class rtl_storeg::rtl_effect var::global)
  51. (class rtl_setfield::rtl_effect name::bstring objtype::type type::type)
  52. (class rtl_vset::rtl_effect type::type vtype::type)
  53. (class rtl_boxset::rtl_effect)
  54. ; others
  55. (class rtl_new::rtl_fun type::type constr::pair-nil)
  56. (class rtl_call::rtl_fun var::global)
  57. (class rtl_apply::rtl_fun)
  58. (class rtl_lightfuncall::rtl_fun)
  59. (class rtl_funcall::rtl_fun)
  60. (class rtl_pragma::rtl_fun format::bstring)
  61. (class rtl_cast::rtl_fun type::type)
  62. (class rtl_cast_null::rtl_fun type::type)
  63. (class rtl_protect::rtl_fun)
  64. (class rtl_protected::rtl_fun)
  65. ;; Instructions
  66. (final-class rtl_ins
  67. (loc (default #f))
  68. (%spill::pair-nil (default '()))
  69. (dest (default #f)) ; ::(or reg #f)
  70. (fun::rtl_fun)
  71. (args::pair-nil) ) ; ::(list (or reg ins))
  72. ;; Block of instructions
  73. (final-class block
  74. (label::int (default 0))
  75. (preds::pair-nil (default '())) ; ::(list block)
  76. (succs::pair-nil (default '())) ; ::(list block)
  77. first::pair ) ; :: (list ins)
  78. (ins-args*::pair-nil ::rtl_ins)
  79. (dump-basic-blocks id v params l)
  80. (rtl-dump ::obj ::output-port)
  81. (generic dump ::obj ::output-port ::int)
  82. ))
  83. (define (ins-args* ins)
  84. (let loop ((args (rtl_ins-args ins))
  85. (res '()))
  86. (cond
  87. ((null? args)
  88. res)
  89. ((rtl_reg? (car args))
  90. (loop (cdr args) (cons (car args) res)))
  91. ((rtl_ins? (car args))
  92. (loop (cdr args) (append (ins-args* (car args)) res)))
  93. (else
  94. (loop (cdr args) res)))))
  95. ;*---------------------------------------------------------------------*/
  96. ;* shape ::rtl_reg ... */
  97. ;*---------------------------------------------------------------------*/
  98. (define-method (shape o::rtl_reg)
  99. (let ((p (open-output-string)))
  100. (with-access::rtl_reg o (var hardware name onexpr? type key)
  101. (cond
  102. (onexpr?
  103. (display "*" p)
  104. (display name p))
  105. (hardware
  106. (display "%" p)
  107. (display hardware p))
  108. (var
  109. (display "!" p)
  110. (display (variable-id var) p))
  111. (else
  112. (display "$" p)
  113. (display name p)))
  114. (when *type-shape?*
  115. (display "::" p)
  116. (display (type-id type) p))
  117. (when *key-shape?*
  118. (display "@" p)
  119. (display key p)))
  120. (close-output-port p)))
  121. ;*---------------------------------------------------------------------*/
  122. ;* dump-basic-blocks ... */
  123. ;*---------------------------------------------------------------------*/
  124. (define (dump-basic-blocks id v params l)
  125. (fprint *trace-port* "+-- " id " " (shape v))
  126. (display "| args:" *trace-port*)
  127. (map (lambda (a)
  128. (display " " *trace-port*)
  129. (dump a *trace-port* 0))
  130. params)
  131. (newline *trace-port*)
  132. (fprint *trace-port* "| Basic blocks: " )
  133. (for-each (lambda (b)
  134. (rtl-dump b *trace-port*)
  135. (newline *trace-port*))
  136. l))
  137. ;*---------------------------------------------------------------------*/
  138. ;* rtl-dump ... */
  139. ;*---------------------------------------------------------------------*/
  140. (define (rtl-dump obj port)
  141. (dump obj port 0)
  142. (newline port))
  143. ;*---------------------------------------------------------------------*/
  144. ;* dump-margin ... */
  145. ;*---------------------------------------------------------------------*/
  146. (define (dump-margin m p)
  147. (let ((mgs '#("" " " " " " " " " " " " " " ")))
  148. (if (<fx m (vector-length mgs))
  149. (display (vector-ref mgs m) p)
  150. (display (make-string m #\space) p))))
  151. ;*---------------------------------------------------------------------*/
  152. ;* dump :: ... */
  153. ;*---------------------------------------------------------------------*/
  154. (define-generic (dump o p m)
  155. (cond
  156. ((or (string? o) (number? o) (symbol? o))
  157. (display o p))
  158. ((pair? o)
  159. (for-each (lambda (o)
  160. (dump o p m)
  161. (newline p)
  162. (if (>fx m 0)
  163. (dump-margin m p)
  164. (newline p)))
  165. o))
  166. (else
  167. (write o p))))
  168. ;*---------------------------------------------------------------------*/
  169. ;* dump* ... */
  170. ;*---------------------------------------------------------------------*/
  171. (define (dump* o p m)
  172. (cond
  173. ((null? o)
  174. #unspecified)
  175. ((null? (cdr o))
  176. (dump (car o) p m))
  177. (else
  178. (let loop ((o o))
  179. (dump (car o) p m)
  180. (when (pair? (cdr o))
  181. (newline p)
  182. (dump-margin m p)
  183. (loop (cdr o)))))))
  184. ;*---------------------------------------------------------------------*/
  185. ;* dump-args ... */
  186. ;*---------------------------------------------------------------------*/
  187. (define (dump-args args p)
  188. (let loop ((args args))
  189. (when (pair? args)
  190. (let ((a (car args)))
  191. (cond
  192. ((rtl_reg? a)
  193. (display " " p)
  194. (dump a p 0))
  195. ((rtl_ins? a)
  196. (display " " p)
  197. (dump-ins-rhs a p 0))
  198. (else
  199. (display " " p)
  200. (display a p)))
  201. (loop (cdr args))))))
  202. ;*---------------------------------------------------------------------*/
  203. ;* dump ::block ... */
  204. ;*---------------------------------------------------------------------*/
  205. (define-method (dump o::block p m)
  206. (with-access::block o (label first)
  207. (fprint p "(block " label)
  208. (dump-margin (+fx m 1) p)
  209. (dump* first p (+fx m 1))
  210. (display ")" p)))
  211. ;*---------------------------------------------------------------------*/
  212. ;* dump ::rtl_ins ... */
  213. ;*---------------------------------------------------------------------*/
  214. (define-method (dump o::rtl_ins p m)
  215. (with-access::rtl_ins o (%spill fun dest args)
  216. (when dest
  217. (dump dest p m)
  218. (display " <- " p))
  219. (dump-ins-rhs o p m)
  220. (display " {" p)
  221. (for-each (lambda (r)
  222. (display (shape r) p)
  223. (display " " p))
  224. %spill)
  225. (display "}" p)))
  226. ;*---------------------------------------------------------------------*/
  227. ;* dump-ins-rhs ... */
  228. ;*---------------------------------------------------------------------*/
  229. (define (dump-ins-rhs o::rtl_ins p m)
  230. (with-access::rtl_ins o (fun dest args)
  231. (display "(" p)
  232. (dump-fun fun dest args p m)
  233. (display ")" p)))
  234. ;*---------------------------------------------------------------------*/
  235. ;* dump ::rtl_reg ... */
  236. ;*---------------------------------------------------------------------*/
  237. (define-method (dump o::rtl_reg p m)
  238. (display (shape o) p)
  239. (when *type-shape?*
  240. (display "::" p)
  241. (display (shape (rtl_reg-type o)) p)))
  242. ;*---------------------------------------------------------------------*/
  243. ;* show-fun ... */
  244. ;*---------------------------------------------------------------------*/
  245. (define (show-fun o p)
  246. (let ((c (symbol->string (class-name (object-class o)))))
  247. (display (substring c 4 (string-length c)) p)))
  248. ;*---------------------------------------------------------------------*/
  249. ;* dump-fun ... */
  250. ;*---------------------------------------------------------------------*/
  251. (define-generic (dump-fun o::rtl_fun dest args p m)
  252. #unspecified)
  253. ;*---------------------------------------------------------------------*/
  254. ;* dump-fun ::rtl_fun ... */
  255. ;*---------------------------------------------------------------------*/
  256. (define-method (dump-fun o::rtl_fun dest args p m)
  257. (show-fun o p)
  258. (dump-args args p))
  259. ;*---------------------------------------------------------------------*/
  260. ;* dump-fun ::rtl_loadi ... */
  261. ;*---------------------------------------------------------------------*/
  262. (define-method (dump-fun o::rtl_loadi dest args p m)
  263. (show-fun o p)
  264. (display " " p)
  265. (display (atom-value (rtl_loadi-constant o)) p)
  266. (dump-args args p))
  267. ;*---------------------------------------------------------------------*/
  268. ;* dump-fun ::rtl_mov ... */
  269. ;*---------------------------------------------------------------------*/
  270. (define-method (dump-fun o::rtl_mov dest args p m)
  271. (show-fun o p)
  272. (when dest
  273. (display " [" p)
  274. (dump dest p m)
  275. (display "]" p))
  276. (dump-args args p))
  277. ;*---------------------------------------------------------------------*/
  278. ;* dump-fun ::rtl_loadg ... */
  279. ;*---------------------------------------------------------------------*/
  280. (define-method (dump-fun o::rtl_loadg dest args p m)
  281. (show-fun o p)
  282. (display " " p)
  283. (display (shape (rtl_loadg-var o)) p)
  284. (dump-args args p))
  285. ;*---------------------------------------------------------------------*/
  286. ;* dump-fun ::rtl_loadfun ... */
  287. ;*---------------------------------------------------------------------*/
  288. (define-method (dump-fun o::rtl_loadfun dest args p m)
  289. (show-fun o p)
  290. (display " " p)
  291. (display (shape (rtl_loadfun-var o)) p)
  292. (dump-args args p))
  293. ;*---------------------------------------------------------------------*/
  294. ;* dump-fun ::rtl_globalref ... */
  295. ;*---------------------------------------------------------------------*/
  296. (define-method (dump-fun o::rtl_globalref dest args p m)
  297. (show-fun o p)
  298. (display " " p)
  299. (display (shape (rtl_globalref-var o)) p)
  300. (dump-args args p))
  301. ;*---------------------------------------------------------------------*/
  302. ;* dump-fun ::rtl_ifeq ... */
  303. ;*---------------------------------------------------------------------*/
  304. (define-method (dump-fun o::rtl_ifeq dest args p m)
  305. (with-access::rtl_ifeq o (then)
  306. (show-fun o p)
  307. (dump-args args p)
  308. (display " " p)
  309. (display (block-label then) p)))
  310. ;*---------------------------------------------------------------------*/
  311. ;* dump-fun ::rtl_ifne ... */
  312. ;*---------------------------------------------------------------------*/
  313. (define-method (dump-fun o::rtl_ifne dest args p m)
  314. (with-access::rtl_ifne o (then)
  315. (show-fun o p)
  316. (dump-args args p)
  317. (display " " p)
  318. (display (block-label then) p)))
  319. ;*---------------------------------------------------------------------*/
  320. ;* dump-fun ::rtl_go ... */
  321. ;*---------------------------------------------------------------------*/
  322. (define-method (dump-fun o::rtl_go dest args p m)
  323. (with-access::rtl_go o (to)
  324. (show-fun o p)
  325. (display " " p)
  326. (display (block-label to) p)
  327. (dump-args args p)))
  328. ;*---------------------------------------------------------------------*/
  329. ;* dump-fun ::rtl_call ... */
  330. ;*---------------------------------------------------------------------*/
  331. (define-method (dump-fun o::rtl_call dest args p m)
  332. (with-access::rtl_call o (var)
  333. (display (let ((ou *user-shape?*)
  334. (oa *access-shape?*))
  335. (set! *user-shape?* #f)
  336. (set! *access-shape?* #f)
  337. (let ((r (shape var)))
  338. (set! *user-shape?* ou)
  339. (set! *access-shape?* oa)
  340. r))
  341. p)
  342. (dump-args args p)))