//===- CallDescription.cpp - function/method call matching --*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // /// \file This file defines a generic mechanism for matching for function and /// method calls of C, C++, and Objective-C languages. Instances of these /// classes are frequently used together with the CallEvent classes. // //===----------------------------------------------------------------------===// #include "clang/StaticAnalyzer/Core/PathSensitive/CallDescription.h" #include "clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/Optional.h" using namespace llvm; using namespace clang; // A constructor helper. static Optional readRequiredParams(Optional RequiredArgs, Optional RequiredParams) { if (RequiredParams) return RequiredParams; if (RequiredArgs) return static_cast(*RequiredArgs); return None; } ento::CallDescription::CallDescription( int Flags, ArrayRef QualifiedName, Optional RequiredArgs /*= None*/, Optional RequiredParams /*= None*/) : QualifiedName(QualifiedName), RequiredArgs(RequiredArgs), RequiredParams(readRequiredParams(RequiredArgs, RequiredParams)), Flags(Flags) { assert(!QualifiedName.empty()); } /// Construct a CallDescription with default flags. ento::CallDescription::CallDescription( ArrayRef QualifiedName, Optional RequiredArgs /*= None*/, Optional RequiredParams /*= None*/) : CallDescription(0, QualifiedName, RequiredArgs, RequiredParams) {} ento::CallDescriptionSet::CallDescriptionSet( std::initializer_list &&List) { Impl.LinearMap.reserve(List.size()); for (const CallDescription &CD : List) Impl.LinearMap.push_back({CD, /*unused*/ true}); } bool ento::CallDescriptionSet::contains(const CallEvent &Call) const { return static_cast(Impl.lookup(Call)); }