brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.0 KiB · a5d8a63 Raw
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