ThreadSafety.h revision d5b16055782034ca90153880c36bd88b59c63aa0
1402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski//===- ThreadSafety.h ------------------------------------------*- C++ --*-===//
2402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski//
3402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski//                     The LLVM Compiler Infrastructure
4402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski//
5402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski// This file is distributed under the University of Illinois Open Source
6402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski// License. See LICENSE.TXT for details.
7402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski//
8402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski//===----------------------------------------------------------------------===//
9402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski//
10402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski//
11402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski// A intra-procedural analysis for thread safety (e.g. deadlocks and race
12402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski// conditions), based off of an annotation system.
13402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski//
14402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski// See http://gcc.gnu.org/wiki/ThreadSafetyAnnotation for the gcc version.
15402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski//
16402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski//===----------------------------------------------------------------------===//
17402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski
18402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski#ifndef LLVM_CLANG_THREADSAFETY_H
19402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski#define LLVM_CLANG_THREADSAFETY_H
20402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski
21d5b16055782034ca90153880c36bd88b59c63aa0Caitlin Sadowski#include "clang/Analysis/AnalysisContext.h"
22402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski#include "clang/Basic/SourceLocation.h"
23402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski#include "llvm/ADT/StringRef.h"
24402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski
25402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowskinamespace clang {
26402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowskinamespace thread_safety {
27402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski
28402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowskienum ProtectedOperationKind {
29402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski  POK_VarDereference,
30402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski  POK_VarAccess,
31402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski  POK_FunctionCall
32402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski};
33402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski
34402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowskienum LockKind {
35402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski  LK_Shared,
36402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski  LK_Exclusive
37402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski};
38402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski
39402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowskienum AccessKind {
40402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski  AK_Read,
41402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski  AK_Written
42402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski};
43402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski
44402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowskiclass ThreadSafetyHandler {
45402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowskipublic:
46402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski  typedef llvm::StringRef Name;
47402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski  ThreadSafetyHandler() {}
48402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski  virtual ~ThreadSafetyHandler() {}
4999107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski  virtual void handleInvalidLockExp(SourceLocation Loc) {}
50402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski  virtual void handleUnmatchedUnlock(Name LockName, SourceLocation Loc) {}
51402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski  virtual void handleDoubleLock(Name LockName, SourceLocation Loc) {}
52402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski  virtual void handleMutexHeldEndOfScope(Name LockName, SourceLocation Loc){}
53402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski  virtual void handleNoLockLoopEntry(Name LockName, SourceLocation Loc) {}
54402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski  virtual void handleNoUnlock(Name LockName, Name FunName,
55402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski                              SourceLocation Loc) {}
56402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski  virtual void handleExclusiveAndShared(Name LockName, SourceLocation Loc1,
57402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski                                        SourceLocation Loc2) {}
58402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski  virtual void handleNoMutexHeld(const NamedDecl *D, ProtectedOperationKind POK,
59402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski                                 AccessKind AK, SourceLocation Loc) {}
60402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski  virtual void handleMutexNotHeld(const NamedDecl *D,
61402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski                                  ProtectedOperationKind POK, Name LockName,
62402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski                                  LockKind LK, SourceLocation Loc) {}
63402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski  virtual void handleFunExcludesLock(Name FunName, Name LockName,
64402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski                                     SourceLocation Loc) {}
65402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski};
66402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski
67402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowskivoid runThreadSafetyAnalysis(AnalysisContext &AC, ThreadSafetyHandler &Handler);
68402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin SadowskiLockKind getLockKindFromAccessKind(AccessKind AK);
69402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski
70402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski}} // end namespace clang::thread_safety
71402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski#endif
72