[NFC][AttributeList] Replace index_begin/end with an iterator

We expose the fact that we rely on unsigned wrapping to iterate through
all indexes. This can be confusing. Rather, keeping it as an
implementation detail through an iterator is less confusing and is less
code.

Reviewed By: rnk

Differential Revision: https://reviews.llvm.org/D110885
This commit is contained in:
Arthur Eubanks 2021-09-30 13:57:55 -07:00
parent 31c92d515d
commit a7b4ce9cfd
7 changed files with 32 additions and 11 deletions

View File

@ -237,8 +237,7 @@ bool fixupRSAllocationStructByValCalls(llvm::Module &module) {
llvm::AttributeList call_attribs = call_inst->getAttributes();
// iterate over the argument attributes
for (unsigned I = call_attribs.index_begin(); I != call_attribs.index_end();
I++) {
for (unsigned I : call_attribs.indexes()) {
// if this argument is passed by val
if (call_attribs.hasAttributeAtIndex(I, llvm::Attribute::ByVal)) {
// strip away the byval attribute

View File

@ -851,9 +851,32 @@ public:
unsigned getNumAttrSets() const;
/// Use these to iterate over the valid attribute indices.
unsigned index_begin() const { return AttributeList::FunctionIndex; }
unsigned index_end() const { return getNumAttrSets() - 1; }
// Implementation of indexes(). Produces iterators that wrap an index. Mostly
// to hide the awkwardness of unsigned wrapping when iterating over valid
// indexes.
struct index_iterator {
unsigned NumAttrSets;
index_iterator(int NumAttrSets) : NumAttrSets(NumAttrSets) {}
struct int_wrapper {
int_wrapper(unsigned i) : i(i) {}
unsigned i;
unsigned operator*() { return i; }
bool operator!=(const int_wrapper &Other) { return i != Other.i; }
int_wrapper &operator++() {
// This is expected to undergo unsigned wrapping since FunctionIndex is
// ~0 and that's where we start.
++i;
return *this;
}
};
int_wrapper begin() { return int_wrapper(AttributeList::FunctionIndex); }
int_wrapper end() { return int_wrapper(NumAttrSets - 1); }
};
/// Use this to iterate over the valid attribute indexes.
index_iterator indexes() const { return index_iterator(getNumAttrSets()); }
/// operator==/!= - Provide equality predicates.
bool operator==(const AttributeList &RHS) const { return pImpl == RHS.pImpl; }

View File

@ -835,7 +835,7 @@ void ModuleBitcodeWriter::writeAttributeTable() {
SmallVector<uint64_t, 64> Record;
for (unsigned i = 0, e = Attrs.size(); i != e; ++i) {
AttributeList AL = Attrs[i];
for (unsigned i = AL.index_begin(), e = AL.index_end(); i != e; ++i) {
for (unsigned i : AL.indexes()) {
AttributeSet AS = AL.getAttributes(i);
if (AS.hasAttributes())
Record.push_back(VE.getAttributeGroupID({i, AS}));

View File

@ -1039,7 +1039,7 @@ void ValueEnumerator::EnumerateAttributes(AttributeList PAL) {
}
// Do lookups for all attribute groups.
for (unsigned i = PAL.index_begin(), e = PAL.index_end(); i != e; ++i) {
for (unsigned i : PAL.indexes()) {
AttributeSet AS = PAL.getAttributes(i);
if (!AS.hasAttributes())
continue;

View File

@ -1527,7 +1527,7 @@ unsigned AttributeList::getNumAttrSets() const {
void AttributeList::print(raw_ostream &O) const {
O << "AttributeList[\n";
for (unsigned i = index_begin(), e = index_end(); i != e; ++i) {
for (unsigned i : indexes()) {
if (!getAttributes(i).hasAttributes())
continue;
O << " { ";

View File

@ -110,7 +110,7 @@ int FunctionComparator::cmpAttrs(const AttributeList L,
if (int Res = cmpNumbers(L.getNumAttrSets(), R.getNumAttrSets()))
return Res;
for (unsigned i = L.index_begin(), e = L.index_end(); i != e; ++i) {
for (unsigned i : L.indexes()) {
AttributeSet LAS = L.getAttributes(i);
AttributeSet RAS = R.getAttributes(i);
AttributeSet::iterator LI = LAS.begin(), LE = LAS.end();

View File

@ -84,8 +84,7 @@ public:
AttrPtrVecVecTy &AttributeSetsToPreserve) {
assert(AttributeSetsToPreserve.empty() && "Should not be sharing vectors.");
AttributeSetsToPreserve.reserve(AL.getNumAttrSets());
for (unsigned SetIdx = AL.index_begin(), SetEndIdx = AL.index_end();
SetIdx != SetEndIdx; ++SetIdx) {
for (unsigned SetIdx : AL.indexes()) {
AttrPtrIdxVecVecTy AttributesToPreserve;
AttributesToPreserve.first = SetIdx;
visitAttributeSet(AL.getAttributes(AttributesToPreserve.first),