xref: /llvm-project/llvm/lib/IR/PassInstrumentation.cpp (revision b8fddca7bdb354d51e340c60aafe3dff1b35a195)
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-exception
6 //
7 //===----------------------------------------------------------------------===//
8 /// \file
9 ///
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 
18 namespace llvm {
19 
20 template struct LLVM_EXPORT_TEMPLATE Any::TypeId<const Module *>;
21 template struct LLVM_EXPORT_TEMPLATE Any::TypeId<const Function *>;
22 template struct LLVM_EXPORT_TEMPLATE Any::TypeId<const Loop *>;
23 
24 void PassInstrumentationCallbacks::addClassToPassName(StringRef ClassName,
25                                                       StringRef PassName) {
26   ClassToPassName.try_emplace(ClassName, PassName.str());
27 }
28 
29 StringRef
30 PassInstrumentationCallbacks::getPassNameForClassName(StringRef ClassName) {
31   if (!ClassToPassNameCallbacks.empty()) {
32     for (auto &Fn : ClassToPassNameCallbacks)
33       Fn();
34     ClassToPassNameCallbacks.clear();
35   }
36   return ClassToPassName[ClassName];
37 }
38 
39 AnalysisKey PassInstrumentationAnalysis::Key;
40 
41 bool isSpecialPass(StringRef PassID, const std::vector<StringRef> &Specials) {
42   size_t Pos = PassID.find('<');
43   StringRef Prefix = PassID;
44   if (Pos != StringRef::npos)
45     Prefix = PassID.substr(0, Pos);
46   return any_of(Specials,
47                 [Prefix](StringRef S) { return Prefix.ends_with(S); });
48 }
49 
50 } // namespace llvm
51