bones-compiler 1.3.1 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (307) hide show
  1. data/CHANGELOG +62 -0
  2. data/README.rdoc +14 -3
  3. data/Rakefile +13 -12
  4. data/VERSION +1 -1
  5. data/examples/applications/ffos.c +24 -8
  6. data/examples/benchmarks/PolyBench/2mm.c +0 -0
  7. data/examples/benchmarks/PolyBench/3mm.c +0 -0
  8. data/examples/benchmarks/PolyBench/adi.c +0 -0
  9. data/examples/benchmarks/PolyBench/atax.c +0 -0
  10. data/examples/benchmarks/PolyBench/bicg.c +0 -0
  11. data/examples/benchmarks/PolyBench/cholesky.c +0 -0
  12. data/examples/benchmarks/PolyBench/common.h +0 -0
  13. data/examples/benchmarks/PolyBench/correlation.c +0 -0
  14. data/examples/benchmarks/PolyBench/covariance.c +0 -0
  15. data/examples/benchmarks/PolyBench/doitgen.c +0 -0
  16. data/examples/benchmarks/PolyBench/durbin.c +0 -0
  17. data/examples/benchmarks/PolyBench/dynprog.c +0 -0
  18. data/examples/benchmarks/PolyBench/fdtd-2d-apml.c +0 -0
  19. data/examples/benchmarks/PolyBench/fdtd-2d.c +0 -0
  20. data/examples/benchmarks/PolyBench/floyd-warshall.c +0 -0
  21. data/examples/benchmarks/PolyBench/gemm.c +0 -0
  22. data/examples/benchmarks/PolyBench/gemver.c +0 -0
  23. data/examples/benchmarks/PolyBench/gesummv.c +0 -0
  24. data/examples/benchmarks/PolyBench/gramschmidt.c +0 -0
  25. data/examples/benchmarks/PolyBench/jacobi-1d-imper.c +4 -2
  26. data/examples/benchmarks/PolyBench/jacobi-2d-imper.c +1 -1
  27. data/examples/benchmarks/PolyBench/lu.c +0 -0
  28. data/examples/benchmarks/PolyBench/ludcmp.c +0 -0
  29. data/examples/benchmarks/PolyBench/mvt.c +0 -0
  30. data/examples/benchmarks/PolyBench/reg_detect.c +0 -0
  31. data/examples/benchmarks/PolyBench/seidel-2d.c +0 -0
  32. data/examples/benchmarks/PolyBench/symm.c +0 -0
  33. data/examples/benchmarks/PolyBench/syr2k.c +0 -0
  34. data/examples/benchmarks/PolyBench/syrk.c +0 -0
  35. data/examples/benchmarks/PolyBench/trisolv.c +0 -0
  36. data/examples/benchmarks/PolyBench/trmm.c +0 -0
  37. data/examples/benchmarks/Rodinia/bfs.c +143 -0
  38. data/examples/benchmarks/Rodinia/common.h +78 -0
  39. data/examples/benchmarks/Rodinia/hotspot.c +106 -126
  40. data/examples/benchmarks/Rodinia/kmeans.c +157 -164
  41. data/examples/benchmarks/Rodinia/nw.c +151 -0
  42. data/examples/benchmarks/Rodinia/pathfinder.c +88 -0
  43. data/examples/benchmarks/Rodinia/srad.c +50 -59
  44. data/examples/benchmarks/other/common.h +0 -0
  45. data/examples/benchmarks/other/dct.c +0 -0
  46. data/examples/benchmarks/other/mm.c +0 -0
  47. data/examples/benchmarks/other/saxpy.c +0 -0
  48. data/examples/chunk/example01.c +6 -4
  49. data/examples/chunk/example02.c +6 -4
  50. data/examples/chunk/example03.c +6 -4
  51. data/examples/chunk/example04.c +8 -5
  52. data/examples/chunk/example05.c +6 -4
  53. data/examples/chunk/example06.c +3 -1
  54. data/examples/chunk/example07.c +5 -2
  55. data/examples/dependences/example01.c +3 -1
  56. data/examples/dependences/example02.c +3 -1
  57. data/examples/dependences/example03.c +3 -1
  58. data/examples/dependences/example04.c +3 -1
  59. data/examples/dependences/example05.c +3 -1
  60. data/examples/element/example01.c +6 -4
  61. data/examples/element/example02.c +6 -4
  62. data/examples/element/example03.c +10 -8
  63. data/examples/element/example04.c +6 -4
  64. data/examples/element/example05.c +8 -5
  65. data/examples/element/example06.c +6 -4
  66. data/examples/element/example07.c +6 -4
  67. data/examples/element/example08.c +6 -4
  68. data/examples/element/example09.c +6 -4
  69. data/examples/element/example10.c +4 -2
  70. data/examples/element/example11.c +4 -2
  71. data/examples/element/example12.c +4 -2
  72. data/examples/element/example13.c +3 -1
  73. data/examples/fusion/example01.c +3 -12
  74. data/examples/fusion/example02.c +3 -16
  75. data/examples/fusion/example03.c +3 -1
  76. data/examples/fusion/example04.c +5 -3
  77. data/examples/fusion/example05.c +3 -1
  78. data/examples/neighbourhood/example01.c +6 -4
  79. data/examples/neighbourhood/example02.c +6 -4
  80. data/examples/neighbourhood/example03.c +6 -4
  81. data/examples/neighbourhood/example04.c +5 -3
  82. data/examples/neighbourhood/example05.c +3 -1
  83. data/examples/shared/example01.c +6 -4
  84. data/examples/shared/example02.c +6 -4
  85. data/examples/shared/example03.c +6 -4
  86. data/examples/shared/example04.c +6 -4
  87. data/examples/shared/example05.c +6 -4
  88. data/lib/adarwin/engine.rb +16 -5
  89. data/lib/adarwin/memorycopies.rb +21 -9
  90. data/lib/adarwin/nest.rb +18 -1
  91. data/lib/adarwin/preprocessor.rb +5 -2
  92. data/lib/adarwin/reference.rb +71 -6
  93. data/lib/bones/algorithm.rb +20 -5
  94. data/lib/bones/copy.rb +3 -2
  95. data/lib/bones/engine.rb +12 -9
  96. data/lib/bones/preprocessor.rb +170 -120
  97. data/lib/bones/variablelist.rb +1 -1
  98. data/lib/cast.rb +11 -0
  99. data/lib/castaddon.rb +23 -6
  100. data/lib/castaddon/node_adarwin.rb +17 -0
  101. data/lib/castaddon/node_common.rb +6 -0
  102. data/lib/castaddon/transformations.rb +13 -9
  103. data/skeletons/CPU-C/common/epilogue.c +0 -0
  104. data/skeletons/CPU-C/common/globals.c +0 -0
  105. data/skeletons/CPU-C/common/globals_kernel.c +0 -0
  106. data/skeletons/CPU-C/common/header.c +0 -0
  107. data/skeletons/CPU-C/common/mem_copy_D2H.c +0 -0
  108. data/skeletons/CPU-C/common/mem_copy_H2D.c +0 -0
  109. data/skeletons/CPU-C/common/mem_epilogue.c +0 -0
  110. data/skeletons/CPU-C/common/mem_global.c +0 -0
  111. data/skeletons/CPU-C/common/mem_prologue.c +0 -0
  112. data/skeletons/CPU-C/common/prologue.c +0 -0
  113. data/skeletons/CPU-C/common/timer_1_start.c +0 -0
  114. data/skeletons/CPU-C/common/timer_1_stop.c +0 -0
  115. data/skeletons/CPU-C/common/timer_2_start.c +0 -0
  116. data/skeletons/CPU-C/common/timer_2_stop.c +0 -0
  117. data/skeletons/CPU-C/common/timer_globals.c +5 -0
  118. data/skeletons/CPU-C/kernel/default.host.c +0 -0
  119. data/skeletons/CPU-C/kernel/default.kernel.c +0 -0
  120. data/skeletons/CPU-C/skeletons.txt +0 -0
  121. data/skeletons/CPU-OPENCL-AMD/common/epilogue.c +0 -0
  122. data/skeletons/CPU-OPENCL-AMD/common/globals.c +0 -0
  123. data/skeletons/CPU-OPENCL-AMD/common/globals_kernel.c +0 -0
  124. data/skeletons/CPU-OPENCL-AMD/common/header.c +0 -0
  125. data/skeletons/CPU-OPENCL-AMD/common/mem_copy_D2H.c +0 -0
  126. data/skeletons/CPU-OPENCL-AMD/common/mem_copy_H2D.c +0 -0
  127. data/skeletons/CPU-OPENCL-AMD/common/mem_epilogue.c +0 -0
  128. data/skeletons/CPU-OPENCL-AMD/common/mem_prologue.c +0 -0
  129. data/skeletons/CPU-OPENCL-AMD/common/prologue.c +0 -0
  130. data/skeletons/CPU-OPENCL-AMD/common/timer_1_start.c +0 -0
  131. data/skeletons/CPU-OPENCL-AMD/common/timer_1_stop.c +0 -0
  132. data/skeletons/CPU-OPENCL-AMD/common/timer_2_start.c +0 -0
  133. data/skeletons/CPU-OPENCL-AMD/common/timer_2_stop.c +0 -0
  134. data/skeletons/CPU-OPENCL-AMD/kernel/D-element-to-1-shared.host.c +0 -0
  135. data/skeletons/CPU-OPENCL-AMD/kernel/D-element-to-1-shared.kernel.cl +0 -0
  136. data/skeletons/CPU-OPENCL-AMD/kernel/default.host.c +0 -0
  137. data/skeletons/CPU-OPENCL-AMD/kernel/default.kernel.cl +0 -0
  138. data/skeletons/CPU-OPENCL-AMD/skeletons.txt +0 -0
  139. data/skeletons/CPU-OPENCL-INTEL/common/epilogue.c +0 -0
  140. data/skeletons/CPU-OPENCL-INTEL/common/globals.c +0 -0
  141. data/skeletons/CPU-OPENCL-INTEL/common/globals_kernel.c +0 -0
  142. data/skeletons/CPU-OPENCL-INTEL/common/header.c +0 -0
  143. data/skeletons/CPU-OPENCL-INTEL/common/mem_copy_D2H.c +0 -0
  144. data/skeletons/CPU-OPENCL-INTEL/common/mem_copy_H2D.c +0 -0
  145. data/skeletons/CPU-OPENCL-INTEL/common/mem_epilogue.c +0 -0
  146. data/skeletons/CPU-OPENCL-INTEL/common/mem_global.c +0 -0
  147. data/skeletons/CPU-OPENCL-INTEL/common/mem_prologue.c +0 -0
  148. data/skeletons/CPU-OPENCL-INTEL/common/prologue.c +0 -0
  149. data/skeletons/CPU-OPENCL-INTEL/common/timer_1_start.c +0 -0
  150. data/skeletons/CPU-OPENCL-INTEL/common/timer_1_stop.c +0 -0
  151. data/skeletons/CPU-OPENCL-INTEL/common/timer_2_start.c +0 -0
  152. data/skeletons/CPU-OPENCL-INTEL/common/timer_2_stop.c +0 -0
  153. data/skeletons/CPU-OPENCL-INTEL/common/timer_globals.c +5 -0
  154. data/skeletons/CPU-OPENCL-INTEL/kernel/D-element-to-1-shared.host.c +0 -0
  155. data/skeletons/CPU-OPENCL-INTEL/kernel/D-element-to-1-shared.kernel.cl +0 -0
  156. data/skeletons/CPU-OPENCL-INTEL/kernel/default.host.c +0 -0
  157. data/skeletons/CPU-OPENCL-INTEL/kernel/default.kernel.cl +0 -0
  158. data/skeletons/CPU-OPENCL-INTEL/skeletons.txt +0 -0
  159. data/skeletons/CPU-OPENMP/common/epilogue.c +0 -0
  160. data/skeletons/CPU-OPENMP/common/globals.c +0 -0
  161. data/skeletons/CPU-OPENMP/common/globals_kernel.c +0 -0
  162. data/skeletons/CPU-OPENMP/common/header.c +0 -0
  163. data/skeletons/CPU-OPENMP/common/mem_copy_D2H.c +0 -0
  164. data/skeletons/CPU-OPENMP/common/mem_copy_H2D.c +0 -0
  165. data/skeletons/CPU-OPENMP/common/mem_epilogue.c +0 -0
  166. data/skeletons/CPU-OPENMP/common/mem_global.c +0 -0
  167. data/skeletons/CPU-OPENMP/common/mem_prologue.c +0 -0
  168. data/skeletons/CPU-OPENMP/common/prologue.c +0 -0
  169. data/skeletons/CPU-OPENMP/common/timer_1_start.c +0 -0
  170. data/skeletons/CPU-OPENMP/common/timer_1_stop.c +0 -0
  171. data/skeletons/CPU-OPENMP/common/timer_2_start.c +0 -0
  172. data/skeletons/CPU-OPENMP/common/timer_2_stop.c +0 -0
  173. data/skeletons/CPU-OPENMP/common/timer_globals.c +2 -0
  174. data/skeletons/CPU-OPENMP/kernel/D-element-to-1-shared.host.c +0 -0
  175. data/skeletons/CPU-OPENMP/kernel/D-element-to-1-shared.kernel.c +3 -3
  176. data/skeletons/CPU-OPENMP/kernel/default.host.c +0 -0
  177. data/skeletons/CPU-OPENMP/kernel/default.kernel.c +0 -0
  178. data/skeletons/CPU-OPENMP/skeletons.txt +0 -0
  179. data/skeletons/GPU-CUDA/common/epilogue.c +0 -0
  180. data/skeletons/GPU-CUDA/common/globals.c +0 -0
  181. data/skeletons/GPU-CUDA/common/globals_kernel.c +0 -0
  182. data/skeletons/GPU-CUDA/common/header.c +0 -0
  183. data/skeletons/GPU-CUDA/common/mem_async_alloc.c +0 -0
  184. data/skeletons/GPU-CUDA/common/mem_async_copyin.c +0 -0
  185. data/skeletons/GPU-CUDA/common/mem_async_copyout.c +0 -0
  186. data/skeletons/GPU-CUDA/common/mem_async_free.c +0 -0
  187. data/skeletons/GPU-CUDA/common/mem_copy_D2H.c +0 -0
  188. data/skeletons/GPU-CUDA/common/mem_copy_H2D.c +0 -0
  189. data/skeletons/GPU-CUDA/common/mem_epilogue.c +0 -0
  190. data/skeletons/GPU-CUDA/common/mem_global.c +0 -0
  191. data/skeletons/GPU-CUDA/common/mem_prologue.c +0 -0
  192. data/skeletons/GPU-CUDA/common/prologue.c +0 -0
  193. data/skeletons/GPU-CUDA/common/scheduler.c +2 -2
  194. data/skeletons/GPU-CUDA/common/timer_1_start.c +0 -0
  195. data/skeletons/GPU-CUDA/common/timer_1_stop.c +0 -0
  196. data/skeletons/GPU-CUDA/common/timer_2_start.c +0 -0
  197. data/skeletons/GPU-CUDA/common/timer_2_stop.c +0 -0
  198. data/skeletons/GPU-CUDA/common/timer_globals.c +0 -0
  199. data/skeletons/GPU-CUDA/kernel/2xN-N-chunk-1-N-to-D-element.host.c +0 -0
  200. data/skeletons/GPU-CUDA/kernel/2xN-N-chunk-1-N-to-D-element.kernel.cu +0 -0
  201. data/skeletons/GPU-CUDA/kernel/D-element-to-1-shared.host.c +0 -0
  202. data/skeletons/GPU-CUDA/kernel/D-element-to-1-shared.kernel.cu +0 -0
  203. data/skeletons/GPU-CUDA/kernel/D-element-to-N-shared.host.c +0 -0
  204. data/skeletons/GPU-CUDA/kernel/D-element-to-N-shared.kernel.cu +0 -0
  205. data/skeletons/GPU-CUDA/kernel/N-N-chunk-1-N-to-D-element.host.c +0 -0
  206. data/skeletons/GPU-CUDA/kernel/N-N-chunk-1-N-to-D-element.kernel.cu +0 -0
  207. data/skeletons/GPU-CUDA/kernel/N-neighbourhood-N-to-N-element.host.c +0 -0
  208. data/skeletons/GPU-CUDA/kernel/N-neighbourhood-N-to-N-element.kernel.cu +0 -0
  209. data/skeletons/GPU-CUDA/kernel/default.host.c +0 -0
  210. data/skeletons/GPU-CUDA/kernel/default.kernel.cu +0 -0
  211. data/skeletons/GPU-CUDA/skeletons.txt +4 -2
  212. data/skeletons/GPU-OPENCL-AMD/common/epilogue.c +0 -0
  213. data/skeletons/GPU-OPENCL-AMD/common/globals.c +0 -0
  214. data/skeletons/GPU-OPENCL-AMD/common/globals_kernel.c +0 -0
  215. data/skeletons/GPU-OPENCL-AMD/common/header.c +0 -0
  216. data/skeletons/GPU-OPENCL-AMD/common/mem_copy_D2H.c +0 -0
  217. data/skeletons/GPU-OPENCL-AMD/common/mem_copy_H2D.c +0 -0
  218. data/skeletons/GPU-OPENCL-AMD/common/mem_epilogue.c +0 -0
  219. data/skeletons/GPU-OPENCL-AMD/common/mem_prologue.c +0 -0
  220. data/skeletons/GPU-OPENCL-AMD/common/prologue.c +0 -0
  221. data/skeletons/GPU-OPENCL-AMD/common/timer_1_start.c +0 -0
  222. data/skeletons/GPU-OPENCL-AMD/common/timer_1_stop.c +0 -0
  223. data/skeletons/GPU-OPENCL-AMD/common/timer_2_start.c +0 -0
  224. data/skeletons/GPU-OPENCL-AMD/common/timer_2_stop.c +0 -0
  225. data/skeletons/GPU-OPENCL-AMD/kernel/D-element-to-1-shared.host.c +0 -0
  226. data/skeletons/GPU-OPENCL-AMD/kernel/D-element-to-1-shared.kernel.cl +0 -0
  227. data/skeletons/GPU-OPENCL-AMD/kernel/default.host.c +0 -0
  228. data/skeletons/GPU-OPENCL-AMD/kernel/default.kernel.cl +0 -0
  229. data/skeletons/GPU-OPENCL-AMD/skeletons.txt +0 -0
  230. data/skeletons/verification/header.c +0 -0
  231. data/skeletons/verification/timer_start.c +0 -0
  232. data/skeletons/verification/timer_stop.c +0 -0
  233. data/skeletons/verification/verify_results.c +0 -0
  234. data/test/bones/test_algorithm.rb +0 -0
  235. data/test/bones/test_common.rb +0 -0
  236. data/test/bones/test_preprocessor.rb +0 -0
  237. data/test/bones/test_species.rb +0 -0
  238. data/test/bones/test_variable.rb +0 -0
  239. data/test/examples/benchmarks/PolyBench/2mm_species.c +1 -1
  240. data/test/examples/benchmarks/PolyBench/3mm_species.c +0 -0
  241. data/test/examples/benchmarks/PolyBench/adi_species.c +0 -0
  242. data/test/examples/benchmarks/PolyBench/atax_species.c +0 -0
  243. data/test/examples/benchmarks/PolyBench/bicg_species.c +0 -0
  244. data/test/examples/benchmarks/PolyBench/cholesky_species.c +0 -0
  245. data/test/examples/benchmarks/PolyBench/correlation_species.c +0 -0
  246. data/test/examples/benchmarks/PolyBench/covariance_species.c +0 -0
  247. data/test/examples/benchmarks/PolyBench/doitgen_species.c +0 -0
  248. data/test/examples/benchmarks/PolyBench/durbin_species.c +0 -0
  249. data/test/examples/benchmarks/PolyBench/dynprog_species.c +0 -0
  250. data/test/examples/benchmarks/PolyBench/fdtd-2d-apml_species.c +0 -0
  251. data/test/examples/benchmarks/PolyBench/fdtd-2d_species.c +0 -0
  252. data/test/examples/benchmarks/PolyBench/floyd-warshall_species.c +0 -0
  253. data/test/examples/benchmarks/PolyBench/gemm_species.c +0 -0
  254. data/test/examples/benchmarks/PolyBench/gemver_species.c +0 -0
  255. data/test/examples/benchmarks/PolyBench/gesummv_species.c +0 -0
  256. data/test/examples/benchmarks/PolyBench/gramschmidt_species.c +0 -0
  257. data/test/examples/benchmarks/PolyBench/jacobi-1d-imper_species.c +0 -0
  258. data/test/examples/benchmarks/PolyBench/jacobi-2d-imper_species.c +0 -0
  259. data/test/examples/benchmarks/PolyBench/lu_species.c +0 -0
  260. data/test/examples/benchmarks/PolyBench/ludcmp_species.c +0 -0
  261. data/test/examples/benchmarks/PolyBench/mvt_species.c +0 -0
  262. data/test/examples/benchmarks/PolyBench/reg_detect_species.c +0 -0
  263. data/test/examples/benchmarks/PolyBench/seidel-2d_species.c +0 -0
  264. data/test/examples/benchmarks/PolyBench/symm_species.c +0 -0
  265. data/test/examples/benchmarks/PolyBench/syr2k_species.c +0 -0
  266. data/test/examples/benchmarks/PolyBench/syrk_species.c +0 -0
  267. data/test/examples/benchmarks/PolyBench/trisolv_species.c +0 -0
  268. data/test/examples/benchmarks/PolyBench/trmm_species.c +0 -0
  269. data/test/examples/chunk/example01_species.c +3 -3
  270. data/test/examples/chunk/example02_species.c +3 -3
  271. data/test/examples/chunk/example03_species.c +3 -3
  272. data/test/examples/chunk/example04_species.c +3 -3
  273. data/test/examples/chunk/example05_species.c +3 -3
  274. data/test/examples/chunk/example06_species.c +1 -1
  275. data/test/examples/chunk/example07_species.c +3 -2
  276. data/test/examples/dependences/example01_species.c +1 -1
  277. data/test/examples/dependences/example02_species.c +1 -1
  278. data/test/examples/dependences/example03_species.c +1 -1
  279. data/test/examples/dependences/example04_species.c +1 -1
  280. data/test/examples/dependences/example05_species.c +1 -1
  281. data/test/examples/element/example01_species.c +3 -3
  282. data/test/examples/element/example02_species.c +3 -3
  283. data/test/examples/element/example03_species.c +7 -7
  284. data/test/examples/element/example04_species.c +3 -3
  285. data/test/examples/element/example05_species.c +3 -3
  286. data/test/examples/element/example06_species.c +3 -3
  287. data/test/examples/element/example07_species.c +3 -3
  288. data/test/examples/element/example08_species.c +3 -3
  289. data/test/examples/element/example09_species.c +3 -3
  290. data/test/examples/element/example10_species.c +1 -1
  291. data/test/examples/element/example11_species.c +1 -1
  292. data/test/examples/element/example12_species.c +1 -1
  293. data/test/examples/element/example13_species.c +1 -1
  294. data/test/examples/neighbourhood/example01_species.c +3 -3
  295. data/test/examples/neighbourhood/example02_species.c +3 -3
  296. data/test/examples/neighbourhood/example03_species.c +3 -3
  297. data/test/examples/neighbourhood/example04_species.c +3 -3
  298. data/test/examples/neighbourhood/example05_species.c +1 -1
  299. data/test/examples/shared/example01_species.c +3 -3
  300. data/test/examples/shared/example02_species.c +3 -3
  301. data/test/examples/shared/example03_species.c +3 -3
  302. data/test/examples/shared/example04_species.c +3 -3
  303. data/test/examples/shared/example05_species.c +3 -3
  304. data/test/test_helper.rb +2 -2
  305. metadata +266 -252
  306. checksums.yaml +0 -15
  307. data/examples/benchmarks/Rodinia/cfd.c +0 -180
