Files
nudt-compiler-cpp/scripts/gen_ir.sh
2025-12-29 22:15:03 +08:00

76 lines
1.7 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env bash
#./scripts/gen_ir.sh test/test_case/simple_add.sy --run
set -euo pipefail
if [[ $# -lt 1 || $# -gt 3 ]]; then
echo "用法: $0 <input.sy> [output_dir] [--run]" >&2
exit 1
fi
input=$1
out_dir="out/ir"
run_exec=false
shift
while [[ $# -gt 0 ]]; do
case "$1" in
--run)
run_exec=true
;;
*)
out_dir="$1"
;;
esac
shift
done
if [[ ! -f "$input" ]]; then
echo "输入文件不存在: $input" >&2
exit 1
fi
compiler="./build/bin/compiler"
if [[ ! -x "$compiler" ]]; then
echo "未找到编译器: $compiler ,请先构建(如: mkdir -p build && cd build && cmake .. && make -j" >&2
exit 1
fi
mkdir -p "$out_dir"
base=$(basename "$input")
stem=${base%.sy}
out_file="$out_dir/$stem.ll"
"$compiler" "$input" > "$out_file"
echo "IR 已生成: $out_file"
# 为 LLVM 使用准备纯净 IR去掉可能的 AST 调试输出),写入同目录。
pure_file="$out_dir/$stem.ir.ll"
awk '/^define /{p=1} p' "$out_file" > "$pure_file"
if [[ ! -s "$pure_file" ]]; then
echo "警告: 未找到 IR 定义(文件可能只包含 AST 输出),未生成 $pure_file" >&2
else
echo "纯净 IR 已生成: $pure_file"
fi
if [[ "$run_exec" == true ]]; then
if ! command -v llc >/dev/null 2>&1; then
echo "未找到 llc无法运行 IR。请安装 LLVM。" >&2
exit 1
fi
if ! command -v clang >/dev/null 2>&1; then
echo "未找到 clang无法链接可执行文件。请安装 LLVM/Clang。" >&2
exit 1
fi
obj="$out_dir/$stem.o"
exe="$out_dir/$stem.exe"
llc -filetype=obj "$pure_file" -o "$obj"
clang "$obj" -o "$exe"
echo "运行 $exe ..."
set +e
"$exe"
status=$?
set -e
echo "退出码: $status"
fi