//===- llvm/AttributeMask.h - Mask for Attributes ---------------*- C++ -*-===// // // 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 // //===----------------------------------------------------------------------===// // /// \file // This file declares the AttributeMask class. // //===----------------------------------------------------------------------===// #ifndef LLVM_IR_ATTRIBUTEMASK_H #define LLVM_IR_ATTRIBUTEMASK_H #include "llvm/ADT/SmallString.h" #include "llvm/IR/Attributes.h" #include #include #include namespace llvm { //===----------------------------------------------------------------------===// /// \class /// This class stores enough information to efficiently remove some attributes /// from an existing AttrBuilder, AttributeSet or AttributeList. class AttributeMask { std::bitset Attrs; std::set, std::less<>> TargetDepAttrs; public: AttributeMask() = default; AttributeMask(const AttributeMask &) = delete; AttributeMask(AttributeMask &&) = default; AttributeMask(AttributeSet AS) { for (Attribute A : AS) addAttribute(A); } /// Add an attribute to the mask. AttributeMask &addAttribute(Attribute::AttrKind Val) { assert((unsigned)Val < Attribute::EndAttrKinds && "Attribute out of range!"); Attrs[Val] = true; return *this; } /// Add the Attribute object to the builder. AttributeMask &addAttribute(Attribute A) { if (A.isStringAttribute()) addAttribute(A.getKindAsString()); else addAttribute(A.getKindAsEnum()); return *this; } /// Add the target-dependent attribute to the builder. AttributeMask &addAttribute(StringRef A) { TargetDepAttrs.insert(A); return *this; } /// Return true if the builder has the specified attribute. bool contains(Attribute::AttrKind A) const { assert((unsigned)A < Attribute::EndAttrKinds && "Attribute out of range!"); return Attrs[A]; } /// Return true if the builder has the specified target-dependent /// attribute. bool contains(StringRef A) const { return TargetDepAttrs.count(A); } /// Return true if the mask contains the specified attribute. bool contains(Attribute A) const { if (A.isStringAttribute()) return contains(A.getKindAsString()); return contains(A.getKindAsEnum()); } }; } // end namespace llvm #endif // LLVM_IR_ATTRIBUTEMASK_H