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