Skip to content

Print hook argument values on crash #603

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 19 commits into from
Jan 9, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,6 @@
path = deps/pybind11
url = ../../pybind/pybind11
branch = stable
[submodule "deps/fmt"]
path = deps/fmt
url = https://github.com/fmtlib/fmt.git
7 changes: 7 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,10 @@ install(
DIRECTORY include/runtime
DESTINATION include/kllvm
)
install(
DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include/fmt
DESTINATION include/fmt
)
install(
DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include/immer
DESTINATION include/kllvm
Expand All @@ -186,6 +190,7 @@ install(
)

file(COPY ${PROJECT_SOURCE_DIR}/deps/immer/immer DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/include)
file(COPY ${PROJECT_SOURCE_DIR}/deps/fmt/include/fmt DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/include)
file(COPY ${PROJECT_SOURCE_DIR}/deps/rapidjson/include/rapidjson DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/include)

set(GC_THRESHOLD 2097152 CACHE STRING "Initial Young Generation Size")
Expand Down Expand Up @@ -255,6 +260,8 @@ add_subdirectory(lib)
add_subdirectory(tools)
add_subdirectory(runtime)

find_package(fmt)

if(BUILD_TESTS)
add_subdirectory(unittests)
endif()
Expand Down
1 change: 1 addition & 0 deletions bin/llvm-kompile-clang
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,7 @@ run @CMAKE_CXX_COMPILER@ -Wno-override-module -Wno-return-type-c-linkage "$modop
"$MAINFILES" \
"$LIBDIR"/libutil.a \
"$LIBDIR"/libstrings.a \
"$LIBDIR"/libnumeric_strings.a \
"$LIBDIR"/libio.a \
"$LIBDIR"/libcollections.a \
"$LIBDIR"/libParser.a \
Expand Down
1 change: 1 addition & 0 deletions deps/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
add_subdirectory(base64)
add_subdirectory(fmt)
add_subdirectory(pybind11)
1 change: 1 addition & 0 deletions deps/fmt
Submodule fmt added at a33701
18 changes: 18 additions & 0 deletions flake.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 7 additions & 2 deletions flake.nix
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@
inputs = {
utils.url = "github:numtide/flake-utils";
nixpkgs.url = "github:nixos/nixpkgs";
fmt-src.url =
"github:fmtlib/fmt/9.1.0";
fmt-src.flake = false;
immer-src.url =
"github:runtimeverification/immer/198c2ae260d49ef1800a2fe4433e07d7dec20059";
immer-src.flake = false;
Expand All @@ -16,15 +19,15 @@
mavenix.url = "github:nix-community/mavenix";
};

outputs = { self, nixpkgs, utils, immer-src, rapidjson-src, pybind11-src, mavenix }:
outputs = { self, nixpkgs, utils, fmt-src, immer-src, rapidjson-src, pybind11-src, mavenix }:
let
inherit (nixpkgs) lib;

# put devShell and any other required packages into local overlay
# if you have additional overlays, you may add them here
localOverlay = import ./nix/overlay.nix; # this should expose devShell
depsOverlay = (final: prev: {
inherit immer-src rapidjson-src pybind11-src;
inherit fmt-src immer-src rapidjson-src pybind11-src;

llvm-backend-src = prev.stdenv.mkDerivation {
name = "llvm-backend-src";
Expand All @@ -41,9 +44,11 @@
mkdir $out
cp -rv $src/* $out
chmod -R u+w $out
mkdir -p $out/deps/fmt
mkdir -p $out/deps/immer
mkdir -p $out/deps/rapidjson
mkdir -p $out/deps/pybind11
cp -rv ${final.fmt-src}/* $out/deps/fmt
cp -rv ${final.immer-src}/* $out/deps/immer
cp -rv ${final.rapidjson-src}/* $out/deps/rapidjson
cp -rv ${final.pybind11-src}/* $out/deps/pybind11
Expand Down
10 changes: 7 additions & 3 deletions include/runtime/header.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include <cstdint>
#include <limits>

#include <fmt/format.h>
#include <gmp.h>
#include <mpfr.h>

Expand Down Expand Up @@ -275,10 +276,13 @@ block *strip_injection(block *);
std::string floatToString(const floating *);
void init_float2(floating *, std::string);

#define KLLVM_HOOK_INVALID_ARGUMENT(msg) \
std::string intToStringInBase(mpz_t, uint64_t);
std::string intToString(mpz_t);

#define KLLVM_HOOK_INVALID_ARGUMENT(...) \
do { \
auto err_msg = std::string("[") + std::string(__func__) \
+ std::string("]: ") + std::string(msg); \
auto err_msg \
= ::fmt::format("[{}]: {}", __func__, ::fmt::format(__VA_ARGS__)); \
throw std::invalid_argument(err_msg); \
} while (false)

Expand Down
4 changes: 4 additions & 0 deletions runtime/arithmetic/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,10 @@ add_library(arithmetic STATIC
float.cpp
)

target_link_libraries(arithmetic
numeric_strings fmt::fmt-header-only
)

install(
TARGETS arithmetic
ARCHIVE DESTINATION lib/kllvm
Expand Down
29 changes: 17 additions & 12 deletions runtime/arithmetic/float.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -84,11 +84,12 @@ SortFloat hook_FLOAT_trunc(SortFloat a) {

SortFloat hook_FLOAT_round(SortFloat a, SortInt prec, SortInt exp) {
if (!mpz_fits_ulong_p(prec)) {
KLLVM_HOOK_INVALID_ARGUMENT("Precision out of range");
KLLVM_HOOK_INVALID_ARGUMENT(
"Precision out of range: {}", intToString(prec));
}
unsigned long uprec = mpz_get_ui(prec);
if (!mpz_fits_ulong_p(exp)) {
KLLVM_HOOK_INVALID_ARGUMENT("Exponent out of range");
KLLVM_HOOK_INVALID_ARGUMENT("Exponent out of range: {}", intToString(exp));
}
unsigned long uexp = mpz_get_ui(exp);
floating result[1];
Expand All @@ -100,7 +101,7 @@ SortFloat hook_FLOAT_round(SortFloat a, SortInt prec, SortInt exp) {

mpz_ptr hook_FLOAT_float2int(SortFloat a) {
if (!mpfr_number_p(a->f)) {
KLLVM_HOOK_INVALID_ARGUMENT("Not a finite number");
KLLVM_HOOK_INVALID_ARGUMENT("Not a finite number: {}", floatToString(a));
}
mpz_t result;
mpz_init(result);
Expand All @@ -110,11 +111,12 @@ mpz_ptr hook_FLOAT_float2int(SortFloat a) {

SortFloat hook_FLOAT_int2float(SortInt a, SortInt prec, SortInt exp) {
if (!mpz_fits_ulong_p(prec)) {
KLLVM_HOOK_INVALID_ARGUMENT("Precision out of range");
KLLVM_HOOK_INVALID_ARGUMENT(
"Precision out of range: {}", intToString(prec));
}
unsigned long uprec = mpz_get_ui(prec);
if (!mpz_fits_ulong_p(exp)) {
KLLVM_HOOK_INVALID_ARGUMENT("Exponent out of range");
KLLVM_HOOK_INVALID_ARGUMENT("Exponent out of range: {}", intToString(exp));
}
unsigned long uexp = mpz_get_ui(exp);
floating result[1];
Expand Down Expand Up @@ -263,11 +265,12 @@ bool hook_FLOAT_isNaN(SortFloat a) {

SortFloat hook_FLOAT_maxValue(SortInt prec, SortInt exp) {
if (!mpz_fits_ulong_p(prec)) {
KLLVM_HOOK_INVALID_ARGUMENT("Precision out of range");
KLLVM_HOOK_INVALID_ARGUMENT(
"Precision out of range: {}", intToString(prec));
}
unsigned long uprec = mpz_get_ui(prec);
if (!mpz_fits_ulong_p(exp)) {
KLLVM_HOOK_INVALID_ARGUMENT("Exponent out of range");
KLLVM_HOOK_INVALID_ARGUMENT("Exponent out of range: {}", intToString(exp));
}
unsigned long uexp = mpz_get_ui(exp);
floating result[1];
Expand All @@ -280,11 +283,12 @@ SortFloat hook_FLOAT_maxValue(SortInt prec, SortInt exp) {

SortFloat hook_FLOAT_minValue(SortInt prec, SortInt exp) {
if (!mpz_fits_ulong_p(prec)) {
KLLVM_HOOK_INVALID_ARGUMENT("Precision out of range");
KLLVM_HOOK_INVALID_ARGUMENT(
"Precision out of range: {}", intToString(prec));
}
unsigned long uprec = mpz_get_ui(prec);
if (!mpz_fits_ulong_p(exp)) {
KLLVM_HOOK_INVALID_ARGUMENT("Exponent out of range");
KLLVM_HOOK_INVALID_ARGUMENT("Exponent out of range: {}", intToString(exp));
}
unsigned long uexp = mpz_get_ui(exp);
floating result[1];
Expand Down Expand Up @@ -423,7 +427,7 @@ SortFloat hook_FLOAT_pow(SortFloat a, SortFloat b) {

SortFloat hook_FLOAT_root(SortFloat a, SortInt b) {
if (!mpz_fits_ulong_p(b)) {
KLLVM_HOOK_INVALID_ARGUMENT("Root out of range");
KLLVM_HOOK_INVALID_ARGUMENT("Root out of range: {}", intToString(b));
}
unsigned long root = mpz_get_ui(b);
floating result[1];
Expand Down Expand Up @@ -456,11 +460,12 @@ bool hook_FLOAT_sign(SortFloat a) {
SortFloat hook_FLOAT_rat2float(
SortInt numerator, SortInt denominator, SortInt prec, SortInt exp) {
if (!mpz_fits_ulong_p(prec)) {
KLLVM_HOOK_INVALID_ARGUMENT("Precision out of range");
KLLVM_HOOK_INVALID_ARGUMENT(
"Precision out of range: {}", intToString(prec));
}
unsigned long uprec = mpz_get_ui(prec);
if (!mpz_fits_ulong_p(exp)) {
KLLVM_HOOK_INVALID_ARGUMENT("Exponent out of range");
KLLVM_HOOK_INVALID_ARGUMENT("Exponent out of range: {}", intToString(exp));
}
unsigned long uexp = mpz_get_ui(exp);

Expand Down
38 changes: 25 additions & 13 deletions runtime/arithmetic/int.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@ void add_hash64(void *, uint64_t);
SortInt hook_INT_tmod(SortInt a, SortInt b) {
mpz_t result;
if (mpz_sgn(b) == 0) {
KLLVM_HOOK_INVALID_ARGUMENT("Modulus by zero");
KLLVM_HOOK_INVALID_ARGUMENT(
"Modulus by zero: {} % {}", intToString(a), intToString(b));
}
mpz_init(result);
mpz_tdiv_r(result, a, b);
Expand All @@ -23,7 +24,8 @@ SortInt hook_INT_tmod(SortInt a, SortInt b) {
SortInt hook_INT_emod(SortInt a, SortInt b) {
mpz_t result;
if (mpz_sgn(b) == 0) {
KLLVM_HOOK_INVALID_ARGUMENT("Modulus by zero");
KLLVM_HOOK_INVALID_ARGUMENT(
"Modulus by zero: {} % {}", intToString(a), intToString(b));
}
mpz_init(result);
mpz_tdiv_r(result, a, b);
Expand Down Expand Up @@ -81,7 +83,8 @@ SortInt hook_INT_sub(SortInt a, SortInt b) {
SortInt hook_INT_tdiv(SortInt a, SortInt b) {
mpz_t result;
if (mpz_sgn(b) == 0) {
KLLVM_HOOK_INVALID_ARGUMENT("Division by zero");
KLLVM_HOOK_INVALID_ARGUMENT(
"Division by zero: {} / {}", intToString(a), intToString(b));
}
mpz_init(result);
mpz_tdiv_q(result, a, b);
Expand All @@ -91,7 +94,8 @@ SortInt hook_INT_tdiv(SortInt a, SortInt b) {
SortInt hook_INT_ediv(SortInt a, SortInt b) {
mpz_t result;
if (mpz_sgn(b) == 0) {
KLLVM_HOOK_INVALID_ARGUMENT("Division by zero");
KLLVM_HOOK_INVALID_ARGUMENT(
"Division by zero: {} / {}", intToString(a), intToString(b));
}
mpz_init(result);
if (mpz_sgn(b) >= 0) {
Expand All @@ -105,7 +109,9 @@ SortInt hook_INT_ediv(SortInt a, SortInt b) {
SortInt hook_INT_shl(SortInt a, SortInt b) {
mpz_t result;
if (!mpz_fits_ulong_p(b)) {
KLLVM_HOOK_INVALID_ARGUMENT("Shift amount out of range");
KLLVM_HOOK_INVALID_ARGUMENT(
"Left shift amount out of range: {} << {}", intToString(a),
intToString(b));
}
mpz_init(result);
unsigned long blong = mpz_get_ui(b);
Expand All @@ -126,7 +132,9 @@ SortInt hook_INT_shr(SortInt a, SortInt b) {
mpz_init(result);
if (!mpz_fits_ulong_p(b)) {
if (mpz_sgn(b) < 0) {
KLLVM_HOOK_INVALID_ARGUMENT("Negative shift amount");
KLLVM_HOOK_INVALID_ARGUMENT(
"Negative right shift amount: {} >> {}", intToString(a),
intToString(b));
}
if (mpz_sgn(a) < 0) {
mpz_set_si(result, -1);
Expand All @@ -145,7 +153,8 @@ bool hook_INT_gt(SortInt a, SortInt b) {
SortInt hook_INT_pow(SortInt a, SortInt b) {
mpz_t result;
if (!mpz_fits_ulong_p(b)) {
KLLVM_HOOK_INVALID_ARGUMENT("Exponent out of range");
KLLVM_HOOK_INVALID_ARGUMENT(
"Exponent out of range: {} ^ {}", intToString(a), intToString(b));
}
mpz_init(result);
unsigned long blong = mpz_get_ui(b);
Expand All @@ -160,7 +169,9 @@ SortInt hook_INT_powmod(SortInt a, SortInt b, SortInt mod) {
mpz_gcd(result, a, mod);
if (mpz_cmp_ui(result, 1) != 0) {
mpz_clear(result);
KLLVM_HOOK_INVALID_ARGUMENT("Modular inverse not defined");
KLLVM_HOOK_INVALID_ARGUMENT(
"Modular inverse not defined: {} ^ {} % {}", intToString(a),
intToString(b), intToString(mod));
}
}
mpz_powm(result, a, b, mod);
Expand Down Expand Up @@ -220,7 +231,8 @@ SortInt hook_INT_min(SortInt a, SortInt b) {
SortInt hook_INT_log2(SortInt a) {
mpz_t result;
if (mpz_sgn(a) <= 0) {
KLLVM_HOOK_INVALID_ARGUMENT("Logarithm of nonpositive integer");
KLLVM_HOOK_INVALID_ARGUMENT(
"Logarithm of nonpositive integer: log2({})", intToString(a));
}
mpz_init(result);
size_t log = mpz_sizeinbase(a, 2) - 1;
Expand Down Expand Up @@ -278,12 +290,12 @@ SortInt hook_INT_bitRange(SortInt i, SortInt off, SortInt len) {
return move_int(result);
}
if (!mpz_fits_ulong_p(len)) {
KLLVM_HOOK_INVALID_ARGUMENT("Length out of range");
KLLVM_HOOK_INVALID_ARGUMENT("Length out of range: {}", intToString(len));
}
unsigned long lenlong = mpz_get_ui(len);
if (!mpz_fits_ulong_p(off)) {
if (mpz_sgn(off) < 0) {
KLLVM_HOOK_INVALID_ARGUMENT("Negative offset");
KLLVM_HOOK_INVALID_ARGUMENT("Negative offset: {}", intToString(off));
}
mpz_init(result);
if (mpz_sgn(i) < 0) {
Expand Down Expand Up @@ -324,7 +336,7 @@ SortInt hook_INT_signExtendBitRange(SortInt i, SortInt off, SortInt len) {
mpz_t result;
if (!mpz_fits_ulong_p(off)) {
if (mpz_sgn(off) < 0) {
KLLVM_HOOK_INVALID_ARGUMENT("Negative offset");
KLLVM_HOOK_INVALID_ARGUMENT("Negative offset: {}", intToString(off));
}
mpz_init(result);
if (mpz_sgn(i) < 0) {
Expand All @@ -333,7 +345,7 @@ SortInt hook_INT_signExtendBitRange(SortInt i, SortInt off, SortInt len) {
return move_int(result);
}
if (!mpz_fits_ulong_p(len)) {
KLLVM_HOOK_INVALID_ARGUMENT("Length out of range");
KLLVM_HOOK_INVALID_ARGUMENT("Length out of range: {}", intToString(len));
}
unsigned long offlong = mpz_get_ui(off);
unsigned long lenlong = mpz_get_ui(len);
Expand Down
3 changes: 3 additions & 0 deletions runtime/collections/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,6 @@ install(
TARGETS collections
ARCHIVE DESTINATION lib/kllvm
)

target_link_libraries(collections
numeric_strings fmt::fmt-header-only)
Loading