ThreadSafety.h revision 402aa0698fec81e574818a0a6c2000fac0b2c4c6
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 21402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski#include "clang/Basic/SourceLocation.h" 22402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski#include "llvm/ADT/StringRef.h" 23402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski#include "clang/Analysis/AnalysisContext.h" 24402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski#include "clang/Sema/SemaInternal.h" 25402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski 26402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowskinamespace clang { 27402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowskinamespace thread_safety { 28402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski 29402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowskienum ProtectedOperationKind { 30402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski POK_VarDereference, 31402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski POK_VarAccess, 32402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski POK_FunctionCall 33402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski}; 34402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski 35402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowskienum LockKind { 36402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski LK_Shared, 37402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski LK_Exclusive 38402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski}; 39402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski 40402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowskienum AccessKind { 41402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski AK_Read, 42402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski AK_Written 43402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski}; 44402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski 45402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowskiclass ThreadSafetyHandler { 46402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowskipublic: 47402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski typedef llvm::StringRef Name; 48402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski ThreadSafetyHandler() {} 49402aa0698fec81e574818a0a6c2000fac0b2c4c6Caitlin Sadowski virtual ~ThreadSafetyHandler() {} 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