77 lines · cpp
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-exception6//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 21using namespace llvm;22 23namespace {24 25std::unique_ptr<Module> parseIR(LLVMContext &Context, const char *IR) {26 SMDiagnostic Err;27 return parseAssemblyString(IR, Err, Context);28}29 30class GCMetadataTest : public ::testing::Test {31protected:32 LLVMContext Context;33 std::unique_ptr<Module> M;34 35public:36 GCMetadataTest()37 : M(parseIR(Context, R"(38%Env = type ptr39 40define void @.main(%Env) gc "shadow-stack" {41 %Root = alloca %Env42 call void @llvm.gcroot( ptr %Root, %Env null )43 unreachable44}45 46define void @g() gc "erlang" {47entry:48 ret void49}50 51declare void @llvm.gcroot(ptr, %Env)52)")) {}53};54 55TEST_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} // namespace77