mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-06 04:31:08 +00:00
1bbd644301
The Attribute class is eventually going to represent one attribute. So we need this class to create the set of attributes. Add some iterator methods to the builder to access its internal bits in a nice way. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@171586 91177308-0d34-0410-b5e6-96231b3b80d8
111 lines
3.4 KiB
C++
111 lines
3.4 KiB
C++
//===-- AttributeImpl.h - Attribute Internals -------------------*- 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 various helper methods and classes used by
|
|
/// LLVMContextImpl for creating and managing attributes.
|
|
///
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_ATTRIBUTESIMPL_H
|
|
#define LLVM_ATTRIBUTESIMPL_H
|
|
|
|
#include "llvm/ADT/FoldingSet.h"
|
|
#include "llvm/IR/Attributes.h"
|
|
|
|
namespace llvm {
|
|
|
|
class Constant;
|
|
class LLVMContext;
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
/// \class
|
|
/// \brief This class represents a single, uniqued attribute. That attribute
|
|
/// could be a single enum, a tuple, or a string.
|
|
class AttributeImpl : public FoldingSetNode {
|
|
LLVMContext &Context;
|
|
Constant *Data;
|
|
SmallVector<Constant*, 0> Vals;
|
|
public:
|
|
explicit AttributeImpl(LLVMContext &C, uint64_t data);
|
|
explicit AttributeImpl(LLVMContext &C, Attribute::AttrKind data);
|
|
AttributeImpl(LLVMContext &C, Attribute::AttrKind data,
|
|
ArrayRef<Constant*> values);
|
|
AttributeImpl(LLVMContext &C, StringRef data);
|
|
|
|
ArrayRef<Constant*> getValues() const {
|
|
return Vals;
|
|
}
|
|
|
|
bool hasAttribute(Attribute::AttrKind A) const;
|
|
|
|
bool hasAttributes() const;
|
|
|
|
uint64_t getAlignment() const;
|
|
void setAlignment(unsigned Align);
|
|
|
|
uint64_t getStackAlignment() const;
|
|
void setStackAlignment(unsigned Align);
|
|
|
|
bool operator==(Attribute::AttrKind Kind) const;
|
|
bool operator!=(Attribute::AttrKind Kind) const;
|
|
|
|
bool operator==(StringRef Kind) const;
|
|
bool operator!=(StringRef Kind) const;
|
|
|
|
uint64_t getBitMask() const; // FIXME: Remove.
|
|
|
|
static uint64_t getAttrMask(Attribute::AttrKind Val);
|
|
|
|
void Profile(FoldingSetNodeID &ID) const {
|
|
Profile(ID, Data, Vals);
|
|
}
|
|
static void Profile(FoldingSetNodeID &ID, Constant *Data,
|
|
ArrayRef<Constant*> Vals) {
|
|
ID.AddPointer(Data);
|
|
for (ArrayRef<Constant*>::iterator I = Vals.begin(), E = Vals.end();
|
|
I != E; ++I)
|
|
ID.AddPointer(*I);
|
|
}
|
|
};
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
/// \class
|
|
/// \brief This class represents a set of attributes.
|
|
class AttributeSetImpl : public FoldingSetNode {
|
|
LLVMContext &Context;
|
|
SmallVector<AttributeWithIndex, 4> AttrList;
|
|
|
|
// AttributesSet is uniqued, these should not be publicly available.
|
|
void operator=(const AttributeSetImpl &) LLVM_DELETED_FUNCTION;
|
|
AttributeSetImpl(const AttributeSetImpl &) LLVM_DELETED_FUNCTION;
|
|
public:
|
|
AttributeSetImpl(LLVMContext &C, ArrayRef<AttributeWithIndex> attrs)
|
|
: Context(C), AttrList(attrs.begin(), attrs.end()) {}
|
|
|
|
LLVMContext &getContext() { return Context; }
|
|
ArrayRef<AttributeWithIndex> getAttributes() const { return AttrList; }
|
|
unsigned getNumAttributes() const { return AttrList.size(); }
|
|
|
|
void Profile(FoldingSetNodeID &ID) const {
|
|
Profile(ID, AttrList);
|
|
}
|
|
static void Profile(FoldingSetNodeID &ID,
|
|
ArrayRef<AttributeWithIndex> AttrList){
|
|
for (unsigned i = 0, e = AttrList.size(); i != e; ++i) {
|
|
ID.AddInteger(AttrList[i].Index);
|
|
ID.AddInteger(AttrList[i].Attrs.getBitMask());
|
|
}
|
|
}
|
|
};
|
|
|
|
} // end llvm namespace
|
|
|
|
#endif
|