@@ -20,7 +20,7 @@ module Adarwin
20
20
  @header_code = ''
21
21
  @parsed_code = ''
22
22
  @target_code = ''
23
- @scop_code = ''
23
+ @scop_code = []
24
24
  end
25
25
 
26
26
  # This is the method to perform the actual preprocessing. This method takes
@@ -30,6 +30,7 @@ module Adarwin
30
30
  # could have a commented-out SCoP or define or include.
31
31
  def process
32
32
  scop = false
33
+ scop_code = ''
33
34
  scop_in_code = false
34
35
 
35
36
  # Process the file line by line
@@ -55,12 +56,14 @@ module Adarwin
55
56
  # Found the end of a SCoP
56
57
  elsif line =~ /^#{WHITESPACE}#{SCOP_END}/
57
58
  scop = false
59
+ @scop_code.push(scop_code)
60
+ scop_code = ''
58
61
  @parsed_code += '}'+NL
59
62
  end
60
63
 
61
64
  # Nothing special in the code going on here
62
65
  else
63
- @scop_code += line if scop
66
+ scop_code += line if scop
64
67
  @parsed_code += line
65
68
  @target_code += line
66
69
  end
@@ -28,7 +28,7 @@ module Adarwin
28
28
  # * It constructs the sets of loops (all,inner,outer) for this reference
