#include "clang/Analysis/Analyses/ThreadSafetyCommon.h"
#include "clang/AST/Attr.h"
#include "clang/AST/Decl.h"
#include "clang/AST/DeclCXX.h"
#include "clang/AST/DeclGroup.h"
#include "clang/AST/DeclObjC.h"
#include "clang/AST/Expr.h"
#include "clang/AST/ExprCXX.h"
#include "clang/AST/OperationKinds.h"
#include "clang/AST/Stmt.h"
#include "clang/AST/Type.h"
#include "clang/Analysis/Analyses/ThreadSafetyTIL.h"
#include "clang/Analysis/CFG.h"
#include "clang/Basic/LLVM.h"
#include "clang/Basic/OperatorKinds.h"
#include "clang/Basic/Specifiers.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Support/Casting.h"
#include <algorithm>
#include <cassert>
#include <string>
#include <utility>
usingnamespaceclang;
usingnamespacethreadSafety;
std::string threadSafety::getSourceLiteralString(const Expr *CE) { … }
static bool isIncompletePhi(const til::SExpr *E) { … }
CallingContext;
til::SExpr *SExprBuilder::lookupStmt(const Stmt *S) { … }
til::SCFG *SExprBuilder::buildCFG(CFGWalker &Walker) { … }
static bool isCalleeArrow(const Expr *E) { … }
static StringRef ClassifyDiagnostic(const CapabilityAttr *A) { … }
static StringRef ClassifyDiagnostic(QualType VDT) { … }
CapabilityExpr SExprBuilder::translateAttrExpr(const Expr *AttrExp,
const NamedDecl *D,
const Expr *DeclExp,
til::SExpr *Self) { … }
CapabilityExpr SExprBuilder::translateAttrExpr(const Expr *AttrExp,
CallingContext *Ctx) { … }
til::LiteralPtr *SExprBuilder::createVariable(const VarDecl *VD) { … }
std::pair<til::LiteralPtr *, StringRef>
SExprBuilder::createThisPlaceholder(const Expr *Exp) { … }
til::SExpr *SExprBuilder::translate(const Stmt *S, CallingContext *Ctx) { … }
til::SExpr *SExprBuilder::translateDeclRefExpr(const DeclRefExpr *DRE,
CallingContext *Ctx) { … }
til::SExpr *SExprBuilder::translateCXXThisExpr(const CXXThisExpr *TE,
CallingContext *Ctx) { … }
static const ValueDecl *getValueDeclFromSExpr(const til::SExpr *E) { … }
static bool hasAnyPointerType(const til::SExpr *E) { … }
static const CXXMethodDecl *getFirstVirtualDecl(const CXXMethodDecl *D) { … }
til::SExpr *SExprBuilder::translateMemberExpr(const MemberExpr *ME,
CallingContext *Ctx) { … }
til::SExpr *SExprBuilder::translateObjCIVarRefExpr(const ObjCIvarRefExpr *IVRE,
CallingContext *Ctx) { … }
til::SExpr *SExprBuilder::translateCallExpr(const CallExpr *CE,
CallingContext *Ctx,
const Expr *SelfE) { … }
til::SExpr *SExprBuilder::translateCXXMemberCallExpr(
const CXXMemberCallExpr *ME, CallingContext *Ctx) { … }
til::SExpr *SExprBuilder::translateCXXOperatorCallExpr(
const CXXOperatorCallExpr *OCE, CallingContext *Ctx) { … }
til::SExpr *SExprBuilder::translateUnaryOperator(const UnaryOperator *UO,
CallingContext *Ctx) { … }
til::SExpr *SExprBuilder::translateBinOp(til::TIL_BinaryOpcode Op,
const BinaryOperator *BO,
CallingContext *Ctx, bool Reverse) { … }
til::SExpr *SExprBuilder::translateBinAssign(til::TIL_BinaryOpcode Op,
const BinaryOperator *BO,
CallingContext *Ctx,
bool Assign) { … }
til::SExpr *SExprBuilder::translateBinaryOperator(const BinaryOperator *BO,
CallingContext *Ctx) { … }
til::SExpr *SExprBuilder::translateCastExpr(const CastExpr *CE,
CallingContext *Ctx) { … }
til::SExpr *
SExprBuilder::translateArraySubscriptExpr(const ArraySubscriptExpr *E,
CallingContext *Ctx) { … }
til::SExpr *
SExprBuilder::translateAbstractConditionalOperator(
const AbstractConditionalOperator *CO, CallingContext *Ctx) { … }
til::SExpr *
SExprBuilder::translateDeclStmt(const DeclStmt *S, CallingContext *Ctx) { … }
til::SExpr *SExprBuilder::addStatement(til::SExpr* E, const Stmt *S,
const ValueDecl *VD) { … }
til::SExpr *SExprBuilder::lookupVarDecl(const ValueDecl *VD) { … }
static void maybeUpdateVD(til::SExpr *E, const ValueDecl *VD) { … }
til::SExpr *SExprBuilder::addVarDecl(const ValueDecl *VD, til::SExpr *E) { … }
til::SExpr *SExprBuilder::updateVarDecl(const ValueDecl *VD, til::SExpr *E) { … }
void SExprBuilder::makePhiNodeVar(unsigned i, unsigned NPreds, til::SExpr *E) { … }
void SExprBuilder::mergeEntryMap(LVarDefinitionMap Map) { … }
void SExprBuilder::mergeEntryMapBackEdge() { … }
void SExprBuilder::mergePhiNodesBackEdge(const CFGBlock *Blk) { … }
void SExprBuilder::enterCFG(CFG *Cfg, const NamedDecl *D,
const CFGBlock *First) { … }
void SExprBuilder::enterCFGBlock(const CFGBlock *B) { … }
void SExprBuilder::handlePredecessor(const CFGBlock *Pred) { … }
void SExprBuilder::handlePredecessorBackEdge(const CFGBlock *Pred) { … }
void SExprBuilder::enterCFGBlockBody(const CFGBlock *B) { … }
void SExprBuilder::handleStatement(const Stmt *S) { … }
void SExprBuilder::handleDestructorCall(const VarDecl *VD,
const CXXDestructorDecl *DD) { … }
void SExprBuilder::exitCFGBlockBody(const CFGBlock *B) { … }
void SExprBuilder::handleSuccessor(const CFGBlock *Succ) { … }
void SExprBuilder::handleSuccessorBackEdge(const CFGBlock *Succ) { … }
void SExprBuilder::exitCFGBlock(const CFGBlock *B) { … }
void SExprBuilder::exitCFG(const CFGBlock *Last) { … }
#ifndef NDEBUG
namespace {
class TILPrinter :
public til::PrettyPrinter<TILPrinter, llvm::raw_ostream> {};
}
namespace clang {
namespace threadSafety {
void printSCFG(CFGWalker &Walker) {
llvm::BumpPtrAllocator Bpa;
til::MemRegionRef Arena(&Bpa);
SExprBuilder SxBuilder(Arena);
til::SCFG *Scfg = SxBuilder.buildCFG(Walker);
TILPrinter::print(Scfg, llvm::errs());
}
}
}
#endif