summaryrefslogtreecommitdiffstats
path: root/lib/IR
diff options
context:
space:
mode:
authorBill Wendling <isanbard@gmail.com>2013-02-01 22:32:30 +0000
committerBill Wendling <isanbard@gmail.com>2013-02-01 22:32:30 +0000
commit5a4041e7282ca1dba93fe1a97c8260c0ef621f5d (patch)
tree9935c2330dd4c2bbd88aaee9bc89934b4ff61873 /lib/IR
parent83474ee594b5b14e9071564814a90571805cc433 (diff)
downloadexternal_llvm-5a4041e7282ca1dba93fe1a97c8260c0ef621f5d.zip
external_llvm-5a4041e7282ca1dba93fe1a97c8260c0ef621f5d.tar.gz
external_llvm-5a4041e7282ca1dba93fe1a97c8260c0ef621f5d.tar.bz2
Change the AttributeImpl to hold a single Constant* for the values.
This Constant could be an aggregate to represent multiple values. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@174228 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/IR')
-rw-r--r--lib/IR/AttributeImpl.h22
-rw-r--r--lib/IR/Attributes.cpp28
2 files changed, 23 insertions, 27 deletions
diff --git a/lib/IR/AttributeImpl.h b/lib/IR/AttributeImpl.h
index 3fbd723..66001f7 100644
--- a/lib/IR/AttributeImpl.h
+++ b/lib/IR/AttributeImpl.h
@@ -30,24 +30,23 @@ class LLVMContext;
/// \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 *Kind;
- SmallVector<Constant*, 0> Vals;
+ LLVMContext &Context; ///< Global context for uniquing objects
+ Constant *Kind; ///< Kind of attribute: enum or string
+ Constant *Values; ///< Values associated with the attribute
// AttributesImpl is uniqued, these should not be publicly available.
void operator=(const AttributeImpl &) LLVM_DELETED_FUNCTION;
AttributeImpl(const AttributeImpl &) LLVM_DELETED_FUNCTION;
public:
- AttributeImpl(LLVMContext &C, Constant *Kind,
- ArrayRef<Constant*> Vals = ArrayRef<Constant*>())
- : Context(C), Kind(Kind), Vals(Vals.begin(), Vals.end()) {}
+ AttributeImpl(LLVMContext &C, Constant *Kind, Constant *Values = 0)
+ : Context(C), Kind(Kind), Values(Values) {}
LLVMContext &getContext() { return Context; }
bool hasAttribute(Attribute::AttrKind A) const;
Constant *getAttributeKind() const { return Kind; }
- ArrayRef<Constant*> getAttributeValues() const { return Vals; }
+ Constant *getAttributeValues() const { return Values; }
uint64_t getAlignment() const;
uint64_t getStackAlignment() const;
@@ -63,13 +62,12 @@ public:
bool operator<(const AttributeImpl &AI) const;
void Profile(FoldingSetNodeID &ID) const {
- Profile(ID, Kind, Vals);
+ Profile(ID, Kind, Values);
}
- static void Profile(FoldingSetNodeID &ID, Constant *Kind,
- ArrayRef<Constant*> Vals) {
+ static void Profile(FoldingSetNodeID &ID, Constant *Kind, Constant *Values) {
ID.AddPointer(Kind);
- for (unsigned I = 0, E = Vals.size(); I != E; ++I)
- ID.AddPointer(Vals[I]);
+ if (Values)
+ ID.AddPointer(Values);
}
// FIXME: Remove this!
diff --git a/lib/IR/Attributes.cpp b/lib/IR/Attributes.cpp
index 412d83e..f8ca9f1 100644
--- a/lib/IR/Attributes.cpp
+++ b/lib/IR/Attributes.cpp
@@ -84,8 +84,8 @@ Constant *Attribute::getAttributeKind() const {
return pImpl ? pImpl->getAttributeKind() : 0;
}
-ArrayRef<Constant*> Attribute::getAttributeValues() const {
- return pImpl ? pImpl->getAttributeValues() : ArrayRef<Constant*>();
+Constant *Attribute::getAttributeValues() const {
+ return pImpl ? pImpl->getAttributeValues() : 0;
}
/// This returns the alignment field of an attribute as a byte alignment value.
@@ -186,24 +186,22 @@ std::string Attribute::getAsString() const {
//
// "kind"
// "kind" = "value"
- // "kind" = ("value1" "value2" "value3" )
+ // "kind" = ( "value1" "value2" "value3" )
//
if (ConstantDataArray *CDA =
dyn_cast<ConstantDataArray>(pImpl->getAttributeKind())) {
std::string Result;
Result += '\"' + CDA->getAsString().str() + '"';
- ArrayRef<Constant*> Vals = pImpl->getAttributeValues();
- if (Vals.empty()) return Result;
+ Constant *Vals = pImpl->getAttributeValues();
+ if (!Vals) return Result;
+
+ // FIXME: This should support more than just ConstantDataArrays. Also,
+ // support a vector of attribute values.
+
Result += " = ";
- if (Vals.size() > 1) Result += '(';
- for (ArrayRef<Constant*>::iterator I = Vals.begin(), E = Vals.end();
- I != E; ) {
- ConstantDataArray *CDA = cast<ConstantDataArray>(*I++);
- Result += '\"' + CDA->getAsString().str() + '"';
- if (I != E) Result += ' ';
- }
- if (Vals.size() > 1) Result += ')';
+ Result += '\"' + cast<ConstantDataArray>(Vals)->getAsString().str() + '"';
+
return Result;
}
@@ -237,13 +235,13 @@ bool AttributeImpl::hasAttribute(Attribute::AttrKind A) const {
uint64_t AttributeImpl::getAlignment() const {
assert(hasAttribute(Attribute::Alignment) &&
"Trying to retrieve the alignment from a non-alignment attr!");
- return cast<ConstantInt>(Vals[0])->getZExtValue();
+ return cast<ConstantInt>(Values)->getZExtValue();
}
uint64_t AttributeImpl::getStackAlignment() const {
assert(hasAttribute(Attribute::StackAlignment) &&
"Trying to retrieve the stack alignment from a non-alignment attr!");
- return cast<ConstantInt>(Vals[0])->getZExtValue();
+ return cast<ConstantInt>(Values)->getZExtValue();
}
bool AttributeImpl::operator==(Attribute::AttrKind kind) const {