teak-llvm/clang/lib/Basic/XRayLists.cpp
Ilya Biryukov aa981c1802 Reland 9f3fdb0d7f: [Driver] Use VFS to check if sanitizer blacklists exist
With updates to various LLVM tools that use SpecialCastList.

It was tempting to use RealFileSystem as the default, but that makes it
too easy to accidentally forget passing VFS in clang code.
2019-11-21 11:56:09 +01:00

72 lines
3.1 KiB
C++

//===-- XRayLists.cpp - XRay automatic-attribution ------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// 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,
ArrayRef<std::string> AttrListPaths, SourceManager &SM)
: AlwaysInstrument(llvm::SpecialCaseList::createOrDie(
AlwaysInstrumentPaths, SM.getFileManager().getVirtualFileSystem())),
NeverInstrument(llvm::SpecialCaseList::createOrDie(
NeverInstrumentPaths, SM.getFileManager().getVirtualFileSystem())),
AttrList(llvm::SpecialCaseList::createOrDie(
AttrListPaths, SM.getFileManager().getVirtualFileSystem())),
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.
// TODO: Remove these as they're deprecated; use the AttrList exclusively.
if (AlwaysInstrument->inSection("xray_always_instrument", "fun", FunctionName,
"arg1") ||
AttrList->inSection("always", "fun", FunctionName, "arg1"))
return ImbueAttribute::ALWAYS_ARG1;
if (AlwaysInstrument->inSection("xray_always_instrument", "fun",
FunctionName) ||
AttrList->inSection("always", "fun", FunctionName))
return ImbueAttribute::ALWAYS;
if (NeverInstrument->inSection("xray_never_instrument", "fun",
FunctionName) ||
AttrList->inSection("never", "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) ||
AttrList->inSection("always", "src", Filename, Category))
return ImbueAttribute::ALWAYS;
if (NeverInstrument->inSection("xray_never_instrument", "src", Filename,
Category) ||
AttrList->inSection("never", "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);
}