1d15d2f508748008bfb2d9521b4724a0f80d1169cOwen Anderson//===- llvm/PassRegistry.h - Pass Information Registry ----------*- C++ -*-===// 2d15d2f508748008bfb2d9521b4724a0f80d1169cOwen Anderson// 3d15d2f508748008bfb2d9521b4724a0f80d1169cOwen Anderson// The LLVM Compiler Infrastructure 4d15d2f508748008bfb2d9521b4724a0f80d1169cOwen Anderson// 5d15d2f508748008bfb2d9521b4724a0f80d1169cOwen Anderson// This file is distributed under the University of Illinois Open Source 6d15d2f508748008bfb2d9521b4724a0f80d1169cOwen Anderson// License. See LICENSE.TXT for details. 7d15d2f508748008bfb2d9521b4724a0f80d1169cOwen Anderson// 8d15d2f508748008bfb2d9521b4724a0f80d1169cOwen Anderson//===----------------------------------------------------------------------===// 9d15d2f508748008bfb2d9521b4724a0f80d1169cOwen Anderson// 10d15d2f508748008bfb2d9521b4724a0f80d1169cOwen Anderson// This file defines PassRegistry, a class that is used in the initialization 116bcd3a02653c45b87094577517547b7eb9f76395Owen Anderson// and registration of passes. At application startup, passes are registered 126bcd3a02653c45b87094577517547b7eb9f76395Owen Anderson// with the PassRegistry, which is later provided to the PassManager for 136bcd3a02653c45b87094577517547b7eb9f76395Owen Anderson// dependency resolution and similar tasks. 14d15d2f508748008bfb2d9521b4724a0f80d1169cOwen Anderson// 15d15d2f508748008bfb2d9521b4724a0f80d1169cOwen Anderson//===----------------------------------------------------------------------===// 16d15d2f508748008bfb2d9521b4724a0f80d1169cOwen Anderson 17d15d2f508748008bfb2d9521b4724a0f80d1169cOwen Anderson#ifndef LLVM_PASSREGISTRY_H 18d15d2f508748008bfb2d9521b4724a0f80d1169cOwen Anderson#define LLVM_PASSREGISTRY_H 19d15d2f508748008bfb2d9521b4724a0f80d1169cOwen Anderson 2036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm-c/Core.h" 21cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "llvm/ADT/DenseMap.h" 22cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "llvm/ADT/SmallPtrSet.h" 23cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "llvm/ADT/StringMap.h" 24049e42f0b4547eb1afad4e4ce708d110408957e4Owen Anderson#include "llvm/ADT/StringRef.h" 25cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "llvm/PassInfo.h" 2640be1e85665d10f5444186f0e7106e368dd735b8Filip Pizlo#include "llvm/Support/CBindingWrapping.h" 27cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "llvm/Support/RWMutex.h" 28cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include <vector> 29d15d2f508748008bfb2d9521b4724a0f80d1169cOwen Anderson 30d15d2f508748008bfb2d9521b4724a0f80d1169cOwen Andersonnamespace llvm { 31d15d2f508748008bfb2d9521b4724a0f80d1169cOwen Anderson 32539673579ec79b75a95ef9daefc6a8b2fc8552f5Owen Andersonclass PassInfo; 33539673579ec79b75a95ef9daefc6a8b2fc8552f5Owen Andersonstruct PassRegistrationListener; 34539673579ec79b75a95ef9daefc6a8b2fc8552f5Owen Anderson 356bcd3a02653c45b87094577517547b7eb9f76395Owen Anderson/// PassRegistry - This class manages the registration and intitialization of 366bcd3a02653c45b87094577517547b7eb9f76395Owen Anderson/// the pass subsystem as application startup, and assists the PassManager 376bcd3a02653c45b87094577517547b7eb9f76395Owen Anderson/// in resolving pass dependencies. 386bcd3a02653c45b87094577517547b7eb9f76395Owen Anderson/// NOTE: PassRegistry is NOT thread-safe. If you want to use LLVM on multiple 396bcd3a02653c45b87094577517547b7eb9f76395Owen Anderson/// threads simultaneously, you will need to use a separate PassRegistry on 406bcd3a02653c45b87094577517547b7eb9f76395Owen Anderson/// each thread. 41d15d2f508748008bfb2d9521b4724a0f80d1169cOwen Andersonclass PassRegistry { 42cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines mutable sys::SmartRWMutex<true> Lock; 43cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 44cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines /// PassInfoMap - Keep track of the PassInfo object for each registered pass. 45cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines typedef DenseMap<const void*, const PassInfo*> MapType; 46cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines MapType PassInfoMap; 47cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 48cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines typedef StringMap<const PassInfo*> StringMapType; 49cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines StringMapType PassInfoStringMap; 50cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 51cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines /// AnalysisGroupInfo - Keep track of information for each analysis group. 52cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines struct AnalysisGroupInfo { 53cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines SmallPtrSet<const PassInfo *, 8> Implementations; 54cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines }; 55cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines DenseMap<const PassInfo*, AnalysisGroupInfo> AnalysisGroupInfoMap; 56cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 57cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines std::vector<std::unique_ptr<const PassInfo>> ToFree; 58cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines std::vector<PassRegistrationListener*> Listeners; 596bcd3a02653c45b87094577517547b7eb9f76395Owen Anderson 60d15d2f508748008bfb2d9521b4724a0f80d1169cOwen Andersonpublic: 61cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines PassRegistry() { } 62381f17ee7c07b5a80d7dcdeae3d62e497902ef85Owen Anderson ~PassRegistry(); 63c88c11d607c5e3154dad679b11ad5326d1f0e8acOwen Anderson 64a4b06f7c55a9620ca104f0e056da1ac423e16f78Owen Anderson /// getPassRegistry - Access the global registry object, which is 65a4b06f7c55a9620ca104f0e056da1ac423e16f78Owen Anderson /// automatically initialized at application launch and destroyed by 66a4b06f7c55a9620ca104f0e056da1ac423e16f78Owen Anderson /// llvm_shutdown. 67aac07eaeef0b29690f18061abc148a2608cd77deOwen Anderson static PassRegistry *getPassRegistry(); 68aac07eaeef0b29690f18061abc148a2608cd77deOwen Anderson 69a4b06f7c55a9620ca104f0e056da1ac423e16f78Owen Anderson /// getPassInfo - Look up a pass' corresponding PassInfo, indexed by the pass' 70a4b06f7c55a9620ca104f0e056da1ac423e16f78Owen Anderson /// type identifier (&MyPass::ID). 7190c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson const PassInfo *getPassInfo(const void *TI) const; 72a4b06f7c55a9620ca104f0e056da1ac423e16f78Owen Anderson 73a4b06f7c55a9620ca104f0e056da1ac423e16f78Owen Anderson /// getPassInfo - Look up a pass' corresponding PassInfo, indexed by the pass' 74a4b06f7c55a9620ca104f0e056da1ac423e16f78Owen Anderson /// argument string. 75d15d2f508748008bfb2d9521b4724a0f80d1169cOwen Anderson const PassInfo *getPassInfo(StringRef Arg) const; 76d15d2f508748008bfb2d9521b4724a0f80d1169cOwen Anderson 77a4b06f7c55a9620ca104f0e056da1ac423e16f78Owen Anderson /// registerPass - Register a pass (by means of its PassInfo) with the 78a4b06f7c55a9620ca104f0e056da1ac423e16f78Owen Anderson /// registry. Required in order to use the pass with a PassManager. 7975f6df283f726c289b240fe8c5f2f42cdfff5d5fOwen Anderson void registerPass(const PassInfo &PI, bool ShouldFree = false); 80a4b06f7c55a9620ca104f0e056da1ac423e16f78Owen Anderson 81a4b06f7c55a9620ca104f0e056da1ac423e16f78Owen Anderson /// registerPass - Unregister a pass (by means of its PassInfo) with the 82a4b06f7c55a9620ca104f0e056da1ac423e16f78Owen Anderson /// registry. 83d15d2f508748008bfb2d9521b4724a0f80d1169cOwen Anderson void unregisterPass(const PassInfo &PI); 84d15d2f508748008bfb2d9521b4724a0f80d1169cOwen Anderson 85a4b06f7c55a9620ca104f0e056da1ac423e16f78Owen Anderson /// registerAnalysisGroup - Register an analysis group (or a pass implementing 86a4b06f7c55a9620ca104f0e056da1ac423e16f78Owen Anderson // an analysis group) with the registry. Like registerPass, this is required 87a4b06f7c55a9620ca104f0e056da1ac423e16f78Owen Anderson // in order for a PassManager to be able to use this group/pass. 8890c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson void registerAnalysisGroup(const void *InterfaceID, const void *PassID, 8975f6df283f726c289b240fe8c5f2f42cdfff5d5fOwen Anderson PassInfo& Registeree, bool isDefault, 9075f6df283f726c289b240fe8c5f2f42cdfff5d5fOwen Anderson bool ShouldFree = false); 91d15d2f508748008bfb2d9521b4724a0f80d1169cOwen Anderson 92a4b06f7c55a9620ca104f0e056da1ac423e16f78Owen Anderson /// enumerateWith - Enumerate the registered passes, calling the provided 93a4b06f7c55a9620ca104f0e056da1ac423e16f78Owen Anderson /// PassRegistrationListener's passEnumerate() callback on each of them. 94d15d2f508748008bfb2d9521b4724a0f80d1169cOwen Anderson void enumerateWith(PassRegistrationListener *L); 95a4b06f7c55a9620ca104f0e056da1ac423e16f78Owen Anderson 96a4b06f7c55a9620ca104f0e056da1ac423e16f78Owen Anderson /// addRegistrationListener - Register the given PassRegistrationListener 97a4b06f7c55a9620ca104f0e056da1ac423e16f78Owen Anderson /// to receive passRegistered() callbacks whenever a new pass is registered. 98223c92c9cddf9034ddf5cf540fb2de4d14026632Chris Lattner void addRegistrationListener(PassRegistrationListener *L); 99a4b06f7c55a9620ca104f0e056da1ac423e16f78Owen Anderson 100a4b06f7c55a9620ca104f0e056da1ac423e16f78Owen Anderson /// removeRegistrationListener - Unregister a PassRegistrationListener so that 101a4b06f7c55a9620ca104f0e056da1ac423e16f78Owen Anderson /// it no longer receives passRegistered() callbacks. 102539673579ec79b75a95ef9daefc6a8b2fc8552f5Owen Anderson void removeRegistrationListener(PassRegistrationListener *L); 103d15d2f508748008bfb2d9521b4724a0f80d1169cOwen Anderson}; 104d15d2f508748008bfb2d9521b4724a0f80d1169cOwen Anderson 10540be1e85665d10f5444186f0e7106e368dd735b8Filip Pizlo// Create wrappers for C Binding types (see CBindingWrapping.h). 10640be1e85665d10f5444186f0e7106e368dd735b8Filip PizloDEFINE_STDCXX_CONVERSION_FUNCTIONS(PassRegistry, LLVMPassRegistryRef) 10740be1e85665d10f5444186f0e7106e368dd735b8Filip Pizlo 108d15d2f508748008bfb2d9521b4724a0f80d1169cOwen Anderson} 109d15d2f508748008bfb2d9521b4724a0f80d1169cOwen Anderson 110d15d2f508748008bfb2d9521b4724a0f80d1169cOwen Anderson#endif 111