1 //===- CXXPredicates.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 /// \file Contains utilities related to handling C++ code in MIR patterns for 10 /// GlobalISel. C++ predicates need to be expanded, and then stored in a 11 /// static pool until they can be emitted. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #ifndef LLVM_UTILS_MIRPATTERNS_CXXPREDICATES_H 16 #define LLVM_UTILS_MIRPATTERNS_CXXPREDICATES_H 17 18 #include "llvm/ADT/DenseMap.h" 19 #include "llvm/ADT/Hashing.h" 20 #include "llvm/ADT/StringRef.h" 21 #include <memory> 22 #include <string> 23 #include <vector> 24 25 namespace llvm { 26 namespace gi { 27 28 /// Entry into the static pool of all CXX Predicate code. This contains 29 /// fully expanded C++ code. 30 /// 31 /// The static pool is hidden inside the object and can be accessed through 32 /// getAllMatchCode/getAllApplyCode 33 /// 34 /// Note that CXXPattern trims C++ code, so the Code is already expected to be 35 /// free of leading/trailing whitespace. 36 class CXXPredicateCode { 37 using CXXPredicateCodePool = 38 DenseMap<hash_code, std::unique_ptr<CXXPredicateCode>>; 39 static CXXPredicateCodePool AllCXXMatchCode; 40 static CXXPredicateCodePool AllCXXCustomActionCode; 41 42 /// Sorts a `CXXPredicateCodePool` by their IDs and returns it. 43 static std::vector<const CXXPredicateCode *> 44 getSorted(const CXXPredicateCodePool &Pool); 45 46 /// Gets an instance of `CXXPredicateCode` for \p Code, or returns an already 47 /// existing one. 48 static const CXXPredicateCode &get(CXXPredicateCodePool &Pool, 49 std::string Code); 50 51 CXXPredicateCode(std::string Code, unsigned ID); 52 53 public: getMatchCode(std::string Code)54 static const CXXPredicateCode &getMatchCode(std::string Code) { 55 return get(AllCXXMatchCode, std::move(Code)); 56 } 57 getCustomActionCode(std::string Code)58 static const CXXPredicateCode &getCustomActionCode(std::string Code) { 59 return get(AllCXXCustomActionCode, std::move(Code)); 60 } 61 getAllMatchCode()62 static std::vector<const CXXPredicateCode *> getAllMatchCode() { 63 return getSorted(AllCXXMatchCode); 64 } 65 getAllCustomActionsCode()66 static std::vector<const CXXPredicateCode *> getAllCustomActionsCode() { 67 return getSorted(AllCXXCustomActionCode); 68 } 69 70 const std::string Code; 71 const unsigned ID; 72 const std::string BaseEnumName; 73 needsUnreachable()74 bool needsUnreachable() const { 75 return !StringRef(Code).starts_with("return"); 76 } 77 getEnumNameWithPrefix(StringRef Prefix)78 std::string getEnumNameWithPrefix(StringRef Prefix) const { 79 return Prefix.str() + BaseEnumName; 80 } 81 }; 82 83 } // namespace gi 84 } // end namespace llvm 85 86 #endif // ifndef LLVM_UTILS_MIRPATTERNS_CXXPREDICATES_H 87