1353358Sdim//===-- XRayLists.cpp - XRay automatic-attribution ------------------------===// 2317019Sdim// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6317019Sdim// 7317019Sdim//===----------------------------------------------------------------------===// 8317019Sdim// 9317019Sdim// User-provided filters for always/never XRay instrumenting certain functions. 10317019Sdim// 11317019Sdim//===----------------------------------------------------------------------===// 12317019Sdim#include "clang/Basic/XRayLists.h" 13317019Sdim 14317019Sdimusing namespace clang; 15317019Sdim 16317019SdimXRayFunctionFilter::XRayFunctionFilter( 17317019Sdim ArrayRef<std::string> AlwaysInstrumentPaths, 18341825Sdim ArrayRef<std::string> NeverInstrumentPaths, 19341825Sdim ArrayRef<std::string> AttrListPaths, SourceManager &SM) 20360784Sdim : AlwaysInstrument(llvm::SpecialCaseList::createOrDie( 21360784Sdim AlwaysInstrumentPaths, SM.getFileManager().getVirtualFileSystem())), 22360784Sdim NeverInstrument(llvm::SpecialCaseList::createOrDie( 23360784Sdim NeverInstrumentPaths, SM.getFileManager().getVirtualFileSystem())), 24360784Sdim AttrList(llvm::SpecialCaseList::createOrDie( 25360784Sdim AttrListPaths, SM.getFileManager().getVirtualFileSystem())), 26360784Sdim SM(SM) {} 27317019Sdim 28317019SdimXRayFunctionFilter::ImbueAttribute 29317019SdimXRayFunctionFilter::shouldImbueFunction(StringRef FunctionName) const { 30317019Sdim // First apply the always instrument list, than if it isn't an "always" see 31317019Sdim // whether it's treated as a "never" instrument function. 32341825Sdim // TODO: Remove these as they're deprecated; use the AttrList exclusively. 33327952Sdim if (AlwaysInstrument->inSection("xray_always_instrument", "fun", FunctionName, 34341825Sdim "arg1") || 35341825Sdim AttrList->inSection("always", "fun", FunctionName, "arg1")) 36319164Sdim return ImbueAttribute::ALWAYS_ARG1; 37327952Sdim if (AlwaysInstrument->inSection("xray_always_instrument", "fun", 38341825Sdim FunctionName) || 39341825Sdim AttrList->inSection("always", "fun", FunctionName)) 40317019Sdim return ImbueAttribute::ALWAYS; 41341825Sdim 42341825Sdim if (NeverInstrument->inSection("xray_never_instrument", "fun", 43341825Sdim FunctionName) || 44341825Sdim AttrList->inSection("never", "fun", FunctionName)) 45317019Sdim return ImbueAttribute::NEVER; 46341825Sdim 47317019Sdim return ImbueAttribute::NONE; 48317019Sdim} 49317019Sdim 50317019SdimXRayFunctionFilter::ImbueAttribute 51317019SdimXRayFunctionFilter::shouldImbueFunctionsInFile(StringRef Filename, 52317019Sdim StringRef Category) const { 53327952Sdim if (AlwaysInstrument->inSection("xray_always_instrument", "src", Filename, 54341825Sdim Category) || 55341825Sdim AttrList->inSection("always", "src", Filename, Category)) 56317019Sdim return ImbueAttribute::ALWAYS; 57327952Sdim if (NeverInstrument->inSection("xray_never_instrument", "src", Filename, 58341825Sdim Category) || 59341825Sdim AttrList->inSection("never", "src", Filename, Category)) 60317019Sdim return ImbueAttribute::NEVER; 61317019Sdim return ImbueAttribute::NONE; 62317019Sdim} 63317019Sdim 64317019SdimXRayFunctionFilter::ImbueAttribute 65317019SdimXRayFunctionFilter::shouldImbueLocation(SourceLocation Loc, 66317019Sdim StringRef Category) const { 67317019Sdim if (!Loc.isValid()) 68317019Sdim return ImbueAttribute::NONE; 69317019Sdim return this->shouldImbueFunctionsInFile(SM.getFilename(SM.getFileLoc(Loc)), 70317019Sdim Category); 71317019Sdim} 72