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