Coverage Report

Created: 2017-10-03 07:32

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