1//===-- XRayLists.cpp - XRay automatic-attribution ------------------------===// 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// User-provided filters for always/never XRay instrumenting certain functions. 10// 11//===----------------------------------------------------------------------===// 12#include "clang/Basic/XRayLists.h" 13 14using namespace clang; 15 16XRayFunctionFilter::XRayFunctionFilter( 17 ArrayRef<std::string> AlwaysInstrumentPaths, 18 ArrayRef<std::string> NeverInstrumentPaths, 19 ArrayRef<std::string> AttrListPaths, SourceManager &SM) 20 : AlwaysInstrument(llvm::SpecialCaseList::createOrDie( 21 AlwaysInstrumentPaths, SM.getFileManager().getVirtualFileSystem())), 22 NeverInstrument(llvm::SpecialCaseList::createOrDie( 23 NeverInstrumentPaths, SM.getFileManager().getVirtualFileSystem())), 24 AttrList(llvm::SpecialCaseList::createOrDie( 25 AttrListPaths, SM.getFileManager().getVirtualFileSystem())), 26 SM(SM) {} 27 28XRayFunctionFilter::ImbueAttribute 29XRayFunctionFilter::shouldImbueFunction(StringRef FunctionName) const { 30 // First apply the always instrument list, than if it isn't an "always" see 31 // whether it's treated as a "never" instrument function. 32 // TODO: Remove these as they're deprecated; use the AttrList exclusively. 33 if (AlwaysInstrument->inSection("xray_always_instrument", "fun", FunctionName, 34 "arg1") || 35 AttrList->inSection("always", "fun", FunctionName, "arg1")) 36 return ImbueAttribute::ALWAYS_ARG1; 37 if (AlwaysInstrument->inSection("xray_always_instrument", "fun", 38 FunctionName) || 39 AttrList->inSection("always", "fun", FunctionName)) 40 return ImbueAttribute::ALWAYS; 41 42 if (NeverInstrument->inSection("xray_never_instrument", "fun", 43 FunctionName) || 44 AttrList->inSection("never", "fun", FunctionName)) 45 return ImbueAttribute::NEVER; 46 47 return ImbueAttribute::NONE; 48} 49 50XRayFunctionFilter::ImbueAttribute 51XRayFunctionFilter::shouldImbueFunctionsInFile(StringRef Filename, 52 StringRef Category) const { 53 if (AlwaysInstrument->inSection("xray_always_instrument", "src", Filename, 54 Category) || 55 AttrList->inSection("always", "src", Filename, Category)) 56 return ImbueAttribute::ALWAYS; 57 if (NeverInstrument->inSection("xray_never_instrument", "src", Filename, 58 Category) || 59 AttrList->inSection("never", "src", Filename, Category)) 60 return ImbueAttribute::NEVER; 61 return ImbueAttribute::NONE; 62} 63 64XRayFunctionFilter::ImbueAttribute 65XRayFunctionFilter::shouldImbueLocation(SourceLocation Loc, 66 StringRef Category) const { 67 if (!Loc.isValid()) 68 return ImbueAttribute::NONE; 69 return this->shouldImbueFunctionsInFile(SM.getFilename(SM.getFileLoc(Loc)), 70 Category); 71} 72