xref: /freebsd/contrib/llvm-project/llvm/lib/TextAPI/ArchitectureSet.cpp (revision 96b917bfcf2c558340f8f6e620e64efededa1daf)
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