Skip to content

Commit 0e45c24

Browse files
committed
[mlir] Add --force-mlir flag in soltest and a semantic test runner
1 parent 87acaa7 commit 0e45c24

File tree

4 files changed

+127
-1
lines changed

4 files changed

+127
-1
lines changed

test/Common.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,8 @@ void CommonOptions::addOptions()
124124
("enforce-gas-cost-min-value", po::value(&enforceGasTestMinValue)->default_value(enforceGasTestMinValue), "Threshold value to enforce adding gas checks to a test.")
125125
("abiencoderv1", po::bool_switch(&useABIEncoderV1)->default_value(useABIEncoderV1), "enables abi encoder v1")
126126
("show-messages", po::bool_switch(&showMessages)->default_value(showMessages), "enables message output")
127-
("show-metadata", po::bool_switch(&showMetadata)->default_value(showMetadata), "enables metadata output");
127+
("show-metadata", po::bool_switch(&showMetadata)->default_value(showMetadata), "enables metadata output")
128+
("force-mlir", po::bool_switch(&forceMlir)->default_value(forceMlir), "force compilation via MLIR regardless of test metadata");
128129
}
129130

130131
void CommonOptions::validate() const

test/Common.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ struct CommonOptions
6666
bool useABIEncoderV1 = false;
6767
bool showMessages = false;
6868
bool showMetadata = false;
69+
bool forceMlir = false;
6970
size_t batches = 1;
7071
size_t selectedBatch = 0;
7172

test/libsolidity/SemanticTest.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,13 @@ SemanticTest::SemanticTest(
112112
if (m_testCaseWantsMlirRun)
113113
m_testCaseWantsYulRun = m_testCaseWantsLegacyRun = false;
114114

115+
if (solidity::test::CommonOptions::get().forceMlir)
116+
{
117+
m_testCaseWantsMlirRun = true;
118+
m_testCaseWantsYulRun = false;
119+
m_testCaseWantsLegacyRun = false;
120+
}
121+
115122
auto revertStrings = revertStringsFromString(m_reader.stringSetting("revertStrings", "default"));
116123
soltestAssert(revertStrings, "Invalid revertStrings setting.");
117124
m_revertStrings = revertStrings.value();

test/mlirSemtests.sh

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
#!/bin/bash
2+
# Run each semantic test via MLIR in its own soltest process, in parallel.
3+
#
4+
# Requires: GNU parallel (https://www.gnu.org/software/parallel/)
5+
# Linux: apt install parallel / pacman -S parallel
6+
# macOS: brew install parallel
7+
#
8+
# Usage: ./mlirSemtests.sh --soltest <path> --testpath <path> --vm <path> [filter]
9+
# Examples:
10+
# ./mlirSemtests.sh --soltest build/dbg/test/soltest --testpath test --vm /path/to/libevmone.so
11+
# ./mlirSemtests.sh --soltest build/dbg/test/soltest --testpath test --vm /path/to/libevmone.so enums
12+
# ./mlirSemtests.sh --soltest build/dbg/test/soltest --testpath test --vm /path/to/libevmone.so enums/minmax
13+
14+
set -u
15+
16+
SOLTEST=""
17+
TESTPATH=""
18+
VM=""
19+
FILTER=""
20+
OUTDIR=$(mktemp -d -t mlir-semtest-XXXXXX)
21+
JOBLOG=$(mktemp -t mlir-semtest-XXXXXX)
22+
23+
while [[ $# -gt 0 ]]; do
24+
case "$1" in
25+
--soltest) SOLTEST="$2"; shift 2 ;;
26+
--testpath) TESTPATH="$2"; shift 2 ;;
27+
--vm) VM="$2"; shift 2 ;;
28+
-*) echo "Unknown option: $1"; exit 1 ;;
29+
*) FILTER="$1"; shift ;;
30+
esac
31+
done
32+
33+
if [[ -z "$SOLTEST" || -z "$TESTPATH" || -z "$VM" ]]; then
34+
echo "Usage: $0 --soltest <path> --testpath <path> --vm <path> [filter]"
35+
exit 1
36+
fi
37+
38+
SEMTEST_DIR="$TESTPATH/libsolidity/semanticTests"
39+
40+
collect_tests() {
41+
local target="$SEMTEST_DIR/$FILTER"
42+
if [[ -n "$FILTER" && -f "$target" ]]; then
43+
echo "semanticTests/${FILTER%.sol}"
44+
elif [[ -z "$FILTER" || -d "$target" ]]; then
45+
find "${target:-$SEMTEST_DIR}" -name '*.sol' | sort | \
46+
sed "s|^$TESTPATH/libsolidity/||; s|\.sol$||"
47+
else
48+
echo "Not a file or directory: $target" >&2
49+
exit 1
50+
fi
51+
}
52+
53+
tests=()
54+
while IFS= read -r line; do
55+
tests+=("$line")
56+
done < <(collect_tests)
57+
total=${#tests[@]}
58+
59+
if [[ $total -eq 0 ]]; then
60+
echo "No tests found for filter: $FILTER"
61+
exit 1
62+
fi
63+
64+
trap 'rm -rf "$OUTDIR" "$JOBLOG"' EXIT
65+
66+
echo "Running $total tests in parallel..."
67+
68+
run_one_test() {
69+
"$SOLTEST" --catch_system_errors=no --log_level=error --report_level=no \
70+
-t "$1" \
71+
-- --testpath "$TESTPATH" --vm "$VM" --force-mlir
72+
}
73+
export -f run_one_test
74+
export SOLTEST TESTPATH VM
75+
76+
printf '%s\n' "${tests[@]}" | \
77+
parallel --joblog "$JOBLOG" --results "$OUTDIR" \
78+
run_one_test {}
79+
80+
pass=$(tail -n+2 "$JOBLOG" | awk -F'\t' '$7==0 && $8==0' | wc -l)
81+
abort=$(tail -n+2 "$JOBLOG" | awk -F'\t' '$8!=0' | wc -l)
82+
fail=$(tail -n+2 "$JOBLOG" | awk -F'\t' '$7!=0 && $8==0' | wc -l)
83+
84+
echo ""
85+
echo "=========================================="
86+
echo "Results: $total tests"
87+
echo "=========================================="
88+
echo " Pass: $pass"
89+
echo " Fail: $fail"
90+
echo " Abort: $abort"
91+
echo ""
92+
echo ""
93+
94+
# Write failures report
95+
REPORT="semtest-failures.txt"
96+
: > "$REPORT"
97+
98+
failures=$((fail + abort))
99+
if [[ $failures -gt 0 ]]; then
100+
tail -n+2 "$JOBLOG" | awk -F'\t' '$7!=0 || $8!=0 {print $NF}' | while read -r cmd; do
101+
test_name="${cmd##*run_one_test }"
102+
encoded=$(echo "$test_name" | sed 's|/|+z|g')
103+
stderr_file="$OUTDIR/1/$encoded/stderr"
104+
105+
stdout_file="$OUTDIR/1/$encoded/stdout"
106+
107+
echo "=== $test_name ==="
108+
if [[ -s "$stderr_file" ]]; then
109+
cat "$stderr_file"
110+
elif [[ -s "$stdout_file" ]]; then
111+
cat "$stdout_file"
112+
fi
113+
echo ""
114+
done > "$REPORT"
115+
116+
echo "Failures: $REPORT"
117+
fi

0 commit comments

Comments
 (0)