aboutsummaryrefslogtreecommitdiff
path: root/backend/unittests/CodeGen
diff options
context:
space:
mode:
authorRichard-Qin-X <richard.qin.001@gmail.com>2026-08-01 17:10:33 +0800
committerRichard-Qin-X <richard.qin.001@gmail.com>2026-08-01 17:10:33 +0800
commit77d76b73a614820bf45024b053db376f35b06d10 (patch)
tree122fa035693683366ad51c0d57b7c9c91f5563b5 /backend/unittests/CodeGen
parent85eed8fb2d6563fea750f7b55730c9feaecc5898 (diff)
downloadrcc-project-77d76b73a614820bf45024b053db376f35b06d10.tar.gz
rcc-project-77d76b73a614820bf45024b053db376f35b06d10.tar.xz
[MIR] Add compilation unit reference context
Diffstat (limited to 'backend/unittests/CodeGen')
-rw-r--r--backend/unittests/CodeGen/CMakeLists.txt12
-rw-r--r--backend/unittests/CodeGen/CompilationUnitTest.cpp58
2 files changed, 70 insertions, 0 deletions
diff --git a/backend/unittests/CodeGen/CMakeLists.txt b/backend/unittests/CodeGen/CMakeLists.txt
index b0bdd13..e128d0b 100644
--- a/backend/unittests/CodeGen/CMakeLists.txt
+++ b/backend/unittests/CodeGen/CMakeLists.txt
@@ -2,6 +2,7 @@
set(
RCCBackendCodeGenTestSources
+ CompilationUnitTest.cpp
CoreTypesTest.cpp
InstructionDescriptorTest.cpp
MachineCompilationStatusTest.cpp
@@ -19,6 +20,15 @@ set(
TargetRegisterInfoTest.cpp
)
+add_executable(RCCBackendCodeGenCompilationUnitTests CompilationUnitTest.cpp)
+rcc_backend_configure_target(RCCBackendCodeGenCompilationUnitTests)
+target_link_libraries(RCCBackendCodeGenCompilationUnitTests PRIVATE RCCBackend::CodeGen)
+
+add_test(
+ NAME RCCBackend.CodeGen.CompilationUnit
+ COMMAND RCCBackendCodeGenCompilationUnitTests
+)
+
add_executable(RCCBackendCodeGenCoreTypesTests CoreTypesTest.cpp)
rcc_backend_configure_target(RCCBackendCodeGenCoreTypesTests)
target_link_libraries(RCCBackendCodeGenCoreTypesTests PRIVATE RCCBackend::CodeGen)
@@ -188,6 +198,7 @@ add_test(
)
rcc_backend_register_format_files(
+ "${CMAKE_CURRENT_SOURCE_DIR}/CompilationUnitTest.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/CoreTypesTest.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/InstructionDescriptorTest.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/MachineCompilationStatusTest.cpp"
@@ -205,6 +216,7 @@ rcc_backend_register_format_files(
"${CMAKE_CURRENT_SOURCE_DIR}/TargetRegisterInfoTest.cpp"
)
rcc_backend_register_tidy_files(
+ "${CMAKE_CURRENT_SOURCE_DIR}/CompilationUnitTest.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/CoreTypesTest.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/InstructionDescriptorTest.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/MachineCompilationStatusTest.cpp"
diff --git a/backend/unittests/CodeGen/CompilationUnitTest.cpp b/backend/unittests/CodeGen/CompilationUnitTest.cpp
new file mode 100644
index 0000000..39cd175
--- /dev/null
+++ b/backend/unittests/CodeGen/CompilationUnitTest.cpp
@@ -0,0 +1,58 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "rcc/CodeGen/CompilationUnit.h"
+
+#include "rcc/CodeGen/MachineFunction.h"
+
+#include <iostream>
+#include <utility>
+
+namespace {
+
+int fail(const char *Message) {
+ std::cerr << Message << '\n';
+ return 1;
+}
+
+} // namespace
+
+int main() {
+ rcc::CompilationUnit Unit;
+ auto Empty = Unit.createMachineFunction("");
+ if (Empty || Unit.functionCount() != 0)
+ return fail("CompilationUnit must reject an empty function name atomically");
+
+ auto First = Unit.createMachineFunction("first");
+ if (!First || (*First)->stableID().value() != 1)
+ return fail("CompilationUnit must allocate the first stable function identity");
+
+ auto Duplicate = Unit.createMachineFunction("first");
+ if (Duplicate || Unit.functionCount() != 1)
+ return fail("CompilationUnit must reject duplicate function names atomically");
+
+ auto Second = Unit.createMachineFunction("second");
+ if (!Second || (*Second)->stableID().value() != 2)
+ return fail("Rejected function creation must not consume a StableID");
+ if (Unit.functionCount() != 2 || Unit.functionAt(0) != *First || Unit.functionAt(1) != *Second)
+ return fail("CompilationUnit must preserve function document order");
+ if (Unit.function("first") != *First || Unit.function("missing") != nullptr)
+ return fail("CompilationUnit must provide exact name lookup");
+ if (Unit.function((*Second)->stableID()) != *Second ||
+ Unit.function(rcc::MachineFunctionStableID::fromValue(99)) != nullptr)
+ return fail("CompilationUnit must provide exact StableID lookup");
+ if (Unit.functionAt(2) != nullptr)
+ return fail("CompilationUnit must reject an out-of-range ordered lookup");
+
+ auto Verification = Unit.verify();
+ if (!Verification)
+ return fail("A valid CompilationUnit must pass verification");
+
+ rcc::CompilationUnit Moved = std::move(Unit);
+ if (Moved.functionCount() != 2 || Moved.function("first") != *First ||
+ Moved.function("second") != *Second)
+ return fail("Moving a CompilationUnit must preserve owned function addresses and indices");
+ Verification = Moved.verify();
+ if (!Verification)
+ return fail("A moved CompilationUnit must pass verification");
+ return 0;
+}