91 lines · cpp
1//===----------------------------------------------------------------------===//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 "Plugin/CodeGenTestPass.h"10 11#include "llvm/CodeGen/MachineModuleInfo.h"12#include "llvm/CodeGen/Passes.h"13#include "llvm/CodeGen/TargetPassConfig.h"14#include "llvm/Config/config.h"15#include "llvm/IR/LegacyPassManager.h"16#include "llvm/MC/TargetRegistry.h"17#include "llvm/Support/DynamicLibrary.h"18#include "llvm/Support/FileSystem.h"19#include "llvm/Support/Path.h"20#include "llvm/Support/TargetSelect.h"21#include "llvm/Target/RegisterTargetPassConfigCallback.h"22#include "llvm/Target/TargetMachine.h"23 24#include "gtest/gtest.h"25 26using namespace llvm;27 28namespace llvm {29class CGPluginTests : public testing::Test {30protected:31 static void SetUpTestCase() {32 InitializeAllTargetMCs();33 InitializeAllTargetInfos();34 InitializeAllTargets();35 }36};37} // namespace llvm38 39TEST_F(CGPluginTests, LoadPlugin) {40#if !defined(LLVM_ENABLE_PLUGINS)41 // Skip the test if plugins are disabled.42 GTEST_SKIP();43#endif44 45 auto PluginPath{std::string{"CGTestPlugin"} + LLVM_PLUGIN_EXT};46 47 std::string Error;48 auto Library = sys::DynamicLibrary::getLibrary(PluginPath.c_str(), &Error);49 ASSERT_TRUE(Library.isValid()) << Error;50 sys::DynamicLibrary::closeLibrary(Library);51}52 53TEST_F(CGPluginTests, ExecuteCallback) {54#if !defined(LLVM_ENABLE_PLUGINS)55 // Skip the test if plugins are disabled.56 GTEST_SKIP();57#endif58 59 volatile bool CallbackExecuted = false;60 volatile bool MPassExecuted = false;61 62 RegisterTargetPassConfigCallback X{[&](auto &TM, auto &PM, auto *TPC) {63 CallbackExecuted = true;64 TPC->insertPass(&GCLoweringID, &CodeGenTest::ID);65 }};66 67 CodeGenTest::RunCallback = [&] { MPassExecuted = true; };68 69 TargetOptions Options;70 std::unique_ptr<MCContext> MCC;71 for (auto T : TargetRegistry::targets()) {72 if (!T.hasTargetMachine())73 continue;74 Triple TT{T.getName(), "", ""};75 auto *TM = T.createTargetMachine(TT, "", "", Options, std::nullopt,76 std::nullopt, CodeGenOptLevel::Default);77 ASSERT_TRUE(TM);78 79 legacy::PassManager PM;80 MCC.reset(new MCContext(TT, TM->getMCAsmInfo(), TM->getMCRegisterInfo(),81 TM->getMCSubtargetInfo()));82 auto *PtrMCC = MCC.get();83 CallbackExecuted = false;84 MPassExecuted = false;85 if (TM->addPassesToEmitMC(PM, PtrMCC, outs()) == true)86 continue;87 ASSERT_TRUE(CallbackExecuted) << T.getName() << " callback failed";88 ASSERT_TRUE(MPassExecuted) << T.getName() << " MachinePass failed";89 }90}91