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