@@ -44,6 +44,7 @@ Options:
44
44
"hidden"
45
45
--profile-matching Instrument interpeter to emit a profile of time spent in
46
46
top-level rule matching on stderr.
47
+ --verify-ir Verify result of IR generation.
47
48
-O[0123] Set the optimization level for code generation.
48
49
49
50
Any option not listed above will be passed through to clang; use '--' to
@@ -89,6 +90,7 @@ llvm_major_version () {
89
90
positional_args=()
90
91
reading_clang_args=false
91
92
codegen_flags=()
93
+ codegen_verify_flags=()
92
94
if [[ -z " ${NIX_LLVM_KOMPILE_LIBS} " ]]; then
93
95
kompile_clang_flags=()
94
96
else
@@ -105,6 +107,7 @@ embedded_files=()
105
107
embedded_names=()
106
108
use_opt=false
107
109
emit_ir=false
110
+ verify_ir=false
108
111
frame_pointer=false
109
112
110
113
export verbose=false
@@ -175,23 +178,32 @@ while [[ $# -gt 0 ]]; do
175
178
;;
176
179
--proof-hint-instrumentation)
177
180
codegen_flags+=(" --proof-hint-instrumentation" )
181
+ codegen_verify_flags+=(" --proof-hint-instrumentation" )
178
182
shift
179
183
;;
180
184
--proof-hint-instrumentation-slow)
181
185
codegen_flags+=(" --proof-hint-instrumentation-slow" )
186
+ codegen_verify_flags+=(" --proof-hint-instrumentation-slow" )
182
187
shift
183
188
;;
184
189
--mutable-bytes)
185
190
codegen_flags+=(" --mutable-bytes" )
191
+ codegen_verify_flags+=(" --mutable-bytes" )
186
192
shift
187
193
;;
188
194
--hidden-visibility)
189
195
codegen_flags+=(" --hidden-visibility" )
196
+ codegen_verify_flags+=(" --hidden-visibility" )
190
197
kompile_clang_flags+=(" --hidden-visibility" )
191
198
shift
192
199
;;
193
200
--profile-matching)
194
201
codegen_flags+=(" --profile-matching" )
202
+ codegen_verify_flags+=(" --profile-matching" )
203
+ shift
204
+ ;;
205
+ --verify-ir)
206
+ verify_ir=true
195
207
shift
196
208
;;
197
209
-O* )
@@ -236,17 +248,19 @@ if [[ "$emit_ir" == "false" ]]; then
236
248
codegen_flags+=(" --emit-object" )
237
249
if [[ " $frame_pointer " == " true" ]]; then
238
250
codegen_flags+=(" -fno-omit-frame-pointer" )
251
+ codegen_verify_flags+=(" -fno-omit-frame-pointer" )
239
252
fi
240
253
else
241
254
codegen_flags+=(" --binary-ir" )
242
255
fi
243
256
244
257
mod=" $( mktemp tmp.XXXXXXXXXX) "
258
+ modtmp=" $( mktemp tmp.XXXXXXXXXX) "
245
259
modopt_tmp=" $( mktemp tmp.XXXXXXXXXX) "
246
260
tmpdir=" $( mktemp -d tmp.XXXXXXXXXX) "
247
261
modopt=" $modopt_tmp "
248
262
if [ " $save_temps " = false ]; then
249
- trap ' rm -rf "$mod" "$modopt_tmp" "$tmpdir"' INT TERM EXIT
263
+ trap ' rm -rf "$mod" "$modtmp" "$ modopt_tmp" "$tmpdir"' INT TERM EXIT
250
264
fi
251
265
252
266
definition=" ${positional_args[0]} "
@@ -271,19 +285,27 @@ if [[ "$compile" = "default" ]]; then
271
285
# flag.
272
286
if [[ " $main " = " c" ]] || [[ " $main " = " python" ]]; then
273
287
codegen_flags+=(" --safe-partial" )
288
+ codegen_verify_flags+=(" --safe-partial" )
274
289
fi
275
290
276
291
for arg in " ${clang_args[@]} " ; do
277
292
case " $arg " in
278
293
-g)
279
294
codegen_flags+=(" --debug" )
295
+ codegen_verify_flags+=(" --debug" )
280
296
;;
281
297
esac
282
298
done
283
299
284
300
run " $( dirname " $0 " ) " /llvm-kompile-codegen " ${codegen_flags[@]} " \
285
301
" $definition " " $dt_dir " /dt.yaml " $dt_dir " -o " $mod "
286
302
303
+ if [[ " $verify_ir " == " true" ]]; then
304
+ run " $( dirname " $0 " ) " /llvm-kompile-codegen " ${codegen_verify_flags[@]} " \
305
+ " $definition " " $dt_dir " /dt.yaml " $dt_dir " -o " $modtmp " --no-optimize
306
+ run @OPT@ -passes=verify " $modtmp " -o /dev/null
307
+ fi
308
+
287
309
if [[ " $use_opt " = " true" ]]; then
288
310
if [ " $( llvm_major_version) " -ge " 16" ]; then
289
311
run @OPT@ -passes=' mem2reg,tailcallelim' " $mod " -o " $modopt "
0 commit comments