29
29
  # * It computes the bounds based on loop data and on if-statements
30
30
  # * It computes the domain (D), number of elements (E), and step (S)
31
- def initialize(reference,id,inner_loops,outer_loops,verbose)
31
+ def initialize(reference,id,inner_loops,outer_loops,var_declarations,verbose)
32
32
  @id = id
33
33
 
34
34
  # Initialise the 5-tuple (already fill in N and A)
@@ -44,6 +44,9 @@ module Adarwin
44
44
  @all_loops = reference[:loop_data]
45
45
  @inner_loops = inner_loops & @all_loops
46
46
  @outer_loops = outer_loops
47
+
48
+ # Set the list of all local variables
49
+ @var_declarations = var_declarations
47
50
 
48
51
  # Set the indices of the array reference (e.g. 2*i+4). The size of this
49
52
  # array is equal to the number of dimensions of the array.
@@ -56,11 +59,11 @@ module Adarwin
56
59
  @all_loops.each do |loop_data|
57
60
  conditions = [loop_data[:min],loop_data[:max]]
58
61
  reference[:if_statements].each do |if_statement|
59
- condition_if = if_statement.map{ |c| solve(c,loop_data[:var],loop_vars) }
60
- conditions = [
61
- max(conditions[0],condition_if[0]),
62
- min(conditions[1],condition_if[1])
63
- ]
62
+ if !array_includes_local_vars(if_statement,loop_vars)
63
+ condition_if = if_statement.map{ |c| solve(c,loop_data[:var],loop_vars) }
64
+ conditions[0] = max(conditions[0],condition_if[0])
65
+ conditions[1] = min(conditions[1],condition_if[1])
66
+ end
64
67
  end
