GCC Code Coverage Report


Directory: ../
Coverage: low: ≥ 0% medium: ≥ 75.0% high: ≥ 90.0%
Coverage Exec / Excl / Total
Lines: 100.0% 1 / 0 / 1
Functions: 100.0% 1 / 0 / 1
Branches: -% 0 / 0 / 0

src/global/RuntimeModuleManager.h
Line Branch Exec Source
1 // Copyright (c) 2021-2026 ChilliBits. All rights reserved.
2
3 #pragma once
4
5 #include <unordered_map>
6
7 #include <symboltablebuilder/QualType.h>
8
9 namespace spice::compiler {
10
11 // Forward declaration
12 class GlobalResourceManager;
13 class SourceFile;
14 class Scope;
15
16 const char *const STRING_RT_IMPORT_NAME = "__rt_string";
17 const char *const RESULT_RT_IMPORT_NAME = "__rt_result";
18 const char *const ERROR_RT_IMPORT_NAME = "__rt_error";
19 const char *const ERROR_TRACE_RT_IMPORT_NAME = "__rt_error_trace";
20 const char *const MEMORY_RT_IMPORT_NAME = "__rt_memory";
21 const char *const RTTI_RT_IMPORT_NAME = "__rt_rtti";
22 const char *const STACK_TRACE_RT_IMPORT_NAME = "__rt_stack_trace";
23
24 enum RuntimeModule : uint8_t {
25 STRING_RT = 1 << 0,
26 RESULT_RT = 1 << 1,
27 ERROR_RT = 1 << 2,
28 ERROR_TRACE_RT = 1 << 3,
29 MEMORY_RT = 1 << 4,
30 RTTI_RT = 1 << 5,
31 STACK_TRACE_RT = 1 << 6,
32 };
33
34 const std::unordered_map<const char *, RuntimeModule> TYPE_NAME_TO_RT_MODULE_MAPPING = {
35 {STROBJ_NAME, STRING_RT},
36 {RESULTOBJ_NAME, RESULT_RT},
37 {ERROBJ_NAME, ERROR_RT},
38 };
39
40 const std::unordered_map<const char *, RuntimeModule> FCT_NAME_TO_RT_MODULE_MAPPING = {
41 // Memory RT
42 {"sAlloc", MEMORY_RT},
43 {"sAllocUnsafe", MEMORY_RT},
44 {"sRealloc", MEMORY_RT},
45 {"sReallocUnsafe", MEMORY_RT},
46 {"sCopy", MEMORY_RT},
47 {"sCopyUnsafe", MEMORY_RT},
48 {"sMove", MEMORY_RT},
49 {"sDestruct", MEMORY_RT},
50 {"sDealloc", MEMORY_RT},
51 {"sDelete", MEMORY_RT},
52 {"sCompare", MEMORY_RT},
53 // Result RT
54 {"ok", RESULT_RT},
55 {"err", RESULT_RT},
56 // Error Trace RT
57 {"sErrTraceReset", ERROR_TRACE_RT},
58 {"sErrTracePush", ERROR_TRACE_RT},
59 {"sErrTraceDump", ERROR_TRACE_RT},
60 // Stack Trace RT
61 {"sDumpStacktrace", STACK_TRACE_RT},
62 {"sGetStacktrace", STACK_TRACE_RT},
63 };
64
65 // This serves for the compiler to detect if a source file is a specific runtime module
66 const std::unordered_map<RuntimeModule, const char *> IDENTIFYING_TOP_LEVEL_NAMES = {
67 {STRING_RT, STROBJ_NAME}, // String struct
68 {RESULT_RT, RESULTOBJ_NAME}, // Result struct
69 {ERROR_RT, ERROBJ_NAME}, // Error struct
70 {ERROR_TRACE_RT, "sErrTracePush"}, // sErrTracePush function
71 {MEMORY_RT, "sAlloc"}, // sAlloc function
72 {RTTI_RT, TIOBJ_NAME}, // TypeInfo struct
73 {STACK_TRACE_RT, "sDumpStacktrace"}, // sDumpStacktrace function
74 };
75
76 struct ModuleNamePair {
77 const char *const importName;
78 const char *const fileName;
79 };
80
81 class RuntimeModuleManager {
82 public:
83 // Constructors
84 1314 explicit RuntimeModuleManager(GlobalResourceManager &resourceManager) : resourceManager(resourceManager) {}
85
86 // Prevent copy
87 RuntimeModuleManager(const RuntimeModuleManager &) = delete;
88 RuntimeModuleManager &operator=(const RuntimeModuleManager &) = delete;
89
90 // Public methods
91 SourceFile *requestModule(SourceFile *parentSourceFile, RuntimeModule requestedModule);
92 [[nodiscard]] SourceFile *getModule(RuntimeModule requestedModule) const;
93 [[nodiscard]] bool isModuleAvailable(RuntimeModule requestedModule) const;
94
95 private:
96 // Private methods
97 SourceFile *loadModule(SourceFile *parentSourceFile, RuntimeModule requestedModule) const;
98 static ModuleNamePair resolveNamePair(RuntimeModule runtimeModule);
99
100 // Private members
101 GlobalResourceManager &resourceManager;
102 std::unordered_map<RuntimeModule, SourceFile *> modules;
103 };
104
105 } // namespace spice::compiler
106