summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--include/CompilerKit/Utilities/Compiler.h5
-rw-r--r--snippets/.gitkeep (renamed from test/.gitkeep)0
-rw-r--r--snippets/test_snippets/inner.nc (renamed from test/test_samples/inner.nc)0
-rw-r--r--snippets/test_snippets/test_ostream.nc (renamed from test/test_samples/test_ostream.nc)0
-rw-r--r--snippets/test_snippets/test_printf.nc (renamed from test/test_samples/test_printf.nc)0
-rw-r--r--snippets/test_snippets/test_struct.nc (renamed from test/test_samples/test_struct.nc)0
-rw-r--r--src/CompilerKit/src/Assemblers/Assembler+AMD64.cpp14
-rw-r--r--src/CompilerKit/test/Compilers/.gitkeep (renamed from test/test_01_codegen/.gitkeep)0
-rw-r--r--src/CompilerKit/test/Compilers/CMakeLists.txt (renamed from test/test_01_codegen/CMakeLists.txt)2
-rw-r--r--src/CompilerKit/test/Compilers/NectarCodegen.test.cpp20
-rw-r--r--test/test_01_codegen/codegen.test.cc32
-rw-r--r--test/test_02_linker/.gitkeep0
-rw-r--r--test/test_02_linker/CMakeLists.txt23
-rw-r--r--test/test_02_linker/linker.test.cc28
14 files changed, 33 insertions, 91 deletions
diff --git a/include/CompilerKit/Utilities/Compiler.h b/include/CompilerKit/Utilities/Compiler.h
index 5d4c6d9..0c787ba 100644
--- a/include/CompilerKit/Utilities/Compiler.h
+++ b/include/CompilerKit/Utilities/Compiler.h
@@ -25,9 +25,10 @@
#define kRed "\e[0;31m"
#define kWhite "\e[0;97m"
#define kYellow "\e[0;33m"
+#define kBlackOverWhite "\E[0;37m"
-#define kStdOut (std::cout << kRed << "Nectar: " << kWhite)
-#define kStdErr (std::cerr << kRed << "Nectar: " << kWhite)
+#define kStdOut (std::cout << kRed << "Nectar: " << kBlackOverWhite)
+#define kStdErr (std::cerr << kRed << "Nectar: " << kBlackOverWhite)
#define kStdEndl std::endl
#define kPrintF kStdOut
#define kPrintErr kStdErr
diff --git a/test/.gitkeep b/snippets/.gitkeep
index e69de29..e69de29 100644
--- a/test/.gitkeep
+++ b/snippets/.gitkeep
diff --git a/test/test_samples/inner.nc b/snippets/test_snippets/inner.nc
index 5d90b41..5d90b41 100644
--- a/test/test_samples/inner.nc
+++ b/snippets/test_snippets/inner.nc
diff --git a/test/test_samples/test_ostream.nc b/snippets/test_snippets/test_ostream.nc
index 0d0410b..0d0410b 100644
--- a/test/test_samples/test_ostream.nc
+++ b/snippets/test_snippets/test_ostream.nc
diff --git a/test/test_samples/test_printf.nc b/snippets/test_snippets/test_printf.nc
index c29bb05..c29bb05 100644
--- a/test/test_samples/test_printf.nc
+++ b/snippets/test_snippets/test_printf.nc
diff --git a/test/test_samples/test_struct.nc b/snippets/test_snippets/test_struct.nc
index 71a9492..71a9492 100644
--- a/test/test_samples/test_struct.nc
+++ b/snippets/test_snippets/test_struct.nc
diff --git a/src/CompilerKit/src/Assemblers/Assembler+AMD64.cpp b/src/CompilerKit/src/Assemblers/Assembler+AMD64.cpp
index 0acbdb5..536ac27 100644
--- a/src/CompilerKit/src/Assemblers/Assembler+AMD64.cpp
+++ b/src/CompilerKit/src/Assemblers/Assembler+AMD64.cpp
@@ -900,7 +900,7 @@ bool CompilerKit::EncoderAMD64::WriteNumber8(const std::size_t& pos, std::string
/////////////////////////////////////////////////////////////////////////////////////////
-bool CompilerKit::EncoderAMD64::WriteLine(std::string line, std::string file) {
+bool CompilerKit::EncoderAMD64::WriteLine(CompilerKit::STLString line, CompilerKit::STLString file) {
if (CompilerKit::ast_find_needle(line, "public_segment ")) return true;
struct RegMapAMD64 {
@@ -926,7 +926,9 @@ bool CompilerKit::EncoderAMD64::WriteLine(std::string line, std::string file) {
/// Move instruction handler.
if (line.find(name) != std::string::npos) {
- if (name == "mov" || name == "xor") {
+ if ((line.find(name) + name.size()) > line.size()) continue;
+
+ if (name == "mov" || name == "xor") {
std::string substr = line.substr(line.find(name) + name.size());
uint64_t bits = kRegisterBitWidth;
@@ -1165,9 +1167,7 @@ bool CompilerKit::EncoderAMD64::WriteLine(std::string line, std::string file) {
bool hasRBasedRegs = false;
- if (!onlyOneReg) {
- /// very tricky to understand.
- /// but this checks for a r8 through r15 register.
+ if (!onlyOneReg && currentRegList.size() == 2) {
if (currentRegList[0].fName[0] == 'r' || currentRegList[1].fName[0] == 'r') {
if (isdigit(currentRegList[0].fName[1]) && isdigit(currentRegList[1].fName[1])) {
kAppBytes.emplace_back(0x4d);
@@ -1796,10 +1796,13 @@ bool CompilerKit::EncoderAMD64::WriteLine(std::string line, std::string file) {
if (line.find("bits 64") != std::string::npos) {
kRegisterBitWidth = 64U;
+ return true;
} else if (line.find("bits 32") != std::string::npos) {
kRegisterBitWidth = 32U;
+ return true;
} else if (line.find("bits 16") != std::string::npos) {
kRegisterBitWidth = 16U;
+ return true;
}
if (auto org_pos = line.find("org"); org_pos != std::string::npos) {
@@ -1827,6 +1830,7 @@ bool CompilerKit::EncoderAMD64::WriteLine(std::string line, std::string file) {
}
}
}
+
/// write a dword
else if (auto pos = line.find(".dword"); pos != std::string::npos) {
this->WriteNumber32(pos + strlen(".dword") + 1, line);
diff --git a/test/test_01_codegen/.gitkeep b/src/CompilerKit/test/Compilers/.gitkeep
index e69de29..e69de29 100644
--- a/test/test_01_codegen/.gitkeep
+++ b/src/CompilerKit/test/Compilers/.gitkeep
diff --git a/test/test_01_codegen/CMakeLists.txt b/src/CompilerKit/test/Compilers/CMakeLists.txt
index f6b363b..2d1a2f2 100644
--- a/test/test_01_codegen/CMakeLists.txt
+++ b/src/CompilerKit/test/Compilers/CMakeLists.txt
@@ -13,7 +13,7 @@ FetchContent_MakeAvailable(googletest)
enable_testing()
-add_executable(CodegenTestBasic codegen.test.cc)
+add_executable(CodegenTestBasic NectarCodegen.test.cpp)
target_link_libraries(CodegenTestBasic gtest_main)
set_property(TARGET CodegenTestBasic PROPERTY CXX_STANDARD 20)
diff --git a/src/CompilerKit/test/Compilers/NectarCodegen.test.cpp b/src/CompilerKit/test/Compilers/NectarCodegen.test.cpp
new file mode 100644
index 0000000..27a908e
--- /dev/null
+++ b/src/CompilerKit/test/Compilers/NectarCodegen.test.cpp
@@ -0,0 +1,20 @@
+// Copyright 2024-2026, Amlal El Mahrouss (amlal@nekernel.org)
+// Licensed under the Apache License, Version 2.0 (See accompanying
+// file LICENSE or copy at http://www.apache.org/licenses/LICENSE-2.0)
+// Official repository: https://github.com/ne-foss-org/nectar
+
+/// @brief Codegen Unit test, from the C++ unit to the final executable.
+/// @author Amlal El Mahrouss
+
+#include <gtest/gtest.h>
+
+TEST(CodegenTest, BasicCodegenTestGrep) {
+ // Compile C++ source to assembly
+ auto compile_result = std::system("pef-amd64-necdrv ../../../../snippets/test_snippets/inner.nc > /dev/null 2>&1");
+ EXPECT_TRUE(compile_result == 0) << "C++ compiler driver failed to compile sample.cc";
+}
+
+TEST(CodegenTest, BasicCodegenTestAssemble) {
+ auto expr = std::system("pef-amd64-asm ../../../../snippets/test_snippets/inner.masm > /dev/null 2>&1");
+ EXPECT_TRUE(expr == 0) << "ASM Driver did not compile the easy ASM unit.";
+}
diff --git a/test/test_01_codegen/codegen.test.cc b/test/test_01_codegen/codegen.test.cc
deleted file mode 100644
index 10d1f95..0000000
--- a/test/test_01_codegen/codegen.test.cc
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2024-2025, Amlal El Mahrouss (amlal@nekernel.org)
-// Licensed under the Apache License, Version 2.0 (See accompanying
-// file LICENSE or copy at http://www.apache.org/licenses/LICENSE-2.0)
-// Official repository: https://github.com/ne-foss-org/nectar
-
-/// @brief Codegen Unit test, from the C++ unit to the final executable.
-/// @author Amlal El Mahrouss
-
-#include <gtest/gtest.h>
-
-TEST(CodegenTest, BasicCodegenTestGrep) {
- // Compile C++ source to assembly
- auto compile_result = std::system("pef-amd64-cxxdrv ../test_samples/sample.nc > /dev/null 2>&1");
- EXPECT_TRUE(compile_result == 0) << "C++ compiler driver failed to compile sample.cc";
-
- // Grep for expected entry point symbol in generated assembly
- auto grep_main = std::system("grep -q '__NECTAR_main' ../test_samples/sample.nc.masm");
- EXPECT_TRUE(grep_main == 0) << "Generated assembly missing expected entry point __NECTAR_main";
-
- // Grep for return instruction
- auto grep_ret = std::system("grep -q 'ret' ../test_samples/sample.nc.masm");
- EXPECT_TRUE(grep_ret == 0) << "Generated assembly missing return instruction";
-
- // Grep for 64-bit mode directive
- auto grep_bits64 = std::system("grep -q '%bits 64' ../test_samples/sample.nc.masm");
- EXPECT_TRUE(grep_bits64 == 0) << "Generated assembly missing 64-bit mode directive";
-}
-
-TEST(CodegenTest, BasicCodegenTestAssemble) {
- auto expr = std::system("asm -asm-x64 test_samples/sample.asm");
- EXPECT_TRUE(expr == 0) << "ASM Driver did not compile the easy ASM unit.";
-}
diff --git a/test/test_02_linker/.gitkeep b/test/test_02_linker/.gitkeep
deleted file mode 100644
index e69de29..0000000
--- a/test/test_02_linker/.gitkeep
+++ /dev/null
diff --git a/test/test_02_linker/CMakeLists.txt b/test/test_02_linker/CMakeLists.txt
deleted file mode 100644
index 0ad69e0..0000000
--- a/test/test_02_linker/CMakeLists.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-cmake_minimum_required(VERSION 3.10)
-project(NeCTILinkerTest)
-
-include(FetchContent)
-FetchContent_Declare(
- googletest
- URL https://github.com/google/googletest/archive/refs/tags/v1.14.0.zip
-)
-
-# For Windows: Prevent overriding the parent project's compiler/linker settings
-set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
-FetchContent_MakeAvailable(googletest)
-
-enable_testing()
-
-add_executable(LinkerTestBasic linker.test.cc)
-target_link_libraries(LinkerTestBasic gtest_main)
-
-set_property(TARGET LinkerTestBasic PROPERTY CXX_STANDARD 20)
-target_include_directories(LinkerTestBasic PUBLIC ../../)
-
-include(GoogleTest)
-gtest_discover_tests(LinkerTestBasic)
diff --git a/test/test_02_linker/linker.test.cc b/test/test_02_linker/linker.test.cc
deleted file mode 100644
index bade75b..0000000
--- a/test/test_02_linker/linker.test.cc
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2024-2025, Amlal El Mahrouss (amlal@nekernel.org)
-// Licensed under the Apache License, Version 2.0 (See accompanying
-// file LICENSE or copy at http://www.apache.org/licenses/LICENSE-2.0)
-// Official repository: https://github.com/ne-foss-org/nectar
-
-/// @brief Linker Unit test, from the C++ unit to the final executable.
-/// @author Amlal El Mahrouss
-
-#include <gtest/gtest.h>
-
-/// compile
-TEST(LinkerTest, BasicLinkTestCompile) {
- auto expr = std::system("pef-amd64-cxxdrv test_samples/sample.cc");
- EXPECT_TRUE(expr == 0) << "C++ Driver did not compile the easy C++ unit.";
-}
-
-/// assemble
-TEST(LinkerTest, BasicLinkTestAssemble) {
- auto expr = std::system("asm -asm:x64 test_samples/sample.cc.pp.masm");
- EXPECT_TRUE(expr == 0) << "Assembler did not assemble the easy asm unit.";
-}
-
-/// link
-TEST(LinkerTest, BasicLinkTestLink) {
- auto expr = std::system(
- "ld64 -amd64 test_samples/sample.cc.pp.obj -start __NECTAR_main -output main.exec");
- EXPECT_TRUE(expr == 0) << "Linker did not link the easy object.";
-}