1 //===--- ModelConsumer.cpp - ASTConsumer for consuming model files --------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 /// 9 /// \file 10 /// This file implements an ASTConsumer for consuming model files. 11 /// 12 /// This ASTConsumer handles the AST of a parsed model file. All top level 13 /// function definitions will be collected from that model file for later 14 /// retrieval during the static analysis. The body of these functions will not 15 /// be injected into the ASTUnit of the analyzed translation unit. It will be 16 /// available through the BodyFarm which is utilized by the AnalysisDeclContext 17 /// class. 18 /// 19 //===----------------------------------------------------------------------===// 20 21 #include "clang/StaticAnalyzer/Frontend/ModelConsumer.h" 22 #include "clang/AST/Decl.h" 23 #include "clang/AST/DeclGroup.h" 24 25 using namespace clang; 26 using namespace ento; 27 ModelConsumer(llvm::StringMap<Stmt * > & Bodies)28ModelConsumer::ModelConsumer(llvm::StringMap<Stmt *> &Bodies) 29 : Bodies(Bodies) {} 30 HandleTopLevelDecl(DeclGroupRef D)31bool ModelConsumer::HandleTopLevelDecl(DeclGroupRef D) { 32 for (DeclGroupRef::iterator I = D.begin(), E = D.end(); I != E; ++I) { 33 34 // Only interested in definitions. 35 const FunctionDecl *func = llvm::dyn_cast<FunctionDecl>(*I); 36 if (func && func->hasBody()) { 37 Bodies.insert(std::make_pair(func->getName(), func->getBody())); 38 } 39 } 40 return true; 41 } 42