65
68
  @bounds << { :var => loop_data[:var], :min => conditions[0], :max => conditions[1] }
66
69
  end
@@ -103,6 +106,47 @@ module Adarwin
103
106
  @tS[index] = '0'
104
107
  end
105
108
  end
109
+
110
+ # Check for local variables in the domain. If they exist ask the user to fill
111
+ # in the bounds.
112
+ # TODO: Make this a command-line question asked to the user. For now, several
113
+ # known values are simply put here - for ease of automated testing.
114
+ @tD.each do |bounds|
115
+
116
+ # Bounds are equal (e.g. [t:t])
117
+ if bounds.a == bounds.b && string_includes_local_vars(bounds.a)
118
+
119
+ # Default (assume 'char')
120
+ a = '0'
121
+ b = '255'
122
+
123
+ # Overrides (see notice above)
124
+ b = 'NUM_CLUSTERS-1' if bounds.a == 'cluster_index'
125
+ b = 'no_of_nodes-1' if bounds.b == 'id'
126
+
127
+ # Output a warning
128
+ puts WARNING+"Bounds of '#{bounds.a}' variable unknown, assuming #{a}:#{b}"
129
+ bounds.a = a
130
+ bounds.b = b
131
+
132
+ # Not equal but both problematic
133
+ elsif string_includes_local_vars(bounds.a) && string_includes_local_vars(bounds.b)
134
+
135
+ # Default (assume 'char')
136
+ a = '0'
137
+ b = '255'
138
+
139
+ # Overrides (see notice above)
140
+ b = 'no_of_nodes-1' if bounds.a == 'val2'
141
+
142
+ # Output a warning
143
+ puts WARNING+"Bounds of '#{bounds.a}' and '#{bounds.b}' variables unknown, assuming #{a}:#{b}"
144
+ bounds.a = a
145
+ bounds.b = b
146
+
147
+ end
148
+ end
149
+
106
150
 
