r207837 - Updated the attribute tablegen emitter for variadic arguments to emit a range accessor in addition to the iterators. Updated code using iterators to use range-based for loops.
Aaron Ballman
aaron at aaronballman.com
Fri May 2 06:35:43 PDT 2014
Author: aaronballman
Date: Fri May 2 08:35:42 2014
New Revision: 207837
URL: http://llvm.org/viewvc/llvm-project?rev=207837&view=rev
Log:
Updated the attribute tablegen emitter for variadic arguments to emit a range accessor in addition to the iterators. Updated code using iterators to use range-based for loops.
Modified:
cfe/trunk/include/clang/Basic/Attr.td
cfe/trunk/lib/Analysis/Consumed.cpp
cfe/trunk/lib/Analysis/ThreadSafety.cpp
cfe/trunk/lib/Sema/SemaChecking.cpp
cfe/trunk/lib/StaticAnalyzer/Checkers/MallocChecker.cpp
cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp
Modified: cfe/trunk/include/clang/Basic/Attr.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Attr.td?rev=207837&r1=207836&r2=207837&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/Attr.td (original)
+++ cfe/trunk/include/clang/Basic/Attr.td Fri May 2 08:35:42 2014
@@ -830,9 +830,8 @@ def NonNull : InheritableAttr {
let Args = [VariadicUnsignedArgument<"Args">];
let AdditionalMembers =
[{bool isNonNull(unsigned idx) const {
- for (args_iterator i = args_begin(), e = args_end();
- i != e; ++i)
- if (*i == idx)
+ for (const auto &V : args())
+ if (V == idx)
return true;
return false;
} }];
Modified: cfe/trunk/lib/Analysis/Consumed.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/Consumed.cpp?rev=207837&r1=207836&r2=207837&view=diff
==============================================================================
--- cfe/trunk/lib/Analysis/Consumed.cpp (original)
+++ cfe/trunk/lib/Analysis/Consumed.cpp Fri May 2 08:35:42 2014
@@ -113,14 +113,10 @@ static ConsumedState invertConsumedUncon
static bool isCallableInState(const CallableWhenAttr *CWAttr,
ConsumedState State) {
- CallableWhenAttr::callableStates_iterator I = CWAttr->callableStates_begin(),
- E = CWAttr->callableStates_end();
-
- for (; I != E; ++I) {
-
+ for (const auto &S : CWAttr->callableStates()) {
ConsumedState MappedAttrState = CS_None;
-
- switch (*I) {
+
+ switch (S) {
case CallableWhenAttr::Unknown:
MappedAttrState = CS_Unknown;
break;
Modified: cfe/trunk/lib/Analysis/ThreadSafety.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/ThreadSafety.cpp?rev=207837&r1=207836&r2=207837&view=diff
==============================================================================
--- cfe/trunk/lib/Analysis/ThreadSafety.cpp (original)
+++ cfe/trunk/lib/Analysis/ThreadSafety.cpp Fri May 2 08:35:42 2014
@@ -1478,12 +1478,12 @@ static const ValueDecl *getValueDecl(con
}
template <typename Ty>
-class has_arg_iterator {
+class has_arg_iterator_range {
typedef char yes[1];
typedef char no[2];
template <typename Inner>
- static yes& test(Inner *I, decltype(I->args_begin()) * = nullptr);
+ static yes& test(Inner *I, decltype(I->args()) * = nullptr);
template <typename>
static no& test(...);
@@ -1522,7 +1522,7 @@ static StringRef ClassifyDiagnostic(cons
}
template <typename AttrTy>
-static typename std::enable_if<!has_arg_iterator<AttrTy>::value,
+static typename std::enable_if<!has_arg_iterator_range<AttrTy>::value,
StringRef>::type
ClassifyDiagnostic(const AttrTy *A) {
if (const ValueDecl *VD = getValueDecl(A->getArg()))
@@ -1531,11 +1531,11 @@ ClassifyDiagnostic(const AttrTy *A) {
}
template <typename AttrTy>
-static typename std::enable_if<has_arg_iterator<AttrTy>::value,
+static typename std::enable_if<has_arg_iterator_range<AttrTy>::value,
StringRef>::type
ClassifyDiagnostic(const AttrTy *A) {
- for (auto I = A->args_begin(), E = A->args_end(); I != E; ++I) {
- if (const ValueDecl *VD = getValueDecl(*I))
+ for (const auto *Arg : A->args()) {
+ if (const ValueDecl *VD = getValueDecl(Arg))
return ClassifyDiagnostic(VD);
}
return "mutex";
@@ -1624,10 +1624,10 @@ void ThreadSafetyAnalyzer::getMutexIDs(M
return;
}
- for (iterator_type I=Attr->args_begin(), E=Attr->args_end(); I != E; ++I) {
- SExpr Mu(*I, Exp, D, SelfDecl);
+ for (const auto *Arg : Attr->args()) {
+ SExpr Mu(Arg, Exp, D, SelfDecl);
if (!Mu.isValid())
- SExpr::warnInvalidLock(Handler, *I, Exp, D, ClassifyDiagnostic(Attr));
+ SExpr::warnInvalidLock(Handler, Arg, Exp, D, ClassifyDiagnostic(Attr));
else
Mtxs.push_back_nodup(Mu);
}
@@ -2058,21 +2058,16 @@ void BuildLockset::handleCall(Expr *Exp,
case attr::RequiresCapability: {
RequiresCapabilityAttr *A = cast<RequiresCapabilityAttr>(At);
-
- for (RequiresCapabilityAttr::args_iterator I = A->args_begin(),
- E = A->args_end(); I != E; ++I)
- warnIfMutexNotHeld(D, Exp, A->isShared() ? AK_Read : AK_Written, *I,
+ for (auto *Arg : A->args())
+ warnIfMutexNotHeld(D, Exp, A->isShared() ? AK_Read : AK_Written, Arg,
POK_FunctionCall, ClassifyDiagnostic(A));
break;
}
case attr::LocksExcluded: {
LocksExcludedAttr *A = cast<LocksExcludedAttr>(At);
-
- for (LocksExcludedAttr::args_iterator I = A->args_begin(),
- E = A->args_end(); I != E; ++I) {
- warnIfMutexHeld(D, Exp, *I, ClassifyDiagnostic(A));
- }
+ for (auto *Arg : A->args())
+ warnIfMutexHeld(D, Exp, Arg, ClassifyDiagnostic(A));
break;
}
Modified: cfe/trunk/lib/Sema/SemaChecking.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaChecking.cpp?rev=207837&r1=207836&r2=207837&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaChecking.cpp (original)
+++ cfe/trunk/lib/Sema/SemaChecking.cpp Fri May 2 08:35:42 2014
@@ -717,11 +717,8 @@ static void CheckNonNullArguments(Sema &
SourceLocation CallSiteLoc) {
// Check the attributes attached to the method/function itself.
for (const auto *NonNull : FDecl->specific_attrs<NonNullAttr>()) {
- for (NonNullAttr::args_iterator i = NonNull->args_begin(),
- e = NonNull->args_end();
- i != e; ++i) {
- CheckNonNullArgument(S, ExprArgs[*i], CallSiteLoc);
- }
+ for (const auto &Val : NonNull->args())
+ CheckNonNullArgument(S, ExprArgs[Val], CallSiteLoc);
}
// Check the attributes on the parameters.
Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/MallocChecker.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/MallocChecker.cpp?rev=207837&r1=207836&r2=207837&view=diff
==============================================================================
--- cfe/trunk/lib/StaticAnalyzer/Checkers/MallocChecker.cpp (original)
+++ cfe/trunk/lib/StaticAnalyzer/Checkers/MallocChecker.cpp Fri May 2 08:35:42 2014
@@ -921,9 +921,8 @@ ProgramStateRef MallocChecker::FreeMemAt
ProgramStateRef State = C.getState();
bool ReleasedAllocated = false;
- for (OwnershipAttr::args_iterator I = Att->args_begin(), E = Att->args_end();
- I != E; ++I) {
- ProgramStateRef StateI = FreeMemAux(C, CE, State, *I,
+ for (const auto &Arg : Att->args()) {
+ ProgramStateRef StateI = FreeMemAux(C, CE, State, Arg,
Att->getOwnKind() == OwnershipAttr::Holds,
ReleasedAllocated);
if (StateI)
Modified: cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp?rev=207837&r1=207836&r2=207837&view=diff
==============================================================================
--- cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp (original)
+++ cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp Fri May 2 08:35:42 2014
@@ -504,32 +504,33 @@ namespace {
};
class VariadicArgument : public Argument {
- std::string type;
+ std::string Type, ArgName, ArgSizeName, RangeName;
public:
VariadicArgument(Record &Arg, StringRef Attr, std::string T)
- : Argument(Arg, Attr), type(T)
- {}
+ : Argument(Arg, Attr), Type(T), ArgName(getLowerName().str() + "_"),
+ ArgSizeName(ArgName + "Size"), RangeName(getLowerName()) {}
- std::string getType() const { return type; }
+ std::string getType() const { return Type; }
void writeAccessors(raw_ostream &OS) const override {
- OS << " typedef " << type << "* " << getLowerName() << "_iterator;\n";
- OS << " " << getLowerName() << "_iterator " << getLowerName()
- << "_begin() const {\n";
- OS << " return " << getLowerName() << ";\n";
- OS << " }\n";
- OS << " " << getLowerName() << "_iterator " << getLowerName()
- << "_end() const {\n";
- OS << " return " << getLowerName() << " + " << getLowerName()
- << "Size;\n";
- OS << " }\n";
- OS << " unsigned " << getLowerName() << "_size() const {\n"
- << " return " << getLowerName() << "Size;\n";
- OS << " }";
+ std::string IteratorType = getLowerName().str() + "_iterator";
+ std::string BeginFn = getLowerName().str() + "_begin()";
+ std::string EndFn = getLowerName().str() + "_end()";
+
+ OS << " typedef " << Type << "* " << IteratorType << ";\n";
+ OS << " " << IteratorType << " " << BeginFn << " const {"
+ << " return " << ArgName << "; }\n";
+ OS << " " << IteratorType << " " << EndFn << " const {"
+ << " return " << ArgName << " + " << ArgSizeName << "; }\n";
+ OS << " unsigned " << getLowerName() << "_size() const {"
+ << " return " << ArgSizeName << "; }\n";
+ OS << " llvm::iterator_range<" << IteratorType << "> " << RangeName
+ << "() const { return llvm::make_range(" << BeginFn << ", " << EndFn
+ << "); }\n";
}
void writeCloneArgs(raw_ostream &OS) const override {
- OS << getLowerName() << ", " << getLowerName() << "Size";
+ OS << ArgName << ", " << ArgSizeName;
}
void writeTemplateInstantiationArgs(raw_ostream &OS) const override {
// This isn't elegant, but we have to go through public methods...
@@ -538,15 +539,15 @@ namespace {
}
void writeCtorBody(raw_ostream &OS) const override {
OS << " std::copy(" << getUpperName() << ", " << getUpperName()
- << " + " << getLowerName() << "Size, " << getLowerName() << ");";
+ << " + " << ArgSizeName << ", " << ArgName << ");";
}
void writeCtorInitializers(raw_ostream &OS) const override {
- OS << getLowerName() << "Size(" << getUpperName() << "Size), "
- << getLowerName() << "(new (Ctx, 16) " << getType() << "["
- << getLowerName() << "Size])";
+ OS << ArgSizeName << "(" << getUpperName() << "Size), "
+ << ArgName << "(new (Ctx, 16) " << getType() << "["
+ << ArgSizeName << "])";
}
void writeCtorDefaultInitializers(raw_ostream &OS) const override {
- OS << getLowerName() << "Size(0), " << getLowerName() << "(0)";
+ OS << ArgSizeName << "(0), " << ArgName << "(nullptr)";
}
void writeCtorParameters(raw_ostream &OS) const override {
OS << getType() << " *" << getUpperName() << ", unsigned "
@@ -556,18 +557,18 @@ namespace {
OS << getUpperName() << ", " << getUpperName() << "Size";
}
void writeDeclarations(raw_ostream &OS) const override {
- OS << " unsigned " << getLowerName() << "Size;\n";
- OS << " " << getType() << " *" << getLowerName() << ";";
+ OS << " unsigned " << ArgSizeName << ";\n";
+ OS << " " << getType() << " *" << ArgName << ";";
}
void writePCHReadDecls(raw_ostream &OS) const override {
OS << " unsigned " << getLowerName() << "Size = Record[Idx++];\n";
- OS << " SmallVector<" << type << ", 4> " << getLowerName()
+ OS << " SmallVector<" << Type << ", 4> " << getLowerName()
<< ";\n";
OS << " " << getLowerName() << ".reserve(" << getLowerName()
<< "Size);\n";
OS << " for (unsigned i = " << getLowerName() << "Size; i; --i)\n";
- std::string read = ReadPCHRecord(type);
+ std::string read = ReadPCHRecord(Type);
OS << " " << getLowerName() << ".push_back(" << read << ");\n";
}
void writePCHReadArgs(raw_ostream &OS) const override {
@@ -575,28 +576,22 @@ namespace {
}
void writePCHWrite(raw_ostream &OS) const override {
OS << " Record.push_back(SA->" << getLowerName() << "_size());\n";
- OS << " for (" << getAttrName() << "Attr::" << getLowerName()
- << "_iterator i = SA->" << getLowerName() << "_begin(), e = SA->"
- << getLowerName() << "_end(); i != e; ++i)\n";
- OS << " " << WritePCHRecord(type, "(*i)");
+ OS << " for (auto &Val : SA->" << RangeName << "())\n";
+ OS << " " << WritePCHRecord(Type, "Val");
}
void writeValue(raw_ostream &OS) const override {
OS << "\";\n";
OS << " bool isFirst = true;\n"
- << " for (" << getAttrName() << "Attr::" << getLowerName()
- << "_iterator i = " << getLowerName() << "_begin(), e = "
- << getLowerName() << "_end(); i != e; ++i) {\n"
+ << " for (const auto &Val : " << RangeName << "()) {\n"
<< " if (isFirst) isFirst = false;\n"
<< " else OS << \", \";\n"
- << " OS << *i;\n"
+ << " OS << Val;\n"
<< " }\n";
OS << " OS << \"";
}
void writeDump(raw_ostream &OS) const override {
- OS << " for (" << getAttrName() << "Attr::" << getLowerName()
- << "_iterator I = SA->" << getLowerName() << "_begin(), E = SA->"
- << getLowerName() << "_end(); I != E; ++I)\n";
- OS << " OS << \" \" << *I;\n";
+ OS << " for (const auto &Val : SA->" << RangeName << "())\n";
+ OS << " OS << \" \" << Val;\n";
}
};
More information about the cfe-commits
mailing list