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