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