laag-nasm 2.13.03.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (455) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +57 -0
  3. data/LICENSE.txt +29 -0
  4. data/README.org +34 -0
  5. data/ext/laag/nasm/extconf.rb +16 -0
  6. data/laag-nasm.gemspec +20 -0
  7. data/lib/laag/nasm.rb +29 -0
  8. data/patches/Makefile.in.patch +13 -0
  9. data/vendor/repo.or.cz/nasm/.gitignore +102 -0
  10. data/vendor/repo.or.cz/nasm/AUTHORS +137 -0
  11. data/vendor/repo.or.cz/nasm/CHANGES +2 -0
  12. data/vendor/repo.or.cz/nasm/ChangeLog +2905 -0
  13. data/vendor/repo.or.cz/nasm/INSTALL +102 -0
  14. data/vendor/repo.or.cz/nasm/LICENSE +29 -0
  15. data/vendor/repo.or.cz/nasm/Makefile.in +855 -0
  16. data/vendor/repo.or.cz/nasm/Mkfiles/README +46 -0
  17. data/vendor/repo.or.cz/nasm/Mkfiles/msvc.mak +732 -0
  18. data/vendor/repo.or.cz/nasm/Mkfiles/openwcom.mak +706 -0
  19. data/vendor/repo.or.cz/nasm/README +23 -0
  20. data/vendor/repo.or.cz/nasm/SubmittingPatches +116 -0
  21. data/vendor/repo.or.cz/nasm/TODO +376 -0
  22. data/vendor/repo.or.cz/nasm/aclocal.m4 +139 -0
  23. data/vendor/repo.or.cz/nasm/asm/assemble.c +2957 -0
  24. data/vendor/repo.or.cz/nasm/asm/assemble.h +54 -0
  25. data/vendor/repo.or.cz/nasm/asm/directiv.c +566 -0
  26. data/vendor/repo.or.cz/nasm/asm/directiv.dat +92 -0
  27. data/vendor/repo.or.cz/nasm/asm/error.c +202 -0
  28. data/vendor/repo.or.cz/nasm/asm/eval.c +1014 -0
  29. data/vendor/repo.or.cz/nasm/asm/eval.h +49 -0
  30. data/vendor/repo.or.cz/nasm/asm/exprdump.c +79 -0
  31. data/vendor/repo.or.cz/nasm/asm/exprlib.c +200 -0
  32. data/vendor/repo.or.cz/nasm/asm/float.c +952 -0
  33. data/vendor/repo.or.cz/nasm/asm/float.h +54 -0
  34. data/vendor/repo.or.cz/nasm/asm/labels.c +540 -0
  35. data/vendor/repo.or.cz/nasm/asm/listing.c +346 -0
  36. data/vendor/repo.or.cz/nasm/asm/listing.h +113 -0
  37. data/vendor/repo.or.cz/nasm/asm/nasm.c +1855 -0
  38. data/vendor/repo.or.cz/nasm/asm/parser.c +1167 -0
  39. data/vendor/repo.or.cz/nasm/asm/parser.h +45 -0
  40. data/vendor/repo.or.cz/nasm/asm/phash.pl +109 -0
  41. data/vendor/repo.or.cz/nasm/asm/pptok.dat +96 -0
  42. data/vendor/repo.or.cz/nasm/asm/pptok.pl +271 -0
  43. data/vendor/repo.or.cz/nasm/asm/pragma.c +218 -0
  44. data/vendor/repo.or.cz/nasm/asm/preproc-nop.c +188 -0
  45. data/vendor/repo.or.cz/nasm/asm/preproc.c +5459 -0
  46. data/vendor/repo.or.cz/nasm/asm/preproc.h +55 -0
  47. data/vendor/repo.or.cz/nasm/asm/quote.c +479 -0
  48. data/vendor/repo.or.cz/nasm/asm/quote.h +44 -0
  49. data/vendor/repo.or.cz/nasm/asm/rdstrnum.c +68 -0
  50. data/vendor/repo.or.cz/nasm/asm/segalloc.c +51 -0
  51. data/vendor/repo.or.cz/nasm/asm/stdscan.c +345 -0
  52. data/vendor/repo.or.cz/nasm/asm/stdscan.h +49 -0
  53. data/vendor/repo.or.cz/nasm/asm/strfunc.c +359 -0
  54. data/vendor/repo.or.cz/nasm/asm/tokens.dat +135 -0
  55. data/vendor/repo.or.cz/nasm/asm/tokhash.pl +284 -0
  56. data/vendor/repo.or.cz/nasm/autogen.sh +9 -0
  57. data/vendor/repo.or.cz/nasm/common/common.c +122 -0
  58. data/vendor/repo.or.cz/nasm/config/msvc.h +192 -0
  59. data/vendor/repo.or.cz/nasm/config/unknown.h +51 -0
  60. data/vendor/repo.or.cz/nasm/config/watcom.h +74 -0
  61. data/vendor/repo.or.cz/nasm/configure.ac +253 -0
  62. data/vendor/repo.or.cz/nasm/contrib/MSVC6.txt +25 -0
  63. data/vendor/repo.or.cz/nasm/contrib/VSrules/nasm.README +16 -0
  64. data/vendor/repo.or.cz/nasm/contrib/VSrules/nasm.rules +79 -0
  65. data/vendor/repo.or.cz/nasm/disasm/disasm.c +1735 -0
  66. data/vendor/repo.or.cz/nasm/disasm/disasm.h +49 -0
  67. data/vendor/repo.or.cz/nasm/disasm/ndisasm.c +397 -0
  68. data/vendor/repo.or.cz/nasm/disasm/sync.c +132 -0
  69. data/vendor/repo.or.cz/nasm/disasm/sync.h +45 -0
  70. data/vendor/repo.or.cz/nasm/doc/Makefile.in +86 -0
  71. data/vendor/repo.or.cz/nasm/doc/README +20 -0
  72. data/vendor/repo.or.cz/nasm/doc/afmmetrics.ph +102 -0
  73. data/vendor/repo.or.cz/nasm/doc/changes.src +2588 -0
  74. data/vendor/repo.or.cz/nasm/doc/findfont.ph +180 -0
  75. data/vendor/repo.or.cz/nasm/doc/genps.pl +1294 -0
  76. data/vendor/repo.or.cz/nasm/doc/inslist.pl +108 -0
  77. data/vendor/repo.or.cz/nasm/doc/internal.doc +290 -0
  78. data/vendor/repo.or.cz/nasm/doc/local.css +1 -0
  79. data/vendor/repo.or.cz/nasm/doc/nasmdoc.css +150 -0
  80. data/vendor/repo.or.cz/nasm/doc/nasmdoc.src +8309 -0
  81. data/vendor/repo.or.cz/nasm/doc/nasmlogo.eps +212 -0
  82. data/vendor/repo.or.cz/nasm/doc/nasmlogw.png +0 -0
  83. data/vendor/repo.or.cz/nasm/doc/psfonts.ph +53 -0
  84. data/vendor/repo.or.cz/nasm/doc/pspdf.pl +98 -0
  85. data/vendor/repo.or.cz/nasm/doc/pswidth.ph +25 -0
  86. data/vendor/repo.or.cz/nasm/doc/rdsrc.pl +1111 -0
  87. data/vendor/repo.or.cz/nasm/doc/ttfmetrics.ph +63 -0
  88. data/vendor/repo.or.cz/nasm/headers/c +33 -0
  89. data/vendor/repo.or.cz/nasm/headers/doc +33 -0
  90. data/vendor/repo.or.cz/nasm/headers/mac +33 -0
  91. data/vendor/repo.or.cz/nasm/headers/perl +33 -0
  92. data/vendor/repo.or.cz/nasm/include/compiler.h +277 -0
  93. data/vendor/repo.or.cz/nasm/include/disp8.h +45 -0
  94. data/vendor/repo.or.cz/nasm/include/error.h +135 -0
  95. data/vendor/repo.or.cz/nasm/include/hashtbl.h +85 -0
  96. data/vendor/repo.or.cz/nasm/include/iflag.h +173 -0
  97. data/vendor/repo.or.cz/nasm/include/insns.h +76 -0
  98. data/vendor/repo.or.cz/nasm/include/labels.h +60 -0
  99. data/vendor/repo.or.cz/nasm/include/md5.h +21 -0
  100. data/vendor/repo.or.cz/nasm/include/nasm.h +1246 -0
  101. data/vendor/repo.or.cz/nasm/include/nasmint.h +219 -0
  102. data/vendor/repo.or.cz/nasm/include/nasmlib.h +524 -0
  103. data/vendor/repo.or.cz/nasm/include/opflags.h +271 -0
  104. data/vendor/repo.or.cz/nasm/include/perfhash.h +52 -0
  105. data/vendor/repo.or.cz/nasm/include/raa.h +46 -0
  106. data/vendor/repo.or.cz/nasm/include/rbtree.h +51 -0
  107. data/vendor/repo.or.cz/nasm/include/rdoff.h +169 -0
  108. data/vendor/repo.or.cz/nasm/include/saa.h +94 -0
  109. data/vendor/repo.or.cz/nasm/include/strlist.h +55 -0
  110. data/vendor/repo.or.cz/nasm/include/tables.h +70 -0
  111. data/vendor/repo.or.cz/nasm/include/ver.h +47 -0
  112. data/vendor/repo.or.cz/nasm/install-sh +250 -0
  113. data/vendor/repo.or.cz/nasm/macros/altreg.mac +107 -0
  114. data/vendor/repo.or.cz/nasm/macros/fp.mac +54 -0
  115. data/vendor/repo.or.cz/nasm/macros/ifunc.mac +48 -0
  116. data/vendor/repo.or.cz/nasm/macros/macros.pl +294 -0
  117. data/vendor/repo.or.cz/nasm/macros/smartalign.mac +189 -0
  118. data/vendor/repo.or.cz/nasm/macros/standard.mac +226 -0
  119. data/vendor/repo.or.cz/nasm/misc/Doxyfile +752 -0
  120. data/vendor/repo.or.cz/nasm/misc/Nindent +18 -0
  121. data/vendor/repo.or.cz/nasm/misc/README +2 -0
  122. data/vendor/repo.or.cz/nasm/misc/c16.mac +82 -0
  123. data/vendor/repo.or.cz/nasm/misc/c32.mac +52 -0
  124. data/vendor/repo.or.cz/nasm/misc/crcgen.c +44 -0
  125. data/vendor/repo.or.cz/nasm/misc/exebin.mac +57 -0
  126. data/vendor/repo.or.cz/nasm/misc/exebin2.mac +114 -0
  127. data/vendor/repo.or.cz/nasm/misc/fmtinsns.pl +40 -0
  128. data/vendor/repo.or.cz/nasm/misc/genfma.pl +63 -0
  129. data/vendor/repo.or.cz/nasm/misc/hints.txt +26 -0
  130. data/vendor/repo.or.cz/nasm/misc/magic +6 -0
  131. data/vendor/repo.or.cz/nasm/misc/myC32.mac +121 -0
  132. data/vendor/repo.or.cz/nasm/misc/nasm.sl +320 -0
  133. data/vendor/repo.or.cz/nasm/misc/nasmstab +296 -0
  134. data/vendor/repo.or.cz/nasm/misc/omfdump.c +517 -0
  135. data/vendor/repo.or.cz/nasm/misc/pmw.bat +9 -0
  136. data/vendor/repo.or.cz/nasm/misc/proc32.ash +441 -0
  137. data/vendor/repo.or.cz/nasm/misc/scitech.mac +1223 -0
  138. data/vendor/repo.or.cz/nasm/misc/xcrcgen.c +80 -0
  139. data/vendor/repo.or.cz/nasm/nasm.spec.in +83 -0
  140. data/vendor/repo.or.cz/nasm/nasm.spec.sed +3 -0
  141. data/vendor/repo.or.cz/nasm/nasm.txt +306 -0
  142. data/vendor/repo.or.cz/nasm/nasmlib/badenum.c +43 -0
  143. data/vendor/repo.or.cz/nasm/nasmlib/bsi.c +77 -0
  144. data/vendor/repo.or.cz/nasm/nasmlib/crc64.c +189 -0
  145. data/vendor/repo.or.cz/nasm/nasmlib/file.c +259 -0
  146. data/vendor/repo.or.cz/nasm/nasmlib/file.h +128 -0
  147. data/vendor/repo.or.cz/nasm/nasmlib/filename.c +69 -0
  148. data/vendor/repo.or.cz/nasm/nasmlib/hashtbl.c +232 -0
  149. data/vendor/repo.or.cz/nasm/nasmlib/ilog2.c +168 -0
  150. data/vendor/repo.or.cz/nasm/nasmlib/malloc.c +108 -0
  151. data/vendor/repo.or.cz/nasm/nasmlib/md5c.c +247 -0
  152. data/vendor/repo.or.cz/nasm/nasmlib/mmap.c +139 -0
  153. data/vendor/repo.or.cz/nasm/nasmlib/path.c +186 -0
  154. data/vendor/repo.or.cz/nasm/nasmlib/perfhash.c +55 -0
  155. data/vendor/repo.or.cz/nasm/nasmlib/perfhash.pl +362 -0
  156. data/vendor/repo.or.cz/nasm/nasmlib/raa.c +173 -0
  157. data/vendor/repo.or.cz/nasm/nasmlib/rbtree.c +119 -0
  158. data/vendor/repo.or.cz/nasm/nasmlib/readnum.c +172 -0
  159. data/vendor/repo.or.cz/nasm/nasmlib/realpath.c +135 -0
  160. data/vendor/repo.or.cz/nasm/nasmlib/saa.c +431 -0
  161. data/vendor/repo.or.cz/nasm/nasmlib/srcfile.c +128 -0
  162. data/vendor/repo.or.cz/nasm/nasmlib/string.c +242 -0
  163. data/vendor/repo.or.cz/nasm/nasmlib/strlist.c +100 -0
  164. data/vendor/repo.or.cz/nasm/nasmlib/ver.c +51 -0
  165. data/vendor/repo.or.cz/nasm/nasmlib/zerobuf.c +42 -0
  166. data/vendor/repo.or.cz/nasm/ndisasm.txt +94 -0
  167. data/vendor/repo.or.cz/nasm/nsis/NASMMultiUser.nsh +478 -0
  168. data/vendor/repo.or.cz/nasm/nsis/getpearch.pl +76 -0
  169. data/vendor/repo.or.cz/nasm/nsis/nasm-un.ico +0 -0
  170. data/vendor/repo.or.cz/nasm/nsis/nasm.ico +0 -0
  171. data/vendor/repo.or.cz/nasm/nsis/nasm.nsi +241 -0
  172. data/vendor/repo.or.cz/nasm/output/codeview.c +814 -0
  173. data/vendor/repo.or.cz/nasm/output/dwarf.h +566 -0
  174. data/vendor/repo.or.cz/nasm/output/elf.h +537 -0
  175. data/vendor/repo.or.cz/nasm/output/legacy.c +112 -0
  176. data/vendor/repo.or.cz/nasm/output/nulldbg.c +93 -0
  177. data/vendor/repo.or.cz/nasm/output/nullout.c +51 -0
  178. data/vendor/repo.or.cz/nasm/output/outaout.c +954 -0
  179. data/vendor/repo.or.cz/nasm/output/outaout.mac +37 -0
  180. data/vendor/repo.or.cz/nasm/output/outas86.c +650 -0
  181. data/vendor/repo.or.cz/nasm/output/outas86.mac +37 -0
  182. data/vendor/repo.or.cz/nasm/output/outbin.c +1713 -0
  183. data/vendor/repo.or.cz/nasm/output/outbin.mac +40 -0
  184. data/vendor/repo.or.cz/nasm/output/outcoff.c +1242 -0
  185. data/vendor/repo.or.cz/nasm/output/outcoff.mac +43 -0
  186. data/vendor/repo.or.cz/nasm/output/outdbg.c +425 -0
  187. data/vendor/repo.or.cz/nasm/output/outelf.c +3370 -0
  188. data/vendor/repo.or.cz/nasm/output/outelf.h +156 -0
  189. data/vendor/repo.or.cz/nasm/output/outelf.mac +41 -0
  190. data/vendor/repo.or.cz/nasm/output/outform.c +120 -0
  191. data/vendor/repo.or.cz/nasm/output/outform.h +379 -0
  192. data/vendor/repo.or.cz/nasm/output/outieee.c +1528 -0
  193. data/vendor/repo.or.cz/nasm/output/outlib.c +58 -0
  194. data/vendor/repo.or.cz/nasm/output/outlib.h +63 -0
  195. data/vendor/repo.or.cz/nasm/output/outmacho.c +2387 -0
  196. data/vendor/repo.or.cz/nasm/output/outmacho.mac +49 -0
  197. data/vendor/repo.or.cz/nasm/output/outobj.c +2725 -0
  198. data/vendor/repo.or.cz/nasm/output/outobj.mac +49 -0
  199. data/vendor/repo.or.cz/nasm/output/outrdf.mac +40 -0
  200. data/vendor/repo.or.cz/nasm/output/outrdf2.c +791 -0
  201. data/vendor/repo.or.cz/nasm/output/outrdf2.mac +43 -0
  202. data/vendor/repo.or.cz/nasm/output/pecoff.h +532 -0
  203. data/vendor/repo.or.cz/nasm/output/stabs.h +144 -0
  204. data/vendor/repo.or.cz/nasm/perllib/crc64.ph +158 -0
  205. data/vendor/repo.or.cz/nasm/perllib/gensv.pl +34 -0
  206. data/vendor/repo.or.cz/nasm/perllib/phash.ph +200 -0
  207. data/vendor/repo.or.cz/nasm/perllib/random_sv_vectors.ph +67 -0
  208. data/vendor/repo.or.cz/nasm/rdoff/README +185 -0
  209. data/vendor/repo.or.cz/nasm/rdoff/collectn.c +44 -0
  210. data/vendor/repo.or.cz/nasm/rdoff/collectn.h +22 -0
  211. data/vendor/repo.or.cz/nasm/rdoff/doc/Makefile +37 -0
  212. data/vendor/repo.or.cz/nasm/rdoff/doc/rdoff.texi +137 -0
  213. data/vendor/repo.or.cz/nasm/rdoff/doc/v1-v2.txt +62 -0
  214. data/vendor/repo.or.cz/nasm/rdoff/hash.c +122 -0
  215. data/vendor/repo.or.cz/nasm/rdoff/hash.h +17 -0
  216. data/vendor/repo.or.cz/nasm/rdoff/ldrdf.1 +41 -0
  217. data/vendor/repo.or.cz/nasm/rdoff/ldrdf.c +1395 -0
  218. data/vendor/repo.or.cz/nasm/rdoff/ldsegs.h +59 -0
  219. data/vendor/repo.or.cz/nasm/rdoff/rdf2bin.1 +65 -0
  220. data/vendor/repo.or.cz/nasm/rdoff/rdf2bin.c +431 -0
  221. data/vendor/repo.or.cz/nasm/rdoff/rdf2com.1 +1 -0
  222. data/vendor/repo.or.cz/nasm/rdoff/rdf2ihx.1 +1 -0
  223. data/vendor/repo.or.cz/nasm/rdoff/rdf2ith.1 +1 -0
  224. data/vendor/repo.or.cz/nasm/rdoff/rdf2srec.1 +1 -0
  225. data/vendor/repo.or.cz/nasm/rdoff/rdfdump.1 +24 -0
  226. data/vendor/repo.or.cz/nasm/rdoff/rdfdump.c +347 -0
  227. data/vendor/repo.or.cz/nasm/rdoff/rdflib.1 +39 -0
  228. data/vendor/repo.or.cz/nasm/rdoff/rdflib.c +434 -0
  229. data/vendor/repo.or.cz/nasm/rdoff/rdfload.c +213 -0
  230. data/vendor/repo.or.cz/nasm/rdoff/rdfload.h +29 -0
  231. data/vendor/repo.or.cz/nasm/rdoff/rdfutils.h +165 -0
  232. data/vendor/repo.or.cz/nasm/rdoff/rdlar.c +492 -0
  233. data/vendor/repo.or.cz/nasm/rdoff/rdlar.h +34 -0
  234. data/vendor/repo.or.cz/nasm/rdoff/rdlib.c +290 -0
  235. data/vendor/repo.or.cz/nasm/rdoff/rdlib.h +62 -0
  236. data/vendor/repo.or.cz/nasm/rdoff/rdoff.c +621 -0
  237. data/vendor/repo.or.cz/nasm/rdoff/rdx.1 +21 -0
  238. data/vendor/repo.or.cz/nasm/rdoff/rdx.c +90 -0
  239. data/vendor/repo.or.cz/nasm/rdoff/segtab.c +172 -0
  240. data/vendor/repo.or.cz/nasm/rdoff/segtab.h +45 -0
  241. data/vendor/repo.or.cz/nasm/rdoff/symtab.c +159 -0
  242. data/vendor/repo.or.cz/nasm/rdoff/symtab.h +55 -0
  243. data/vendor/repo.or.cz/nasm/rdoff/test/Makefile +10 -0
  244. data/vendor/repo.or.cz/nasm/rdoff/test/makelib.sh +14 -0
  245. data/vendor/repo.or.cz/nasm/rdoff/test/rdfseg.asm +20 -0
  246. data/vendor/repo.or.cz/nasm/rdoff/test/rdfseg2.asm +12 -0
  247. data/vendor/repo.or.cz/nasm/rdoff/test/rdftest1.asm +54 -0
  248. data/vendor/repo.or.cz/nasm/rdoff/test/rdftest2.asm +33 -0
  249. data/vendor/repo.or.cz/nasm/rdoff/test/rdtlib.asm +48 -0
  250. data/vendor/repo.or.cz/nasm/rdoff/test/rdtmain.asm +47 -0
  251. data/vendor/repo.or.cz/nasm/rdoff/test/testlib.asm +18 -0
  252. data/vendor/repo.or.cz/nasm/stdlib/snprintf.c +29 -0
  253. data/vendor/repo.or.cz/nasm/stdlib/strlcpy.c +51 -0
  254. data/vendor/repo.or.cz/nasm/stdlib/strnlen.c +46 -0
  255. data/vendor/repo.or.cz/nasm/stdlib/vsnprintf.c +51 -0
  256. data/vendor/repo.or.cz/nasm/test/Makefile +106 -0
  257. data/vendor/repo.or.cz/nasm/test/_file_.asm +5 -0
  258. data/vendor/repo.or.cz/nasm/test/_version.asm +2 -0
  259. data/vendor/repo.or.cz/nasm/test/a32offs.asm +9 -0
  260. data/vendor/repo.or.cz/nasm/test/absolute.asm +40 -0
  261. data/vendor/repo.or.cz/nasm/test/addr64x.asm +18 -0
  262. data/vendor/repo.or.cz/nasm/test/align13.asm +19 -0
  263. data/vendor/repo.or.cz/nasm/test/align13s.asm +20 -0
  264. data/vendor/repo.or.cz/nasm/test/alonesym-obj.asm +166 -0
  265. data/vendor/repo.or.cz/nasm/test/andbyte.asm +15 -0
  266. data/vendor/repo.or.cz/nasm/test/aoutso.asm +99 -0
  267. data/vendor/repo.or.cz/nasm/test/aouttest.asm +86 -0
  268. data/vendor/repo.or.cz/nasm/test/aouttest.c +36 -0
  269. data/vendor/repo.or.cz/nasm/test/avx.asm +46 -0
  270. data/vendor/repo.or.cz/nasm/test/avx005.asm +529 -0
  271. data/vendor/repo.or.cz/nasm/test/avx2.asm +1608 -0
  272. data/vendor/repo.or.cz/nasm/test/avx512cd.asm +106 -0
  273. data/vendor/repo.or.cz/nasm/test/avx512er.asm +144 -0
  274. data/vendor/repo.or.cz/nasm/test/avx512f.asm +7000 -0
  275. data/vendor/repo.or.cz/nasm/test/avx512pf.asm +88 -0
  276. data/vendor/repo.or.cz/nasm/test/bcd.asm +23 -0
  277. data/vendor/repo.or.cz/nasm/test/binexe.asm +35 -0
  278. data/vendor/repo.or.cz/nasm/test/bintest.asm +59 -0
  279. data/vendor/repo.or.cz/nasm/test/bisect.sh +22 -0
  280. data/vendor/repo.or.cz/nasm/test/br1879590.asm +25 -0
  281. data/vendor/repo.or.cz/nasm/test/br2003451.asm +17 -0
  282. data/vendor/repo.or.cz/nasm/test/br2030823.asm +7 -0
  283. data/vendor/repo.or.cz/nasm/test/br2148476.asm +221 -0
  284. data/vendor/repo.or.cz/nasm/test/br2222615.asm +19 -0
  285. data/vendor/repo.or.cz/nasm/test/br2496848.asm +42 -0
  286. data/vendor/repo.or.cz/nasm/test/br3005117.asm +26 -0
  287. data/vendor/repo.or.cz/nasm/test/br3026808.asm +20 -0
  288. data/vendor/repo.or.cz/nasm/test/br3028880.asm +8 -0
  289. data/vendor/repo.or.cz/nasm/test/br3041451.asm +59 -0
  290. data/vendor/repo.or.cz/nasm/test/br3058845.asm +14 -0
  291. data/vendor/repo.or.cz/nasm/test/br3066383.asm +70 -0
  292. data/vendor/repo.or.cz/nasm/test/br3074517.asm +12 -0
  293. data/vendor/repo.or.cz/nasm/test/br3092924.asm +25 -0
  294. data/vendor/repo.or.cz/nasm/test/br3104312.asm +11 -0
  295. data/vendor/repo.or.cz/nasm/test/br3109604.asm +9 -0
  296. data/vendor/repo.or.cz/nasm/test/br3174983.asm +9 -0
  297. data/vendor/repo.or.cz/nasm/test/br3187743.asm +7 -0
  298. data/vendor/repo.or.cz/nasm/test/br3189064.asm +7 -0
  299. data/vendor/repo.or.cz/nasm/test/br3200749.asm +9 -0
  300. data/vendor/repo.or.cz/nasm/test/br3385573.asm +11 -0
  301. data/vendor/repo.or.cz/nasm/test/br3392252.asm +43 -0
  302. data/vendor/repo.or.cz/nasm/test/br3392259.asm +8 -0
  303. data/vendor/repo.or.cz/nasm/test/br3392363.asm +4 -0
  304. data/vendor/repo.or.cz/nasm/test/br3392392.asm +16 -0
  305. data/vendor/repo.or.cz/nasm/test/br3392396.asm +5 -0
  306. data/vendor/repo.or.cz/nasm/test/br3392411.asm +22 -0
  307. data/vendor/repo.or.cz/nasm/test/br3392418.asm +3 -0
  308. data/vendor/repo.or.cz/nasm/test/br3392439.asm +25 -0
  309. data/vendor/repo.or.cz/nasm/test/br3392442.asm +6 -0
  310. data/vendor/repo.or.cz/nasm/test/br560575.asm +17 -0
  311. data/vendor/repo.or.cz/nasm/test/br560873.asm +27 -0
  312. data/vendor/repo.or.cz/nasm/test/br890790.asm +7 -0
  313. data/vendor/repo.or.cz/nasm/test/br890790_i.asm +1 -0
  314. data/vendor/repo.or.cz/nasm/test/br978756.asm +7 -0
  315. data/vendor/repo.or.cz/nasm/test/changed.asm +383 -0
  316. data/vendor/repo.or.cz/nasm/test/cofftest.asm +85 -0
  317. data/vendor/repo.or.cz/nasm/test/cofftest.c +35 -0
  318. data/vendor/repo.or.cz/nasm/test/crc32.asm +37 -0
  319. data/vendor/repo.or.cz/nasm/test/cv8struc.asm +14 -0
  320. data/vendor/repo.or.cz/nasm/test/dtbcd.asm +72 -0
  321. data/vendor/repo.or.cz/nasm/test/elf64so.asm +118 -0
  322. data/vendor/repo.or.cz/nasm/test/elfso.asm +100 -0
  323. data/vendor/repo.or.cz/nasm/test/elftest.asm +87 -0
  324. data/vendor/repo.or.cz/nasm/test/elftest.c +38 -0
  325. data/vendor/repo.or.cz/nasm/test/elftest64.c +43 -0
  326. data/vendor/repo.or.cz/nasm/test/elif.asm +39 -0
  327. data/vendor/repo.or.cz/nasm/test/expimp.asm +90 -0
  328. data/vendor/repo.or.cz/nasm/test/far64.asm +10 -0
  329. data/vendor/repo.or.cz/nasm/test/float.asm +186 -0
  330. data/vendor/repo.or.cz/nasm/test/float8.asm +135 -0
  331. data/vendor/repo.or.cz/nasm/test/floatb.asm +35 -0
  332. data/vendor/repo.or.cz/nasm/test/floatexp.asm +382 -0
  333. data/vendor/repo.or.cz/nasm/test/floatize.asm +19 -0
  334. data/vendor/repo.or.cz/nasm/test/floattest.asm +28 -0
  335. data/vendor/repo.or.cz/nasm/test/floatx.asm +525 -0
  336. data/vendor/repo.or.cz/nasm/test/fpu.asm +127 -0
  337. data/vendor/repo.or.cz/nasm/test/fwdopt.asm +133 -0
  338. data/vendor/repo.or.cz/nasm/test/fwdoptpp.asm +150 -0
  339. data/vendor/repo.or.cz/nasm/test/gas2nasm.py +104 -0
  340. data/vendor/repo.or.cz/nasm/test/gather.asm +11 -0
  341. data/vendor/repo.or.cz/nasm/test/gotoff64.asm +25 -0
  342. data/vendor/repo.or.cz/nasm/test/hexfp.asm +25 -0
  343. data/vendor/repo.or.cz/nasm/test/hle.asm +19 -0
  344. data/vendor/repo.or.cz/nasm/test/ifelse.asm +46 -0
  345. data/vendor/repo.or.cz/nasm/test/ifenv.asm +31 -0
  346. data/vendor/repo.or.cz/nasm/test/ifmacro.asm +413 -0
  347. data/vendor/repo.or.cz/nasm/test/iftoken.asm +317 -0
  348. data/vendor/repo.or.cz/nasm/test/iftoken.pl +32 -0
  349. data/vendor/repo.or.cz/nasm/test/ilog2.asm +271 -0
  350. data/vendor/repo.or.cz/nasm/test/imacro.asm +8 -0
  351. data/vendor/repo.or.cz/nasm/test/imm.asm +23 -0
  352. data/vendor/repo.or.cz/nasm/test/imm64.asm +61 -0
  353. data/vendor/repo.or.cz/nasm/test/immwarn.asm +91 -0
  354. data/vendor/repo.or.cz/nasm/test/imul.asm +117 -0
  355. data/vendor/repo.or.cz/nasm/test/inc1.asm +6 -0
  356. data/vendor/repo.or.cz/nasm/test/inc2.asm +8 -0
  357. data/vendor/repo.or.cz/nasm/test/incbin.asm +7 -0
  358. data/vendor/repo.or.cz/nasm/test/incbin.data +2 -0
  359. data/vendor/repo.or.cz/nasm/test/inctest.asm +15 -0
  360. data/vendor/repo.or.cz/nasm/test/insnlbl.asm +12 -0
  361. data/vendor/repo.or.cz/nasm/test/invlpga.asm +11 -0
  362. data/vendor/repo.or.cz/nasm/test/jmp64.asm +19 -0
  363. data/vendor/repo.or.cz/nasm/test/lar_lsl.asm +124 -0
  364. data/vendor/repo.or.cz/nasm/test/larlsl.asm +23 -0
  365. data/vendor/repo.or.cz/nasm/test/lnxhello.asm +54 -0
  366. data/vendor/repo.or.cz/nasm/test/local.asm +19 -0
  367. data/vendor/repo.or.cz/nasm/test/loopoffs.asm +12 -0
  368. data/vendor/repo.or.cz/nasm/test/lwp.asm +213 -0
  369. data/vendor/repo.or.cz/nasm/test/macro-defaults.asm +64 -0
  370. data/vendor/repo.or.cz/nasm/test/macroerr.asm +12 -0
  371. data/vendor/repo.or.cz/nasm/test/macroerr.inc +3 -0
  372. data/vendor/repo.or.cz/nasm/test/mmxsize.asm +38 -0
  373. data/vendor/repo.or.cz/nasm/test/movd.asm +12 -0
  374. data/vendor/repo.or.cz/nasm/test/movd64.asm +15 -0
  375. data/vendor/repo.or.cz/nasm/test/movimm.asm +28 -0
  376. data/vendor/repo.or.cz/nasm/test/movnti.asm +10 -0
  377. data/vendor/repo.or.cz/nasm/test/mpx-64.asm +120 -0
  378. data/vendor/repo.or.cz/nasm/test/mpx.asm +89 -0
  379. data/vendor/repo.or.cz/nasm/test/multisection.asm +96 -0
  380. data/vendor/repo.or.cz/nasm/test/nasmformat.asm +17 -0
  381. data/vendor/repo.or.cz/nasm/test/new +9 -0
  382. data/vendor/repo.or.cz/nasm/test/newrdwr.asm +24 -0
  383. data/vendor/repo.or.cz/nasm/test/nop.asm +17 -0
  384. data/vendor/repo.or.cz/nasm/test/nullfile.asm +4 -0
  385. data/vendor/repo.or.cz/nasm/test/objexe.asm +30 -0
  386. data/vendor/repo.or.cz/nasm/test/objlink.c +33 -0
  387. data/vendor/repo.or.cz/nasm/test/objtest.asm +85 -0
  388. data/vendor/repo.or.cz/nasm/test/optimization.asm +104 -0
  389. data/vendor/repo.or.cz/nasm/test/org.asm +18 -0
  390. data/vendor/repo.or.cz/nasm/test/paste.asm +12 -0
  391. data/vendor/repo.or.cz/nasm/test/pcrel.asm +52 -0
  392. data/vendor/repo.or.cz/nasm/test/perf/label.pl +18 -0
  393. data/vendor/repo.or.cz/nasm/test/perf/macro.pl +18 -0
  394. data/vendor/repo.or.cz/nasm/test/perf/token.pl +23 -0
  395. data/vendor/repo.or.cz/nasm/test/performtest.pl +192 -0
  396. data/vendor/repo.or.cz/nasm/test/pextrw.asm +3 -0
  397. data/vendor/repo.or.cz/nasm/test/pinsr16.asm +53 -0
  398. data/vendor/repo.or.cz/nasm/test/pinsr32.asm +53 -0
  399. data/vendor/repo.or.cz/nasm/test/pinsr64.asm +68 -0
  400. data/vendor/repo.or.cz/nasm/test/popcnt.asm +32 -0
  401. data/vendor/repo.or.cz/nasm/test/ppindirect.asm +42 -0
  402. data/vendor/repo.or.cz/nasm/test/pragma.asm +12 -0
  403. data/vendor/repo.or.cz/nasm/test/prefix66.asm +28 -0
  404. data/vendor/repo.or.cz/nasm/test/ptr.asm +4 -0
  405. data/vendor/repo.or.cz/nasm/test/pushseg.asm +17 -0
  406. data/vendor/repo.or.cz/nasm/test/r13.asm +15 -0
  407. data/vendor/repo.or.cz/nasm/test/radix.asm +54 -0
  408. data/vendor/repo.or.cz/nasm/test/rdpid.asm +21 -0
  409. data/vendor/repo.or.cz/nasm/test/reldef.asm +57 -0
  410. data/vendor/repo.or.cz/nasm/test/relocs.asm +20 -0
  411. data/vendor/repo.or.cz/nasm/test/riprel.asm +5357 -0
  412. data/vendor/repo.or.cz/nasm/test/riprel.pl +29 -0
  413. data/vendor/repo.or.cz/nasm/test/riprel2.asm +11 -0
  414. data/vendor/repo.or.cz/nasm/test/sha-64.asm +30 -0
  415. data/vendor/repo.or.cz/nasm/test/sha.asm +31 -0
  416. data/vendor/repo.or.cz/nasm/test/smartalign16.asm +36 -0
  417. data/vendor/repo.or.cz/nasm/test/smartalign32.asm +36 -0
  418. data/vendor/repo.or.cz/nasm/test/smartalign64.asm +36 -0
  419. data/vendor/repo.or.cz/nasm/test/splitea.asm +11 -0
  420. data/vendor/repo.or.cz/nasm/test/sreg.asm +65 -0
  421. data/vendor/repo.or.cz/nasm/test/strlen.asm +5 -0
  422. data/vendor/repo.or.cz/nasm/test/struc.asm +33 -0
  423. data/vendor/repo.or.cz/nasm/test/test67.asm +38 -0
  424. data/vendor/repo.or.cz/nasm/test/testdos.asm +13 -0
  425. data/vendor/repo.or.cz/nasm/test/testnos3.asm +973 -0
  426. data/vendor/repo.or.cz/nasm/test/time.asm +11 -0
  427. data/vendor/repo.or.cz/nasm/test/times.asm +21 -0
  428. data/vendor/repo.or.cz/nasm/test/timesneg.asm +3 -0
  429. data/vendor/repo.or.cz/nasm/test/tmap.nas +1447 -0
  430. data/vendor/repo.or.cz/nasm/test/uscore.asm +15 -0
  431. data/vendor/repo.or.cz/nasm/test/utf.asm +82 -0
  432. data/vendor/repo.or.cz/nasm/test/vaesenc.asm +22 -0
  433. data/vendor/repo.or.cz/nasm/test/vex.asm +9 -0
  434. data/vendor/repo.or.cz/nasm/test/vgather.asm +76 -0
  435. data/vendor/repo.or.cz/nasm/test/vmread.asm +26 -0
  436. data/vendor/repo.or.cz/nasm/test/weirdpaste.asm +29 -0
  437. data/vendor/repo.or.cz/nasm/test/xchg.asm +96 -0
  438. data/vendor/repo.or.cz/nasm/test/xcrypt.asm +24 -0
  439. data/vendor/repo.or.cz/nasm/test/xmm0.asm +12 -0
  440. data/vendor/repo.or.cz/nasm/test/zerobyte.asm +22 -0
  441. data/vendor/repo.or.cz/nasm/tools/cleanfile +176 -0
  442. data/vendor/repo.or.cz/nasm/tools/cleanpatch +258 -0
  443. data/vendor/repo.or.cz/nasm/tools/mkdep.pl +261 -0
  444. data/vendor/repo.or.cz/nasm/tools/release +105 -0
  445. data/vendor/repo.or.cz/nasm/tools/syncfiles.pl +137 -0
  446. data/vendor/repo.or.cz/nasm/tools/tag-release +58 -0
  447. data/vendor/repo.or.cz/nasm/version +1 -0
  448. data/vendor/repo.or.cz/nasm/version.pl +189 -0
  449. data/vendor/repo.or.cz/nasm/x86/disp8.c +131 -0
  450. data/vendor/repo.or.cz/nasm/x86/insns-iflags.ph +280 -0
  451. data/vendor/repo.or.cz/nasm/x86/insns.dat +5371 -0
  452. data/vendor/repo.or.cz/nasm/x86/insns.pl +1043 -0
  453. data/vendor/repo.or.cz/nasm/x86/regs.dat +138 -0
  454. data/vendor/repo.or.cz/nasm/x86/regs.pl +204 -0
  455. metadata +520 -0
