Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/llvm-project/clang/lib/Basic/XRayLists.cpp
35232 views
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
79