107
151
  # Print the result
108
152
  puts MESSAGE+"Found: #{to_arc}" if verbose
@@ -256,6 +300,27 @@ module Adarwin
256
300
  end
257
301
  return false
258
302
  end
303
+
304
+ # Method to find if local variables are included
305
+ def array_includes_local_vars(array, loop_vars)
306
+ vars = @var_declarations - loop_vars
307
+ array.each do |string|
308
+ vars.each do |decl|
309
+ if string =~ /\b#{decl}\b/
310
+ return true
311
+ end
312
+ end
313
+ end
314
+ return false
315
+ end
316
+ def string_includes_local_vars(string)
317
+ @var_declarations.each do |decl|
318
+ if string =~ /\b#{decl}\b/
319
+ return true
320
+ end
321
+ end
322
+ return false
323
+ end
259
324
 
260
325
  end
261
326
  end
@@ -40,7 +40,7 @@ module Bones
40
40
  @lists = {:host_name => [],:host_definition => [], :argument_name => [], :argument_definition => [], :golden_name => []}
41
41
  @arrays = Variablelist.new()
42
42
  @constants = Variablelist.new()
43
- @merge_factor = nil
43
+ @merge_factor = 0
44
44
  @register_caching_enabled = 1
45
45
  @function_code = ''
46
46
  @function_name = ''
@@ -64,6 +64,7 @@ module Bones
64
64
  @function_name = function.name
65
65
  end
66
66
  end
67
+ raise_error("Incorrect code found in body of #{@name}, something wrong with the classification?") if @function_code == ""
67
68
  end
68
69
 
69
70
  # This method performs the code transformations according
@@ -146,12 +147,17 @@ module Bones
146
147
 
147
148
  # Perform transformations for reduction operations (conditionally do this)
148
149
  if transformation[1,1].to_i >= 1
149
- new_code = new_code.transform_reduction(@arrays.select(INPUT)[0],@arrays.select(OUTPUT)[0],transformation[1,1].to_i)
150
+ input = @arrays.select(INPUT)[0]
151
+ @arrays.select(OUTPUT).each do |output|
152
+ if output.species.shared?
153
+ new_code = new_code.transform_reduction(input,output,transformation[1,1].to_i)
154
+ end
155
+ end
150
156
  end
151
157
 
152
158
  # Perform thread-merging (experimental)
153
159
  # TODO: Solve the problem related to constants (e.g chunk/example1.c)
154
- if @merge_factor == nil
160
+ if @merge_factor == 0
155
161
  if transformation[0,1] == '4' && @hash[:parallelism].to_i >= 1024*1024
156
162
  @merge_factor = 4
157
163
  else
@@ -159,7 +165,7 @@ module Bones
159
165
  end
160
166
  end
161
167
  if @merge_factor > 1
162
- puts @hash[:parallelism]
168
+ #puts @hash[:parallelism]
163
169
  if new_code.has_conditional_statements?
164
170
  puts MESSAGE+'Not coarsening ('+@merge_factor.to_s+'x) because of conditional statements in kernel body.'
165
171
  # TODO: Fix this temporary hack for multiple loops with mismatching bounds
@@ -405,7 +411,11 @@ module Bones
405
411
 
406
412
  DIRECTIONS.each do |direction|
407
413
  species = @species.structures(direction)
408
- arrays = @arrays.select(direction)
414
+ if direction == INPUT && @species.shared?
415
+ arrays = @arrays.inputs_only
416
+ else
417
+ arrays = @arrays.select(direction)
418
+ end
409
419
  if !arrays.empty?
410
420
 
411
421
  # Check if the amount of input/ouput arrays is equal to the amount of input/output species
@@ -439,6 +449,11 @@ module Bones
439
449
  array = free_array if structure.name == free_array.name
440
450
  end
441
451
  end
452
+
453
+ # Still haven't found anything, raise an error
454
+ if !array
455
+ raise_error("Could not find a matching array in C-code for a species with name '#{species.first.name}'")
456
+ end
442
457
 
