1*a07aba5dSTimm Baeder //===--- InterpShared.cpp ---------------------------------------*- C++ -*-===// 2*a07aba5dSTimm Baeder // 3*a07aba5dSTimm Baeder // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*a07aba5dSTimm Baeder // See https://llvm.org/LICENSE.txt for license information. 5*a07aba5dSTimm Baeder // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*a07aba5dSTimm Baeder // 7*a07aba5dSTimm Baeder //===----------------------------------------------------------------------===// 8*a07aba5dSTimm Baeder 9*a07aba5dSTimm Baeder #include "InterpShared.h" 10*a07aba5dSTimm Baeder #include "clang/AST/Attr.h" 11*a07aba5dSTimm Baeder #include "llvm/ADT/BitVector.h" 12*a07aba5dSTimm Baeder 13*a07aba5dSTimm Baeder namespace clang { 14*a07aba5dSTimm Baeder namespace interp { 15*a07aba5dSTimm Baeder 16*a07aba5dSTimm Baeder llvm::BitVector collectNonNullArgs(const FunctionDecl *F, 17*a07aba5dSTimm Baeder const llvm::ArrayRef<const Expr *> &Args) { 18*a07aba5dSTimm Baeder llvm::BitVector NonNullArgs; 19*a07aba5dSTimm Baeder if (!F) 20*a07aba5dSTimm Baeder return NonNullArgs; 21*a07aba5dSTimm Baeder 22*a07aba5dSTimm Baeder assert(F); 23*a07aba5dSTimm Baeder NonNullArgs.resize(Args.size()); 24*a07aba5dSTimm Baeder 25*a07aba5dSTimm Baeder for (const auto *Attr : F->specific_attrs<NonNullAttr>()) { 26*a07aba5dSTimm Baeder if (!Attr->args_size()) { 27*a07aba5dSTimm Baeder NonNullArgs.set(); 28*a07aba5dSTimm Baeder break; 29*a07aba5dSTimm Baeder } else 30*a07aba5dSTimm Baeder for (auto Idx : Attr->args()) { 31*a07aba5dSTimm Baeder unsigned ASTIdx = Idx.getASTIndex(); 32*a07aba5dSTimm Baeder if (ASTIdx >= Args.size()) 33*a07aba5dSTimm Baeder continue; 34*a07aba5dSTimm Baeder NonNullArgs[ASTIdx] = true; 35*a07aba5dSTimm Baeder } 36*a07aba5dSTimm Baeder } 37*a07aba5dSTimm Baeder 38*a07aba5dSTimm Baeder return NonNullArgs; 39*a07aba5dSTimm Baeder } 40*a07aba5dSTimm Baeder 41*a07aba5dSTimm Baeder } // namespace interp 42*a07aba5dSTimm Baeder } // namespace clang 43