diff options
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."; -} |