443
458
  # Process the assignment
444
459
  array.species = structure
@@ -3,9 +3,10 @@ module Bones
3
3
 
4
4
  # Class copyin/out
5
5
  class Copy
6
- attr_accessor :name, :domain, :deadline, :direction, :id
6
+ attr_accessor :scop, :name, :domain, :deadline, :direction, :id
7
7
 
8
- def initialize(name,domain,deadline,direction,id)
8
+ def initialize(scop,name,domain,deadline,direction,id)
9
+ @scop = scop
9
10
  @name = name
10
11
  @domain = domain
11
12
  @deadline = deadline
@@ -91,16 +91,16 @@ module Bones
91
91
  opt :measurements, 'Enable/disable timers', :short => 'm', :default => false
92
92
  opt :verify, 'Verify correctness of the generated code', :short => 'c', :default => false
93
93
  opt :only_alg_number, 'Only generate code for the x-th species (99 -> all)', :short => 'o', :type => Integer, :default => 99
94
- opt :merge_factor, 'Thread merge factor, default is 1 (==disabled)', :short => 'f', :type => Integer, :default => 1
94
+ opt :merge_factor, 'Thread merge factor, default is 1 (==disabled)', :short => 'f', :type => Integer, :default => 0
95
95
  opt :register_caching,'Enable register caching: 1:enabled (default), 0:disabled', :short => 'r', :type => Integer, :default => 1
96
96
  opt :zero_copy ,'Enable OpenCL zero-copy: 1:enabled (default), 0:disabled', :short => 'z', :type => Integer, :default => 1
97
97
  opt :skeletons ,'Enable non-default skeletons: 1:enabled (default), 0:disabled', :short => 's', :type => Integer, :default => 1
98
98
  end
99
99
  Trollop::die 'no input file supplied (use: --application)' if !@options[:application_given]
100
100
  Trollop::die 'no target supplied (use: --target)' if !@options[:target_given]
101
- Trollop::die 'input file "'+@options[:application]+'"does not exist ' if !File.exists?(@options[:application])
101
+ Trollop::die 'input file "'+@options[:application]+'" does not exist' if !File.exists?(@options[:application])
102
102
  Trollop::die 'target not supported, supported targets are: '+pp_targets if !targets.include?(@options[:target].upcase)
103
- @options[:name] = @options[:application].split('/').last.split('.').first
103
+ @options[:name] = File.basename(@options[:application], ".*")
104
104
  @options[:target] = @options[:target].upcase
105
105
 
106
106
  # Extension for the host files corresponding to the target.
@@ -204,9 +204,10 @@ module Bones
204
204
  # Perform code generation (memory allocs)
205
205
  allocs = []
206
206
  preprocessor.copies.each do |copy|
207
- if !allocs.include?(copy.name)
207
+ name_scop = Set.new([copy.name, copy.scop])
208
+ if !allocs.include?(name_scop)
208
209
  generate_memory('alloc',copy,arrays,0)
209
- allocs << copy.name
210
+ allocs << name_scop
210
211
  end
211
212
  end
212
213
 
@@ -219,9 +220,10 @@ module Bones
219
220
  # Perform code generation (memory frees)
220
221
  frees = []
221
222
  preprocessor.copies.each do |copy|
222
- if !frees.include?(copy.name)
223
+ name_scop = Set.new([copy.name, copy.scop])
224
+ if !frees.include?(name_scop)
223
225
  generate_memory('free',copy,arrays,0)
224
- frees << copy.name
226
+ frees << name_scop
225
227
  end
226
228
  end
227
229
 
@@ -240,7 +242,7 @@ module Bones
240
242
  def write_output
241
243
 
242
244
  # Create a new directory for the output
243
- directory = @options[:application].split('.').first+'_'+@options[:target]
245
+ directory = @options[:application].rpartition('.').first+'_'+@options[:target]
244
246
  Dir.mkdir(directory,0744) unless File.directory?(directory)
245
247
 
246
248
  parser = C::Parser.new
@@ -273,13 +275,14 @@ module Bones
273
275
  end
274
276
 
275
277
  # Populate the target file (host)
278
+
276
279
  File.open(File.join(directory,@options[:name]+OUTPUT_HOST+@extension),'w') do |target|
277
280
  target.puts '#include <cuda_runtime.h>'+NL if @options[:target] == 'GPU-CUDA'
278
281
  target.puts "#define ZEROCOPY 0"+NL if @options[:zero_copy] == 0 && @options[:target] == 'CPU-OPENCL-INTEL'
279
282
  target.puts "#define ZEROCOPY 1"+NL if @options[:zero_copy] == 1 && @options[:target] == 'CPU-OPENCL-INTEL'
280
283
  target.puts @result[:header_code]
281
284
  target.puts
282
- target.puts @result[:host_device_mem_globals]
285
+ target.puts @result[:host_device_mem_globals].uniq
283
286
  target.puts
284
287
  target.puts @result[:algorithm_declarations]
285
288
  target.puts @result[:host_code_lists]
@@ -67,117 +67,147 @@ module Bones
67
67
  species = nil
68
68
  found = 0
69
69
  alloc_index, free_index = 0, 0
70
+ block_comment = false
71
+ a_scop_was_found = false
72
+ scop = 0
73
+ scop_copies = []
70
74
 
71
75
  # Process the file line by line
72
76
  @source_code.each_line.with_index do |line,index|
