Skip to content
Jake Goulding edited this page Apr 28, 2017 · 9 revisions

Generating testcases

Get the offending Rust code as LLVM IR

cargo build --release --target=./arduino.json --verbose
# grab the `rustc ...` invocation
# add `--emit=llvm-ir`
# Look for `target/arduino/release/deps/foo.0.ll`

Build LLVM

Basically, recreate what the build system does

cmake \
  -D CMAKE_BUILD_TYPE=Debug \
  -D LLVM_ENABLE_ASSERTIONS=ON \
  -D LLVM_TARGETS_TO_BUILD="X86" \
  -D LLVM_EXPERIMENTAL_TARGETS_TO_BUILD="AVR" \
  -D LLVM_INCLUDE_EXAMPLES=OFF \
  -D LLVM_INCLUDE_TESTS=OFF \
  -D LLVM_INCLUDE_DOCS=OFF \
  -D LLVM_ENABLE_ZLIB=OFF \
  -D WITH_POLLY=OFF \
  -D LLVM_ENABLE_TERMINFO=OFF \
  -D LLVM_ENABLE_LIBEDIT=OFF \
  ..

Reduce the testcase

Create the two supporting files, then run it against your LLVM IR (./bugpoint.sh myfile.ll). This will produce a bugpoint-reduced-simplified.bc, which you can convert back to IR with llvm-dis.

bugpoint.sh

#!/bin/bash

export PATH=../debug/bin/:$PATH

bugpoint $1 -compile-custom -compile-command ./repro.sh -safe-tool-args='-march=avr -mcpu=atmega328p -filetype=obj'

repro.sh

Edit this file to look for your error

#!/bin/bash

set -eux

! llc -march=avr -mcpu=atmega328p -filetype=obj $1 2>&1 | grep 'No instruction defining live value'
Clone this wiki locally