r209847 - Thread Safety Analysis: implement review suggestions from Aaron Ballman.
DeLesley Hutchins
delesley at google.com
Thu May 29 14:24:16 PDT 2014
Author: delesley
Date: Thu May 29 16:24:16 2014
New Revision: 209847
URL: http://llvm.org/viewvc/llvm-project?rev=209847&view=rev
Log:
Thread Safety Analysis: implement review suggestions from Aaron Ballman.
Modified:
cfe/trunk/include/clang/Analysis/Analyses/ThreadSafetyTIL.h
cfe/trunk/include/clang/Analysis/Analyses/ThreadSafetyTraverse.h
cfe/trunk/include/clang/Analysis/Analyses/ThreadSafetyUtil.h
cfe/trunk/lib/Analysis/ThreadSafetyCommon.cpp
Modified: cfe/trunk/include/clang/Analysis/Analyses/ThreadSafetyTIL.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/Analyses/ThreadSafetyTIL.h?rev=209847&r1=209846&r2=209847&view=diff
==============================================================================
--- cfe/trunk/include/clang/Analysis/Analyses/ThreadSafetyTIL.h (original)
+++ cfe/trunk/include/clang/Analysis/Analyses/ThreadSafetyTIL.h Thu May 29 16:24:16 2014
@@ -52,6 +52,7 @@
#include "ThreadSafetyUtil.h"
#include <stdint.h>
+#include <algorithm>
#include <cassert>
#include <cstddef>
#include <utility>
@@ -598,6 +599,8 @@ public:
};
+template <class T> class LiteralT;
+
// Base class for literal values.
class Literal : public SExpr {
public:
@@ -614,6 +617,13 @@ public:
ValueType valueType() const { return ValType; }
+ template<class T> const LiteralT<T>& as() const {
+ return *static_cast<const LiteralT<T>*>(this);
+ }
+ template<class T> LiteralT<T>& as() {
+ return *static_cast<LiteralT<T>*>(this);
+ }
+
template <class V> typename V::R_SExpr traverse(V &Vs, typename V::R_Ctx Ctx);
template <class C> typename C::CType compare(Literal* E, C& Cmp) {
@@ -621,7 +631,7 @@ public:
return Cmp.comparePointers(Cexpr, E->Cexpr);
}
-protected:
+private:
const ValueType ValType;
const clang::Expr *Cexpr;
};
@@ -642,6 +652,7 @@ private:
};
+
template <class V>
typename V::R_SExpr Literal::traverse(V &Vs, typename V::R_Ctx Ctx) {
if (Cexpr)
@@ -651,29 +662,29 @@ typename V::R_SExpr Literal::traverse(V
case ValueType::BT_Void:
break;
case ValueType::BT_Bool:
- return Vs.reduceLiteralT(*static_cast<LiteralT<bool>*>(this));
+ return Vs.reduceLiteralT(as<bool>());
case ValueType::BT_Int: {
switch (ValType.Size) {
case ValueType::ST_8:
if (ValType.Signed)
- return Vs.reduceLiteralT(*static_cast<LiteralT<int8_t>*>(this));
+ return Vs.reduceLiteralT(as<int8_t>());
else
- return Vs.reduceLiteralT(*static_cast<LiteralT<uint8_t>*>(this));
+ return Vs.reduceLiteralT(as<uint8_t>());
case ValueType::ST_16:
if (ValType.Signed)
- return Vs.reduceLiteralT(*static_cast<LiteralT<int16_t>*>(this));
+ return Vs.reduceLiteralT(as<int16_t>());
else
- return Vs.reduceLiteralT(*static_cast<LiteralT<uint16_t>*>(this));
+ return Vs.reduceLiteralT(as<uint16_t>());
case ValueType::ST_32:
if (ValType.Signed)
- return Vs.reduceLiteralT(*static_cast<LiteralT<int32_t>*>(this));
+ return Vs.reduceLiteralT(as<int32_t>());
else
- return Vs.reduceLiteralT(*static_cast<LiteralT<uint32_t>*>(this));
+ return Vs.reduceLiteralT(as<uint32_t>());
case ValueType::ST_64:
if (ValType.Signed)
- return Vs.reduceLiteralT(*static_cast<LiteralT<int64_t>*>(this));
+ return Vs.reduceLiteralT(as<int64_t>());
else
- return Vs.reduceLiteralT(*static_cast<LiteralT<uint64_t>*>(this));
+ return Vs.reduceLiteralT(as<uint64_t>());
default:
break;
}
@@ -681,17 +692,17 @@ typename V::R_SExpr Literal::traverse(V
case ValueType::BT_Float: {
switch (ValType.Size) {
case ValueType::ST_32:
- return Vs.reduceLiteralT(*static_cast<LiteralT<float>*>(this));
+ return Vs.reduceLiteralT(as<float>());
case ValueType::ST_64:
- return Vs.reduceLiteralT(*static_cast<LiteralT<double>*>(this));
+ return Vs.reduceLiteralT(as<double>());
default:
break;
}
}
case ValueType::BT_String:
- return Vs.reduceLiteralT(*static_cast<LiteralT<StringRef>*>(this));
+ return Vs.reduceLiteralT(as<StringRef>());
case ValueType::BT_Pointer:
- return Vs.reduceLiteralT(*static_cast<LiteralT<void*>*>(this));
+ return Vs.reduceLiteralT(as<void*>());
case ValueType::BT_ValueRef:
break;
}
@@ -1458,13 +1469,9 @@ public:
void reservePredecessors(unsigned NumPreds);
// Return the index of BB, or Predecessors.size if BB is not a predecessor.
- unsigned findPredecessorIndex(BasicBlock *BB) {
- unsigned I = 0;
- for (BasicBlock *B : Predecessors) {
- if (B == BB) return I;
- ++I;
- }
- return Predecessors.size();
+ unsigned findPredecessorIndex(const BasicBlock *BB) const {
+ auto I = std::find(Predecessors.cbegin(), Predecessors.cend(), BB);
+ return std::distance(Predecessors.cbegin(), I);
}
// Set id numbers for variables.
Modified: cfe/trunk/include/clang/Analysis/Analyses/ThreadSafetyTraverse.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/Analyses/ThreadSafetyTraverse.h?rev=209847&r1=209846&r2=209847&view=diff
==============================================================================
--- cfe/trunk/include/clang/Analysis/Analyses/ThreadSafetyTraverse.h (original)
+++ cfe/trunk/include/clang/Analysis/Analyses/ThreadSafetyTraverse.h Thu May 29 16:24:16 2014
@@ -843,7 +843,7 @@ protected:
if (E->parent())
SS << " BB_" << E->parent()->blockID();
newline(SS);
- for (auto A : E->arguments()) {
+ for (auto *A : E->arguments()) {
SS << "let ";
self()->printVariable(A, SS, true);
SS << " = ";
@@ -851,7 +851,7 @@ protected:
SS << ";";
newline(SS);
}
- for (auto I : E->instructions()) {
+ for (auto *I : E->instructions()) {
if (I->definition()->opcode() != COP_Store) {
SS << "let ";
self()->printVariable(I, SS, true);
Modified: cfe/trunk/include/clang/Analysis/Analyses/ThreadSafetyUtil.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/Analyses/ThreadSafetyUtil.h?rev=209847&r1=209846&r2=209847&view=diff
==============================================================================
--- cfe/trunk/include/clang/Analysis/Analyses/ThreadSafetyUtil.h (original)
+++ cfe/trunk/include/clang/Analysis/Analyses/ThreadSafetyUtil.h Thu May 29 16:24:16 2014
@@ -123,9 +123,9 @@ public:
// Reserve space for at least N more items.
void reserveCheck(size_t N, MemRegionRef A) {
if (Capacity == 0)
- reserve(InitialCapacity, A);
+ reserve(u_max(InitialCapacity, N), A);
else if (Size + N < Capacity)
- reserve(Capacity*2, A);
+ reserve(u_max(Size + N, Capacity * 2), A);
}
typedef T *iterator;
@@ -172,7 +172,11 @@ public:
}
private:
- static const unsigned InitialCapacity = 4;
+ // std::max is annoying here, because it requires a reference,
+ // thus forcing InitialCapacity to be initialized outside the .h file.
+ size_t u_max(size_t i, size_t j) { return (i < j) ? j : i; }
+
+ static const size_t InitialCapacity = 4;
SimpleArray(const SimpleArray<T> &A) LLVM_DELETED_FUNCTION;
Modified: cfe/trunk/lib/Analysis/ThreadSafetyCommon.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/ThreadSafetyCommon.cpp?rev=209847&r1=209846&r2=209847&view=diff
==============================================================================
--- cfe/trunk/lib/Analysis/ThreadSafetyCommon.cpp (original)
+++ cfe/trunk/lib/Analysis/ThreadSafetyCommon.cpp Thu May 29 16:24:16 2014
@@ -725,7 +725,7 @@ void SExprBuilder::exitCFGBlockBody(cons
if (N == 1) {
til::BasicBlock *BB = *It ? lookupBlock(*It) : nullptr;
// TODO: set index
- unsigned Idx = BB->findPredecessorIndex(CurrentBB);
+ unsigned Idx = BB ? BB->findPredecessorIndex(CurrentBB) : 0;
til::SExpr *Tm = new (Arena) til::Goto(BB, Idx);
CurrentBB->setTerminator(Tm);
}
More information about the cfe-commits
mailing list