Skip to content

Commit cb1673b

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

File tree

4 files changed

+123
-1
lines changed

4 files changed

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

0 commit comments

Comments
 (0)