73
- if line =~ /^#{WHITESPACE}#/
74
-
75
- # Keep 'include' statements as header code
76
- if line =~ /^#{WHITESPACE}#include/
77
- @header_code += line
78
- if line =~ /"(.*)"/
79
- process_header($1)
80
- end
81
-
82
- # Process 'define' statements for the algorithm code, but also keep as header code
83
- elsif line =~ /^#{WHITESPACE}#define/
84
- @header_code += line
85
- @device_header += line
86
- match = line.split(/\/\//)[0].scan(/^#{WHITESPACE}#define\s+(\w+)\s+(\S*)/)
87
- @defines[match.first[0].to_sym] = match.first[1]
88
-
89
- # Found the start of algorithm marker
90
- elsif line =~ /^#{WHITESPACE}#{SPECIES_START}/
91
- if found == 0
92
- line = replace_defines(line,@defines)
93
- prefix, input, output = marker_to_algorithm(line)
94
- puts MESSAGE+'Found algorithm "'+(prefix+' '+input+' '+ARROW+' '+output).lstrip+'"' if VERBOSE
95
- species = Bones::Species.new(prefix,input,output)
96
- @found_algorithms = @found_algorithms + 1
97
- end
98
- found = found + 1
99
- #@target_code << "int bones_temp_species_start = '#{line.gsub(NL,'')}';"+NL
100
-
101
- # Found the end of algorithm marker
102
- elsif line =~ /^#{WHITESPACE}#{SPECIES_END}/
103
- if found == 1
104
- name = line.strip.scan(/^#{WHITESPACE}#{SPECIES_END} (.+)/).join
105
- name = DEFAULT_NAME if name == ''
106
- @algorithms.push(Bones::Algorithm.new(name,@filename,index.to_s,species,algorithm_code))
107
- algorithm_code = ''
108
- end
109
- found = found - 1
110
- #@target_code << "int bones_temp_species_end = '#{line.gsub(NL,'')}';"+NL
111
-
112
- # Found a sync marker
113
- elsif @scheduler && line =~ /^#{WHITESPACE}#{SYNC}/
114
- sync = line.strip.scan(/^#{WHITESPACE}#{SYNC} (.+)/).join
115
- @target_code << "bones_synchronize(#{sync});"+NL
116
-
117
- # Found a copyin marker
118
- elsif @scheduler && line =~ /^#{WHITESPACE}#{COPYIN}/
119
- copies = line.strip.scan(/^#{WHITESPACE}#{COPYIN} (.+)/).join.split(WEDGE).map{ |c| c.strip }
120
- copies.each_with_index do |copy,copynum|
121
- name = copy.split('[').first
122
- domain = copy.scan(/\[(.+)\]/).join.split(DIM_SEP)
123
- deadline = copy.split('|').last
124
- @copies.push(Bones::Copy.new(name,domain,deadline,'in',"#{index*100+copynum}"))
125
- @target_code << "bones_copyin_#{index*100+copynum}_#{name}(#{name});"+NL
77
+
78
+ # Don't consider one-line comments
79
+ if !(line =~ /^#{WHITESPACE}\/\//)
80
+
81
+ # Found the start of a block comment
82
+ if line =~ /\/\*/
83
+ block_comment = true
84
+ end
85
+
86
+ # Search for the end of the block comment
87
+ if block_comment
88
+ if line =~ /\*\//
89
+ block_comment = false
126
90
  end
127
-
128
- # Found a copyout marker
129
- elsif @scheduler && line =~ /^#{WHITESPACE}#{COPYOUT}/
130
- copies = line.strip.scan(/^#{WHITESPACE}#{COPYOUT} (.+)/).join.split(WEDGE).map{ |c| c.strip }
131
- copies.each_with_index do |copy,copynum|
132
- name = copy.split('[').first
133
- domain = copy.scan(/\[(.+)\]/).join.split(DIM_SEP)
134
- deadline = copy.split('|').last
135
- @copies.push(Bones::Copy.new(name,domain,deadline,'out',"#{index*100+copynum}"))
136
- @target_code << "bones_copyout_#{index*100+copynum}_#{name}(#{name});"+NL
91
+ @target_code << line
92
+
93
+ # Not in a block-comment
94
+ else
95
+
96
+ if line =~ /^#{WHITESPACE}#/
97
+
98
+ # Keep 'include' statements as header code
99
+ if line =~ /^#{WHITESPACE}#include/
100
+ @header_code += line
101
+ if line =~ /"(.*)"/
102
+ process_header($1)
103
+ end
104
+
105
+ # Process 'define' statements for the algorithm code, but also keep as header code
106
+ elsif line =~ /^#{WHITESPACE}#define/
107
+ @header_code += line
108
+ @device_header += line
109
+ match = line.split(/\/\//)[0].scan(/^#{WHITESPACE}#define\s+(\w+)\s+(\S*)/)
110
+ @defines[match.first[0].to_sym] = match.first[1]
111
+
112
+ # Found the start of algorithm marker
113
+ elsif line =~ /^#{WHITESPACE}#{SPECIES_START}/
114
+ if found == 0
115
+ line = replace_defines(line,@defines)
116
+ prefix, input, output = marker_to_algorithm(line)
117
+ puts MESSAGE+'Found algorithm "'+(prefix+' '+input+' '+ARROW+' '+output).lstrip+'"' if VERBOSE
118
+ species = Bones::Species.new(prefix,input,output)
119
+ @found_algorithms = @found_algorithms + 1
120
+ end
121
+ found = found + 1
122
+ #@target_code << "int bones_temp_species_start = '#{line.gsub(NL,'')}';"+NL
123
+
124
+ # Found the end of algorithm marker
125
+ elsif line =~ /^#{WHITESPACE}#{SPECIES_END}/
126
+ if found == 1
127
+ name = line.strip.scan(/^#{WHITESPACE}#{SPECIES_END} (.+)/).join
128
+ name = DEFAULT_NAME if name == ''
129
+ @algorithms.push(Bones::Algorithm.new(name,@filename,index.to_s,species,algorithm_code))
130
+ algorithm_code = ''
131
+ end
132
+ found = found - 1
133
+ #@target_code << "int bones_temp_species_end = '#{line.gsub(NL,'')}';"+NL
134
+
135
+ # Found a sync marker
136
+ elsif @scheduler && line =~ /^#{WHITESPACE}#{SYNC}/
137
+ sync = line.strip.scan(/^#{WHITESPACE}#{SYNC} (.+)/).join
138
+ @target_code << "bones_synchronize(#{sync});"+NL
139
+
140
+ # Found a copyin marker
141
+ elsif @scheduler && line =~ /^#{WHITESPACE}#{COPYIN}/
142
+ copies = line.strip.scan(/^#{WHITESPACE}#{COPYIN} (.+)/).join.split(WEDGE).map{ |c| c.strip }
143
+ copies.each_with_index do |copy,copynum|
144
+ name = copy.split('[').first
145
+ domain = copy.scan(/\[(.+)\]/).join.split(DIM_SEP)
146
+ deadline = copy.split('|').last
147
+ @copies.push(Bones::Copy.new(scop,name,domain,deadline,'in',"#{index*100+copynum}"))
148
+ scop_copies.push(@copies[-1])
149
+ @target_code << "bones_copyin_#{index*100+copynum}_#{name}(#{name});"+NL
150
+ end
151
+
152
+ # Found a copyout marker
153
+ elsif @scheduler && line =~ /^#{WHITESPACE}#{COPYOUT}/
154
+ copies = line.strip.scan(/^#{WHITESPACE}#{COPYOUT} (.+)/).join.split(WEDGE).map{ |c| c.strip }
155
+ copies.each_with_index do |copy,copynum|
156
+ name = copy.split('[').first
157
+ domain = copy.scan(/\[(.+)\]/).join.split(DIM_SEP)
158
+ deadline = copy.split('|').last
159
+ @copies.push(Bones::Copy.new(scop,name,domain,deadline,'out',"#{index*100+copynum}"))
160
+ scop_copies.push(@copies[-1])
161
+ @target_code << "bones_copyout_#{index*100+copynum}_#{name}(#{name});"+NL
162
+ end
163
+ end
164
+
165
+ # Check if it was a 'pragma scop' / 'pragma endscop' line
166
+ if line =~ /^#{WHITESPACE}#{SCOP_START}/
167
+ scop += 1
168
+ scop_copies = []
169
+ alloc_index = @target_code.length
170
+ a_scop_was_found = true
171
+ @target_code << 'bones_timer_start();'+NL
172
+ elsif line =~ /^#{WHITESPACE}#{SCOP_END}/
173
+ free_index = @target_code.length
174
+ @target_code << 'bones_timer_stop();'+NL
175
+
176
+ # Add frees and mallocs
177
+ if @scheduler
178
+ alloc_code, free_code = '', ''
179
+ included_copies = []
180
+ scop_copies.each do |copy|
181
+ if !included_copies.include?(copy.name)
182
+ alloc_code += copy.get_function_call('alloc')+NL
183
+ free_code += copy.get_function_call('free')+NL
184
+ included_copies << copy.name
185
+ end
186
+ end
187
+ @target_code.insert(alloc_index, alloc_code)
188
+ @target_code << free_code
189
+ end
190
+ end
191
+
192
+ else
193
+ if found > 0
194
+ algorithm_line = replace_defines(line,@defines)
195
+ @target_code << algorithm_line
196
+ algorithm_code += algorithm_line if line !~ /^#{WHITESPACE}#/
197
+ else
198
+ @target_code << line
199
+ end
137
200
  end
138
201
  end
139
-
140
- # Check if it was a 'pragma scop' / 'pragma endscop' line
141
- if line =~ /^#{WHITESPACE}#{SCOP_START}/
142
- alloc_index = index
143
- elsif line =~ /^#{WHITESPACE}#{SCOP_END}/
144
- free_index = @target_code.length
145
- end
146
-
147
202
  else
148
- if found > 0
149
- algorithm_line = replace_defines(line,@defines)
150
- @target_code << algorithm_line
151
- algorithm_code += algorithm_line if line !~ /^#{WHITESPACE}#/
152
- else
153
- @target_code << line
154
- end
203
+ @target_code << line
155
204
  end
156
205
  end
157
206
  puts WARNING+'Begin/end kernel mismatch ('+@found_algorithms.to_s+' versus '+@algorithms.length.to_s+'), probably missing a "'+SPECIES_END+'"' unless @algorithms.length == @found_algorithms
158
207
 
159
- # Add frees and mallocs
160
- if @scheduler
161
- alloc_code, free_code = '', ''
162
- included_copies = []
163
- copies.each do |copy|
164
- if !included_copies.include?(copy.name)
165
- alloc_code += copy.get_function_call('alloc')+NL
166
- free_code += copy.get_function_call('free')+NL
167
- included_copies << copy.name
168
- end
169
- end
170
- end
171
-
172
- # Add timers (whole scop timing) and frees/mallocs to the code
173
- offset = @header_code.lines.count
174
- @target_code.insert(alloc_index-offset, 'bones_timer_start();'+NL)
175
- if @scheduler
176
- @target_code.insert(alloc_index-offset+1, alloc_code)
177
- @target_code.insert(free_index+2, free_code)
178
- @target_code.insert(free_index+3, 'bones_timer_stop();'+NL)
179
- else
180
- @target_code.insert(free_index+2, 'bones_timer_stop();'+NL)
208
+ # Print warning if there is no SCoP found
209
+ if !a_scop_was_found
210
+ puts WARNING+'No "#pragma scop" and "#pragma endscop" found!'
181
211
  end
182
212
 
183
213
  # Join the array
@@ -191,28 +221,48 @@ module Bones
191
221
  ifdefs = [true]
192
222
 
193
223
  # Process the file line by line
224
+ block_comment = false
194
225
  File.read(File.join(@directory,filename)).each_line.with_index do |line,index|
195
- if line =~ /^#{WHITESPACE}#/
196
-
197
- # Process 'include' statements
198
- if line =~ /^#{WHITESPACE}#include/ && ifdefs.last
199
- if line =~ /"(.*)"/
200
- process_header($1)
226
+
227
+ # Don't consider one-line comments
228
+ if !(line =~ /^#{WHITESPACE}\/\//)
229
+
230
+ # Found the start of a block comment
231
+ if line =~ /\/\*/
232
+ block_comment = true
233
+ end
234
+
235
+ # Search for the end of the block comment
236
+ if block_comment
237
+ if line =~ /\*\//
238
+ block_comment = false
239
+ end
240
+
241
+ # Not in a block-comment
242
+ else
243
+ if line =~ /^#{WHITESPACE}#/
244
+
245
+ # Process 'include' statements
246
+ if line =~ /^#{WHITESPACE}#include/ && ifdefs.last
247
+ if line =~ /"(.*)"/
248
+ process_header($1)
249
+ end
250
+
251
+ # Process 'define' statements
252
+ elsif line =~ /^#{WHITESPACE}#define/ && ifdefs.last
253
+ match = line.split(/\/\//)[0].scan(/^#{WHITESPACE}#define\s+(\w+)\s+(\S*)/)
254
+ @defines[match.first[0].to_sym] = match.first[1].strip
255
+
256
+ # Process 'ifdef' statements
257
+ elsif line =~ /^#{WHITESPACE}#ifdef#{WHITESPACE}(\w+)/
258
+ valid = (ifdefs.last) ? @defines.has_key?($1.to_sym) : false
259
+ ifdefs.push(valid)
260
+
261
+ # Process 'endif' statements
262
+ elsif line =~ /^#{WHITESPACE}#endif/
263
+ ifdefs.pop
264
+ end
201
265
  end
202
-
203
- # Process 'define' statements
204
- elsif line =~ /^#{WHITESPACE}#define/ && ifdefs.last
205
- match = line.split(/\/\//)[0].scan(/^#{WHITESPACE}#define\s+(\w+)\s+(\S*)/)
206
- @defines[match.first[0].to_sym] = match.first[1].strip
207
-
208
- # Process 'ifdef' statements
209
- elsif line =~ /^#{WHITESPACE}#ifdef#{WHITESPACE}(\w+)/
210
- valid = (ifdefs.last) ? @defines.has_key?($1.to_sym) : false
211
- ifdefs.push(valid)
212
-
213
- # Process 'endif' statements
214
- elsif line =~ /^#{WHITESPACE}#endif/
215
- ifdefs.pop
216
266
  end
217
267
  end
218
268
  end