brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.8 KiB · 3e8be11 Raw
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