ci: Check matching functions for each push and PR build

This commit is contained in:
Léo Lam 2020-09-24 14:19:48 +02:00
parent 9e6e871859
commit fd90123f88
No known key found for this signature in database
GPG Key ID: 0DF30F9081000741
4 changed files with 46 additions and 4 deletions

View File

@ -25,3 +25,9 @@ jobs:
working-directory: ./build
- name: Build
run: ninja -C build
- uses: actions/upload-artifact@v2
with:
name: build
path: |
build/uking
data/uking_functions.csv

27
.github/workflows/check.yml vendored Normal file
View File

@ -0,0 +1,27 @@
name: check
on:
workflow_run:
workflows: ["build"]
types:
- completed
jobs:
check-matchings:
runs-on: ubuntu-latest
steps:
- uses: haya14busa/action-workflow_run-status@967ed83efa565c257675ed70cfe5231f062ddd94
- uses: actions/checkout@v2
- run: git submodule update --init --recursive
- name: Install pip
run: sudo apt update && sudo apt install -y python3-pip
- name: Install tool dependencies
run: sudo python3 -m pip install capstone colorama cxxfilt pyelftools gpg wget
- name: Download executable
run: wget https://static.zeldamods.org/botw/16A91992BBA71201E98756F3BC8F5D2F.elf.gpg
- name: Decrypt executable
run: gpg --quiet --batch --yes --decrypt --passphrase="${{ secrets.leo_secret }}" --output data/main.elf 16A91992BBA71201E98756F3BC8F5D2F.elf.gpg
- name: Download artifacts
uses: dawidd6/action-download-artifact@3cd20b2b63293848b29e22223f515baf725ed98f
with:
workflow: build.yml
- name: Check matchings
run: tools/check.py

View File

@ -4,6 +4,7 @@ import capstone as cs
from elftools.elf.elffile import ELFFile
import diff_settings
from pathlib import Path
import sys
from typing import Any, Dict, Set
import utils
@ -49,7 +50,7 @@ def check_function(addr: int, size: int, name: str) -> bool:
try:
base_fn = get_fn_from_base_elf(addr, size)
except KeyError:
utils.fail(f"couldn't find base function 0x{addr:016x} for {name}")
utils.print_error(f"couldn't find base function 0x{addr:016x} for {name}")
return False
try:
@ -127,14 +128,18 @@ def check_function(addr: int, size: int, name: str) -> bool:
def main() -> None:
failed = False
for func in utils.get_functions():
if not func.decomp_name:
continue
if func.status == utils.FunctionStatus.Matching:
if not check_function(func.addr, func.size, func.decomp_name):
utils.fail(f"{func.decomp_name} was marked as matching but does not match")
return
utils.print_error(f"{func.decomp_name} was marked as matching but does not match")
failed = True
if failed:
sys.exit(1)
if __name__ == "__main__":

View File

@ -68,6 +68,10 @@ def warn(msg: str):
sys.stderr.write(f"{Fore.MAGENTA}{Style.BRIGHT}warning:{Fore.RESET} {msg}{Style.RESET_ALL}\n")
def fail(msg: str):
def print_error(msg: str):
sys.stderr.write(f"{Fore.RED}{Style.BRIGHT}error:{Fore.RESET} {msg}{Style.RESET_ALL}\n")
def fail(msg: str):
print_error(msg)
sys.exit(1)