54 lines · cpp
1//===- PassInstrumentation.cpp - Pass Instrumentation interface -*- C++ -*-===//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/// \file9///10/// This file provides the implementation of PassInstrumentation class.11///12//===----------------------------------------------------------------------===//13 14#include "llvm/IR/PassInstrumentation.h"15#include "llvm/ADT/STLExtras.h"16#include "llvm/IR/PassManager.h"17 18using namespace llvm;19 20template struct LLVM_EXPORT_TEMPLATE Any::TypeId<const Module *>;21template struct LLVM_EXPORT_TEMPLATE Any::TypeId<const Function *>;22template struct LLVM_EXPORT_TEMPLATE Any::TypeId<const Loop *>;23 24void PassInstrumentationCallbacks::addClassToPassName(StringRef ClassName,25 StringRef PassName) {26 assert(!PassName.empty() && "PassName can't be empty!");27 ClassToPassName.try_emplace(ClassName, PassName.str());28}29 30StringRef31PassInstrumentationCallbacks::getPassNameForClassName(StringRef ClassName) {32 if (!ClassToPassNameCallbacks.empty()) {33 for (auto &Fn : ClassToPassNameCallbacks)34 Fn();35 ClassToPassNameCallbacks.clear();36 }37 auto PassNameIter = ClassToPassName.find(ClassName);38 if (PassNameIter != ClassToPassName.end())39 return PassNameIter->second;40 return {};41}42 43AnalysisKey PassInstrumentationAnalysis::Key;44 45bool llvm::isSpecialPass(StringRef PassID,46 const std::vector<StringRef> &Specials) {47 size_t Pos = PassID.find('<');48 StringRef Prefix = PassID;49 if (Pos != StringRef::npos)50 Prefix = PassID.substr(0, Pos);51 return any_of(Specials,52 [Prefix](StringRef S) { return Prefix.ends_with(S); });53}54