diff options
Diffstat (limited to 'dev/CompilerKit')
22 files changed, 115 insertions, 57 deletions
diff --git a/dev/CompilerKit/AE.h b/dev/CompilerKit/AE.h index 1c334ad..30f07c1 100644 --- a/dev/CompilerKit/AE.h +++ b/dev/CompilerKit/AE.h @@ -7,7 +7,8 @@ * ======================================================== */ -#pragma once +#ifndef _NECTI_AE_H_ +#define _NECTI_AE_H_ #include <CompilerKit/Defines.h> @@ -131,3 +132,5 @@ class AEReadableProtocol final { } }; } // namespace CompilerKit::Utils + +#endif /* ifndef _NECTI_AE_H_ */
\ No newline at end of file diff --git a/dev/CompilerKit/PEF.h b/dev/CompilerKit/PEF.h index a997f17..db317fa 100644 --- a/dev/CompilerKit/PEF.h +++ b/dev/CompilerKit/PEF.h @@ -41,7 +41,7 @@ #define kPefStart "__ImageStart" namespace CompilerKit { - /* @brief Architecture type. */ +/* @brief Architecture type. */ enum { kPefArchIntel86S, kPefArchAMD64, @@ -54,10 +54,10 @@ enum { kPefArchInvalid = 0xFF, }; - /* @brief Architecture vendor. */ +/* @brief Architecture vendor. */ enum { kPefSubArchGeneric = 0, - kPefSubArchAMD = 200, + kPefSubArchAMD = 200, kPefSubArchIntel, kPefSubArchARM, kPefSubArchIBM, @@ -65,11 +65,11 @@ enum { enum { kPefKindInvalid = 0, - kPefKindExec = 1, /* .exec */ - kPefKindDylib = 2, /* .dylib */ - kPefKindObject = 4, /* .obj */ - kPefKindDebug = 5, /* .dbg */ - kPefKindDriver = 6, + kPefKindExec = 1, /* .exec */ + kPefKindDylib = 2, /* .dylib */ + kPefKindObject = 4, /* .obj */ + kPefKindDebug = 5, /* .dbg */ + kPefKindDriver = 6, kPefKindCount, }; @@ -93,7 +93,7 @@ typedef struct PEFContainer final { /* PEF executable section and commands. */ - /* @brief Command Header, a la Mach-O, designed with FAT binaries and virtual memory in mind. */ +/* @brief Command Header, a la Mach-O, designed with FAT binaries and virtual memory in mind. */ typedef struct PEFCommandHeader final { Char Name[kPefNameLen]; /* container name */ UInt32 Cpu; /* container cpu */ @@ -102,8 +102,8 @@ typedef struct PEFCommandHeader final { UInt16 Kind; /* container kind */ UIntPtr Offset; /* File offset */ SizeType OffsetSize; - UIntPtr VirtualAddress; /* Virtual Address */ - SizeType VirtualSize; /* Virtual Size */ + UIntPtr VirtualAddress; /* Virtual Address */ + SizeType VirtualSize; /* Virtual Size */ } PACKED PEFCommandHeader, *PEFCommandHeaderPtr; enum { diff --git a/dev/CompilerKit/StringKit.h b/dev/CompilerKit/StringKit.h index fce1e04..422d163 100644 --- a/dev/CompilerKit/StringKit.h +++ b/dev/CompilerKit/StringKit.h @@ -80,7 +80,7 @@ struct StringBuilder final { static BOOL Equals(const char* lhs, const char* rhs); }; -using BasicStringOr = ErrorOr<BasicString>; +using BasicStringOr = ErrorOr<BasicString>; using BasicStringPtr = BasicString*; using BasicStringRef = Ref<BasicString>; } // namespace CompilerKit diff --git a/dev/CompilerKit/UUID.h b/dev/CompilerKit/UUID.h index d54eec7..39db276 100644 --- a/dev/CompilerKit/UUID.h +++ b/dev/CompilerKit/UUID.h @@ -172,7 +172,7 @@ namespace Detail { process_byte(static_cast<unsigned char>((bitCount >> 24) & 0xFF)); process_byte(static_cast<unsigned char>((bitCount >> 16) & 0xFF)); process_byte(static_cast<unsigned char>((bitCount >> 8) & 0xFF)); - process_byte(static_cast<unsigned char>((bitCount) & 0xFF)); + process_byte(static_cast<unsigned char>((bitCount) &0xFF)); memcpy(digest, m_digest, 5 * sizeof(uint32_t)); return digest; diff --git a/dev/CompilerKit/ck-osx-san.json b/dev/CompilerKit/ck-osx-san.json index f190db2..df1c36b 100644 --- a/dev/CompilerKit/ck-osx-san.json +++ b/dev/CompilerKit/ck-osx-san.json @@ -5,7 +5,8 @@ "../CompilerKit", "../", "../CompilerKit/src/", - "../CompilerKit/src/impl" + "../CompilerKit/src/impl", + "/opt/homebrew/Cellar/boost/1.87.0/include" ], "sources_path": [ "src/*.cc", diff --git a/dev/CompilerKit/ck-osx.json b/dev/CompilerKit/ck-osx.json index 4880763..cab0221 100644 --- a/dev/CompilerKit/ck-osx.json +++ b/dev/CompilerKit/ck-osx.json @@ -5,7 +5,8 @@ "../CompilerKit", "../", "../CompilerKit/src/", - "../CompilerKit/src/impl" + "../CompilerKit/src/impl", + "/opt/homebrew/Cellar/boost/1.87.0/include" ], "sources_path": [ "src/*.cc", diff --git a/dev/CompilerKit/detail/32x0.h b/dev/CompilerKit/impl/32x0.h index f2d30e4..635833e 100644 --- a/dev/CompilerKit/detail/32x0.h +++ b/dev/CompilerKit/impl/32x0.h @@ -9,7 +9,7 @@ #include <CompilerKit/Defines.h> // @brief Open32x0 support. -// @file detail/32x0.h +// @file impl/32x0.h #define CK_ASM_OPCODE(__NAME, __OPCODE, __FUNCT3, __FUNCT7) \ {.fName = __NAME, .fOpcode = __OPCODE, .fFunct3 = __FUNCT3, .fFunct7 = __FUNCT7}, diff --git a/dev/CompilerKit/detail/64x0.h b/dev/CompilerKit/impl/64x0.h index 9c12ca5..116c5ae 100644 --- a/dev/CompilerKit/detail/64x0.h +++ b/dev/CompilerKit/impl/64x0.h @@ -10,7 +10,7 @@ #include <vector> // @brief Open64x0 support. -// @file detail/64x0.h +// @file impl/64x0.h #define CK_ASM_OPCODE(__NAME, __OPCODE, __FUNCT3, __FUNCT7) \ {.fName = __NAME, .fOpcode = __OPCODE, .fFunct3 = __FUNCT3, .fFunct7 = __FUNCT7}, diff --git a/dev/CompilerKit/detail/Aarch64.h b/dev/CompilerKit/impl/Aarch64.h index 528a993..939235f 100644 --- a/dev/CompilerKit/detail/Aarch64.h +++ b/dev/CompilerKit/impl/Aarch64.h @@ -10,7 +10,7 @@ Copyright (C) 2024-2025 Amlal EL Mahrouss, all rights reserved #include <stdint.h> /// @brief ARM64 encoding support. -/// @file detail/Aarch64.h +/// @file impl/Aarch64.h struct CpuOpcodeArm64; diff --git a/dev/CompilerKit/detail/PowerPC.h b/dev/CompilerKit/impl/PowerPC.h index 03aea49..03aea49 100644 --- a/dev/CompilerKit/detail/PowerPC.h +++ b/dev/CompilerKit/impl/PowerPC.h diff --git a/dev/CompilerKit/detail/X64.h b/dev/CompilerKit/impl/X64.h index ed995be..3e9c840 100644 --- a/dev/CompilerKit/detail/X64.h +++ b/dev/CompilerKit/impl/X64.h @@ -9,7 +9,7 @@ #include <CompilerKit/Defines.h> // @brief AMD64 support. -// @file detail/X64.h +// @file impl/X64.h #define CK_ASM_OPCODE(__NAME, __OPCODE) {.fName = __NAME, .fOpcode = __OPCODE}, diff --git a/dev/CompilerKit/src/Backend/Assembler32x0.cc b/dev/CompilerKit/src/Backend/Assembler32x0.cc index 8478930..5534f59 100644 --- a/dev/CompilerKit/src/Backend/Assembler32x0.cc +++ b/dev/CompilerKit/src/Backend/Assembler32x0.cc @@ -24,7 +24,7 @@ #include <CompilerKit/AE.h> #include <CompilerKit/Frontend.h> #include <CompilerKit/PEF.h> -#include <CompilerKit/detail/32x0.h> +#include <CompilerKit/impl/32x0.h> #include <CompilerKit/utils/CompilerUtils.h> ///////////////////////////////////////////////////////////////////////////////////////// diff --git a/dev/CompilerKit/src/Backend/Assembler64x0.cc b/dev/CompilerKit/src/Backend/Assembler64x0.cc index c2dd31c..7aa991b 100644 --- a/dev/CompilerKit/src/Backend/Assembler64x0.cc +++ b/dev/CompilerKit/src/Backend/Assembler64x0.cc @@ -24,7 +24,7 @@ #include <CompilerKit/AE.h> #include <CompilerKit/Frontend.h> #include <CompilerKit/PEF.h> -#include <CompilerKit/detail/64x0.h> +#include <CompilerKit/impl/64x0.h> #include <CompilerKit/utils/CompilerUtils.h> #include <algorithm> #include <filesystem> diff --git a/dev/CompilerKit/src/Backend/AssemblerAMD64.cc b/dev/CompilerKit/src/Backend/AssemblerAMD64.cc index 7e21c93..2e5f58f 100644 --- a/dev/CompilerKit/src/Backend/AssemblerAMD64.cc +++ b/dev/CompilerKit/src/Backend/AssemblerAMD64.cc @@ -31,7 +31,7 @@ #include <CompilerKit/AE.h> #include <CompilerKit/Frontend.h> #include <CompilerKit/PEF.h> -#include <CompilerKit/detail/X64.h> +#include <CompilerKit/impl/X64.h> #include <algorithm> #include <cstdlib> #include <filesystem> diff --git a/dev/CompilerKit/src/Backend/AssemblerARM64.cc b/dev/CompilerKit/src/Backend/AssemblerARM64.cc index ec0f16b..fb03da8 100644 --- a/dev/CompilerKit/src/Backend/AssemblerARM64.cc +++ b/dev/CompilerKit/src/Backend/AssemblerARM64.cc @@ -24,7 +24,7 @@ #include <CompilerKit/Frontend.h> #include <CompilerKit/PEF.h> #include <CompilerKit/Version.h> -#include <CompilerKit/detail/Aarch64.h> +#include <CompilerKit/impl/Aarch64.h> #include <CompilerKit/utils/AsmUtils.h> #include <algorithm> #include <filesystem> diff --git a/dev/CompilerKit/src/Backend/AssemblerPowerPC.cc b/dev/CompilerKit/src/Backend/AssemblerPowerPC.cc index 3282ccb..ffcc102 100644 --- a/dev/CompilerKit/src/Backend/AssemblerPowerPC.cc +++ b/dev/CompilerKit/src/Backend/AssemblerPowerPC.cc @@ -24,7 +24,7 @@ #include <CompilerKit/Frontend.h> #include <CompilerKit/PEF.h> #include <CompilerKit/Version.h> -#include <CompilerKit/detail/PowerPC.h> +#include <CompilerKit/impl/PowerPC.h> #include <CompilerKit/utils/AsmUtils.h> #include <algorithm> #include <filesystem> diff --git a/dev/CompilerKit/src/Frontend/CCompiler64x0.cc b/dev/CompilerKit/src/Frontend/CCompiler64x0.cc index de76807..c23f255 100644 --- a/dev/CompilerKit/src/Frontend/CCompiler64x0.cc +++ b/dev/CompilerKit/src/Frontend/CCompiler64x0.cc @@ -12,7 +12,7 @@ #include <CompilerKit/Frontend.h> #include <CompilerKit/UUID.h> -#include <CompilerKit/detail/64x0.h> +#include <CompilerKit/impl/64x0.h> #include <CompilerKit/utils/CompilerUtils.h> #include <cstdio> #include <fstream> diff --git a/dev/CompilerKit/src/Frontend/CCompilerARM64.cc b/dev/CompilerKit/src/Frontend/CCompilerARM64.cc index 9cfc019..88e2113 100644 --- a/dev/CompilerKit/src/Frontend/CCompilerARM64.cc +++ b/dev/CompilerKit/src/Frontend/CCompilerARM64.cc @@ -12,7 +12,7 @@ #include <CompilerKit/Frontend.h> #include <CompilerKit/UUID.h> -#include <CompilerKit/detail/Aarch64.h> +#include <CompilerKit/impl/Aarch64.h> #include <CompilerKit/utils/CompilerUtils.h> #include <cstdio> diff --git a/dev/CompilerKit/src/Frontend/CCompilerPower64.cc b/dev/CompilerKit/src/Frontend/CCompilerPower64.cc index 1888ed0..39bb58c 100644 --- a/dev/CompilerKit/src/Frontend/CCompilerPower64.cc +++ b/dev/CompilerKit/src/Frontend/CCompilerPower64.cc @@ -9,7 +9,7 @@ #include <CompilerKit/Frontend.h> #include <CompilerKit/UUID.h> -#include <CompilerKit/detail/PowerPC.h> +#include <CompilerKit/impl/PowerPC.h> #include <CompilerKit/utils/CompilerUtils.h> #include <cstdio> #include <fstream> diff --git a/dev/CompilerKit/src/Frontend/CPlusPlusCompilerAMD64.cc b/dev/CompilerKit/src/Frontend/CPlusPlusCompilerAMD64.cc index c92f2e2..19bbe91 100644 --- a/dev/CompilerKit/src/Frontend/CPlusPlusCompilerAMD64.cc +++ b/dev/CompilerKit/src/Frontend/CPlusPlusCompilerAMD64.cc @@ -18,7 +18,7 @@ #include <CompilerKit/Frontend.h> #include <CompilerKit/PEF.h> #include <CompilerKit/UUID.h> -#include <CompilerKit/detail/X64.h> +#include <CompilerKit/impl/X64.h> #include <CompilerKit/utils/CompilerUtils.h> #include <csignal> #include <cstdlib> diff --git a/dev/CompilerKit/src/Linker/DynamicLinker64PEF.cc b/dev/CompilerKit/src/Linker/DynamicLinker64PEF.cc index 04dda25..617ee03 100644 --- a/dev/CompilerKit/src/Linker/DynamicLinker64PEF.cc +++ b/dev/CompilerKit/src/Linker/DynamicLinker64PEF.cc @@ -41,7 +41,10 @@ /// @brief PEF stack size symbol. #define kLinkerStackSizeSymbol "__PEFSizeOfReserveStack" -#define kConsoleOut (std::cout << "\e[0;31m" << "ld64: " << "\e[0;97m") +#define kConsoleOut \ + (std::cout << "\e[0;31m" \ + << "ld64: " \ + << "\e[0;97m") enum { kABITypeNull = 0, @@ -309,13 +312,13 @@ NECTI_MODULE(DynamicLinker64PEF) { } ld_mark_header: - command_header.Offset = offset_of_obj; - command_header.Kind = ae_records[ae_record_index].fKind; - command_header.VirtualSize = ae_records[ae_record_index].fSize; - command_header.Cpu = hdr.fArch; + command_header.Offset = offset_of_obj; + command_header.Kind = ae_records[ae_record_index].fKind; + command_header.VirtualSize = ae_records[ae_record_index].fSize; + command_header.Cpu = hdr.fArch; command_header.VirtualAddress = org; - command_header.SubCpu = hdr.fSubArch; - command_header.OffsetSize = ae_records[ae_record_index].fSize; + command_header.SubCpu = hdr.fSubArch; + command_header.OffsetSize = ae_records[ae_record_index].fSize; org += command_header.VirtualSize; @@ -378,8 +381,7 @@ NECTI_MODULE(DynamicLinker64PEF) { cmd_hdr_name = command_hdr.Name; - if (auto it = std::find(not_found.begin(), not_found.end(), - cmd_hdr_name); + if (auto it = std::find(not_found.begin(), not_found.end(), cmd_hdr_name); it == not_found.end()) { not_found.emplace_back(cmd_hdr_name); } @@ -440,7 +442,8 @@ NECTI_MODULE(DynamicLinker64PEF) { << ", you may have forget to link " "against the C++ runtime library.\n"; - kConsoleOut << "Undefined entrypoint " << kLinkerStart << " for executable: " << kOutput << "\n"; + kConsoleOut << "Undefined entrypoint " << kLinkerStart << " for executable: " << kOutput + << "\n"; } // step 4: write all PEF commands. @@ -454,10 +457,10 @@ NECTI_MODULE(DynamicLinker64PEF) { strncpy(date_cmd_hdr.Name, timeStampStr.c_str(), timeStampStr.size()); - date_cmd_hdr.Flags = 0; - date_cmd_hdr.Kind = CompilerKit::kPefZero; - date_cmd_hdr.Offset = output_fc.tellp(); - date_cmd_hdr.VirtualSize = timeStampStr.size(); + date_cmd_hdr.Flags = 0; + date_cmd_hdr.Kind = CompilerKit::kPefZero; + date_cmd_hdr.Offset = output_fc.tellp(); + date_cmd_hdr.VirtualSize = timeStampStr.size(); command_headers.push_back(date_cmd_hdr); @@ -487,19 +490,19 @@ NECTI_MODULE(DynamicLinker64PEF) { std::memcpy(abi_cmd_hdr.Name, abi.c_str(), abi.size()); - abi_cmd_hdr.VirtualSize = abi.size(); - abi_cmd_hdr.Offset = output_fc.tellp(); - abi_cmd_hdr.Flags = 0; - abi_cmd_hdr.Kind = CompilerKit::kPefLinkerID; + abi_cmd_hdr.VirtualSize = abi.size(); + abi_cmd_hdr.Offset = output_fc.tellp(); + abi_cmd_hdr.Flags = 0; + abi_cmd_hdr.Kind = CompilerKit::kPefLinkerID; command_headers.push_back(abi_cmd_hdr); CompilerKit::PEFCommandHeader stack_cmd_hdr{0}; - stack_cmd_hdr.Cpu = kArch; - stack_cmd_hdr.Flags = 0; - stack_cmd_hdr.VirtualSize = sizeof(uintptr_t); - stack_cmd_hdr.Offset = 0; + stack_cmd_hdr.Cpu = kArch; + stack_cmd_hdr.Flags = 0; + stack_cmd_hdr.VirtualSize = sizeof(uintptr_t); + stack_cmd_hdr.Offset = 0; std::memcpy(stack_cmd_hdr.Name, kLinkerStackSizeSymbol, strlen(kLinkerStackSizeSymbol)); @@ -521,10 +524,10 @@ NECTI_MODULE(DynamicLinker64PEF) { std::memcpy(uuid_cmd_hdr.Name, "Container:GUID:4:", strlen("Container:GUID:4:")); std::memcpy(uuid_cmd_hdr.Name + strlen("Container:GUID:4:"), uuidStr.c_str(), uuidStr.size()); - uuid_cmd_hdr.VirtualSize = strlen(uuid_cmd_hdr.Name); - uuid_cmd_hdr.Offset = output_fc.tellp(); - uuid_cmd_hdr.Flags = CompilerKit::kPefLinkerID; - uuid_cmd_hdr.Kind = CompilerKit::kPefZero; + uuid_cmd_hdr.VirtualSize = strlen(uuid_cmd_hdr.Name); + uuid_cmd_hdr.Offset = output_fc.tellp(); + uuid_cmd_hdr.Flags = CompilerKit::kPefLinkerID; + uuid_cmd_hdr.Kind = CompilerKit::kPefZero; command_headers.push_back(uuid_cmd_hdr); @@ -589,8 +592,8 @@ NECTI_MODULE(DynamicLinker64PEF) { if (kVerbose) { kConsoleOut << "Command name: " << name << "\n"; - kConsoleOut << "VirtualAddress of command content: " << command_headers[commandHeaderIndex].Offset - << "\n"; + kConsoleOut << "VirtualAddress of command content: " + << command_headers[commandHeaderIndex].Offset << "\n"; } output_fc << command_headers[commandHeaderIndex]; diff --git a/dev/CompilerKit/utils/DylibHelpers.h b/dev/CompilerKit/utils/DylibHelpers.h index 1ae7c03..31e0b68 100644 --- a/dev/CompilerKit/utils/DylibHelpers.h +++ b/dev/CompilerKit/utils/DylibHelpers.h @@ -7,7 +7,57 @@ #pragma once #include <CompilerKit/Defines.h> +#include <mutex> #include <dlfcn.h> +struct CompilerKitDylibTraits; + typedef Int32 (*CompilerKitEntrypoint)(Int32 argc, Char const* argv[]); typedef VoidPtr CompilerKitDylib; + +struct CompilerKitDylibTraits final { + CompilerKitDylib fDylib{nullptr}; + CompilerKitEntrypoint fEntrypoint{nullptr}; + std::mutex fMutex; + + CompilerKitDylibTraits& operator()(const Char* path, const Char* fEntrypoint) { + std::lock_guard<std::mutex> lock(this->fMutex); + + if (!path || !fEntrypoint) return *this; + + if (this->fDylib) { + dlclose(this->fDylib); + this->fDylib = nullptr; + } + + this->fDylib = dlopen(path, RTLD_LAZY); + + if (!this->fDylib) { + return *this; + } + + this->fEntrypoint = (CompilerKitEntrypoint)dlsym(this->fDylib, fEntrypoint); + + if (!this->fEntrypoint) { + dlclose(this->fDylib); + this->fDylib = nullptr; + + return *this; + } + + return *this; + } + + NECTI_COPY_DELETE(CompilerKitDylibTraits); + + CompilerKitDylibTraits() = default; + + ~CompilerKitDylibTraits() { + if (this->fDylib) { + dlclose(this->fDylib); + this->fDylib = nullptr; + } + + this->fEntrypoint = nullptr; + } +}; |
