diff options
| author | Amlal El Mahrouss <amlal@nekernel.org> | 2025-05-27 13:22:49 +0200 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal@nekernel.org> | 2025-05-27 13:22:49 +0200 |
| commit | d12204e7302b8f3bd521c782094338733abfded1 (patch) | |
| tree | 708549c25f71e56b30b4223750adb0c317896fde /dev/LibCompiler | |
| parent | 38f86a6646bd59dc746067caaaa9f933fa9707d4 (diff) | |
feat!: better crash reporting.
Signed-off-by: Amlal El Mahrouss <amlal@nekernel.org>
Diffstat (limited to 'dev/LibCompiler')
| -rw-r--r-- | dev/LibCompiler/Frontend.h | 2 | ||||
| -rw-r--r-- | dev/LibCompiler/Util/LCClUtils.h | 48 | ||||
| -rw-r--r-- | dev/LibCompiler/Version.h | 4 | ||||
| -rw-r--r-- | dev/LibCompiler/src/Asm/Assembler64x0.cc | 2 | ||||
| -rw-r--r-- | dev/LibCompiler/src/Asm/AssemblerAMD64.cc | 2 | ||||
| -rw-r--r-- | dev/LibCompiler/src/Asm/AssemblerARM64.cc | 2 | ||||
| -rw-r--r-- | dev/LibCompiler/src/Asm/AssemblerPowerPC.cc | 2 | ||||
| -rw-r--r-- | dev/LibCompiler/src/Cl/CCompiler64x0.cc | 2 | ||||
| -rw-r--r-- | dev/LibCompiler/src/Cl/CCompilerARM64.cc | 2 | ||||
| -rw-r--r-- | dev/LibCompiler/src/Cl/CCompilerPower64.cc | 2 | ||||
| -rw-r--r-- | dev/LibCompiler/src/Cl/CPlusPlusCompilerAMD64.cc | 26 | ||||
| -rw-r--r-- | dev/LibCompiler/src/Linker/DynamicLinkerPEF.cc | 2 |
12 files changed, 63 insertions, 33 deletions
diff --git a/dev/LibCompiler/Frontend.h b/dev/LibCompiler/Frontend.h index 9f6fe71..5f054ac 100644 --- a/dev/LibCompiler/Frontend.h +++ b/dev/LibCompiler/Frontend.h @@ -81,7 +81,7 @@ enum KeywordKind { /// \brief Compiler keyword information struct. struct CompilerKeyword { - std::string keyword_name{""}; + STLString keyword_name{""}; KeywordKind keyword_kind{kKeywordKindInvalid}; }; diff --git a/dev/LibCompiler/Util/LCClUtils.h b/dev/LibCompiler/Util/LCClUtils.h index c88339d..8e7c4d7 100644 --- a/dev/LibCompiler/Util/LCClUtils.h +++ b/dev/LibCompiler/Util/LCClUtils.h @@ -9,6 +9,7 @@ #include <LibCompiler/CodeGen.h> #include <LibCompiler/ErrorID.h> #include <LibCompiler/Frontend.h> +#include <LibCompiler/Version.h> #include <Vendor/Dialogs.h> #define kZero64Section ".zero64" @@ -51,18 +52,59 @@ inline void print_warning(std::string reason, std::string file) noexcept { /// @internal /// @brief Handler for SIGSEGV signal. -inline void drv_segfault_handler(std::int32_t id) { +inline void drvi_crash_handler(std::int32_t id) { + LibCompiler::STLString verbose_header = "LIBCOMPILER CRASH REPORT - "; + verbose_header += kDistVersion; + verbose_header += " - "; + verbose_header += LibCompiler::current_date(); + + for (auto& ch : verbose_header) { + std::cout << '='; + } + + std::cout << std::endl; + + std::cout << verbose_header << std::endl; + + for (auto& ch : verbose_header) { + std::cout << '='; + } + + std::cout << std::endl; + + kStdOut << "DATE: " << LibCompiler::current_date() << std::endl; + kStdOut << "VERSION: " << kDistVersion << std::endl; + kStdOut << "ERRNO: " << errno << std::endl; + kStdOut << "ERRNO(STRING): " << strerror(errno) << std::endl; + + switch (id) { case SIGSEGV: { - kStdErr << "SIGSEGV: Please report this on the GitHub issues page." << kBlank << std::endl; + kStdOut << "SIGSEGV: Segmentation Fault." << kBlank << std::endl; break; } case SIGABRT: { - kStdErr << "SIGABRT: Please report this on the GitHub issues page." << kBlank << std::endl; + kStdOut << "SIGABRT: Aborted." << kBlank << std::endl; break; } } + std::cout << kWhite; + + for (auto& ch : verbose_header) { + std::cout << '='; + } + + std::cout << std::endl; + + std::cout << verbose_header << std::endl; + + for (auto& ch : verbose_header) { + std::cout << '='; + } + + std::cout << std::endl; + std::exit(LIBCOMPILER_EXEC_ERROR); } } // namespace Detail diff --git a/dev/LibCompiler/Version.h b/dev/LibCompiler/Version.h index b94be42..93a7c00 100644 --- a/dev/LibCompiler/Version.h +++ b/dev/LibCompiler/Version.h @@ -6,8 +6,8 @@ #pragma once -#define kDistVersion "v0.0.1-libcompiler" -#define kDistVersionBCD 0x0001 +#define kDistVersion "v0.0.2-libcompiler" +#define kDistVersionBCD 0x0002 #define ToString(X) Stringify(X) #define Stringify(X) #X diff --git a/dev/LibCompiler/src/Asm/Assembler64x0.cc b/dev/LibCompiler/src/Asm/Assembler64x0.cc index 8c1adb5..fb96708 100644 --- a/dev/LibCompiler/src/Asm/Assembler64x0.cc +++ b/dev/LibCompiler/src/Asm/Assembler64x0.cc @@ -67,7 +67,7 @@ static bool asm_read_attributes(std::string line); ///////////////////////////////////////////////////////////////////////////////////////// LIBCOMPILER_MODULE(AssemblerMain64x0) { - ::signal(SIGSEGV, Detail::drv_segfault_handler); + ::signal(SIGSEGV, Detail::drvi_crash_handler); for (size_t i = 1; i < argc; ++i) { if (argv[i][0] == '-') { diff --git a/dev/LibCompiler/src/Asm/AssemblerAMD64.cc b/dev/LibCompiler/src/Asm/AssemblerAMD64.cc index 4a4ca41..e9f3ad5 100644 --- a/dev/LibCompiler/src/Asm/AssemblerAMD64.cc +++ b/dev/LibCompiler/src/Asm/AssemblerAMD64.cc @@ -85,7 +85,7 @@ static bool asm_read_attributes(std::string line); LIBCOMPILER_MODULE(AssemblerMainAMD64) { //////////////// CPU OPCODES BEGIN //////////////// - ::signal(SIGSEGV, Detail::drv_segfault_handler); + ::signal(SIGSEGV, Detail::drvi_crash_handler); std::string opcodes_jump[kJumpLimit] = {"ja", "jae", "jb", "jbe", "jc", "je", "jg", "jge", "jl", "jle", "jna", "jnae", "jnb", "jnbe", "jnc", "jne", diff --git a/dev/LibCompiler/src/Asm/AssemblerARM64.cc b/dev/LibCompiler/src/Asm/AssemblerARM64.cc index 59df5a7..8fad6b5 100644 --- a/dev/LibCompiler/src/Asm/AssemblerARM64.cc +++ b/dev/LibCompiler/src/Asm/AssemblerARM64.cc @@ -71,7 +71,7 @@ static bool asm_read_attributes(std::string line); ///////////////////////////////////////////////////////////////////////////////////////// LIBCOMPILER_MODULE(AssemblerMainARM64) { - ::signal(SIGSEGV, Detail::drv_segfault_handler); + ::signal(SIGSEGV, Detail::drvi_crash_handler); for (size_t i = 1; i < argc; ++i) { if (argv[i][0] == '-') { diff --git a/dev/LibCompiler/src/Asm/AssemblerPowerPC.cc b/dev/LibCompiler/src/Asm/AssemblerPowerPC.cc index bf7f115..86a70b9 100644 --- a/dev/LibCompiler/src/Asm/AssemblerPowerPC.cc +++ b/dev/LibCompiler/src/Asm/AssemblerPowerPC.cc @@ -71,7 +71,7 @@ static bool asm_read_attributes(std::string line); ///////////////////////////////////////////////////////////////////////////////////////// LIBCOMPILER_MODULE(AssemblerMainPower64) { - ::signal(SIGSEGV, Detail::drv_segfault_handler); + ::signal(SIGSEGV, Detail::drvi_crash_handler); for (size_t i = 1; i < argc; ++i) { if (argv[i][0] == '-') { diff --git a/dev/LibCompiler/src/Cl/CCompiler64x0.cc b/dev/LibCompiler/src/Cl/CCompiler64x0.cc index 2d37227..fc31ef9 100644 --- a/dev/LibCompiler/src/Cl/CCompiler64x0.cc +++ b/dev/LibCompiler/src/Cl/CCompiler64x0.cc @@ -1198,7 +1198,7 @@ static void cc_print_help() { #define kExt ".c" LIBCOMPILER_MODULE(NeOSCompilerCLang64x0) { - ::signal(SIGSEGV, Detail::drv_segfault_handler); + ::signal(SIGSEGV, Detail::drvi_crash_handler); kCompilerTypes.push_back({.fName = "void", .fValue = "void"}); kCompilerTypes.push_back({.fName = "char", .fValue = "byte"}); diff --git a/dev/LibCompiler/src/Cl/CCompilerARM64.cc b/dev/LibCompiler/src/Cl/CCompilerARM64.cc index 093c818..02e39f9 100644 --- a/dev/LibCompiler/src/Cl/CCompilerARM64.cc +++ b/dev/LibCompiler/src/Cl/CCompilerARM64.cc @@ -1196,7 +1196,7 @@ static void cc_print_help() { #define kCExtension ".c" LIBCOMPILER_MODULE(NeOSCompilerCLangARM64) { - ::signal(SIGSEGV, Detail::drv_segfault_handler); + ::signal(SIGSEGV, Detail::drvi_crash_handler); kCompilerTypes.push_back({.fName = "void", .fValue = "void"}); kCompilerTypes.push_back({.fName = "char", .fValue = "byte"}); diff --git a/dev/LibCompiler/src/Cl/CCompilerPower64.cc b/dev/LibCompiler/src/Cl/CCompilerPower64.cc index e0081f7..216891a 100644 --- a/dev/LibCompiler/src/Cl/CCompilerPower64.cc +++ b/dev/LibCompiler/src/Cl/CCompilerPower64.cc @@ -1215,7 +1215,7 @@ static void cc_print_help() { #define kExt ".c" LIBCOMPILER_MODULE(NeOSCompilerCLangPowerPC) { - ::signal(SIGSEGV, Detail::drv_segfault_handler); + ::signal(SIGSEGV, Detail::drvi_crash_handler); kCompilerTypes.push_back({.fName = "void", .fValue = "void"}); kCompilerTypes.push_back({.fName = "char", .fValue = "byte"}); diff --git a/dev/LibCompiler/src/Cl/CPlusPlusCompilerAMD64.cc b/dev/LibCompiler/src/Cl/CPlusPlusCompilerAMD64.cc index 856bc64..bfa1896 100644 --- a/dev/LibCompiler/src/Cl/CPlusPlusCompilerAMD64.cc +++ b/dev/LibCompiler/src/Cl/CPlusPlusCompilerAMD64.cc @@ -9,6 +9,7 @@ /// BUGS: 1 +#include "LibCompiler/Defines.h" #define kPrintF printf #define kExitOK (EXIT_SUCCESS) @@ -71,18 +72,14 @@ struct CompilerRegisterMap final { std::string fReg; }; -// \brief Offset based struct/class +/// \brief Offset based struct/class struct CompilerStructMap final { - std::string fName; - std::string fReg; - - // offset counter - std::size_t fOffsetsCnt; - - // offset array + std::string fName; + std::string fReg; std::vector<std::pair<UInt32, std::string>> fOffsets; }; +/// \brief Compiler state structure. struct CompilerState final { std::vector<CompilerRegisterMap> fStackMapVector; std::vector<CompilerStructMap> fStructMapVector; @@ -99,7 +96,7 @@ static Int32 kOnClassScope = 0; ///////////////////////////////////////////////////////////////////////////////////////// // Target architecture. -static int kMachine = LibCompiler::AssemblyFactory::kArchAMD64; +static Int32 kMachine = LibCompiler::AssemblyFactory::kArchAMD64; ///////////////////////////////////////// @@ -740,21 +737,12 @@ class AssemblyCPlusPlusInterface final LC_ASSEMBLY_INTERFACE { std::string line_source; while (std::getline(src_fp, line_source)) { - if (kVerbose) { - kStdOut << line_source << std::endl; - kStdOut << line_source.length() << " bytes\n"; - } - kCompilerFrontend->Compile(line_source, src); out_fp << kState.fOutputValue; kState.fOutputValue.clear(); } - if (kVerbose) { - kStdOut << "Done compiling " << src << " to " << dest << "\n"; - } - return kExitOK; } }; @@ -832,7 +820,7 @@ LIBCOMPILER_MODULE(CompilerCPlusPlusAMD64) { kCompilerFrontend = new CompilerFrontendCPlusPlus(); kFactory.Mount(new AssemblyCPlusPlusInterface()); - ::signal(SIGSEGV, Detail::drv_segfault_handler); + ::signal(SIGSEGV, Detail::drvi_crash_handler); for (auto index = 1UL; index < argc; ++index) { if (argv[index][0] == '-') { diff --git a/dev/LibCompiler/src/Linker/DynamicLinkerPEF.cc b/dev/LibCompiler/src/Linker/DynamicLinkerPEF.cc index 0c6f3bf..edfd47a 100644 --- a/dev/LibCompiler/src/Linker/DynamicLinkerPEF.cc +++ b/dev/LibCompiler/src/Linker/DynamicLinkerPEF.cc @@ -101,7 +101,7 @@ static std::vector<Detail::DynamicLinkerBlob> kObjectBytes; LIBCOMPILER_MODULE(DynamicLinker64PEF) { bool is_executable = true; - ::signal(SIGSEGV, Detail::drv_segfault_handler); + ::signal(SIGSEGV, Detail::drvi_crash_handler); /** * @brief parse flags and trigger options. |
