summaryrefslogtreecommitdiff
path: root/include/clang/Analysis/Analyses
diff options
context:
space:
mode:
Diffstat (limited to 'include/clang/Analysis/Analyses')
-rw-r--r--include/clang/Analysis/Analyses/Dominators.h4
-rw-r--r--include/clang/Analysis/Analyses/FormatString.h24
-rw-r--r--include/clang/Analysis/Analyses/LiveVariables.h7
-rw-r--r--include/clang/Analysis/Analyses/ThreadSafety.h15
-rw-r--r--include/clang/Analysis/Analyses/ThreadSafetyCommon.h12
-rw-r--r--include/clang/Analysis/Analyses/ThreadSafetyTIL.h8
-rw-r--r--include/clang/Analysis/Analyses/ThreadSafetyUtil.h54
7 files changed, 69 insertions, 55 deletions
diff --git a/include/clang/Analysis/Analyses/Dominators.h b/include/clang/Analysis/Analyses/Dominators.h
index fcef0fc10ac8..4524aebe4e8b 100644
--- a/include/clang/Analysis/Analyses/Dominators.h
+++ b/include/clang/Analysis/Analyses/Dominators.h
@@ -44,9 +44,7 @@ public:
DT = new llvm::DominatorTreeBase<CFGBlock>(false);
}
- ~DominatorTree() {
- delete DT;
- }
+ ~DominatorTree() override { delete DT; }
llvm::DominatorTreeBase<CFGBlock>& getBase() { return *DT; }
diff --git a/include/clang/Analysis/Analyses/FormatString.h b/include/clang/Analysis/Analyses/FormatString.h
index 174cce4f363c..2e8058dabda2 100644
--- a/include/clang/Analysis/Analyses/FormatString.h
+++ b/include/clang/Analysis/Analyses/FormatString.h
@@ -49,7 +49,7 @@ public:
const char *toString() const { return representation; }
// Overloaded operators for bool like qualities
- LLVM_EXPLICIT operator bool() const { return flag; }
+ explicit operator bool() const { return flag; }
OptionalFlag& operator=(const bool &rhs) {
flag = rhs;
return *this; // Return a reference to myself.
@@ -161,6 +161,12 @@ public:
ObjCObjArg, // '@'
ObjCBeg = ObjCObjArg, ObjCEnd = ObjCObjArg,
+ // FreeBSD kernel specific specifiers.
+ FreeBSDbArg,
+ FreeBSDDArg,
+ FreeBSDrArg,
+ FreeBSDyArg,
+
// GlibC specific specifiers.
PrintErrno, // 'm'
@@ -204,7 +210,8 @@ public:
return EndScanList ? EndScanList - Position : 1;
}
- bool isIntArg() const { return kind >= IntArgBeg && kind <= IntArgEnd; }
+ bool isIntArg() const { return (kind >= IntArgBeg && kind <= IntArgEnd) ||
+ kind == FreeBSDrArg || kind == FreeBSDyArg; }
bool isUIntArg() const { return kind >= UIntArgBeg && kind <= UIntArgEnd; }
bool isAnyIntArg() const { return kind >= IntArgBeg && kind <= UIntArgEnd; }
const char *toString() const;
@@ -224,6 +231,9 @@ class ArgType {
public:
enum Kind { UnknownTy, InvalidTy, SpecificTy, ObjCPointerTy, CPointerTy,
AnyCharTy, CStrTy, WCStrTy, WIntTy };
+
+ enum MatchKind { NoMatch = 0, Match = 1, NoMatchPedantic };
+
private:
const Kind K;
QualType T;
@@ -247,7 +257,7 @@ public:
return Res;
}
- bool matchesType(ASTContext &C, QualType argTy) const;
+ MatchKind matchesType(ASTContext &C, QualType argTy) const;
QualType getRepresentativeType(ASTContext &C) const;
@@ -646,10 +656,10 @@ public:
bool ParsePrintfString(FormatStringHandler &H,
const char *beg, const char *end, const LangOptions &LO,
- const TargetInfo &Target);
-
-bool ParseFormatStringHasSArg(const char *beg, const char *end, const LangOptions &LO,
- const TargetInfo &Target);
+ const TargetInfo &Target, bool isFreeBSDKPrintf);
+
+bool ParseFormatStringHasSArg(const char *beg, const char *end,
+ const LangOptions &LO, const TargetInfo &Target);
bool ParseScanfString(FormatStringHandler &H,
const char *beg, const char *end, const LangOptions &LO,
diff --git a/include/clang/Analysis/Analyses/LiveVariables.h b/include/clang/Analysis/Analyses/LiveVariables.h
index c29dd409e56c..e17f73a61f81 100644
--- a/include/clang/Analysis/Analyses/LiveVariables.h
+++ b/include/clang/Analysis/Analyses/LiveVariables.h
@@ -44,8 +44,6 @@ public:
llvm::ImmutableSet<const VarDecl *> LiveDecls)
: liveStmts(LiveStmts), liveDecls(LiveDecls) {}
- ~LivenessValues() {}
-
bool isLive(const Stmt *S) const;
bool isLive(const VarDecl *D) const;
@@ -66,11 +64,10 @@ public:
/// Called when the live variables analysis registers
/// that a variable is killed.
virtual void observerKill(const DeclRefExpr *DR) {}
- };
+ };
+ ~LiveVariables() override;
- virtual ~LiveVariables();
-
/// Compute the liveness information for a given CFG.
static LiveVariables *computeLiveness(AnalysisDeclContext &analysisContext,
bool killAtAssign);
diff --git a/include/clang/Analysis/Analyses/ThreadSafety.h b/include/clang/Analysis/Analyses/ThreadSafety.h
index 458bb576f459..22694a7a225a 100644
--- a/include/clang/Analysis/Analyses/ThreadSafety.h
+++ b/include/clang/Analysis/Analyses/ThreadSafety.h
@@ -26,6 +26,8 @@
namespace clang {
namespace threadSafety {
+class BeforeSet;
+
/// This enum distinguishes between different kinds of operations that may
/// need to be protected by locks. We use this enum in error handling.
enum ProtectedOperationKind {
@@ -183,6 +185,14 @@ public:
virtual void handleFunExcludesLock(StringRef Kind, Name FunName,
Name LockName, SourceLocation Loc) {}
+
+ /// Warn that L1 cannot be acquired before L2.
+ virtual void handleLockAcquiredBefore(StringRef Kind, Name L1Name,
+ Name L2Name, SourceLocation Loc) {}
+
+ /// Warn that there is a cycle in acquired_before/after dependencies.
+ virtual void handleBeforeAfterCycle(Name L1Name, SourceLocation Loc) {}
+
/// Called by the analysis when starting analysis of a function.
/// Used to issue suggestions for changes to annotations.
virtual void enterFunction(const FunctionDecl *FD) {}
@@ -203,7 +213,10 @@ private:
/// at the end of each block, and issue warnings for thread safety violations.
/// Each block in the CFG is traversed exactly once.
void runThreadSafetyAnalysis(AnalysisDeclContext &AC,
- ThreadSafetyHandler &Handler);
+ ThreadSafetyHandler &Handler,
+ BeforeSet **Bset);
+
+void threadSafetyCleanup(BeforeSet *Cache);
/// \brief Helper function that returns a LockKind required for the given level
/// of access.
diff --git a/include/clang/Analysis/Analyses/ThreadSafetyCommon.h b/include/clang/Analysis/Analyses/ThreadSafetyCommon.h
index be81121c102b..9b7725ab0f3c 100644
--- a/include/clang/Analysis/Analyses/ThreadSafetyCommon.h
+++ b/include/clang/Analysis/Analyses/ThreadSafetyCommon.h
@@ -286,6 +286,14 @@ public:
sx::partiallyMatches(CapExpr, other.CapExpr);
}
+ const ValueDecl* valueDecl() const {
+ if (Negated)
+ return nullptr;
+ if (auto *P = dyn_cast<til::Project>(CapExpr))
+ return P->clangDecl();
+ return nullptr;
+ }
+
std::string toString() const {
if (Negated)
return "!" + sx::toString(CapExpr);
@@ -422,8 +430,8 @@ private:
}
private:
- BlockInfo(const BlockInfo &) LLVM_DELETED_FUNCTION;
- void operator=(const BlockInfo &) LLVM_DELETED_FUNCTION;
+ BlockInfo(const BlockInfo &) = delete;
+ void operator=(const BlockInfo &) = delete;
};
// We implement the CFGVisitor API
diff --git a/include/clang/Analysis/Analyses/ThreadSafetyTIL.h b/include/clang/Analysis/Analyses/ThreadSafetyTIL.h
index 2cd8c6d6d2d6..4b5946617dfc 100644
--- a/include/clang/Analysis/Analyses/ThreadSafetyTIL.h
+++ b/include/clang/Analysis/Analyses/ThreadSafetyTIL.h
@@ -282,7 +282,7 @@ public:
/// SExpr objects cannot be deleted.
// This declaration is public to workaround a gcc bug that breaks building
// with REQUIRES_EH=1.
- void operator delete(void *) LLVM_DELETED_FUNCTION;
+ void operator delete(void *) = delete;
/// Returns the instruction ID for this expression.
/// All basic block instructions have a unique ID (i.e. virtual register).
@@ -309,10 +309,10 @@ protected:
BasicBlock* Block;
private:
- SExpr() LLVM_DELETED_FUNCTION;
+ SExpr() = delete;
/// SExpr objects must be created in an arena.
- void *operator new(size_t) LLVM_DELETED_FUNCTION;
+ void *operator new(size_t) = delete;
};
@@ -424,7 +424,7 @@ public:
Future() : SExpr(COP_Future), Status(FS_pending), Result(nullptr) {}
private:
- virtual ~Future() LLVM_DELETED_FUNCTION;
+ virtual ~Future() = delete;
public:
// A lazy rewriting strategy should subclass Future and override this method.
diff --git a/include/clang/Analysis/Analyses/ThreadSafetyUtil.h b/include/clang/Analysis/Analyses/ThreadSafetyUtil.h
index ba3e0e519b09..4d3402f8c00b 100644
--- a/include/clang/Analysis/Analyses/ThreadSafetyUtil.h
+++ b/include/clang/Analysis/Analyses/ThreadSafetyUtil.h
@@ -130,6 +130,8 @@ public:
typedef T *iterator;
typedef const T *const_iterator;
+ typedef std::reverse_iterator<iterator> reverse_iterator;
+ typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
size_t size() const { return Size; }
size_t capacity() const { return Capacity; }
@@ -160,6 +162,16 @@ public:
const_iterator cbegin() const { return Data; }
const_iterator cend() const { return Data + Size; }
+ reverse_iterator rbegin() { return reverse_iterator(end()); }
+ reverse_iterator rend() { return reverse_iterator(begin()); }
+
+ const_reverse_iterator rbegin() const {
+ return const_reverse_iterator(end());
+ }
+ const_reverse_iterator rend() const {
+ return const_reverse_iterator(begin());
+ }
+
void push_back(const T &Elem) {
assert(Size < Capacity);
Data[Size++] = Elem;
@@ -188,36 +200,12 @@ public:
return J - Osz;
}
- // An adaptor to reverse a simple array
- class ReverseAdaptor {
- public:
- ReverseAdaptor(SimpleArray &Array) : Array(Array) {}
- // A reverse iterator used by the reverse adaptor
- class Iterator {
- public:
- Iterator(T *Data) : Data(Data) {}
- T &operator*() { return *Data; }
- const T &operator*() const { return *Data; }
- Iterator &operator++() {
- --Data;
- return *this;
- }
- bool operator!=(Iterator Other) { return Data != Other.Data; }
-
- private:
- T *Data;
- };
- Iterator begin() { return Array.end() - 1; }
- Iterator end() { return Array.begin() - 1; }
- const Iterator begin() const { return Array.end() - 1; }
- const Iterator end() const { return Array.begin() - 1; }
-
- private:
- SimpleArray &Array;
- };
-
- const ReverseAdaptor reverse() const { return ReverseAdaptor(*this); }
- ReverseAdaptor reverse() { return ReverseAdaptor(*this); }
+ llvm::iterator_range<reverse_iterator> reverse() {
+ return llvm::make_range(rbegin(), rend());
+ }
+ llvm::iterator_range<const_reverse_iterator> reverse() const {
+ return llvm::make_range(rbegin(), rend());
+ }
private:
// std::max is annoying here, because it requires a reference,
@@ -226,7 +214,7 @@ private:
static const size_t InitialCapacity = 4;
- SimpleArray(const SimpleArray<T> &A) LLVM_DELETED_FUNCTION;
+ SimpleArray(const SimpleArray<T> &A) = delete;
T *Data;
size_t Size;
@@ -255,8 +243,8 @@ class CopyOnWriteVector {
};
// No copy constructor or copy assignment. Use clone() with move assignment.
- CopyOnWriteVector(const CopyOnWriteVector &V) LLVM_DELETED_FUNCTION;
- void operator=(const CopyOnWriteVector &V) LLVM_DELETED_FUNCTION;
+ CopyOnWriteVector(const CopyOnWriteVector &V) = delete;
+ void operator=(const CopyOnWriteVector &V) = delete;
public:
CopyOnWriteVector() : Data(nullptr) {}