| //===--- XRayFunctionFilter.cpp - XRay automatic-attribution --------------===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // User-provided filters for always/never XRay instrumenting certain functions. |
| // |
| //===----------------------------------------------------------------------===// |
| #include "clang/Basic/XRayLists.h" |
| |
| using namespace clang; |
| |
| XRayFunctionFilter::XRayFunctionFilter( |
| ArrayRef<std::string> AlwaysInstrumentPaths, |
| ArrayRef<std::string> NeverInstrumentPaths, SourceManager &SM) |
| : AlwaysInstrument( |
| llvm::SpecialCaseList::createOrDie(AlwaysInstrumentPaths)), |
| NeverInstrument(llvm::SpecialCaseList::createOrDie(NeverInstrumentPaths)), |
| SM(SM) {} |
| |
| XRayFunctionFilter::ImbueAttribute |
| XRayFunctionFilter::shouldImbueFunction(StringRef FunctionName) const { |
| // First apply the always instrument list, than if it isn't an "always" see |
| // whether it's treated as a "never" instrument function. |
| if (AlwaysInstrument->inSection("xray_always_instrument", "fun", FunctionName, |
| "arg1")) |
| return ImbueAttribute::ALWAYS_ARG1; |
| if (AlwaysInstrument->inSection("xray_always_instrument", "fun", |
| FunctionName)) |
| return ImbueAttribute::ALWAYS; |
| if (NeverInstrument->inSection("xray_never_instrument", "fun", FunctionName)) |
| return ImbueAttribute::NEVER; |
| return ImbueAttribute::NONE; |
| } |
| |
| XRayFunctionFilter::ImbueAttribute |
| XRayFunctionFilter::shouldImbueFunctionsInFile(StringRef Filename, |
| StringRef Category) const { |
| if (AlwaysInstrument->inSection("xray_always_instrument", "src", Filename, |
| Category)) |
| return ImbueAttribute::ALWAYS; |
| if (NeverInstrument->inSection("xray_never_instrument", "src", Filename, |
| Category)) |
| return ImbueAttribute::NEVER; |
| return ImbueAttribute::NONE; |
| } |
| |
| XRayFunctionFilter::ImbueAttribute |
| XRayFunctionFilter::shouldImbueLocation(SourceLocation Loc, |
| StringRef Category) const { |
| if (!Loc.isValid()) |
| return ImbueAttribute::NONE; |
| return this->shouldImbueFunctionsInFile(SM.getFilename(SM.getFileLoc(Loc)), |
| Category); |
| } |