diff options
Diffstat (limited to 'llvm/lib/TextAPI/MachO/ArchitectureSet.cpp')
| -rw-r--r-- | llvm/lib/TextAPI/MachO/ArchitectureSet.cpp | 69 | 
1 files changed, 69 insertions, 0 deletions
| diff --git a/llvm/lib/TextAPI/MachO/ArchitectureSet.cpp b/llvm/lib/TextAPI/MachO/ArchitectureSet.cpp new file mode 100644 index 0000000000000..c589671199b79 --- /dev/null +++ b/llvm/lib/TextAPI/MachO/ArchitectureSet.cpp @@ -0,0 +1,69 @@ +//===- ArchitectureSet.cpp ------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// Implements the architecture set. +// +//===----------------------------------------------------------------------===// + +#include "llvm/TextAPI/MachO/ArchitectureSet.h" + +namespace llvm { +namespace MachO { + +ArchitectureSet::ArchitectureSet(const std::vector<Architecture> &Archs) +    : ArchitectureSet() { +  for (auto Arch : Archs) { +    if (Arch == AK_unknown) +      continue; +    set(Arch); +  } +} + +size_t ArchitectureSet::count() const { +  // popcnt +  size_t Cnt = 0; +  for (unsigned i = 0; i < sizeof(ArchSetType) * 8; ++i) +    if (ArchSet & (1U << i)) +      ++Cnt; +  return Cnt; +} + +ArchitectureSet::operator std::string() const { +  if (empty()) +    return "[(empty)]"; + +  std::string result; +  auto size = count(); +  for (auto arch : *this) { +    result.append(getArchitectureName(arch)); +    size -= 1; +    if (size) +      result.append(" "); +  } +  return result; +} + +ArchitectureSet::operator std::vector<Architecture>() const { +  std::vector<Architecture> archs; +  for (auto arch : *this) { +    if (arch == AK_unknown) +      continue; +    archs.emplace_back(arch); +  } +  return archs; +} + +void ArchitectureSet::print(raw_ostream &os) const { os << std::string(*this); } + +raw_ostream &operator<<(raw_ostream &os, ArchitectureSet set) { +  set.print(os); +  return os; +} + +} // end namespace MachO. +} // end namespace llvm. | 
