summaryrefslogtreecommitdiffhomepage
path: root/dev
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal@nekernel.org>2025-05-27 13:22:49 +0200
committerAmlal El Mahrouss <amlal@nekernel.org>2025-05-27 13:22:49 +0200
commitd12204e7302b8f3bd521c782094338733abfded1 (patch)
tree708549c25f71e56b30b4223750adb0c317896fde /dev
parent38f86a6646bd59dc746067caaaa9f933fa9707d4 (diff)
feat!: better crash reporting.
Signed-off-by: Amlal El Mahrouss <amlal@nekernel.org>
Diffstat (limited to 'dev')
-rw-r--r--dev/LibCompiler/Frontend.h2
-rw-r--r--dev/LibCompiler/Util/LCClUtils.h48
-rw-r--r--dev/LibCompiler/Version.h4
-rw-r--r--dev/LibCompiler/src/Asm/Assembler64x0.cc2
-rw-r--r--dev/LibCompiler/src/Asm/AssemblerAMD64.cc2
-rw-r--r--dev/LibCompiler/src/Asm/AssemblerARM64.cc2
-rw-r--r--dev/LibCompiler/src/Asm/AssemblerPowerPC.cc2
-rw-r--r--dev/LibCompiler/src/Cl/CCompiler64x0.cc2
-rw-r--r--dev/LibCompiler/src/Cl/CCompilerARM64.cc2
-rw-r--r--dev/LibCompiler/src/Cl/CCompilerPower64.cc2
-rw-r--r--dev/LibCompiler/src/Cl/CPlusPlusCompilerAMD64.cc26
-rw-r--r--dev/LibCompiler/src/Linker/DynamicLinkerPEF.cc2
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.