/Users/buildslave/jenkins/workspace/clang-stage2-coverage-R/llvm/tools/lld/include/lld/Core/Instrumentation.h
Line | Count | Source (jump to first uncovered line) |
1 | | //===- include/Core/Instrumentation.h - Instrumentation API ---------------===// |
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 | | /// \file |
10 | | /// Provide an Instrumentation API that optionally uses VTune interfaces. |
11 | | /// |
12 | | //===----------------------------------------------------------------------===// |
13 | | |
14 | | #ifndef LLD_CORE_INSTRUMENTATION_H |
15 | | #define LLD_CORE_INSTRUMENTATION_H |
16 | | |
17 | | #include "llvm/Support/Compiler.h" |
18 | | #include <utility> |
19 | | |
20 | | #ifdef LLD_HAS_VTUNE |
21 | | # include <ittnotify.h> |
22 | | #endif |
23 | | |
24 | | namespace lld { |
25 | | #ifdef LLD_HAS_VTUNE |
26 | | /// A unique global scope for instrumentation data. |
27 | | /// |
28 | | /// Domains last for the lifetime of the application and cannot be destroyed. |
29 | | /// Multiple Domains created with the same name represent the same domain. |
30 | | class Domain { |
31 | | __itt_domain *_domain; |
32 | | |
33 | | public: |
34 | | explicit Domain(const char *name) : _domain(__itt_domain_createA(name)) {} |
35 | | |
36 | | operator __itt_domain *() const { return _domain; } |
37 | | __itt_domain *operator->() const { return _domain; } |
38 | | }; |
39 | | |
40 | | /// A global reference to a string constant. |
41 | | /// |
42 | | /// These are uniqued by the ITT runtime and cannot be deleted. They are not |
43 | | /// specific to a domain. |
44 | | /// |
45 | | /// Prefer reusing a single StringHandle over passing a ntbs when the same |
46 | | /// string will be used often. |
47 | | class StringHandle { |
48 | | __itt_string_handle *_handle; |
49 | | |
50 | | public: |
51 | | StringHandle(const char *name) : _handle(__itt_string_handle_createA(name)) {} |
52 | | |
53 | | operator __itt_string_handle *() const { return _handle; } |
54 | | }; |
55 | | |
56 | | /// A task on a single thread. Nests within other tasks. |
57 | | /// |
58 | | /// Each thread has its own task stack and tasks nest recursively on that stack. |
59 | | /// A task cannot transfer threads. |
60 | | /// |
61 | | /// SBRM is used to ensure task starts and ends are ballanced. The lifetime of |
62 | | /// a task is either the lifetime of this object, or until end is called. |
63 | | class ScopedTask { |
64 | | __itt_domain *_domain; |
65 | | |
66 | | ScopedTask(const ScopedTask &) = delete; |
67 | | ScopedTask &operator=(const ScopedTask &) = delete; |
68 | | |
69 | | public: |
70 | | /// Create a task in Domain \p d named \p s. |
71 | | ScopedTask(const Domain &d, const StringHandle &s) : _domain(d) { |
72 | | __itt_task_begin(d, __itt_null, __itt_null, s); |
73 | | } |
74 | | |
75 | | ScopedTask(ScopedTask &&other) { |
76 | | *this = std::move(other); |
77 | | } |
78 | | |
79 | | ScopedTask &operator=(ScopedTask &&other) { |
80 | | _domain = other._domain; |
81 | | other._domain = nullptr; |
82 | | return *this; |
83 | | } |
84 | | |
85 | | /// Prematurely end this task. |
86 | | void end() { |
87 | | if (_domain) |
88 | | __itt_task_end(_domain); |
89 | | _domain = nullptr; |
90 | | } |
91 | | |
92 | | ~ScopedTask() { end(); } |
93 | | }; |
94 | | |
95 | | /// A specific point in time. Allows metadata to be associated. |
96 | | class Marker { |
97 | | public: |
98 | | Marker(const Domain &d, const StringHandle &s) { |
99 | | __itt_marker(d, __itt_null, s, __itt_scope_global); |
100 | | } |
101 | | }; |
102 | | #else |
103 | | class Domain { |
104 | | public: |
105 | 184 | Domain(const char *name) {} |
106 | | }; |
107 | | |
108 | | class StringHandle { |
109 | | public: |
110 | 1.90k | StringHandle(const char *name) {} |
111 | | }; |
112 | | |
113 | | class ScopedTask { |
114 | | public: |
115 | 1.90k | ScopedTask(const Domain &d, const StringHandle &s) {} |
116 | 339 | void end() {} |
117 | | }; |
118 | | |
119 | | class Marker { |
120 | | public: |
121 | 0 | Marker(const Domain &d, const StringHandle &s) {} |
122 | | }; |
123 | | #endif |
124 | | |
125 | 1.90k | inline const Domain &getDefaultDomain() { |
126 | 1.90k | static Domain domain("org.llvm.lld"); |
127 | 1.90k | return domain; |
128 | 1.90k | } |
129 | | } // end namespace lld. |
130 | | |
131 | | #endif |