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 25using namespace clang; 26using namespace ento; 27 28ModelConsumer::ModelConsumer(llvm::StringMap<Stmt *> &Bodies) 29 : Bodies(Bodies) {} 30 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