1 //===- ArchitectureSet.cpp ------------------------------------------------===// 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 // Implements the architecture set. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #include "llvm/TextAPI/ArchitectureSet.h" 14 #include "llvm/Support/raw_ostream.h" 15 16 namespace llvm { 17 namespace MachO { 18 19 ArchitectureSet::ArchitectureSet(const std::vector<Architecture> &Archs) 20 : ArchitectureSet() { 21 for (auto Arch : Archs) { 22 if (Arch == AK_unknown) 23 continue; 24 set(Arch); 25 } 26 } 27 28 size_t ArchitectureSet::count() const { 29 // popcnt 30 size_t Cnt = 0; 31 for (unsigned i = 0; i < sizeof(ArchSetType) * 8; ++i) 32 if (ArchSet & (1U << i)) 33 ++Cnt; 34 return Cnt; 35 } 36 37 ArchitectureSet::operator std::string() const { 38 if (empty()) 39 return "[(empty)]"; 40 41 std::string result; 42 auto size = count(); 43 for (auto arch : *this) { 44 result.append(std::string(getArchitectureName(arch))); 45 size -= 1; 46 if (size) 47 result.append(" "); 48 } 49 return result; 50 } 51 52 ArchitectureSet::operator std::vector<Architecture>() const { 53 std::vector<Architecture> archs; 54 for (auto arch : *this) { 55 if (arch == AK_unknown) 56 continue; 57 archs.emplace_back(arch); 58 } 59 return archs; 60 } 61 62 void ArchitectureSet::print(raw_ostream &os) const { os << std::string(*this); } 63 64 raw_ostream &operator<<(raw_ostream &os, ArchitectureSet set) { 65 set.print(os); 66 return os; 67 } 68 69 } // end namespace MachO. 70 } // end namespace llvm. 71