1*0fca6ea1SDimitry Andric //===- CXXPredicates.cpp ----------------------------------------*- C++ -*-===// 2*0fca6ea1SDimitry Andric // 3*0fca6ea1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0fca6ea1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*0fca6ea1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0fca6ea1SDimitry Andric // 7*0fca6ea1SDimitry Andric //===----------------------------------------------------------------------===// 8*0fca6ea1SDimitry Andric // 9*0fca6ea1SDimitry Andric // 10*0fca6ea1SDimitry Andric //===----------------------------------------------------------------------===// 11*0fca6ea1SDimitry Andric 12*0fca6ea1SDimitry Andric #include "CXXPredicates.h" 13*0fca6ea1SDimitry Andric #include "llvm/ADT/STLExtras.h" 14*0fca6ea1SDimitry Andric 15*0fca6ea1SDimitry Andric namespace llvm { 16*0fca6ea1SDimitry Andric namespace gi { 17*0fca6ea1SDimitry Andric 18*0fca6ea1SDimitry Andric std::vector<const CXXPredicateCode *> 19*0fca6ea1SDimitry Andric CXXPredicateCode::getSorted(const CXXPredicateCodePool &Pool) { 20*0fca6ea1SDimitry Andric std::vector<const CXXPredicateCode *> Out; 21*0fca6ea1SDimitry Andric std::transform(Pool.begin(), Pool.end(), std::back_inserter(Out), 22*0fca6ea1SDimitry Andric [&](auto &Elt) { return Elt.second.get(); }); 23*0fca6ea1SDimitry Andric sort(Out, [](const auto *A, const auto *B) { return A->ID < B->ID; }); 24*0fca6ea1SDimitry Andric return Out; 25*0fca6ea1SDimitry Andric } 26*0fca6ea1SDimitry Andric 27*0fca6ea1SDimitry Andric const CXXPredicateCode &CXXPredicateCode::get(CXXPredicateCodePool &Pool, 28*0fca6ea1SDimitry Andric std::string Code) { 29*0fca6ea1SDimitry Andric // Check if we already have an identical piece of code, if not, create an 30*0fca6ea1SDimitry Andric // entry in the pool. 31*0fca6ea1SDimitry Andric const auto CodeHash = hash_value(Code); 32*0fca6ea1SDimitry Andric if (auto It = Pool.find(CodeHash); It != Pool.end()) 33*0fca6ea1SDimitry Andric return *It->second; 34*0fca6ea1SDimitry Andric 35*0fca6ea1SDimitry Andric const auto ID = Pool.size(); 36*0fca6ea1SDimitry Andric auto OwnedData = std::unique_ptr<CXXPredicateCode>( 37*0fca6ea1SDimitry Andric new CXXPredicateCode(std::move(Code), ID)); 38*0fca6ea1SDimitry Andric const auto &DataRef = *OwnedData; 39*0fca6ea1SDimitry Andric Pool[CodeHash] = std::move(OwnedData); 40*0fca6ea1SDimitry Andric return DataRef; 41*0fca6ea1SDimitry Andric } 42*0fca6ea1SDimitry Andric 43*0fca6ea1SDimitry Andric // TODO: Make BaseEnumName prefix configurable. 44*0fca6ea1SDimitry Andric CXXPredicateCode::CXXPredicateCode(std::string Code, unsigned ID) 45*0fca6ea1SDimitry Andric : Code(Code), ID(ID), BaseEnumName("GICombiner" + std::to_string(ID)) {} 46*0fca6ea1SDimitry Andric 47*0fca6ea1SDimitry Andric CXXPredicateCode::CXXPredicateCodePool CXXPredicateCode::AllCXXMatchCode; 48*0fca6ea1SDimitry Andric CXXPredicateCode::CXXPredicateCodePool CXXPredicateCode::AllCXXCustomActionCode; 49*0fca6ea1SDimitry Andric 50*0fca6ea1SDimitry Andric } // namespace gi 51*0fca6ea1SDimitry Andric } // namespace llvm 52