Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Expose AttributeSetNode, use it to provide aggregate getter for attri…
…bute in the C API. Summary: See D19181 for context. Reviewers: whitequark, Wallbraker, jyknight, echristo, bkramer, void Subscribers: mehdi_amini Differential Revision: http://reviews.llvm.org/D21265 llvm-svn: 276236
- Loading branch information
Showing
5 changed files
with
133 additions
and
68 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,97 @@ | ||
//===-- AttributeSetNode.h - AttributeSet Internal Node ---------*- C++ -*-===// | ||
// | ||
// The LLVM Compiler Infrastructure | ||
// | ||
// This file is distributed under the University of Illinois Open Source | ||
// License. See LICENSE.TXT for details. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
/// | ||
/// \file | ||
/// \brief This file defines the node class used internally by AttributeSet. | ||
/// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#ifndef LLVM_IR_ATTRIBUTESETNODE_H | ||
#define LLVM_IR_ATTRIBUTESETNODE_H | ||
|
||
#include "llvm/ADT/FoldingSet.h" | ||
#include "llvm/IR/Attributes.h" | ||
#include "llvm/Support/TrailingObjects.h" | ||
|
||
namespace llvm { | ||
|
||
//===----------------------------------------------------------------------===// | ||
/// \class | ||
/// \brief This class represents a group of attributes that apply to one | ||
/// element: function, return type, or parameter. | ||
class AttributeSetNode final | ||
: public FoldingSetNode, | ||
private TrailingObjects<AttributeSetNode, Attribute> { | ||
friend TrailingObjects; | ||
|
||
unsigned NumAttrs; ///< Number of attributes in this node. | ||
/// Bitset with a bit for each available attribute Attribute::AttrKind. | ||
uint64_t AvailableAttrs; | ||
|
||
AttributeSetNode(ArrayRef<Attribute> Attrs) | ||
: NumAttrs(Attrs.size()), AvailableAttrs(0) { | ||
static_assert(Attribute::EndAttrKinds <= sizeof(AvailableAttrs) * CHAR_BIT, | ||
"Too many attributes for AvailableAttrs"); | ||
// There's memory after the node where we can store the entries in. | ||
std::copy(Attrs.begin(), Attrs.end(), getTrailingObjects<Attribute>()); | ||
|
||
for (Attribute I : *this) { | ||
if (!I.isStringAttribute()) { | ||
AvailableAttrs |= ((uint64_t)1) << I.getKindAsEnum(); | ||
} | ||
} | ||
} | ||
|
||
// AttributesSetNode is uniqued, these should not be publicly available. | ||
void operator=(const AttributeSetNode &) = delete; | ||
AttributeSetNode(const AttributeSetNode &) = delete; | ||
public: | ||
void operator delete(void *p) { ::operator delete(p); } | ||
|
||
static AttributeSetNode *get(LLVMContext &C, ArrayRef<Attribute> Attrs); | ||
|
||
static AttributeSetNode *get(AttributeSet AS, unsigned Index) { | ||
return AS.getAttributes(Index); | ||
} | ||
|
||
/// \brief Return the number of attributes this AttributeSet contains. | ||
unsigned getNumAttributes() const { return NumAttrs; } | ||
|
||
bool hasAttribute(Attribute::AttrKind Kind) const { | ||
return AvailableAttrs & ((uint64_t)1) << Kind; | ||
} | ||
bool hasAttribute(StringRef Kind) const; | ||
bool hasAttributes() const { return NumAttrs != 0; } | ||
|
||
Attribute getAttribute(Attribute::AttrKind Kind) const; | ||
Attribute getAttribute(StringRef Kind) const; | ||
|
||
unsigned getAlignment() const; | ||
unsigned getStackAlignment() const; | ||
uint64_t getDereferenceableBytes() const; | ||
uint64_t getDereferenceableOrNullBytes() const; | ||
std::pair<unsigned, Optional<unsigned>> getAllocSizeArgs() const; | ||
std::string getAsString(bool InAttrGrp) const; | ||
|
||
typedef const Attribute *iterator; | ||
iterator begin() const { return getTrailingObjects<Attribute>(); } | ||
iterator end() const { return begin() + NumAttrs; } | ||
|
||
void Profile(FoldingSetNodeID &ID) const { | ||
Profile(ID, makeArrayRef(begin(), end())); | ||
} | ||
static void Profile(FoldingSetNodeID &ID, ArrayRef<Attribute> AttrList) { | ||
for (unsigned I = 0, E = AttrList.size(); I != E; ++I) | ||
AttrList[I].Profile(ID); | ||
} | ||
}; | ||
|
||
} // end llvm namespace | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters