Skip to content

Commit 3b055dc

Browse files
committed
Add unit test
1 parent 4e4afb4 commit 3b055dc

File tree

2 files changed

+77
-0
lines changed

2 files changed

+77
-0
lines changed

llvm/unittests/CodeGen/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ add_llvm_unittest(CodeGenTests
2929
DIETest.cpp
3030
DroppedVariableStatsMIRTest.cpp
3131
DwarfStringPoolEntryRefTest.cpp
32+
GCMetadata.cpp
3233
InstrRefLDVTest.cpp
3334
LowLevelTypeTest.cpp
3435
LexicalScopesTest.cpp

llvm/unittests/CodeGen/GCMetadata.cpp

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
//===- llvm/unittest/CodeGen/GCMetadata.cpp -------------------------------===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
#include "llvm/CodeGen/GCMetadata.h"
10+
#include "llvm/Analysis/CGSCCPassManager.h"
11+
#include "llvm/Analysis/LoopAnalysisManager.h"
12+
#include "llvm/AsmParser/Parser.h"
13+
#include "llvm/IR/Analysis.h"
14+
#include "llvm/IR/LLVMContext.h"
15+
#include "llvm/IR/Module.h"
16+
#include "llvm/IR/PassManager.h"
17+
#include "llvm/Passes/PassBuilder.h"
18+
#include "llvm/Support/SourceMgr.h"
19+
#include "gtest/gtest.h"
20+
21+
using namespace llvm;
22+
23+
namespace {
24+
25+
std::unique_ptr<Module> parseIR(LLVMContext &Context, const char *IR) {
26+
SMDiagnostic Err;
27+
return parseAssemblyString(IR, Err, Context);
28+
}
29+
30+
class GCMetadataTest : public ::testing::Test {
31+
protected:
32+
LLVMContext Context;
33+
std::unique_ptr<Module> M;
34+
35+
public:
36+
GCMetadataTest()
37+
: M(parseIR(Context, R"(
38+
%Env = type ptr
39+
40+
define void @.main(%Env) gc "shadow-stack" {
41+
%Root = alloca %Env
42+
call void @llvm.gcroot( ptr %Root, %Env null )
43+
unreachable
44+
}
45+
46+
define void @g() gc "erlang" {
47+
entry:
48+
ret void
49+
}
50+
51+
declare void @llvm.gcroot(ptr, %Env)
52+
)")) {}
53+
};
54+
55+
TEST_F(GCMetadataTest, Basic) {
56+
LoopAnalysisManager LAM;
57+
FunctionAnalysisManager FAM;
58+
CGSCCAnalysisManager CGAM;
59+
ModuleAnalysisManager MAM;
60+
PassBuilder PB;
61+
PB.registerModuleAnalyses(MAM);
62+
PB.registerCGSCCAnalyses(CGAM);
63+
PB.registerFunctionAnalyses(FAM);
64+
PB.registerLoopAnalyses(LAM);
65+
PB.crossRegisterProxies(LAM, FAM, CGAM, MAM);
66+
67+
ModulePassManager MPM;
68+
FunctionPassManager FPM;
69+
GCStrategyMap &StrategyMap = MAM.getResult<CollectorMetadataAnalysis>(*M);
70+
for (auto &[GCName, Strategy] : StrategyMap)
71+
EXPECT_EQ(GCName, Strategy->getName());
72+
for (auto &[GCName, Strategy] : llvm::reverse(StrategyMap))
73+
EXPECT_EQ(GCName, Strategy->getName());
74+
}
75+
76+
} // namespace

0 commit comments

Comments
 (0)