Lines Matching full:clang
28 // This is clang plugin used by gcmole tool. See README for more details.
30 #include "clang/AST/AST.h"
31 #include "clang/AST/ASTConsumer.h"
32 #include "clang/AST/Mangle.h"
33 #include "clang/AST/RecursiveASTVisitor.h"
34 #include "clang/AST/StmtVisitor.h"
35 #include "clang/Frontend/FrontendPluginRegistry.h"
36 #include "clang/Frontend/CompilerInstance.h"
51 static bool GetMangledName(clang::MangleContext* ctx,
52 const clang::NamedDecl* decl,
54 if (!llvm::isa<clang::CXXConstructorDecl>(decl) &&
55 !llvm::isa<clang::CXXDestructorDecl>(decl)) {
67 static bool InV8Namespace(const clang::NamedDecl* decl) {
75 static bool IsExternalVMState(const clang::ValueDecl* var) {
76 const clang::EnumConstantDecl* enum_constant =
77 llvm::dyn_cast<clang::EnumConstantDecl>(var);
79 clang::QualType type = enum_constant->getType();
88 explicit Resolver(clang::ASTContext& ctx)
92 Resolver(clang::ASTContext& ctx, clang::DeclContext* decl_ctx)
96 clang::DeclarationName ResolveName(const char* n) {
97 clang::IdentifierInfo* ident = &ctx_.Idents.get(n);
102 return Resolver(ctx_, Resolve<clang::NamespaceDecl>(n));
109 clang::DeclContext::lookup_result result =
112 clang::DeclContext::lookup_iterator end = result.end();
113 for (clang::DeclContext::lookup_iterator i = result.begin(); i != end;
122 clang::ASTContext& ctx_;
123 clang::DeclContext* decl_ctx_;
127 class CalleesPrinter : public clang::RecursiveASTVisitor<CalleesPrinter> {
129 explicit CalleesPrinter(clang::MangleContext* ctx) : ctx_(ctx) {
132 virtual bool VisitCallExpr(clang::CallExpr* expr) {
133 const clang::FunctionDecl* callee = expr->getDirectCallee();
138 virtual bool VisitDeclRefExpr(clang::DeclRefExpr* expr) {
145 void AnalyzeFunction(const clang::FunctionDecl* f) {
150 const clang::FunctionDecl* body = NULL;
199 clang::MangleContext* ctx_;
207 : public clang::ASTConsumer,
208 public clang::RecursiveASTVisitor<FunctionDeclarationFinder> {
210 explicit FunctionDeclarationFinder(clang::DiagnosticsEngine& d,
211 clang::SourceManager& sm,
215 virtual void HandleTranslationUnit(clang::ASTContext &ctx) {
216 mangle_context_ = clang::ItaniumMangleContext::create(ctx, d_);
224 virtual bool VisitFunctionDecl(clang::FunctionDecl* decl) {
230 clang::DiagnosticsEngine& d_;
231 clang::SourceManager& sm_;
232 clang::MangleContext* mangle_context_;
254 static bool KnownToCauseGC(clang::MangleContext* ctx,
255 const clang::FunctionDecl* decl) {
507 FunctionAnalyzer(clang::MangleContext* ctx,
508 clang::DeclarationName handle_decl_name,
509 clang::CXXRecordDecl* object_decl,
510 clang::CXXRecordDecl* smi_decl, clang::DiagnosticsEngine& d,
511 clang::SourceManager& sm, bool dead_vars_analysis)
526 ExprEffect VisitExpr(clang::Expr* expr, const Environment& env) {
529 clang::type* concrete_expr = llvm::dyn_cast_or_null<clang::type>(expr); \
594 ExprEffect Visit##type (clang::type* expr, const Environment& env)
597 ExprEffect Visit##type (clang::type* expr, const Environment& env) { \
646 clang::Expr* exprs[2] = {expr->getBase(), expr->getIdx()};
650 bool IsRawPointerVar(clang::Expr* expr, std::string* var_name) {
651 if (llvm::isa<clang::DeclRefExpr>(expr)) {
653 llvm::cast<clang::DeclRefExpr>(expr)->getDecl()->getNameAsString();
660 clang::Expr* lhs = expr->getLHS();
661 clang::Expr* rhs = expr->getRHS();
662 clang::Expr* exprs[2] = {lhs, rhs};
665 case clang::BO_Comma:
668 case clang::BO_LAnd:
669 case clang::BO_LOr:
672 case clang::BO_Assign: {
738 if (expr->getOpcode() == clang::UO_AddrOf) {
755 ExprEffect Par(clang::Expr* parent,
757 clang::Expr** exprs,
770 ExprEffect Seq(clang::Stmt* parent,
772 clang::Expr** exprs,
783 ExprEffect Use(const clang::Expr* parent,
784 const clang::QualType& var_type,
796 ExprEffect Use(const clang::Expr* parent,
797 const clang::ValueDecl* var,
824 ExprEffect VisitCallExpr(clang::CallExpr* call,
828 clang::CXXMemberCallExpr* memcall =
829 llvm::dyn_cast_or_null<clang::CXXMemberCallExpr>(call);
831 clang::Expr* receiver = memcall->getImplicitObjectArgument();
842 clang::FunctionDecl* callee = call->getDirectCallee();
854 Environment VisitStmt(clang::Stmt* stmt, const Environment& env) {
857 clang::type* concrete_stmt = llvm::dyn_cast_or_null<clang::type>(stmt); \
863 if (clang::Expr* expr = llvm::dyn_cast_or_null<clang::Expr>(stmt)) {
892 Environment Visit##type (clang::type* stmt, const Environment& env)
895 Environment Visit##type (clang::type* stmt, const Environment& env) { \
952 void Seq(clang::Stmt* a, clang::Stmt* b, clang::Stmt* c) {
959 void Seq(clang::Stmt* a, clang::Stmt* b) {
965 void Loop(clang::Stmt* a, clang::Stmt* b, clang::Stmt* c) {
970 void Loop(clang::Stmt* a, clang::Stmt* b) {
997 clang::CompoundStmt::body_iterator end = stmt->body_end();
998 for (clang::CompoundStmt::body_iterator s = stmt->body_begin();
1061 const clang::TagType* ToTagType(const clang::Type* t) {
1064 } else if (llvm::isa<clang::TagType>(t)) {
1065 return llvm::cast<clang::TagType>(t);
1066 } else if (llvm::isa<clang::SubstTemplateTypeParmType>(t)) {
1067 return ToTagType(llvm::cast<clang::SubstTemplateTypeParmType>(t)
1075 bool IsDerivedFrom(clang::CXXRecordDecl* record,
1076 clang::CXXRecordDecl* base) {
1080 bool IsRawPointerType(clang::QualType qtype) {
1081 const clang::PointerType* type =
1082 llvm::dyn_cast_or_null<clang::PointerType>(qtype.getTypePtrOrNull());
1085 const clang::TagType* pointee =
1089 clang::CXXRecordDecl* record =
1090 llvm::dyn_cast_or_null<clang::CXXRecordDecl>(pointee->getDecl());
1103 Environment VisitDecl(clang::Decl* decl, const Environment& env) {
1104 if (clang::VarDecl* var = llvm::dyn_cast<clang::VarDecl>(decl)) {
1119 clang::DeclStmt::decl_iterator end = stmt->decl_end();
1120 for (clang::DeclStmt::decl_iterator decl = stmt->decl_begin();
1129 void DefineParameters(const clang::FunctionDecl* f,
1132 clang::FunctionDecl::param_const_iterator end = f->param_end();
1133 for (clang::FunctionDecl::param_const_iterator p = f->param_begin();
1141 void AnalyzeFunction(const clang::FunctionDecl* f) {
1142 const clang::FunctionDecl* body = NULL;
1162 void ReportUnsafe(const clang::Expr* expr, const std::string& msg) {
1163 d_.Report(clang::FullSourceLoc(expr->getExprLoc(), sm_),
1164 d_.getCustomDiagID(clang
1169 clang::MangleContext* ctx_;
1170 clang::DeclarationName handle_decl_name_;
1171 clang::CXXRecordDecl* object_decl_;
1172 clang::CXXRecordDecl* smi_decl_;
1174 clang::DiagnosticsEngine& d_;
1175 clang::SourceManager& sm_;
1182 class ProblemsFinder : public clang::ASTConsumer,
1183 public clang::RecursiveASTVisitor<ProblemsFinder> {
1185 ProblemsFinder(clang::DiagnosticsEngine& d, clang::SourceManager& sm,
1195 virtual void HandleTranslationUnit(clang::ASTContext &ctx) {
1198 clang::CXXRecordDecl* object_decl =
1200 Resolve<clang::CXXRecordDecl>("Object");
1202 clang::CXXRecordDecl* smi_decl =
1204 Resolve<clang::CXXRecordDecl>("Smi");
1212 clang::ItaniumMangleContext::create(ctx, d_), r.ResolveName("Handle"),
1225 virtual bool VisitFunctionDecl(clang::FunctionDecl* decl) {
1231 clang::DiagnosticsEngine& d_;
1232 clang::SourceManager& sm_;
1240 class Action : public clang::PluginASTAction {
1242 clang::ASTConsumer *CreateASTConsumer(clang::CompilerInstance &CI,
1247 bool ParseArgs(const clang::CompilerInstance &CI,
1262 static clang::FrontendPluginRegistry::Add<Action<ProblemsFinder> >
1265 static clang::FrontendPluginRegistry::Add<