summaryrefslogtreecommitdiffhomepage
path: root/dev
diff options
context:
space:
mode:
Diffstat (limited to 'dev')
-rw-r--r--dev/LibCompiler/AssemblyInterface.h34
-rw-r--r--dev/LibCompiler/Detail/ClUtils.h2
-rw-r--r--dev/LibCompiler/ErrorID.h1
-rw-r--r--dev/LibCompiler/Parser.h2
-rw-r--r--dev/LibCompiler/src/AssemblyFactory+AssemblyInterface.cc (renamed from dev/LibCompiler/src/AssemblyFactory.cc)4
-rw-r--r--dev/LibCompiler/src/CCompiler64x0.cc10
-rw-r--r--dev/LibCompiler/src/CCompilerARM64.cc8
-rw-r--r--dev/LibCompiler/src/CCompilerPower64.cc8
-rw-r--r--dev/LibCompiler/src/CPlusPlusCompilerAMD64.cc107
9 files changed, 64 insertions, 112 deletions
diff --git a/dev/LibCompiler/AssemblyInterface.h b/dev/LibCompiler/AssemblyInterface.h
index 5450f84..b612962 100644
--- a/dev/LibCompiler/AssemblyInterface.h
+++ b/dev/LibCompiler/AssemblyInterface.h
@@ -13,19 +13,8 @@
#define ASSEMBLY_INTERFACE : public LibCompiler::AssemblyInterface
namespace LibCompiler {
-/// @brief Assembly to binary generator class.
-/// @note This interface creates according to the CPU target of the child class.
-class AssemblyInterface {
- public:
- explicit AssemblyInterface() = default;
- virtual ~AssemblyInterface() = default;
-
- LIBCOMPILER_COPY_DEFAULT(AssemblyInterface);
-
- /// @brief compile to object file.
- /// @note Example C++ -> MASM -> AE object.
- virtual Int32 CompileToFormat(std::string src, Int32 arch) = 0;
-};
+class AssemblyFactory;
+class AssemblyInterface;
/// @brief Simple assembly factory
class AssemblyFactory final {
@@ -37,7 +26,8 @@ class AssemblyFactory final {
public:
enum {
- kArchAMD64,
+ kArchInvalid = 0,
+ kArchAMD64 = 100,
kArch32x0,
kArch64x0,
kArchRISCV,
@@ -55,6 +45,22 @@ class AssemblyFactory final {
AssemblyInterface* fMounted{nullptr};
};
+/// @brief Assembly to binary generator class.
+/// @note This interface creates according to the CPU target of the child class.
+class AssemblyInterface {
+ public:
+ explicit AssemblyInterface() = default;
+ virtual ~AssemblyInterface() = default;
+
+ LIBCOMPILER_COPY_DEFAULT(AssemblyInterface);
+
+ [[maybe_unused]] virtual Int32 Arch() noexcept { return AssemblyFactory::kArchAMD64; }
+
+ /// @brief compile to object file.
+ /// @note Example C++ -> MASM -> AE object.
+ virtual Int32 CompileToFormat(std::string src, Int32 arch) = 0;
+};
+
union NumberCastBase {
NumberCastBase() = default;
~NumberCastBase() = default;
diff --git a/dev/LibCompiler/Detail/ClUtils.h b/dev/LibCompiler/Detail/ClUtils.h
index feb17fc..f47101a 100644
--- a/dev/LibCompiler/Detail/ClUtils.h
+++ b/dev/LibCompiler/Detail/ClUtils.h
@@ -51,7 +51,7 @@ inline void print_warning(std::string reason, std::string file) noexcept {
/// @internal
inline void segfault_handler(std::int32_t _) {
- pfd::notify("LibCompiler", "Driver just crashed, please report this to the developers.");
+ pfd::notify("LibCompiler", "Driver just crashed, please report this on the GitHub issues page.");
std::exit(LIBCOMPILER_EXEC_ERROR);
}
} // namespace Detail
diff --git a/dev/LibCompiler/ErrorID.h b/dev/LibCompiler/ErrorID.h
index 380fa69..45bb393 100644
--- a/dev/LibCompiler/ErrorID.h
+++ b/dev/LibCompiler/ErrorID.h
@@ -21,3 +21,4 @@
#define LIBCOMPILER_INVALID_DATA -35
#define LIBCOMPILER_UNIMPLEMENTED -36
#define LIBCOMPILER_FAT_ERROR -37
+#define LIBCOMPILER_INVALID_ARCH -38
diff --git a/dev/LibCompiler/Parser.h b/dev/LibCompiler/Parser.h
index 64c46d6..6baff7e 100644
--- a/dev/LibCompiler/Parser.h
+++ b/dev/LibCompiler/Parser.h
@@ -26,7 +26,7 @@ class ICompilerFrontend {
//! @brief Compile a syntax tree ouf of the text.
//! Also takes the source file name for metadata.
- virtual bool Compile(std::string text, const std::string file) = 0;
+ virtual bool Compile(std::string text, std::string file) = 0;
//! @brief What language are we dealing with?
virtual const char* Language() { return kInvalidFrontend; }
diff --git a/dev/LibCompiler/src/AssemblyFactory.cc b/dev/LibCompiler/src/AssemblyFactory+AssemblyInterface.cc
index 8fa12a8..11655fb 100644
--- a/dev/LibCompiler/src/AssemblyFactory.cc
+++ b/dev/LibCompiler/src/AssemblyFactory+AssemblyInterface.cc
@@ -18,8 +18,6 @@
*
*/
-#include <iostream>
-
//! @file Asm.cpp
//! @brief AssemblyKit source implementation.
@@ -28,6 +26,8 @@ namespace LibCompiler {
Int32 AssemblyFactory::Compile(std::string sourceFile, const Int32& arch) noexcept {
if (sourceFile.length() < 1 || !fMounted) return LIBCOMPILER_UNIMPLEMENTED;
+ if (arch != fMounted->Arch()) return LIBCOMPILER_INVALID_ARCH;
+
return fMounted->CompileToFormat(sourceFile, arch);
}
diff --git a/dev/LibCompiler/src/CCompiler64x0.cc b/dev/LibCompiler/src/CCompiler64x0.cc
index c100e96..79d32ce 100644
--- a/dev/LibCompiler/src/CCompiler64x0.cc
+++ b/dev/LibCompiler/src/CCompiler64x0.cc
@@ -142,7 +142,7 @@ class CompilerFrontend64x0 final : public LibCompiler::ICompilerFrontend {
LIBCOMPILER_COPY_DEFAULT(CompilerFrontend64x0);
std::string Check(const char* text, const char* file);
- bool Compile(std::string text, const std::string file) override;
+ bool Compile(std::string text, std::string file) override;
const char* Language() override { return "64k C"; }
};
@@ -182,7 +182,7 @@ union double_cast final {
/////////////////////////////////////////////////////////////////////////////////////////
-bool CompilerFrontend64x0::Compile(std::string text_, const std::string file) {
+bool CompilerFrontend64x0::Compile(std::string text_, std::string file) {
std::string text = text_;
bool typeFound = false;
@@ -1051,11 +1051,11 @@ class AssemblyCCInterface final ASSEMBLY_INTERFACE {
LIBCOMPILER_COPY_DEFAULT(AssemblyCCInterface);
- [[maybe_unused]] static Int32 Arch() noexcept { return LibCompiler::AssemblyFactory::kArch64x0; }
+ [[maybe_unused]] Int32 Arch() noexcept override {
+ return LibCompiler::AssemblyFactory::kArch64x0;
+ }
Int32 CompileToFormat(std::string src, Int32 arch) override {
- if (arch != AssemblyCCInterface::Arch()) return 1;
-
if (kCompilerFrontend == nullptr) return 1;
/* @brief copy contents wihtout extension */
diff --git a/dev/LibCompiler/src/CCompilerARM64.cc b/dev/LibCompiler/src/CCompilerARM64.cc
index a992349..a5ddf43 100644
--- a/dev/LibCompiler/src/CCompilerARM64.cc
+++ b/dev/LibCompiler/src/CCompilerARM64.cc
@@ -142,7 +142,7 @@ class CompilerFrontendARM64 final : public LibCompiler::ICompilerFrontend {
LIBCOMPILER_COPY_DEFAULT(CompilerFrontendARM64);
std::string Check(const char* text, const char* file);
- bool Compile(std::string text, const std::string file) override;
+ bool Compile(std::string text, std::string file) override;
const char* Language() override { return "64k C"; }
};
@@ -182,7 +182,7 @@ union double_cast final {
/////////////////////////////////////////////////////////////////////////////////////////
-bool CompilerFrontendARM64::Compile(std::string text, const std::string file) {
+bool CompilerFrontendARM64::Compile(std::string text, std::string file) {
bool typeFound = false;
bool fnFound = false;
@@ -1049,13 +1049,11 @@ class AssemblyCCInterface final ASSEMBLY_INTERFACE {
LIBCOMPILER_COPY_DEFAULT(AssemblyCCInterface);
- [[maybe_unused]] static Int32 Arch() noexcept {
+ [[maybe_unused]] Int32 Arch() noexcept override {
return LibCompiler::AssemblyFactory::kArchAARCH64;
}
Int32 CompileToFormat(std::string src, Int32 arch) override {
- if (arch != AssemblyCCInterface::Arch()) return 1;
-
if (kCompilerFrontend == nullptr) return 1;
/* @brief copy contents wihtout extension */
diff --git a/dev/LibCompiler/src/CCompilerPower64.cc b/dev/LibCompiler/src/CCompilerPower64.cc
index c65f575..f2eba43 100644
--- a/dev/LibCompiler/src/CCompilerPower64.cc
+++ b/dev/LibCompiler/src/CCompilerPower64.cc
@@ -133,7 +133,7 @@ class CompilerFrontendPower64 final : public LibCompiler::ICompilerFrontend {
LIBCOMPILER_COPY_DEFAULT(CompilerFrontendPower64);
std::string Check(const char* text, const char* file);
- bool Compile(std::string text, const std::string file) override;
+ bool Compile(std::string text, std::string file) override;
const char* Language() override { return "POWER C"; }
};
@@ -173,7 +173,7 @@ union double_cast final {
/////////////////////////////////////////////////////////////////////////////////////////
-bool CompilerFrontendPower64::Compile(std::string text_, const std::string file) {
+bool CompilerFrontendPower64::Compile(std::string text_, std::string file) {
std::string text = text_;
bool typeFound = false;
@@ -1069,13 +1069,11 @@ class AssemblyMountpointCLang final ASSEMBLY_INTERFACE {
LIBCOMPILER_COPY_DEFAULT(AssemblyMountpointCLang);
- [[maybe_unused]] static Int32 Arch() noexcept {
+ [[maybe_unused]] Int32 Arch() noexcept override {
return LibCompiler::AssemblyFactory::kArchPowerPC;
}
Int32 CompileToFormat(std::string src, Int32 arch) override {
- if (arch != AssemblyMountpointCLang::Arch()) return 1;
-
if (kCompilerFrontend == nullptr) return 1;
/* @brief copy contents wihtout extension */
diff --git a/dev/LibCompiler/src/CPlusPlusCompilerAMD64.cc b/dev/LibCompiler/src/CPlusPlusCompilerAMD64.cc
index f5e9bf7..344622e 100644
--- a/dev/LibCompiler/src/CPlusPlusCompilerAMD64.cc
+++ b/dev/LibCompiler/src/CPlusPlusCompilerAMD64.cc
@@ -148,7 +148,7 @@ class CompilerFrontendCPlusPlus final : public LibCompiler::ICompilerFrontend {
LIBCOMPILER_COPY_DEFAULT(CompilerFrontendCPlusPlus);
- Boolean Compile(const std::string text, const std::string file) override;
+ Boolean Compile(const std::string text, std::string file) override;
const char* Language() override;
};
@@ -174,7 +174,7 @@ static std::size_t kFunctionEmbedLevel = 0UL;
/// detail namespaces
const char* CompilerFrontendCPlusPlus::Language() {
- return "NeKernel C++";
+ return "AMD64 C++";
}
static std::uintptr_t kOrigin = 0x1000000;
@@ -187,37 +187,15 @@ static std::vector<std::pair<std::string, std::uintptr_t>> kOriginMap;
/////////////////////////////////////////////////////////////////////////////////////////
-Boolean CompilerFrontendCPlusPlus::Compile(std::string text, const std::string file) {
+Boolean CompilerFrontendCPlusPlus::Compile(std::string text, std::string file) {
if (text.empty()) return false;
- // Clean whitespace and tabs
- std::string cleanLine = text;
- cleanLine.erase(std::remove(cleanLine.begin(), cleanLine.end(), '\t'), cleanLine.end());
- cleanLine.erase(0, cleanLine.find_first_not_of(" \r\n"));
- cleanLine.erase(cleanLine.find_last_not_of(" \r\n") + 1);
-
- // Skip empty, doc, or block comment lines
- if (cleanLine.empty() || cleanLine.starts_with("///") || cleanLine.starts_with("//") ||
- cleanLine.starts_with("/*"))
- return false;
-
std::size_t index = 0UL;
std::vector<std::pair<LibCompiler::CompilerKeyword, std::size_t>> keywords_list;
- Boolean found = false;
- static Boolean commentBlock = false;
-
for (auto& keyword : kKeywords) {
if (text.find(keyword.keyword_name) != std::string::npos) {
switch (keyword.keyword_kind) {
- case LibCompiler::kKeywordKindCommentMultiLineStart: {
- commentBlock = true;
- return true;
- }
- case LibCompiler::kKeywordKindCommentMultiLineEnd: {
- commentBlock = false;
- break;
- }
case LibCompiler::kKeywordKindCommentInline: {
break;
}
@@ -239,22 +217,13 @@ Boolean CompilerFrontendCPlusPlus::Compile(std::string text, const std::string f
keywords_list.emplace_back(std::make_pair(keyword, index));
++index;
-
- found = true;
}
}
- if (!found && !commentBlock) {
- for (size_t i = 0; i < text.size(); i++) {
- if (isalnum(text[i])) {
- Detail::print_error("syntax error: " + text, file);
- return NO;
- }
- }
- }
+ auto syntax_tree = LibCompiler::SyntaxLeafList::SyntaxLeaf();
for (auto& keyword : keywords_list) {
- auto syntax_tree = LibCompiler::SyntaxLeafList::SyntaxLeaf();
+ kStdOut << keyword.second;
switch (keyword.first.keyword_kind) {
case LibCompiler::KeywordKind::kKeywordKindClass: {
@@ -408,10 +377,10 @@ Boolean CompilerFrontendCPlusPlus::Compile(std::string text, const std::string f
return fnName == pair.first;
});
- std::stringstream ss;
- ss << std::hex << it->second;
-
if (it != kOriginMap.end()) {
+ std::stringstream ss;
+ ss << std::hex << it->second;
+
syntax_tree.fUserValue = "jmp " + ss.str() + "\n";
kOrigin += 1UL;
}
@@ -506,12 +475,12 @@ Boolean CompilerFrontendCPlusPlus::Compile(std::string text, const std::string f
valueOfVar.erase(i, 1);
}
- constexpr auto cTrueVal = "true";
- constexpr auto cFalseVal = "false";
+ constexpr auto kTrueVal = "true";
+ constexpr auto kFalseVal = "false";
- if (valueOfVar == cTrueVal) {
+ if (valueOfVar == kTrueVal) {
valueOfVar = "1";
- } else if (valueOfVar == cFalseVal) {
+ } else if (valueOfVar == kFalseVal) {
valueOfVar = "0";
}
@@ -620,14 +589,14 @@ Boolean CompilerFrontendCPlusPlus::Compile(std::string text, const std::string f
valueOfVar.erase(valueOfVar.find("\t"), 1);
}
- constexpr auto cTrueVal = "true";
- constexpr auto cFalseVal = "false";
+ constexpr auto kTrueVal = "true";
+ constexpr auto kFalseVal = "false";
/// interpet boolean values, since we're on C++
- if (valueOfVar == cTrueVal) {
+ if (valueOfVar == kTrueVal) {
valueOfVar = "1";
- } else if (valueOfVar == cFalseVal) {
+ } else if (valueOfVar == kFalseVal) {
valueOfVar = "0";
}
@@ -726,16 +695,15 @@ Boolean CompilerFrontendCPlusPlus::Compile(std::string text, const std::string f
}
}
default: {
- break;
+ continue;
}
}
- syntax_tree.fUserData = keyword.first;
-
- kState.fOutputAssembly << syntax_tree.fUserValue;
+ break;
}
lc_compile_ok:
+ kState.fOutputAssembly << syntax_tree.fUserValue;
return true;
}
@@ -754,37 +722,23 @@ class AssemblyCPlusPlusInterface final ASSEMBLY_INTERFACE {
LIBCOMPILER_COPY_DEFAULT(AssemblyCPlusPlusInterface);
- [[maybe_unused]] static Int32 Arch() noexcept { return LibCompiler::AssemblyFactory::kArchAMD64; }
+ [[maybe_unused]] Int32 Arch() noexcept override {
+ return LibCompiler::AssemblyFactory::kArchAMD64;
+ }
Int32 CompileToFormat(std::string src, Int32 arch) override {
- if (arch != AssemblyCPlusPlusInterface::Arch()) return 1;
-
- if (kCompilerFrontend == nullptr) return 1;
+ if (kCompilerFrontend == nullptr) return kExitNO;
/* @brief copy contents wihtout extension */
- std::string src_file = src;
- std::ifstream src_fp = std::ifstream(src_file, std::ios::in);
+ std::ifstream src_fp = std::ifstream(src, std::ios::in);
- const char* cExts[] = kAsmFileExts;
+ std::string dest = src;
+ dest += ".masm";
- std::string dest = src_file;
- dest += cExts[2];
+ std::string line_source;
kState.fOutputAssembly.open(dest);
- if (!kState.fOutputAssembly.good()) return kExitNO;
-
- kState.fOutputAssembly
- << "; Assembler Dialect: AMD64 LibCompiler Assembler. (Generated from C++)\n";
- kState.fOutputAssembly << "; Date: " << LibCompiler::current_date() << "\n"
- << "#bits 64\n#org " << kOrigin << "\n";
-
- // ===================================
- // Parse source file.
- // ===================================
-
- std::string line_source;
-
while (std::getline(src_fp, line_source)) {
kCompilerFrontend->Compile(line_source, src);
}
@@ -951,12 +905,7 @@ LIBCOMPILER_MODULE(CompilerCPlusPlusAMD64) {
return kExitNO;
}
- kStdOut << "CPlusPlusCompilerAMD64: Building: " << argv[index] << std::endl;
-
- if (kFactory.Compile(argv_i, kMachine) != kExitOK) {
- kStdOut << "CPlusPlusCompilerAMD64: Failed to build: " << argv[index] << std::endl;
- return kExitNO;
- }
+ kFactory.Compile(argv_i, kMachine);
}
return kExitOK;