llvm-project/bolt/test/runtime/exceptions-no-pie.cpp
revunov.denis@huawei.com 553c238952 [BOLT] Preserve original LSDA type encoding
In non-pie binaries BOLT unconditionally converted type encoding
from indirect to absptr, which broke std exceptions since pointers
to their typeinfo were only assigned at runtime in .data section.
In this patch we preserve original encoding so that indirect
remains indirect and can be resolved at runtime, and absolute remains absolute.

Reviewed By: rafauler, maksfb

Differential Revision: https://reviews.llvm.org/D132484
2022-09-14 16:33:47 +00:00

42 lines
1.1 KiB
C++

// REQUIRES: system-linux
// RUN: %clangxx -no-pie -Wl,-q %s -o %t.exe
// RUN: llvm-bolt %t.exe -o %t.bolt.exe -lite=false
// RUN: not --crash %t.bolt.exe 2>&1 | FileCheck %s --check-prefix=CHECK-FAIL
// CHECK-FAIL: Should pass one argument
// RUN: not %t.bolt.exe -1 | FileCheck %s --check-prefix=CHECK-BAD
// CHECK-BAD: Bad value
// RUN: not %t.bolt.exe 0 | FileCheck %s --check-prefix=CHECK-ZERO
// CHECK-ZERO: Value is zero
// RUN: %t.bolt.exe 1 | FileCheck %s --check-prefix=CHECK-GOOD
// CHECK-GOOD: Good value
#include <exception>
#include <iostream>
struct ValIsZero {
const char *error = "Value is zero\n";
};
int dummy(int arg) {
if (arg == 0)
throw ValIsZero();
if (arg > 0)
return 0;
else
throw std::out_of_range("Bad value");
}
int main(int argc, char **argv) {
if (argc != 2)
throw std::invalid_argument("Should pass one argument");
try {
dummy(std::strtol(argv[1], nullptr, 10));
} catch (std::out_of_range &e) {
std::cout << e.what() << "\n";
return 1;
} catch (ValIsZero &e) {
std::cout << e.error;
return 1;
}
std::cout << "Good value\n";
return 0;
}