@@ -0,0 +1,92 @@
1
+ ;; --------------------------------------------------------------------------
2
+ ;;
3
+ ;; Copyright 1996-2017 The NASM Authors - All Rights Reserved
4
+ ;; See the file AUTHORS included with the NASM distribution for
5
+ ;; the specific copyright holders.
6
+ ;;
7
+ ;; Redistribution and use in source and binary forms, with or without
8
+ ;; modification, are permitted provided that the following
9
+ ;; conditions are met:
10
+ ;;
11
+ ;; * Redistributions of source code must retain the above copyright
12
+ ;; notice, this list of conditions and the following disclaimer.
13
+ ;; * Redistributions in binary form must reproduce the above
14
+ ;; copyright notice, this list of conditions and the following
15
+ ;; disclaimer in the documentation and/or other materials provided
16
+ ;; with the distribution.
17
+ ;;
18
+ ;; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
19
+ ;; CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
20
+ ;; INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
21
+ ;; MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22
+ ;; DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
23
+ ;; CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24
+ ;; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25
+ ;; NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
26
+ ;; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27
+ ;; HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28
+ ;; CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29
+ ;; OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30
+ ;; EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
+ ;;
32
+ ;; --------------------------------------------------------------------------
33
+ ;;
34
+ ;; List of global NASM directives and pragma operations codes
35
+ ;;
36
+ ;; ALL directives, including backend-specific, need to be added here.
37
+ ;;
38
+ ;; %pragma operation keywords (the second word, after facility) MAY
39
+ ;; be added here too to assist in parsing, but it is not required.
40
+ ;; See the definition of struct pragma in include/nasm.h.
41
+ ;;
42
+ ;; The same keyword can be used as a directive and as a pragma
43
+ ;; operation, or as pragma operations in different namespaces. The
44
+ ;; same D_ constant will be used for both, and this is perfectly
45
+ ;; acceptable.
46
+ ;;
47
+
48
+ ; --- General configuration
49
+ #name directive
50
+ #prefix D_
51
+ #errval D_unknown
52
+ #header directiv.h
53
+
54
+ ; --- Special enum values
55
+ #special none = 0 ; Must be zero
56
+ #special unknown
57
+ #special corrupt
58
+
59
+ ; --- Global directives
60
+ absolute
61
+ bits
62
+ common
63
+ cpu
64
+ debug
65
+ default
66
+ extern
67
+ float
68
+ global
69
+ list
70
+ section
71
+ segment
72
+ warning
73
+ sectalign
74
+ pragma
75
+
76
+ ; --- Format-specific directives
77
+ export ; outcoff, outobj
78
+ group ; outobj
79
+ import ; outobj
80
+ library ; outrdf2
81
+ map ; outbin
82
+ module ; outrdf2
83
+ org ; outbin
84
+ osabi ; outelf
85
+ safeseh ; outcoff
86
+ uppercase ; outieee, outobj
87
+
88
+ ; --- Pragma operations
89
+ subsections_via_symbols ; macho
90
+ no_dead_strip ; macho
91
+ maxdump ; dbg
92
+ nodepend ; obj
@@ -0,0 +1,202 @@
1
+ /* ----------------------------------------------------------------------- *
2
+ *
3
+ * Copyright 1996-2017 The NASM Authors - All Rights Reserved
4
+ * See the file AUTHORS included with the NASM distribution for
5
+ * the specific copyright holders.
6
+ *
7
+ * Redistribution and use in source and binary forms, with or without
8
+ * modification, are permitted provided that the following
9
+ * conditions are met:
10
+ *
11
+ * * Redistributions of source code must retain the above copyright
12
+ * notice, this list of conditions and the following disclaimer.
13
+ * * Redistributions in binary form must reproduce the above
14
+ * copyright notice, this list of conditions and the following
15
+ * disclaimer in the documentation and/or other materials provided
16
+ * with the distribution.
17
+ *
18
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
19
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
20
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
21
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
23
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
26
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
+ *
32
+ * ----------------------------------------------------------------------- */
33
+
34
+ /*
35
+ * error.c - error message handling routines for the assembler
36
+ */
37
+
38
+ #include "compiler.h"
39
+
40
+ #include <stdlib.h>
41
+
42
+ #include "nasmlib.h"
43
+ #include "error.h"
44
+
45
+ /*
46
+ * Description of the suppressible warnings for the command line and
47
+ * the [warning] directive.
48
+ */
49
+ const struct warning warnings[ERR_WARN_ALL+1] = {
50
+ {"other", "any warning not specifially mentioned below", true},
51
+ {"macro-params", "macro calls with wrong parameter count", true},
52
+ {"macro-selfref", "cyclic macro references", false},
53
+ {"macro-defaults", "macros with more default than optional parameters", true},
54
+ {"orphan-labels", "labels alone on lines without trailing `:'", true},
55
+ {"number-overflow", "numeric constant does not fit", true},
56
+ {"gnu-elf-extensions", "using 8- or 16-bit relocation in ELF32, a GNU extension", false},
57
+ {"float-overflow", "floating point overflow", true},
58
+ {"float-denorm", "floating point denormal", false},
59
+ {"float-underflow", "floating point underflow", false},
60
+ {"float-toolong", "too many digits in floating-point number", true},
61
+ {"user", "%warning directives", true},
62
+ {"lock", "lock prefix on unlockable instructions", true},
63
+ {"hle", "invalid hle prefixes", true},
64
+ {"bnd", "invalid bnd prefixes", true},
65
+ {"zext-reloc", "relocation zero-extended to match output format", true},
66
+ {"ptr", "non-NASM keyword used in other assemblers", true},
67
+ {"bad-pragma", "empty or malformed %pragma", false},
68
+ {"unknown-pragma", "unknown %pragma facility or directive", false},
69
+ {"not-my-pragma", "%pragma not applicable to this compilation", false},
70
+ {"unknown-warning", "unknown warning in -W/-w or warning directive", false},
71
+
72
+ /* THIS ENTRY MUST COME LAST */
73
+ {"all", "all possible warnings", false}
74
+ };
75
+
76
+ uint8_t warning_state[ERR_WARN_ALL];/* Current state */
77
+ uint8_t warning_state_init[ERR_WARN_ALL]; /* Command-line state, for reset */
78
+
79
+ vefunc nasm_verror; /* Global error handling function */
80
+
81
+ void nasm_error(int severity, const char *fmt, ...)
82
+ {
83
+ va_list ap;
84
+
85
+ va_start(ap, fmt);
86
+ nasm_verror(severity, fmt, ap);
87
+ va_end(ap);
88
+ }
89
+
90
+ no_return nasm_fatal(int flags, const char *fmt, ...)
91
+ {
92
+ va_list ap;
93
+
94
+ va_start(ap, fmt);
95
+ nasm_verror(flags | ERR_FATAL, fmt, ap);
96
+ abort(); /* We should never get here */
97
+ }
98
+
99
+ no_return nasm_panic(int flags, const char *fmt, ...)
100
+ {
101
+ va_list ap;
102
+
103
+ va_start(ap, fmt);
104
+ nasm_verror(flags | ERR_PANIC, fmt, ap);
105
+ abort(); /* We should never get here */
106
+ }
107
+
108
+ no_return nasm_panic_from_macro(const char *file, int line)
109
+ {
110
+ nasm_panic(ERR_NOFILE, "Internal error at %s:%d\n", file, line);
111
+ }
112
+
113
+ no_return nasm_assert_failed(const char *file, int line, const char *msg)
114
+ {
115
+ nasm_panic(0, "assertion %s failed at %s:%d", msg, file, line);
116
+ }
117
+
118
+ /*
119
+ * This is called when processing a -w or -W option, or a warning directive.
120
+ * Returns true if if the action was successful.
121
+ */
122
+ bool set_warning_status(const char *value)
123
+ {
124
+ enum warn_action { WID_OFF, WID_ON, WID_RESET };
125
+ enum warn_action action;
126
+ uint8_t mask;
127
+ int i;
128
+ bool ok = false;
129
+
130
+ value = nasm_skip_spaces(value);
131
+ switch (*value) {
132
+ case '-':
133
+ action = WID_OFF;
134
+ value++;
135
+ break;
136
+ case '+':
137
+ action = WID_ON;
138
+ value++;
139
+ break;
140
+ case '*':
141
+ action = WID_RESET;
142
+ value++;
143
+ break;
144
+ case 'N':
145
+ case 'n':
146
+ if (!nasm_strnicmp(value, "no-", 3)) {
147
+ action = WID_OFF;
148
+ value += 3;
149
+ break;
150
+ } else if (!nasm_stricmp(value, "none")) {
151
+ action = WID_OFF;
152
+ value = NULL;
153
+ break;
154
+ }
155
+ /* else fall through */
156
+ default:
157
+ action = WID_ON;
158
+ break;
159
+ }
160
+
161
+ mask = WARN_ST_ENABLED;
162
+
163
+ if (value && !nasm_strnicmp(value, "error", 5)) {
164
+ switch (value[5]) {
165
+ case '=':
166
+ mask = WARN_ST_ERROR;
167
+ value += 6;
168
+ break;
169
+ case '\0':
170
+ mask = WARN_ST_ERROR;
171
+ value = NULL;
172
+ break;
173
+ default:
174
+ /* Just an accidental prefix? */
175
+ break;
176
+ }
177
+ }
178
+
179
+ if (value && !nasm_stricmp(value, "all"))
180
+ value = NULL;
181
+
182
+ /* This is inefficient, but it shouldn't matter... */
183
+ for (i = 0; i < ERR_WARN_ALL; i++) {
184
+ if (!value || !nasm_stricmp(value, warnings[i].name)) {
185
+ ok = true; /* At least one action taken */
186
+ switch (action) {
187
+ case WID_OFF:
188
+ warning_state[i] &= ~mask;
189
+ break;
190
+ case WID_ON:
191
+ warning_state[i] |= mask;
192
+ break;
193
+ case WID_RESET:
194
+ warning_state[i] &= ~mask;
195
+ warning_state[i] |= warning_state_init[i] & mask;
196
+ break;
197
+ }
198
+ }
199
+ }
200
+
201
+ return ok;
202
+ }
@@ -0,0 +1,1014 @@
1
+ /* ----------------------------------------------------------------------- *
2
+ *
3
+ * Copyright 1996-2017 The NASM Authors - All Rights Reserved
4
+ * See the file AUTHORS included with the NASM distribution for
5
+ * the specific copyright holders.
6
+ *
7
+ * Redistribution and use in source and binary forms, with or without
8
+ * modification, are permitted provided that the following
9
+ * conditions are met:
10
+ *
11
+ * * Redistributions of source code must retain the above copyright
12
+ * notice, this list of conditions and the following disclaimer.
13
+ * * Redistributions in binary form must reproduce the above
14
+ * copyright notice, this list of conditions and the following
15
+ * disclaimer in the documentation and/or other materials provided
16
+ * with the distribution.
17
+ *
18
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
19
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
20
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
21
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
23
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
26
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
+ *
32
+ * ----------------------------------------------------------------------- */
33
+
34
+ /*
35
+ * eval.c expression evaluator for the Netwide Assembler
36
+ */
37
+
38
+ #include "compiler.h"
39
+
40
+ #include <stdio.h>
41
+ #include <stdlib.h>
42
+ #include <stddef.h>
43
+ #include <string.h>
44
+ #include <ctype.h>
45
+
46
+ #include "nasm.h"
47
+ #include "nasmlib.h"
48
+ #include "error.h"
49
+ #include "eval.h"
50
+ #include "labels.h"
51
+ #include "float.h"
52
+ #include "assemble.h"
53
+
54
+ #define TEMPEXPRS_DELTA 128
55
+ #define TEMPEXPR_DELTA 8
56
+
57
+ static scanner scan; /* Address of scanner routine */
58
+
59
+ static expr **tempexprs = NULL;
60
+ static int ntempexprs;
61
+ static int tempexprs_size = 0;
62
+
63
+ static expr *tempexpr;
64
+ static int ntempexpr;
65
+ static int tempexpr_size;
66
+
67
+ static struct tokenval *tokval; /* The current token */
68
+ static int i; /* The t_type of tokval */
69
+
70
+ static void *scpriv;
71
+ static int *opflags;
72
+
73
+ static struct eval_hints *hint;
74
+
75
+
76
+ /*
77
+ * Unimportant cleanup is done to avoid confusing people who are trying
78
+ * to debug real memory leaks
79
+ */
80
+ void eval_cleanup(void)
81
+ {
82
+ while (ntempexprs)
83
+ nasm_free(tempexprs[--ntempexprs]);
84
+ nasm_free(tempexprs);
85
+ }
86
+
87
+ /*
88
+ * Construct a temporary expression.
89
+ */
90
+ static void begintemp(void)
91
+ {
92
+ tempexpr = NULL;
93
+ tempexpr_size = ntempexpr = 0;
94
+ }
95
+
96
+ static void addtotemp(int32_t type, int64_t value)
97
+ {
98
+ while (ntempexpr >= tempexpr_size) {
99
+ tempexpr_size += TEMPEXPR_DELTA;
100
+ tempexpr = nasm_realloc(tempexpr,
101
+ tempexpr_size * sizeof(*tempexpr));
102
+ }
103
+ tempexpr[ntempexpr].type = type;
104
+ tempexpr[ntempexpr++].value = value;
105
+ }
106
+
107
+ static expr *finishtemp(void)
108
+ {
109
+ addtotemp(0L, 0L); /* terminate */
110
+ while (ntempexprs >= tempexprs_size) {
111
+ tempexprs_size += TEMPEXPRS_DELTA;
112
+ tempexprs = nasm_realloc(tempexprs,
113
+ tempexprs_size * sizeof(*tempexprs));
114
+ }
115
+ return tempexprs[ntempexprs++] = tempexpr;
116
+ }
117
+
118
+ /*
119
+ * Add two vector datatypes. We have some bizarre behaviour on far-
120
+ * absolute segment types: we preserve them during addition _only_
121
+ * if one of the segments is a truly pure scalar.
122
+ */
123
+ static expr *add_vectors(expr * p, expr * q)
124
+ {
125
+ int preserve;
126
+
127
+ preserve = is_really_simple(p) || is_really_simple(q);
128
+
129
+ begintemp();
130
+
131
+ while (p->type && q->type &&
132
+ p->type < EXPR_SEGBASE + SEG_ABS &&
133
+ q->type < EXPR_SEGBASE + SEG_ABS) {
134
+ int lasttype;
135
+
136
+ if (p->type > q->type) {
137
+ addtotemp(q->type, q->value);
138
+ lasttype = q++->type;
139
+ } else if (p->type < q->type) {
140
+ addtotemp(p->type, p->value);
141
+ lasttype = p++->type;
142
+ } else { /* *p and *q have same type */
143
+ int64_t sum = p->value + q->value;
144
+ if (sum) {
145
+ addtotemp(p->type, sum);
146
+ if (hint)
147
+ hint->type = EAH_SUMMED;
148
+ }
149
+ lasttype = p->type;
150
+ p++, q++;
151
+ }
152
+ if (lasttype == EXPR_UNKNOWN) {
153
+ return finishtemp();
154
+ }
155
+ }
156
+ while (p->type && (preserve || p->type < EXPR_SEGBASE + SEG_ABS)) {
157
+ addtotemp(p->type, p->value);
158
+ p++;
159
+ }
160
+ while (q->type && (preserve || q->type < EXPR_SEGBASE + SEG_ABS)) {
161
+ addtotemp(q->type, q->value);
162
+ q++;
163
+ }
164
+
165
+ return finishtemp();
166
+ }
167
+
168
+ /*
169
+ * Multiply a vector by a scalar. Strip far-absolute segment part
170
+ * if present.
171
+ *
172
+ * Explicit treatment of UNKNOWN is not required in this routine,
173
+ * since it will silently do the Right Thing anyway.
174
+ *
175
+ * If `affect_hints' is set, we also change the hint type to
176
+ * NOTBASE if a MAKEBASE hint points at a register being
177
+ * multiplied. This allows [eax*1+ebx] to hint EBX rather than EAX
178
+ * as the base register.
179
+ */
180
+ static expr *scalar_mult(expr * vect, int64_t scalar, int affect_hints)
181
+ {
182
+ expr *p = vect;
183
+
184
+ while (p->type && p->type < EXPR_SEGBASE + SEG_ABS) {
185
+ p->value = scalar * (p->value);
186
+ if (hint && hint->type == EAH_MAKEBASE &&
187
+ p->type == hint->base && affect_hints)
188
+ hint->type = EAH_NOTBASE;
189
+ p++;
190
+ }
191
+ p->type = 0;
192
+
193
+ return vect;
194
+ }
195
+
196
+ static expr *scalarvect(int64_t scalar)
197
+ {
198
+ begintemp();
199
+ addtotemp(EXPR_SIMPLE, scalar);
200
+ return finishtemp();
201
+ }
202
+
203
+ static expr *unknown_expr(void)
204
+ {
205
+ begintemp();
206
+ addtotemp(EXPR_UNKNOWN, 1L);
207
+ return finishtemp();
208
+ }
209
+
210
+ /*
211
+ * The SEG operator: calculate the segment part of a relocatable
212
+ * value. Return NULL, as usual, if an error occurs. Report the
213
+ * error too.
214
+ */
215
+ static expr *segment_part(expr * e)
216
+ {
217
+ int32_t seg;
218
+
219
+ if (is_unknown(e))
220
+ return unknown_expr();
221
+
222
+ if (!is_reloc(e)) {
223
+ nasm_error(ERR_NONFATAL, "cannot apply SEG to a non-relocatable value");
224
+ return NULL;
225
+ }
226
+
227
+ seg = reloc_seg(e);
228
+ if (seg == NO_SEG) {
229
+ nasm_error(ERR_NONFATAL, "cannot apply SEG to a non-relocatable value");
230
+ return NULL;
231
+ } else if (seg & SEG_ABS) {
232
+ return scalarvect(seg & ~SEG_ABS);
233
+ } else if (seg & 1) {
234
+ nasm_error(ERR_NONFATAL, "SEG applied to something which"
235
+ " is already a segment base");
236
+ return NULL;
237
+ } else {
238
+ int32_t base = ofmt->segbase(seg + 1);
239
+
240
+ begintemp();
241
+ addtotemp((base == NO_SEG ? EXPR_UNKNOWN : EXPR_SEGBASE + base),
242
+ 1L);
243
+ return finishtemp();
244
+ }
245
+ }
246
+
247
+ /*
248
+ * Recursive-descent parser. Called with a single boolean operand,
249
+ * which is true if the evaluation is critical (i.e. unresolved
250
+ * symbols are an error condition). Must update the global `i' to
251
+ * reflect the token after the parsed string. May return NULL.
252
+ *
253
+ * evaluate() should report its own errors: on return it is assumed
254
+ * that if NULL has been returned, the error has already been
255
+ * reported.
256
+ */
257
+
258
+ /*
259
+ * Grammar parsed is:
260
+ *
261
+ * expr : bexpr [ WRT expr6 ]
262
+ * bexpr : rexp0 or expr0 depending on relative-mode setting
263
+ * rexp0 : rexp1 [ {||} rexp1...]
264
+ * rexp1 : rexp2 [ {^^} rexp2...]
265
+ * rexp2 : rexp3 [ {&&} rexp3...]
266
+ * rexp3 : expr0 [ {=,==,<>,!=,<,>,<=,>=} expr0 ]
267
+ * expr0 : expr1 [ {|} expr1...]
268
+ * expr1 : expr2 [ {^} expr2...]
269
+ * expr2 : expr3 [ {&} expr3...]
270
+ * expr3 : expr4 [ {<<,>>} expr4...]
271
+ * expr4 : expr5 [ {+,-} expr5...]
272
+ * expr5 : expr6 [ {*,/,%,//,%%} expr6...]
273
+ * expr6 : { ~,+,-,IFUNC,SEG } expr6
274
+ * | (bexpr)
275
+ * | symbol
276
+ * | $
277
+ * | number
278
+ */
279
+
280
+ static expr *rexp0(int), *rexp1(int), *rexp2(int), *rexp3(int);
281
+
282
+ static expr *expr0(int), *expr1(int), *expr2(int), *expr3(int);
283
+ static expr *expr4(int), *expr5(int), *expr6(int);
284
+
285
+ static expr *(*bexpr) (int);
286
+
287
+ static expr *rexp0(int critical)
288
+ {
289
+ expr *e, *f;
290
+
291
+ e = rexp1(critical);
292
+ if (!e)
293
+ return NULL;
294
+
295
+ while (i == TOKEN_DBL_OR) {
296
+ i = scan(scpriv, tokval);
297
+ f = rexp1(critical);
298
+ if (!f)
299
+ return NULL;
300
+ if (!(is_simple(e) || is_just_unknown(e)) ||
301
+ !(is_simple(f) || is_just_unknown(f))) {
302
+ nasm_error(ERR_NONFATAL, "`|' operator may only be applied to"
303
+ " scalar values");
304
+ }
305
+
306
+ if (is_just_unknown(e) || is_just_unknown(f))
307
+ e = unknown_expr();
308
+ else
309
+ e = scalarvect((int64_t)(reloc_value(e) || reloc_value(f)));
310
+ }
311
+ return e;
312
+ }
313
+
314
+ static expr *rexp1(int critical)
315
+ {
316
+ expr *e, *f;
317
+
318
+ e = rexp2(critical);
319
+ if (!e)
320
+ return NULL;
321
+
322
+ while (i == TOKEN_DBL_XOR) {
323
+ i = scan(scpriv, tokval);
324
+ f = rexp2(critical);
325
+ if (!f)
326
+ return NULL;
327
+ if (!(is_simple(e) || is_just_unknown(e)) ||
328
+ !(is_simple(f) || is_just_unknown(f))) {
329
+ nasm_error(ERR_NONFATAL, "`^' operator may only be applied to"
330
+ " scalar values");
331
+ }
332
+
333
+ if (is_just_unknown(e) || is_just_unknown(f))
334
+ e = unknown_expr();
335
+ else
336
+ e = scalarvect((int64_t)(!reloc_value(e) ^ !reloc_value(f)));
337
+ }
338
+ return e;
339
+ }
340
+
341
+ static expr *rexp2(int critical)
342
+ {
343
+ expr *e, *f;
344
+
345
+ e = rexp3(critical);
346
+ if (!e)
347
+ return NULL;
348
+ while (i == TOKEN_DBL_AND) {
349
+ i = scan(scpriv, tokval);
350
+ f = rexp3(critical);
351
+ if (!f)
352
+ return NULL;
353
+ if (!(is_simple(e) || is_just_unknown(e)) ||
354
+ !(is_simple(f) || is_just_unknown(f))) {
355
+ nasm_error(ERR_NONFATAL, "`&' operator may only be applied to"
356
+ " scalar values");
357
+ }
358
+ if (is_just_unknown(e) || is_just_unknown(f))
359
+ e = unknown_expr();
360
+ else
361
+ e = scalarvect((int64_t)(reloc_value(e) && reloc_value(f)));
362
+ }
363
+ return e;
364
+ }
365
+
366
+ static expr *rexp3(int critical)
367
+ {
368
+ expr *e, *f;
369
+ int64_t v;
370
+
371
+ e = expr0(critical);
372
+ if (!e)
373
+ return NULL;
374
+
375
+ while (i == TOKEN_EQ || i == TOKEN_LT || i == TOKEN_GT ||
376
+ i == TOKEN_NE || i == TOKEN_LE || i == TOKEN_GE) {
377
+ int j = i;
378
+ i = scan(scpriv, tokval);
379
+ f = expr0(critical);
380
+ if (!f)
381
+ return NULL;
382
+
383
+ e = add_vectors(e, scalar_mult(f, -1L, false));
384
+
385
+ switch (j) {
386
+ case TOKEN_EQ:
387
+ case TOKEN_NE:
388
+ if (is_unknown(e))
389
+ v = -1; /* means unknown */
390
+ else if (!is_really_simple(e) || reloc_value(e) != 0)
391
+ v = (j == TOKEN_NE); /* unequal, so return true if NE */
392
+ else
393
+ v = (j == TOKEN_EQ); /* equal, so return true if EQ */
394
+ break;
395
+ default:
396
+ if (is_unknown(e))
397
+ v = -1; /* means unknown */
398
+ else if (!is_really_simple(e)) {
399
+ nasm_error(ERR_NONFATAL,
400
+ "`%s': operands differ by a non-scalar",
401
+ (j == TOKEN_LE ? "<=" : j == TOKEN_LT ? "<" : j ==
402
+ TOKEN_GE ? ">=" : ">"));
403
+ v = 0; /* must set it to _something_ */
404
+ } else {
405
+ int64_t vv = reloc_value(e);
406
+ if (vv == 0)
407
+ v = (j == TOKEN_LE || j == TOKEN_GE);
408
+ else if (vv > 0)
409
+ v = (j == TOKEN_GE || j == TOKEN_GT);
410
+ else /* vv < 0 */
411
+ v = (j == TOKEN_LE || j == TOKEN_LT);
412
+ }
413
+ break;
414
+ }
415
+
416
+ if (v == -1)
417
+ e = unknown_expr();
418
+ else
419
+ e = scalarvect(v);
420
+ }
421
+ return e;
422
+ }
423
+
424
+ static expr *expr0(int critical)
425
+ {
426
+ expr *e, *f;
427
+
428
+ e = expr1(critical);
429
+ if (!e)
430
+ return NULL;
431
+
432
+ while (i == '|') {
433
+ i = scan(scpriv, tokval);
434
+ f = expr1(critical);
435
+ if (!f)
436
+ return NULL;
437
+ if (!(is_simple(e) || is_just_unknown(e)) ||
438
+ !(is_simple(f) || is_just_unknown(f))) {
439
+ nasm_error(ERR_NONFATAL, "`|' operator may only be applied to"
440
+ " scalar values");
441
+ }
442
+ if (is_just_unknown(e) || is_just_unknown(f))
443
+ e = unknown_expr();
444
+ else
445
+ e = scalarvect(reloc_value(e) | reloc_value(f));
446
+ }
447
+ return e;
448
+ }
449
+
450
+ static expr *expr1(int critical)
451
+ {
452
+ expr *e, *f;
453
+
454
+ e = expr2(critical);
455
+ if (!e)
456
+ return NULL;
457
+
458
+ while (i == '^') {
459
+ i = scan(scpriv, tokval);
460
+ f = expr2(critical);
461
+ if (!f)
462
+ return NULL;
463
+ if (!(is_simple(e) || is_just_unknown(e)) ||
464
+ !(is_simple(f) || is_just_unknown(f))) {
465
+ nasm_error(ERR_NONFATAL, "`^' operator may only be applied to"
466
+ " scalar values");
467
+ }
468
+ if (is_just_unknown(e) || is_just_unknown(f))
469
+ e = unknown_expr();
470
+ else
471
+ e = scalarvect(reloc_value(e) ^ reloc_value(f));
472
+ }
473
+ return e;
474
+ }
475
+
476
+ static expr *expr2(int critical)
477
+ {
478
+ expr *e, *f;
479
+
480
+ e = expr3(critical);
481
+ if (!e)
482
+ return NULL;
483
+
484
+ while (i == '&') {
485
+ i = scan(scpriv, tokval);
486
+ f = expr3(critical);
487
+ if (!f)
488
+ return NULL;
489
+ if (!(is_simple(e) || is_just_unknown(e)) ||
490
+ !(is_simple(f) || is_just_unknown(f))) {
491
+ nasm_error(ERR_NONFATAL, "`&' operator may only be applied to"
492
+ " scalar values");
493
+ }
494
+ if (is_just_unknown(e) || is_just_unknown(f))
495
+ e = unknown_expr();
496
+ else
497
+ e = scalarvect(reloc_value(e) & reloc_value(f));
498
+ }
499
+ return e;
500
+ }
501
+
502
+ static expr *expr3(int critical)
503
+ {
504
+ expr *e, *f;
505
+
506
+ e = expr4(critical);
507
+ if (!e)
508
+ return NULL;
509
+
510
+ while (i == TOKEN_SHL || i == TOKEN_SHR) {
511
+ int j = i;
512
+ i = scan(scpriv, tokval);
513
+ f = expr4(critical);
514
+ if (!f)
515
+ return NULL;
516
+ if (!(is_simple(e) || is_just_unknown(e)) ||
517
+ !(is_simple(f) || is_just_unknown(f))) {
518
+ nasm_error(ERR_NONFATAL, "shift operator may only be applied to"
519
+ " scalar values");
520
+ } else if (is_just_unknown(e) || is_just_unknown(f)) {
521
+ e = unknown_expr();
522
+ } else
523
+ switch (j) {
524
+ case TOKEN_SHL:
525
+ e = scalarvect(reloc_value(e) << reloc_value(f));
526
+ break;
527
+ case TOKEN_SHR:
528
+ e = scalarvect(((uint64_t)reloc_value(e)) >>
529
+ reloc_value(f));
530
+ break;
531
+ }
532
+ }
533
+ return e;
534
+ }
535
+
536
+ static expr *expr4(int critical)
537
+ {
538
+ expr *e, *f;
539
+
540
+ e = expr5(critical);
541
+ if (!e)
542
+ return NULL;
543
+ while (i == '+' || i == '-') {
544
+ int j = i;
545
+ i = scan(scpriv, tokval);
546
+ f = expr5(critical);
547
+ if (!f)
548
+ return NULL;
549
+ switch (j) {
550
+ case '+':
551
+ e = add_vectors(e, f);
552
+ break;
553
+ case '-':
554
+ e = add_vectors(e, scalar_mult(f, -1L, false));
555
+ break;
556
+ }
557
+ }
558
+ return e;
559
+ }
560
+
561
+ static expr *expr5(int critical)
562
+ {
563
+ expr *e, *f;
564
+
565
+ e = expr6(critical);
566
+ if (!e)
567
+ return NULL;
568
+ while (i == '*' || i == '/' || i == '%' ||
569
+ i == TOKEN_SDIV || i == TOKEN_SMOD) {
570
+ int j = i;
571
+ i = scan(scpriv, tokval);
572
+ f = expr6(critical);
573
+ if (!f)
574
+ return NULL;
575
+ if (j != '*' && (!(is_simple(e) || is_just_unknown(e)) ||
576
+ !(is_simple(f) || is_just_unknown(f)))) {
577
+ nasm_error(ERR_NONFATAL, "division operator may only be applied to"
578
+ " scalar values");
579
+ return NULL;
580
+ }
581
+ if (j != '*' && !is_unknown(f) && reloc_value(f) == 0) {
582
+ nasm_error(ERR_NONFATAL, "division by zero");
583
+ return NULL;
584
+ }
585
+ switch (j) {
586
+ case '*':
587
+ if (is_simple(e))
588
+ e = scalar_mult(f, reloc_value(e), true);
589
+ else if (is_simple(f))
590
+ e = scalar_mult(e, reloc_value(f), true);
591
+ else if (is_just_unknown(e) && is_just_unknown(f))
592
+ e = unknown_expr();
593
+ else {
594
+ nasm_error(ERR_NONFATAL, "unable to multiply two "
595
+ "non-scalar objects");
596
+ return NULL;
597
+ }
598
+ break;
599
+ case '/':
600
+ if (is_just_unknown(e) || is_just_unknown(f))
601
+ e = unknown_expr();
602
+ else
603
+ e = scalarvect(((uint64_t)reloc_value(e)) /
604
+ ((uint64_t)reloc_value(f)));
605
+ break;
606
+ case '%':
607
+ if (is_just_unknown(e) || is_just_unknown(f))
608
+ e = unknown_expr();
609
+ else
610
+ e = scalarvect(((uint64_t)reloc_value(e)) %
611
+ ((uint64_t)reloc_value(f)));
612
+ break;
613
+ case TOKEN_SDIV:
614
+ if (is_just_unknown(e) || is_just_unknown(f))
615
+ e = unknown_expr();
616
+ else
617
+ e = scalarvect(((int64_t)reloc_value(e)) /
618
+ ((int64_t)reloc_value(f)));
619
+ break;
620
+ case TOKEN_SMOD:
621
+ if (is_just_unknown(e) || is_just_unknown(f))
622
+ e = unknown_expr();
623
+ else
624
+ e = scalarvect(((int64_t)reloc_value(e)) %
625
+ ((int64_t)reloc_value(f)));
626
+ break;
627
+ }
628
+ }
629
+ return e;
630
+ }
631
+
632
+ static expr *eval_floatize(enum floatize type)
633
+ {
634
+ uint8_t result[16], *p; /* Up to 128 bits */
635
+ static const struct {
636
+ int bytes, start, len;
637
+ } formats[] = {
638
+ { 1, 0, 1 }, /* FLOAT_8 */
639
+ { 2, 0, 2 }, /* FLOAT_16 */
640
+ { 4, 0, 4 }, /* FLOAT_32 */
641
+ { 8, 0, 8 }, /* FLOAT_64 */
642
+ { 10, 0, 8 }, /* FLOAT_80M */
643
+ { 10, 8, 2 }, /* FLOAT_80E */
644
+ { 16, 0, 8 }, /* FLOAT_128L */
645
+ { 16, 8, 8 }, /* FLOAT_128H */
646
+ };
647
+ int sign = 1;
648
+ int64_t val;
649
+ int j;
650
+
651
+ i = scan(scpriv, tokval);
652
+ if (i != '(') {
653
+ nasm_error(ERR_NONFATAL, "expecting `('");
654
+ return NULL;
655
+ }
656
+ i = scan(scpriv, tokval);
657
+ if (i == '-' || i == '+') {
658
+ sign = (i == '-') ? -1 : 1;
659
+ i = scan(scpriv, tokval);
660
+ }
661
+ if (i != TOKEN_FLOAT) {
662
+ nasm_error(ERR_NONFATAL, "expecting floating-point number");
663
+ return NULL;
664
+ }
665
+ if (!float_const(tokval->t_charptr, sign, result, formats[type].bytes))
666
+ return NULL;
667
+ i = scan(scpriv, tokval);
668
+ if (i != ')') {
669
+ nasm_error(ERR_NONFATAL, "expecting `)'");
670
+ return NULL;
671
+ }
672
+
673
+ p = result+formats[type].start+formats[type].len;
674
+ val = 0;
675
+ for (j = formats[type].len; j; j--) {
676
+ p--;
677
+ val = (val << 8) + *p;
678
+ }
679
+
680
+ begintemp();
681
+ addtotemp(EXPR_SIMPLE, val);
682
+
683
+ i = scan(scpriv, tokval);
684
+ return finishtemp();
685
+ }
686
+
687
+ static expr *eval_strfunc(enum strfunc type)
688
+ {
689
+ char *string;
690
+ size_t string_len;
691
+ int64_t val;
692
+ bool parens, rn_warn;
693
+
694
+ parens = false;
695
+ i = scan(scpriv, tokval);
696
+ if (i == '(') {
697
+ parens = true;
698
+ i = scan(scpriv, tokval);
699
+ }
700
+ if (i != TOKEN_STR) {
701
+ nasm_error(ERR_NONFATAL, "expecting string");
702
+ return NULL;
703
+ }
704
+ string_len = string_transform(tokval->t_charptr, tokval->t_inttwo,
705
+ &string, type);
706
+ if (string_len == (size_t)-1) {
707
+ nasm_error(ERR_NONFATAL, "invalid string for transform");
708
+ return NULL;
709
+ }
710
+
711
+ val = readstrnum(string, string_len, &rn_warn);
712
+ if (parens) {
713
+ i = scan(scpriv, tokval);
714
+ if (i != ')') {
715
+ nasm_error(ERR_NONFATAL, "expecting `)'");
716
+ return NULL;
717
+ }
718
+ }
719
+
720
+ if (rn_warn)
721
+ nasm_error(ERR_WARNING|ERR_PASS1, "character constant too long");
722
+
723
+ begintemp();
724
+ addtotemp(EXPR_SIMPLE, val);
725
+
726
+ i = scan(scpriv, tokval);
727
+ return finishtemp();
728
+ }
729
+
730
+ static int64_t eval_ifunc(int64_t val, enum ifunc func)
731
+ {
732
+ int errtype;
733
+ uint64_t uval = (uint64_t)val;
734
+ int64_t rv;
735
+
736
+ switch (func) {
737
+ case IFUNC_ILOG2E:
738
+ case IFUNC_ILOG2W:
739
+ errtype = (func == IFUNC_ILOG2E) ? ERR_NONFATAL : ERR_WARNING;
740
+
741
+ if (!is_power2(uval))
742
+ nasm_error(errtype, "ilog2 argument is not a power of two");
743
+ /* fall through */
744
+ case IFUNC_ILOG2F:
745
+ rv = ilog2_64(uval);
746
+ break;
747
+
748
+ case IFUNC_ILOG2C:
749
+ rv = (uval < 2) ? 0 : ilog2_64(uval-1) + 1;
750
+ break;
751
+
752
+ default:
753
+ nasm_panic(0, "invalid IFUNC token %d", func);
754
+ rv = 0;
755
+ break;
756
+ }
757
+
758
+ return rv;
759
+ }
760
+
761
+ static expr *expr6(int critical)
762
+ {
763
+ int32_t type;
764
+ expr *e;
765
+ int32_t label_seg;
766
+ int64_t label_ofs;
767
+ int64_t tmpval;
768
+ bool rn_warn;
769
+ char *scope;
770
+
771
+ switch (i) {
772
+ case '-':
773
+ i = scan(scpriv, tokval);
774
+ e = expr6(critical);
775
+ if (!e)
776
+ return NULL;
777
+ return scalar_mult(e, -1L, false);
778
+
779
+ case '+':
780
+ i = scan(scpriv, tokval);
781
+ return expr6(critical);
782
+
783
+ case '~':
784
+ i = scan(scpriv, tokval);
785
+ e = expr6(critical);
786
+ if (!e)
787
+ return NULL;
788
+ if (is_just_unknown(e))
789
+ return unknown_expr();
790
+ else if (!is_simple(e)) {
791
+ nasm_error(ERR_NONFATAL, "`~' operator may only be applied to"
792
+ " scalar values");
793
+ return NULL;
794
+ }
795
+ return scalarvect(~reloc_value(e));
796
+
797
+ case '!':
798
+ i = scan(scpriv, tokval);
799
+ e = expr6(critical);
800
+ if (!e)
801
+ return NULL;
802
+ if (is_just_unknown(e))
803
+ return unknown_expr();
804
+ else if (!is_simple(e)) {
805
+ nasm_error(ERR_NONFATAL, "`!' operator may only be applied to"
806
+ " scalar values");
807
+ return NULL;
808
+ }
809
+ return scalarvect(!reloc_value(e));
810
+
811
+ case TOKEN_IFUNC:
812
+ {
813
+ enum ifunc func = tokval->t_integer;
814
+ i = scan(scpriv, tokval);
815
+ e = expr6(critical);
816
+ if (!e)
817
+ return NULL;
818
+ if (is_just_unknown(e))
819
+ return unknown_expr();
820
+ else if (!is_simple(e)) {
821
+ nasm_error(ERR_NONFATAL, "function may only be applied to"
822
+ " scalar values");
823
+ return NULL;
824
+ }
825
+ return scalarvect(eval_ifunc(reloc_value(e), func));
826
+ }
827
+
828
+ case TOKEN_SEG:
829
+ i = scan(scpriv, tokval);
830
+ e = expr6(critical);
831
+ if (!e)
832
+ return NULL;
833
+ e = segment_part(e);
834
+ if (!e)
835
+ return NULL;
836
+ if (is_unknown(e) && critical) {
837
+ nasm_error(ERR_NONFATAL, "unable to determine segment base");
838
+ return NULL;
839
+ }
840
+ return e;
841
+
842
+ case TOKEN_FLOATIZE:
843
+ return eval_floatize(tokval->t_integer);
844
+
845
+ case TOKEN_STRFUNC:
846
+ return eval_strfunc(tokval->t_integer);
847
+
848
+ case '(':
849
+ i = scan(scpriv, tokval);
850
+ e = bexpr(critical);
851
+ if (!e)
852
+ return NULL;
853
+ if (i != ')') {
854
+ nasm_error(ERR_NONFATAL, "expecting `)'");
855
+ return NULL;
856
+ }
857
+ i = scan(scpriv, tokval);
858
+ return e;
859
+
860
+ case TOKEN_NUM:
861
+ case TOKEN_STR:
862
+ case TOKEN_REG:
863
+ case TOKEN_ID:
864
+ case TOKEN_INSN: /* Opcodes that occur here are really labels */
865
+ case TOKEN_HERE:
866
+ case TOKEN_BASE:
867
+ case TOKEN_DECORATOR:
868
+ begintemp();
869
+ switch (i) {
870
+ case TOKEN_NUM:
871
+ addtotemp(EXPR_SIMPLE, tokval->t_integer);
872
+ break;
873
+ case TOKEN_STR:
874
+ tmpval = readstrnum(tokval->t_charptr, tokval->t_inttwo, &rn_warn);
875
+ if (rn_warn)
876
+ nasm_error(ERR_WARNING|ERR_PASS1, "character constant too long");
877
+ addtotemp(EXPR_SIMPLE, tmpval);
878
+ break;
879
+ case TOKEN_REG:
880
+ addtotemp(tokval->t_integer, 1L);
881
+ if (hint && hint->type == EAH_NOHINT)
882
+ hint->base = tokval->t_integer, hint->type = EAH_MAKEBASE;
883
+ break;
884
+ case TOKEN_ID:
885
+ case TOKEN_INSN:
886
+ case TOKEN_HERE:
887
+ case TOKEN_BASE:
888
+ /*
889
+ * If !location.known, this indicates that no
890
+ * symbol, Here or Base references are valid because we
891
+ * are in preprocess-only mode.
892
+ */
893
+ if (!location.known) {
894
+ nasm_error(ERR_NONFATAL,
895
+ "%s not supported in preprocess-only mode",
896
+ (i == TOKEN_HERE ? "`$'" :
897
+ i == TOKEN_BASE ? "`$$'" :
898
+ "symbol references"));
899
+ addtotemp(EXPR_UNKNOWN, 1L);
900
+ break;
901
+ }
902
+
903
+ type = EXPR_SIMPLE; /* might get overridden by UNKNOWN */
904
+ if (i == TOKEN_BASE) {
905
+ label_seg = in_absolute ? absolute.segment : location.segment;
906
+ label_ofs = 0;
907
+ } else if (i == TOKEN_HERE) {
908
+ label_seg = in_absolute ? absolute.segment : location.segment;
909
+ label_ofs = in_absolute ? absolute.offset : location.offset;
910
+ } else {
911
+ if (!lookup_label(tokval->t_charptr, &label_seg, &label_ofs)) {
912
+ scope = local_scope(tokval->t_charptr);
913
+ if (critical == 2) {
914
+ nasm_error(ERR_NONFATAL, "symbol `%s%s' undefined",
915
+ scope,tokval->t_charptr);
916
+ return NULL;
917
+ } else if (critical == 1) {
918
+ nasm_error(ERR_NONFATAL,
919
+ "symbol `%s%s' not defined before use",
920
+ scope,tokval->t_charptr);
921
+ return NULL;
922
+ } else {
923
+ if (opflags)
924
+ *opflags |= OPFLAG_FORWARD;
925
+ type = EXPR_UNKNOWN;
926
+ label_seg = NO_SEG;
927
+ label_ofs = 1;
928
+ }
929
+ }
930
+ if (opflags && is_extern(tokval->t_charptr))
931
+ *opflags |= OPFLAG_EXTERN;
932
+ }
933
+ addtotemp(type, label_ofs);
934
+ if (label_seg != NO_SEG)
935
+ addtotemp(EXPR_SEGBASE + label_seg, 1L);
936
+ break;
937
+ case TOKEN_DECORATOR:
938
+ addtotemp(EXPR_RDSAE, tokval->t_integer);
939
+ break;
940
+ }
941
+ i = scan(scpriv, tokval);
942
+ return finishtemp();
943
+
944
+ default:
945
+ nasm_error(ERR_NONFATAL, "expression syntax error");
946
+ return NULL;
947
+ }
948
+ }
949
+
950
+ expr *evaluate(scanner sc, void *scprivate, struct tokenval *tv,
951
+ int *fwref, int critical, struct eval_hints *hints)
952
+ {
953
+ expr *e;
954
+ expr *f = NULL;
955
+
956
+ hint = hints;
957
+ if (hint)
958
+ hint->type = EAH_NOHINT;
959
+
960
+ if (critical & CRITICAL) {
961
+ critical &= ~CRITICAL;
962
+ bexpr = rexp0;
963
+ } else
964
+ bexpr = expr0;
965
+
966
+ scan = sc;
967
+ scpriv = scprivate;
968
+ tokval = tv;
969
+ opflags = fwref;
970
+
971
+ if (tokval->t_type == TOKEN_INVALID)
972
+ i = scan(scpriv, tokval);
973
+ else
974
+ i = tokval->t_type;
975
+
976
+ while (ntempexprs) /* initialize temporary storage */
977
+ nasm_free(tempexprs[--ntempexprs]);
978
+
979
+ e = bexpr(critical);
980
+ if (!e)
981
+ return NULL;
982
+
983
+ if (i == TOKEN_WRT) {
984
+ i = scan(scpriv, tokval); /* eat the WRT */
985
+ f = expr6(critical);
986
+ if (!f)
987
+ return NULL;
988
+ }
989
+ e = scalar_mult(e, 1L, false); /* strip far-absolute segment part */
990
+ if (f) {
991
+ expr *g;
992
+ if (is_just_unknown(f))
993
+ g = unknown_expr();
994
+ else {
995
+ int64_t value;
996
+ begintemp();
997
+ if (!is_reloc(f)) {
998
+ nasm_error(ERR_NONFATAL, "invalid right-hand operand to WRT");
999
+ return NULL;
1000
+ }
1001
+ value = reloc_seg(f);
1002
+ if (value == NO_SEG)
1003
+ value = reloc_value(f) | SEG_ABS;
1004
+ else if (!(value & SEG_ABS) && !(value % 2) && critical) {
1005
+ nasm_error(ERR_NONFATAL, "invalid right-hand operand to WRT");
1006
+ return NULL;
1007
+ }
1008
+ addtotemp(EXPR_WRT, value);
1009
+ g = finishtemp();
1010
+ }
1011
+ e = add_vectors(e, g);
1012
+ }
1013
+ return e;
1014
+ }