xref: /freebsd/contrib/llvm-project/llvm/lib/IR/PassInstrumentation.cpp (revision 7fdf597e96a02165cfe22ff357b857d5fa15ed8a)
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 void PassInstrumentationCallbacks::addClassToPassName(StringRef ClassName,
21                                                       StringRef PassName) {
22   ClassToPassName.try_emplace(ClassName, PassName.str());
23 }
24 
25 StringRef
26 PassInstrumentationCallbacks::getPassNameForClassName(StringRef ClassName) {
27   if (!ClassToPassNameCallbacks.empty()) {
28     for (auto &Fn : ClassToPassNameCallbacks)
29       Fn();
30     ClassToPassNameCallbacks.clear();
31   }
32   return ClassToPassName[ClassName];
33 }
34 
35 AnalysisKey PassInstrumentationAnalysis::Key;
36 
37 bool isSpecialPass(StringRef PassID, const std::vector<StringRef> &Specials) {
38   size_t Pos = PassID.find('<');
39   StringRef Prefix = PassID;
40   if (Pos != StringRef::npos)
41     Prefix = PassID.substr(0, Pos);
42   return any_of(Specials,
43                 [Prefix](StringRef S) { return Prefix.ends_with(S); });
44 }
45 
46 } // namespace llvm
47