mirror of https://github.com/icedland/iced.git
442 lines
16 KiB
YAML
442 lines
16 KiB
YAML
name: GitHub CI
|
|
on:
|
|
push:
|
|
paths:
|
|
- '.github/workflows/**'
|
|
- 'src/**'
|
|
- '!**/*.md'
|
|
branches:
|
|
- master
|
|
release:
|
|
types: released
|
|
|
|
jobs:
|
|
build-csharp-windows:
|
|
name: C# (${{ matrix.os }})
|
|
runs-on: ${{ matrix.os }}
|
|
strategy:
|
|
matrix:
|
|
os: [windows-latest]
|
|
|
|
steps:
|
|
- uses: actions/checkout@v1
|
|
|
|
- name: Run generator, verify no diff
|
|
shell: pwsh
|
|
run: |
|
|
dotnet run -c Release -p src/csharp/Intel/Generator/Generator.csproj
|
|
if ($LASTEXITCODE) { exit $LASTEXITCODE }
|
|
git diff --exit-code
|
|
if ($LASTEXITCODE) { exit $LASTEXITCODE }
|
|
|
|
- name: Build one feature at a time
|
|
shell: pwsh
|
|
run: |
|
|
foreach ($def in
|
|
"DECODER",
|
|
"ENCODER",
|
|
"ENCODER;BLOCK_ENCODER",
|
|
"ENCODER;BLOCK_ENCODER;CODE_ASSEMBLER",
|
|
"ENCODER;OPCODE_INFO",
|
|
"INSTR_INFO",
|
|
"GAS",
|
|
"INTEL",
|
|
"MASM",
|
|
"NASM",
|
|
"DECODER;ENCODER;BLOCK_ENCODER;OPCODE_INFO;INSTR_INFO;GAS;INTEL;MASM;NASM;NO_VEX",
|
|
"DECODER;ENCODER;BLOCK_ENCODER;OPCODE_INFO;INSTR_INFO;GAS;INTEL;MASM;NASM;NO_EVEX",
|
|
"DECODER;ENCODER;BLOCK_ENCODER;OPCODE_INFO;INSTR_INFO;GAS;INTEL;MASM;NASM;NO_XOP",
|
|
"DECODER;ENCODER;BLOCK_ENCODER;OPCODE_INFO;INSTR_INFO;GAS;INTEL;MASM;NASM;NO_D3NOW",
|
|
"DECODER;ENCODER;BLOCK_ENCODER;OPCODE_INFO;INSTR_INFO;GAS;INTEL;MASM;NASM;NO_VEX;NO_EVEX;NO_XOP;NO_D3NOW"
|
|
) {
|
|
git clean -xdf
|
|
if ($LASTEXITCODE) { exit $LASTEXITCODE }
|
|
$env:IcedFeatureFlags=$def
|
|
dotnet build -v:m -c Release src/csharp/Intel/Iced/Iced.csproj
|
|
if ($LASTEXITCODE) { exit $LASTEXITCODE }
|
|
}
|
|
foreach ($def in
|
|
"DECODER",
|
|
"DECODER;ENCODER",
|
|
"DECODER;ENCODER;BLOCK_ENCODER",
|
|
"DECODER;ENCODER;BLOCK_ENCODER;CODE_ASSEMBLER",
|
|
"DECODER;ENCODER;OPCODE_INFO",
|
|
"DECODER;INSTR_INFO",
|
|
"DECODER;GAS",
|
|
"DECODER;INTEL",
|
|
"DECODER;MASM",
|
|
"DECODER;NASM",
|
|
"DECODER;ENCODER;BLOCK_ENCODER;OPCODE_INFO;INSTR_INFO;GAS;INTEL;MASM;NASM;NO_VEX",
|
|
"DECODER;ENCODER;BLOCK_ENCODER;OPCODE_INFO;INSTR_INFO;GAS;INTEL;MASM;NASM;NO_EVEX",
|
|
"DECODER;ENCODER;BLOCK_ENCODER;OPCODE_INFO;INSTR_INFO;GAS;INTEL;MASM;NASM;NO_XOP",
|
|
"DECODER;ENCODER;BLOCK_ENCODER;OPCODE_INFO;INSTR_INFO;GAS;INTEL;MASM;NASM;NO_D3NOW",
|
|
"DECODER;ENCODER;BLOCK_ENCODER;OPCODE_INFO;INSTR_INFO;GAS;INTEL;MASM;NASM;NO_VEX;NO_EVEX;NO_XOP;NO_D3NOW"
|
|
) {
|
|
git clean -xdf
|
|
if ($LASTEXITCODE) { exit $LASTEXITCODE }
|
|
$env:IcedFeatureFlags=$def
|
|
dotnet build -v:m -c Release src/csharp/Intel/Iced.UnitTests/Iced.UnitTests.csproj
|
|
if ($LASTEXITCODE) { exit $LASTEXITCODE }
|
|
}
|
|
git clean -xdf
|
|
|
|
- name: Build, test
|
|
shell: pwsh
|
|
run: |
|
|
./build.ps1
|
|
|
|
- name: upload-artifact doesn't support wildcards
|
|
if: github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags/')
|
|
shell: pwsh
|
|
run: |
|
|
New-Item -ItemType Directory nuget_files > $null
|
|
Copy-Item src/csharp/Intel/Iced/bin/Release/*.*nupkg nuget_files
|
|
|
|
- uses: actions/upload-artifact@v1
|
|
if: github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags/')
|
|
with:
|
|
name: nupkg
|
|
path: nuget_files
|
|
|
|
- uses: actions/upload-artifact@v1
|
|
if: github.ref == 'refs/heads/master'
|
|
with:
|
|
name: coverage.info
|
|
path: src/csharp/Intel/Iced.UnitTests/coverage.netcoreapp3.1.info
|
|
|
|
- name: Upload coverage report
|
|
if: github.ref == 'refs/heads/master'
|
|
shell: bash
|
|
continue-on-error: true
|
|
run: |
|
|
curl https://codecov.io/bash -o codecov
|
|
chmod +x codecov
|
|
./codecov -f src/csharp/Intel/Iced.UnitTests/coverage.netcoreapp3.1.info
|
|
env:
|
|
CODECOV_TOKEN: ${{secrets.CODECOV_TOKEN}}
|
|
|
|
- name: Upload to nuget.org if it's a new release
|
|
if: startsWith(github.ref, 'refs/tags/')
|
|
shell: pwsh
|
|
run: |
|
|
Invoke-WebRequest -Uri https://dist.nuget.org/win-x86-commandline/latest/nuget.exe -UseBasicParsing -OutFile nuget.exe
|
|
Get-ChildItem src/csharp/Intel/Iced/bin/Release/Iced.*.nupkg | ForEach-Object { ./nuget.exe push $_.FullName -ApiKey ${{secrets.NUGET_APIKEY}} -NonInteractive -Source https://api.nuget.org/v3/index.json }
|
|
|
|
# Make sure it builds on Linux too
|
|
build-csharp:
|
|
name: C# (${{ matrix.os }})
|
|
runs-on: ${{ matrix.os }}
|
|
strategy:
|
|
matrix:
|
|
os: [ubuntu-latest]
|
|
|
|
steps:
|
|
- uses: actions/checkout@v1
|
|
|
|
- uses: actions/setup-dotnet@v1
|
|
with:
|
|
dotnet-version: '3.1.100'
|
|
|
|
- name: Build, test
|
|
shell: pwsh
|
|
run: ./build.ps1
|
|
|
|
build-rust:
|
|
name: Rust (${{ matrix.os }})
|
|
runs-on: ${{ matrix.os }}
|
|
strategy:
|
|
matrix:
|
|
os: [windows-latest, ubuntu-latest, macos-latest]
|
|
|
|
steps:
|
|
- uses: actions/checkout@v1
|
|
|
|
- name: Install rustup and rustc latest (macOS)
|
|
shell: bash
|
|
if: startsWith(matrix.os, 'macos-')
|
|
run: |
|
|
curl https://sh.rustup.rs -sSf | bash -s -- -y
|
|
export PATH="$HOME/.cargo/bin:$PATH"
|
|
rustup install stable
|
|
rustup component add rustfmt
|
|
rustup component add clippy
|
|
|
|
- name: Install rustc
|
|
shell: bash
|
|
run: |
|
|
export PATH="$HOME/.cargo/bin:$PATH"
|
|
# It fails on Windows, disable auto self update
|
|
rustup toolchain install 1.20.0 --no-self-update
|
|
rustup toolchain install nightly --no-self-update
|
|
rustup target add wasm32-unknown-unknown
|
|
|
|
# 1.45.0 crashes with a stack overflow when compiling iced-x86-js
|
|
rustup toolchain install 1.44.1 --no-self-update
|
|
rustup target add wasm32-unknown-unknown --toolchain 1.44.1
|
|
rustup component add clippy --toolchain 1.44.1
|
|
rustup component add rustfmt --toolchain 1.44.1
|
|
# 1.45 workaround
|
|
|
|
rustup update --no-self-update
|
|
|
|
- name: Install Node.js
|
|
uses: actions/setup-node@v1
|
|
with:
|
|
node-version: 10.0.0
|
|
|
|
- name: Install wasm-pack
|
|
shell: bash
|
|
run: |
|
|
npm install -g wasm-pack
|
|
|
|
- uses: actions/setup-dotnet@v1
|
|
if: matrix.os == 'ubuntu-latest'
|
|
with:
|
|
dotnet-version: '3.1.100'
|
|
|
|
- name: Test valid/invalid instructions
|
|
shell: bash
|
|
if: matrix.os == 'ubuntu-latest'
|
|
run: |
|
|
export PATH="$HOME/.cargo/bin:$PATH"
|
|
export RUSTFLAGS="-D warnings"
|
|
echo dotnet version
|
|
dotnet --version
|
|
valid_file=$(mktemp)
|
|
invalid_file=$(mktemp)
|
|
|
|
for bitness in 16 32 64; do
|
|
echo ==== ${bitness}-bit: Generating valid/invalid files ====
|
|
dotnet run -c:Release -p src/csharp/Intel/IcedFuzzer/IcedFuzzer/IcedFuzzer.csproj -- -$bitness -oil $invalid_file -ovlc $valid_file
|
|
echo ==== ${bitness}-bit: Testing valid instructions ====
|
|
cargo run --color always --release --manifest-path src/rust/Cargo.toml -p iced-x86-fzgt -- -b $bitness -f $valid_file
|
|
echo ==== ${bitness}-bit: Testing invalid instructions ====
|
|
cargo run --color always --release --manifest-path src/rust/Cargo.toml -p iced-x86-fzgt -- -b $bitness -f $invalid_file --invalid
|
|
done
|
|
|
|
for bitness in 16 32 64; do
|
|
echo "==== ${bitness}-bit (AMD): Generating valid/invalid files ===="
|
|
dotnet run -c:Release -p src/csharp/Intel/IcedFuzzer/IcedFuzzer/IcedFuzzer.csproj -- -$bitness -oil $invalid_file -ovlc $valid_file --amd
|
|
echo "==== ${bitness}-bit (AMD): Testing valid instructions ===="
|
|
cargo run --color always --release --manifest-path src/rust/Cargo.toml -p iced-x86-fzgt -- -b $bitness -f $valid_file --amd
|
|
echo "==== ${bitness}-bit (AMD): Testing invalid instructions ===="
|
|
cargo run --color always --release --manifest-path src/rust/Cargo.toml -p iced-x86-fzgt -- -b $bitness -f $invalid_file --invalid --amd
|
|
done
|
|
|
|
rm $valid_file
|
|
rm $invalid_file
|
|
|
|
- name: Build no_std
|
|
shell: bash
|
|
run: |
|
|
export PATH="$HOME/.cargo/bin:$PATH"
|
|
export RUSTFLAGS="-D warnings"
|
|
git clean -xdf
|
|
cd src/rust/iced-x86
|
|
|
|
echo ==== BUILD DEBUG ====
|
|
cargo check --color always --no-default-features --features "no_std decoder encoder block_encoder op_code_info instr_info gas intel masm nasm db"
|
|
|
|
cd ../../..
|
|
git clean -xdf
|
|
|
|
- name: Build one feature at a time
|
|
shell: bash
|
|
run: |
|
|
export PATH="$HOME/.cargo/bin:$PATH"
|
|
export RUSTFLAGS="-D warnings"
|
|
cd src/rust/iced-x86
|
|
|
|
allFeatures=(
|
|
"std decoder"
|
|
"std encoder"
|
|
"std encoder block_encoder"
|
|
"std encoder op_code_info"
|
|
"std instr_info"
|
|
"std gas"
|
|
"std intel"
|
|
"std masm"
|
|
"std nasm"
|
|
)
|
|
for features in "${allFeatures[@]}"; do
|
|
echo ==== $features ====
|
|
cargo check --color always --no-default-features --features "$features"
|
|
done
|
|
|
|
allFeatures=(
|
|
"no_vex"
|
|
"no_evex"
|
|
"no_xop"
|
|
"no_d3now"
|
|
"no_vex no_evex no_xop no_d3now"
|
|
)
|
|
for features in "${allFeatures[@]}"; do
|
|
echo ==== $features ====
|
|
cargo check --color always --features "$features"
|
|
done
|
|
|
|
allFeatures=(
|
|
"no_std decoder"
|
|
"no_std encoder"
|
|
"no_std encoder block_encoder"
|
|
"no_std encoder op_code_info"
|
|
"no_std instr_info"
|
|
"no_std gas"
|
|
"no_std intel"
|
|
"no_std masm"
|
|
"no_std nasm"
|
|
)
|
|
for features in "${allFeatures[@]}"; do
|
|
echo ==== $features ====
|
|
cargo check --color always --no-default-features --features "$features"
|
|
done
|
|
|
|
allFeatures=(
|
|
"std decoder"
|
|
"std decoder encoder"
|
|
"std decoder encoder block_encoder"
|
|
"std decoder encoder op_code_info"
|
|
"std decoder instr_info"
|
|
"std decoder gas"
|
|
"std decoder intel"
|
|
"std decoder masm"
|
|
"std decoder nasm"
|
|
)
|
|
for features in "${allFeatures[@]}"; do
|
|
echo ==== TEST $features ====
|
|
cargo check --color always --tests --no-default-features --features "$features"
|
|
done
|
|
|
|
allFeatures=(
|
|
"no_vex"
|
|
"no_evex"
|
|
"no_xop"
|
|
"no_d3now"
|
|
"no_vex no_evex no_xop no_d3now"
|
|
)
|
|
for features in "${allFeatures[@]}"; do
|
|
echo ==== TEST $features ====
|
|
cargo check --color always --tests --features "$features"
|
|
done
|
|
|
|
cd ..
|
|
git clean -xdf
|
|
|
|
- name: iced-x86-js
|
|
shell: bash
|
|
run: |
|
|
export PATH="$HOME/.cargo/bin:$PATH"
|
|
export RUSTFLAGS="-D warnings"
|
|
cd src/rust/iced-x86-js
|
|
|
|
echo ==== FORMAT CHECK ====
|
|
cargo fmt -- --color always --check
|
|
echo ==== CLIPPY instr_api decoder encoder block_encoder instr_create op_code_info instr_info gas intel masm nasm ====
|
|
cargo +1.44.1 clippy --color always --target wasm32-unknown-unknown --no-default-features --features "instr_api decoder encoder block_encoder instr_create op_code_info instr_info gas intel masm nasm"
|
|
echo ==== CLIPPY instr_api decoder encoder block_encoder instr_create op_code_info instr_info gas intel masm nasm bigint ====
|
|
cargo +1.44.1 clippy --color always --target wasm32-unknown-unknown --no-default-features --features "instr_api decoder encoder block_encoder instr_create op_code_info instr_info gas intel masm nasm bigint"
|
|
|
|
allFeatures=(
|
|
"decoder"
|
|
"instr_api decoder"
|
|
"encoder"
|
|
"instr_api encoder"
|
|
"encoder block_encoder"
|
|
"instr_create"
|
|
"encoder instr_create"
|
|
"encoder op_code_info"
|
|
"instr_api encoder op_code_info"
|
|
"instr_info"
|
|
"instr_api instr_info"
|
|
"gas"
|
|
"intel"
|
|
"masm"
|
|
"nasm"
|
|
"instr_api nasm"
|
|
)
|
|
for features in "${allFeatures[@]}"; do
|
|
echo ==== $features ====
|
|
cargo +1.44.1 check --color always --target wasm32-unknown-unknown --no-default-features --features "$features"
|
|
done
|
|
|
|
allFeatures=(
|
|
"no_vex"
|
|
"no_evex"
|
|
"no_xop"
|
|
"no_d3now"
|
|
"no_vex no_evex no_xop no_d3now"
|
|
)
|
|
for features in "${allFeatures[@]}"; do
|
|
echo ==== $features ====
|
|
cargo +1.44.1 check --color always --target wasm32-unknown-unknown --features "$features"
|
|
done
|
|
|
|
cd ..
|
|
git clean -xdf
|
|
|
|
- name: iced-x86-js tests
|
|
# Disable this for now: https://github.com/rustwasm/wasm-pack/issues/886
|
|
continue-on-error: true
|
|
shell: bash
|
|
run: |
|
|
export PATH="$HOME/.cargo/bin:$PATH"
|
|
export RUSTFLAGS="-D warnings"
|
|
|
|
cd src/rust/iced-x86-js
|
|
# 1.45.0 can't build it without a stack overflow
|
|
rustup default 1.44.1
|
|
wasm-pack build --mode force --target nodejs
|
|
# Restore default toolchain
|
|
rustup default stable
|
|
cd src/tests
|
|
npm install
|
|
npm test
|
|
|
|
cd ..
|
|
git clean -xdf
|
|
|
|
- name: Build, test (default)
|
|
shell: bash
|
|
run: |
|
|
export PATH="$HOME/.cargo/bin:$PATH"
|
|
export RUSTFLAGS="-D warnings"
|
|
cargo -V
|
|
cd src/rust/iced-x86
|
|
echo ==== CLIPPY ====
|
|
cargo clippy --color always
|
|
echo ==== CLIPPY --tests ====
|
|
cargo clippy --color always --tests
|
|
echo ==== FORMAT CHECK ====
|
|
cargo fmt -- --color always --check
|
|
echo ==== DOC ====
|
|
# Use nightly since that's what docs.rs uses
|
|
cargo +nightly doc --color always
|
|
echo ==== BUILD RELEASE ====
|
|
cargo build --color always --features "db" --release
|
|
echo ==== TEST RELEASE ====
|
|
cargo test --color always --features "db" --release
|
|
echo ==== BUILD RELEASE wasm32-unknown-unknown ====
|
|
cargo check --color always --features "db" --target wasm32-unknown-unknown --release
|
|
echo ==== PUBLISH DRY-RUN ====
|
|
# It fails on Windows without this, claiming that some random number of rust files are dirty.
|
|
# This is the 2nd GitHub CI for Windows hack I've added to this file.
|
|
git status
|
|
git diff
|
|
cargo publish --color always --dry-run
|
|
|
|
- name: Build, test (1.20.0)
|
|
shell: bash
|
|
run: |
|
|
export PATH="$HOME/.cargo/bin:$PATH"
|
|
export RUSTFLAGS="-D warnings"
|
|
cd src/rust/iced-x86
|
|
sed -i -e 's/"iced-x86-fzgt",/#"iced-x86-fzgt",/' ../Cargo.toml
|
|
echo ==== UPDATE Cargo.lock ====
|
|
cargo +1.20.0 generate-lockfile
|
|
cargo +1.20.0 update --package lazy_static --precise 1.1.1
|
|
echo ==== BUILD RELEASE ====
|
|
cargo +1.20.0 build --color always --features "db" --release
|
|
echo ==== TEST RELEASE ====
|
|
cargo +1.20.0 test --color always --features "db" --release -- --skip "lib.rs"
|
|
git checkout ../Cargo.toml
|