1 //===- llvm/CodeGen/RegAllocRegistry.h --------------------------*- 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 // 9 // This file contains the implementation for register allocator function 10 // pass registry (RegisterRegAlloc). 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_CODEGEN_REGALLOCREGISTRY_H 15 #define LLVM_CODEGEN_REGALLOCREGISTRY_H 16 17 #include "llvm/CodeGen/RegAllocCommon.h" 18 #include "llvm/CodeGen/MachinePassRegistry.h" 19 20 namespace llvm { 21 22 class FunctionPass; 23 24 //===----------------------------------------------------------------------===// 25 /// 26 /// RegisterRegAllocBase class - Track the registration of register allocators. 27 /// 28 //===----------------------------------------------------------------------===// 29 template <class SubClass> 30 class RegisterRegAllocBase : public MachinePassRegistryNode<FunctionPass *(*)()> { 31 public: 32 using FunctionPassCtor = FunctionPass *(*)(); 33 34 static MachinePassRegistry<FunctionPassCtor> Registry; 35 RegisterRegAllocBase(const char * N,const char * D,FunctionPassCtor C)36 RegisterRegAllocBase(const char *N, const char *D, FunctionPassCtor C) 37 : MachinePassRegistryNode(N, D, C) { 38 Registry.Add(this); 39 } 40 ~RegisterRegAllocBase()41 ~RegisterRegAllocBase() { Registry.Remove(this); } 42 43 // Accessors. getNext()44 SubClass *getNext() const { 45 return static_cast<SubClass *>(MachinePassRegistryNode::getNext()); 46 } 47 getList()48 static SubClass *getList() { 49 return static_cast<SubClass *>(Registry.getList()); 50 } 51 getDefault()52 static FunctionPassCtor getDefault() { return Registry.getDefault(); } 53 setDefault(FunctionPassCtor C)54 static void setDefault(FunctionPassCtor C) { Registry.setDefault(C); } 55 setListener(MachinePassRegistryListener<FunctionPassCtor> * L)56 static void setListener(MachinePassRegistryListener<FunctionPassCtor> *L) { 57 Registry.setListener(L); 58 } 59 }; 60 61 class RegisterRegAlloc : public RegisterRegAllocBase<RegisterRegAlloc> { 62 public: RegisterRegAlloc(const char * N,const char * D,FunctionPassCtor C)63 RegisterRegAlloc(const char *N, const char *D, FunctionPassCtor C) 64 : RegisterRegAllocBase(N, D, C) {} 65 }; 66 67 /// RegisterRegAlloc's global Registry tracks allocator registration. 68 template <class T> 69 MachinePassRegistry<typename RegisterRegAllocBase<T>::FunctionPassCtor> 70 RegisterRegAllocBase<T>::Registry; 71 72 } // end namespace llvm 73 74 #endif // LLVM_CODEGEN_REGALLOCREGISTRY_H 75