From 56b777d54fa932c75cafd6561c3cac78425aa4e2 Mon Sep 17 00:00:00 2001 From: nkchuykin Date: Mon, 20 Jun 2022 21:13:50 +0300 Subject: [PATCH] Add check for SIGABRT --- project/src/transpiler/main.cpp | 22 +++++++++++++++++++++- project/src/transpiler/memory_manager.h | 2 +- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/project/src/transpiler/main.cpp b/project/src/transpiler/main.cpp index 69c58364..ca1b7504 100644 --- a/project/src/transpiler/main.cpp +++ b/project/src/transpiler/main.cpp @@ -34,6 +34,19 @@ void SegfaultSigaction(int /*unused*/, siginfo_t *si, void * /*unused*/) { exit(0); } +void SiAbrtSigaction(int /*unused*/, siginfo_t *si, void * /*unused*/) { + llvm::errs() << "exception: SIGABRT with code " << si->si_code + << " while tool run\n"; + ofstream out(filename); + out << "+package c2eo.src." << package_name << "\n\n"; + out << "+alias c2eo.stdio.printf\n\n"; + out << "[args...] > global\n"; + out << " printf \"SIGABRT at address " << si->si_addr + << " while tool run\" > @\n"; + out.close(); + exit(0); +} + int main(int argc, const char **argv) { if (argc < 3) { llvm::errs() << "exception: incorrect command line format. Necessary: c2eo " @@ -87,8 +100,15 @@ int main(int argc, const char **argv) { sigemptyset(&sa.sa_mask); sa.sa_sigaction = SegfaultSigaction; sa.sa_flags = SA_SIGINFO; - sigaction(SIGSEGV, &sa, nullptr); + + struct sigaction sab {}; + memset(&sab, 0, sizeof(struct sigaction)); + sigemptyset(&sab.sa_mask); + sab.sa_sigaction = SiAbrtSigaction; + sab.sa_flags = SA_SIGINFO; + sigaction(SIGABRT, &sab, nullptr); + auto result = tool.run(newFrontendActionFactory(&finder).get()); if (result != 0) { cerr << "An error in clang occurred\n"; diff --git a/project/src/transpiler/memory_manager.h b/project/src/transpiler/memory_manager.h index 6d4791ae..8c007f47 100644 --- a/project/src/transpiler/memory_manager.h +++ b/project/src/transpiler/memory_manager.h @@ -62,7 +62,7 @@ class MemoryManager { bool Empty(); - size_t GetFreeSpacePointer() const; + [[nodiscard]] size_t GetFreeSpacePointer() const; const Variable &GetVarById(const clang::VarDecl *id) const;