diff options
| author | Amlal El Mahrouss <amlal@nekernel.org> | 2026-01-24 15:31:17 +0100 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal@nekernel.org> | 2026-01-24 15:32:32 +0100 |
| commit | 97868f338a02ad5acd8049f0ba0474d330e11877 (patch) | |
| tree | 34d7642918ea47c899ea2a009384576f41dbb527 /include/CoreRuntimeKit | |
| parent | 41458b7253c524db10088657c930d300fc1b09ca (diff) | |
feat: More runtime improvements for Nectar and NeKernel C++ Runtime.
Signed-off-by: Amlal El Mahrouss <amlal@nekernel.org>
Diffstat (limited to 'include/CoreRuntimeKit')
| -rw-r--r-- | include/CoreRuntimeKit/C++/__abi | 22 | ||||
| -rw-r--r-- | include/CoreRuntimeKit/C++/base_alloc | 43 | ||||
| -rw-r--r-- | include/CoreRuntimeKit/C++/base_exception | 37 | ||||
| -rw-r--r-- | include/CoreRuntimeKit/C++/base_math | 88 | ||||
| -rw-r--r-- | include/CoreRuntimeKit/C++/base_process | 45 | ||||
| -rw-r--r-- | include/CoreRuntimeKit/C++/defines | 81 | ||||
| -rw-r--r-- | include/CoreRuntimeKit/C++/filesystem | 19 | ||||
| -rw-r--r-- | include/CoreRuntimeKit/C++/new | 58 | ||||
| -rw-r--r-- | include/CoreRuntimeKit/C++/utility | 30 | ||||
| -rw-r--r-- | include/CoreRuntimeKit/Nectar/.keep | 0 |
10 files changed, 423 insertions, 0 deletions
diff --git a/include/CoreRuntimeKit/C++/__abi b/include/CoreRuntimeKit/C++/__abi new file mode 100644 index 0000000..c4ec668 --- /dev/null +++ b/include/CoreRuntimeKit/C++/__abi @@ -0,0 +1,22 @@ +/* ======================================== + + Copyright (C) 2024-2025 Amlal El Mahrouss, licensed under the Apache 2.0 license. + +======================================== */ + +#pragma once + +#include <base_process> +#include <defines> + +__init_decl() + + static constexpr int32_t __unreachable_code = 34; + +inline void __compilerkit_unreachable(void) { + std::base_process::signal(__unreachable_code); + + while (1); +} + +__fini_decl() diff --git a/include/CoreRuntimeKit/C++/base_alloc b/include/CoreRuntimeKit/C++/base_alloc new file mode 100644 index 0000000..27d1eb8 --- /dev/null +++ b/include/CoreRuntimeKit/C++/base_alloc @@ -0,0 +1,43 @@ +/* ======================================== + + Copyright (C) 2024-2025 Amlal El Mahrouss, licensed under the Apache 2.0 license. + +======================================== */ + +#pragma once + +#include <defines> + +namespace std::base_alloc { +/// @brief allocate a new class. +/// @tparam KindClass the class type to allocate. +template <class KindClass, typename... Args> +inline KindClass* allocate(Args&&... args) { + return new KindClass(forward(args)...); +} + +/// @brief allocate a new class. +/// @note aborts on error. +/// @tparam KindClass the class type to allocate. +template <class KindClass, typename... Args> +inline KindClass* allocate_nothrow(Args&&... args) noexcept { + return allocate(forward(args)...); +} + +/// @brief free a class. +/// @tparam KindClass the class type to allocate. +template <class KindClass> +inline void release(KindClass ptr) { + if (!ptr) return; + + delete ptr; +} + +/// @brief destroy and free a class. +/// @note aborts on error. +/// @tparam KindClass the class type to allocate. +template <class KindClass> +inline void release_nothrow(KindClass ptr) noexcept { + release(ptr); +} +} // namespace std::base_alloc diff --git a/include/CoreRuntimeKit/C++/base_exception b/include/CoreRuntimeKit/C++/base_exception new file mode 100644 index 0000000..be77479 --- /dev/null +++ b/include/CoreRuntimeKit/C++/base_exception @@ -0,0 +1,37 @@ +/* ======================================== + + Copyright (C) 2024-2025 Amlal El Mahrouss, licensed under the Apache 2.0 license. + +======================================== */ + +#pragma once + +#include <__abi> +#include <base_process> +#include <defines> +#include <iostream> + +/// @author Amlal El Mahrouss (amlal@nekernel.org) + +namespace std::base_exception::abi { +inline constexpr int __terminate_id = 33; + +/// @note This function is internal, don't call it. +extern void __unwind_object_list(); + +inline void __throw_general(const char* what) { + std::cout << "LibC++: Unwinding exception of kind: " << what << ", aborting here..." << std::endl; + __unwind_object_list(); + base_process::exit(__terminate_id); +} + +inline void __throw_domain_error(const char* what) { + __throw_general(what); + __builtin_unreachable(); // prevent from continuing. +} + +inline void __throw_bad_array_new_length(const char* what) { + __throw_general(what); + __builtin_unreachable(); // prevent from continuing. +} +} // namespace std::base_exception::abi diff --git a/include/CoreRuntimeKit/C++/base_math b/include/CoreRuntimeKit/C++/base_math new file mode 100644 index 0000000..a025b62 --- /dev/null +++ b/include/CoreRuntimeKit/C++/base_math @@ -0,0 +1,88 @@ +/* ======================================== + + Copyright (C) 2024-2025 Amlal El Mahrouss, licensed under the Apache 2.0 license. + +======================================== */ + +#pragma once + +#include <defines> + +#ifndef NAN +#define NAN (__builtin_nanf("")) +#endif // !NAN + +/// @file Math +/// @brief Math functions. + +#ifdef __LIBCXX_USE_DOUBLE__ +typedef double real_type; +#else +typedef float real_type; +#endif + +namespace std::base_math { +inline constexpr static auto not_a_number = NAN; + +/// =========================================================== /// +/// @brief Power function, with Repeat argument. +/// =========================================================== /// +template <size_t Exponent> +inline real_type pow(real_type in) { + if (Exponent == 0) return 1; // Any number to the power of 0 is 1. + + if (Exponent == 1) return in; // Any number to the power of 1 is itself. + + size_t cnt = Exponent; + + real_type result = 1; + + for (auto i = 0; i < cnt; ++i) result *= in; + + return result; +} + +/// =========================================================== /// +/// @brief Square root function. +/// =========================================================== /// +inline real_type sqrt(real_type in) { + if (in == 0) return 0; + if (in == not_a_number) return not_a_number; + + auto constexpr const static Base = 2; + + auto x = in / Base; + + for (int i = 0; i < 10; ++i) { + x = (x + in / x) / Base; + } + + return x; +} + +/// =========================================================== /// +/// @brief Square of function, with Base template argument. +/// @param of Base argument to find the square of. +/// =========================================================== /// +template <size_t Base> +inline real_type surd(real_type in) { + if (in == 0) return 0; + if (in == 1) return 1; + + if (Base == 1) return in; + if (Base == 2) return sqrt(in); + + return not_a_number; +} + +/// =========================================================== /// +/// @brief Linear interpolation equation solver. +/// @param from where? +/// @param to to? +/// @param Updated diff value according to difference. +/// =========================================================== /// +inline real_type lerp(real_type to, real_type from, real_type stat) { + real_type diff = (to - from); + return from + (diff * stat); +} +} // namespace std::base_math diff --git a/include/CoreRuntimeKit/C++/base_process b/include/CoreRuntimeKit/C++/base_process new file mode 100644 index 0000000..8fbe7b7 --- /dev/null +++ b/include/CoreRuntimeKit/C++/base_process @@ -0,0 +1,45 @@ +/* ======================================== + + Copyright (C) 2024-2025 Amlal El Mahrouss, licensed under the Apache 2.0 license. + +======================================== */ + +#pragma once + +#include <defines> + +__init_decl() + + /// @brief CRT exit, with exit code (!!! exits all threads. !!!) + /// @param code the exit code. + /// @return the return > 0 for non successful. + extern int exit_(int code); + +/// @brief CRT signal handler. +/// @param code the signal code. +extern void signal_(int code); + +extern void (*__atexit_cdecl_ptr)(void); +extern void (**__atexit_lst_ptr)(void); +extern size_t __atexit_lst_cnt; + +__fini_decl() + + /// @brief Standard C++ namespace + namespace std::base_process { + inline int signal(int code) { + signal_(code); + return -1; + } + + inline int32_t exit(const int32_t& code) { + for (auto idx = 0UL; idx < __atexit_lst_cnt; ++idx) { + __atexit_lst_ptr[idx](); + } + + if (__atexit_cdecl_ptr) __atexit_cdecl_ptr(); + + exit_(code); + return -1; + } +} // namespace std::base_process diff --git a/include/CoreRuntimeKit/C++/defines b/include/CoreRuntimeKit/C++/defines new file mode 100644 index 0000000..d6a5369 --- /dev/null +++ b/include/CoreRuntimeKit/C++/defines @@ -0,0 +1,81 @@ +/* ======================================== + + Copyright (C) 2024-2025 Amlal El Mahrouss, licensed under the Apache 2.0 license. + +======================================== */ + +#ifndef __NECTAR_DEFINES_H__ +#define __NECTAR_DEFINES_H__ + +#define __ATTRIBUTE(X) __attribute__((X)) + +typedef __SIZE_TYPE__ size_t; +typedef __INT64_TYPE__ ssize_t; +typedef __INT32_TYPE__ int32_t; + +typedef void* ptr_type; +typedef __SIZE_TYPE__ size_type; + +typedef __INT64_TYPE__ ptrdiff_t; +typedef size_t uintptr_t; +typedef void* voidptr_t; +typedef void* any_t; +typedef char* caddr_t; + +#ifndef NULL +#define NULL ((voidptr_t) 0) +#endif // !null + +#define __alloca(sz) __ck_alloca(sz) + +#define __deref(ptr) (*(ptr)) + +#ifdef __cplusplus +#define __init_decl() extern "C" { +#define __fini_decl() \ + } \ + ; +#else +#define __init_decl() +#define __fini_decl() +#endif + +#if __has_builtin(__builtin_alloca) +#define alloca(sz) __builtin_alloca(sz) +#ifdef __alloca +#undef __alloca +#endif +#define __alloca alloca +#else +#warning !! alloca not detected !! +#endif + +typedef long long off_t; +typedef unsigned long long uoff_t; + +typedef union float_cast { + struct { + unsigned int mantissa : 23; + unsigned int exponent : 8; + unsigned int sign : 1; + }; + + float f; +} __ATTRIBUTE(packed) float_cast_t; + +typedef union double_cast { + struct { + unsigned long long int mantissa : 52; + unsigned int exponent : 11; + unsigned int sign : 1; + }; + + double f; +} __ATTRIBUTE(packed) double_cast_t; + +namespace std { +struct placement_t; +struct nothrow_t; +} // namespace std + +#endif /* __NECTAR_DEFINES_H__ */ diff --git a/include/CoreRuntimeKit/C++/filesystem b/include/CoreRuntimeKit/C++/filesystem new file mode 100644 index 0000000..46d1310 --- /dev/null +++ b/include/CoreRuntimeKit/C++/filesystem @@ -0,0 +1,19 @@ +/* ======================================== + + Copyright (C) 2024-2025 Amlal El Mahrouss, licensed under the Apache 2.0 license. + +======================================== */ + +#ifndef __NECTAR_FS_H__ +#define __NECTAR_FS_H__ + +#include <defines> + +namespace std { +class path; +class filesystem_error; +class directory_entry; +class directory_iterator; +} // namespace std + +#endif // __NECTAR_FS_H__ diff --git a/include/CoreRuntimeKit/C++/new b/include/CoreRuntimeKit/C++/new new file mode 100644 index 0000000..beb40c3 --- /dev/null +++ b/include/CoreRuntimeKit/C++/new @@ -0,0 +1,58 @@ +/* ======================================== + + Copyright (C) 2025, Amlal El Mahrouss, licensed under the Apache 2.0 license. + +======================================== */ + +#pragma once + +#include <defines> + +namespace std { +struct nothrow_t final { + explicit nothrow_t() = default; + ~nothrow_t() = default; +}; + +struct placement_t final { + explicit placement_t() = default; + ~placement_t() = default; + + void* __base{}; + int32_t __align{}; + size_t __size{}; +}; +} // namespace std + +// AMLALE: Define the placement_t feature. +#ifndef __cpp_has_placement +#define __cpp_has_placement 1 +#endif + +// AMLALE: Define nothrow +#ifndef __cpp_has_nothrow +#define __cpp_has_nothrow 1 +#endif + +void* operator new(size_t); +void* operator new[](size_t); + +/// \brief placement_t new and delete operators. Governs how the memory shall be placed. +/// \note This is a feature that shall be used wisely, failure to do so will produce Undefined Behaviors at runtime. +void* operator _placement_new(size_t); +void operator _placement_delete(void*); + +/// \note This should NOT fail, failure to meet the conditions will cause the program's state to be aborted. +/// \brief Set the placement policy of future memory allocations. +template <class PlaceableType> +void set_placement_policy(const PlaceableType&) noexcept; + +void* operator new(size_t, const nothrow_t&) noexcept; +void* operator new(size_t, void*) noexcept; +void* operator new[](size_t, const nothrow_t&) noexcept; +void* operator new[](size_t, void*) noexcept; + +void operator delete(void*) noexcept; +void operator delete(void*, size_t) noexcept; + +void operator delete[](void*) noexcept; diff --git a/include/CoreRuntimeKit/C++/utility b/include/CoreRuntimeKit/C++/utility new file mode 100644 index 0000000..0ee2735 --- /dev/null +++ b/include/CoreRuntimeKit/C++/utility @@ -0,0 +1,30 @@ +/* ======================================== + + Copyright (C) 2024-2025 Amlal El Mahrouss, licensed under the Apache 2.0 license. + +======================================== */ + +#ifndef LIBCXX_UTILITY_H +#define LIBCXX_UTILITY_H + +namespace std { +/// @brief Forward object. +/// @tparam Args the object type. +/// @param arg the object. +/// @return object's rvalue +template <typename Args> +inline auto forward(Args& arg) -> Args&& { + return static_cast<const Args&&>(arg); +} + +/// @brief Move object. +/// @tparam Args the object type. +/// @param arg the object. +/// @return object's rvalue +template <typename Args> +inline auto move(Args&& arg) -> Args&& { + return static_cast<Args&&>(arg); +} +} // namespace std + +#endif // LIBCXX_UTILITY_H diff --git a/include/CoreRuntimeKit/Nectar/.keep b/include/CoreRuntimeKit/Nectar/.keep new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/include/CoreRuntimeKit/Nectar/.keep |
