Coverage Report

Created: 2019-06-16 23:17

/Users/buildslave/jenkins/workspace/clang-stage2-coverage-R/llvm/tools/clang/include/clang/Basic/Linkage.h
Line
Count
Source (jump to first uncovered line)
1
//===- Linkage.h - Linkage enumeration and utilities ------------*- C++ -*-===//
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
/// Defines the Linkage enumeration and various utility functions.
11
//
12
//===----------------------------------------------------------------------===//
13
14
#ifndef LLVM_CLANG_BASIC_LINKAGE_H
15
#define LLVM_CLANG_BASIC_LINKAGE_H
16
17
#include <utility>
18
19
namespace clang {
20
21
/// Describes the different kinds of linkage
22
/// (C++ [basic.link], C99 6.2.2) that an entity may have.
23
enum Linkage : unsigned char {
24
  /// No linkage, which means that the entity is unique and
25
  /// can only be referred to from within its scope.
26
  NoLinkage = 0,
27
28
  /// Internal linkage, which indicates that the entity can
29
  /// be referred to from within the translation unit (but not other
30
  /// translation units).
31
  InternalLinkage,
32
33
  /// External linkage within a unique namespace.
34
  ///
35
  /// From the language perspective, these entities have external
36
  /// linkage. However, since they reside in an anonymous namespace,
37
  /// their names are unique to this translation unit, which is
38
  /// equivalent to having internal linkage from the code-generation
39
  /// point of view.
40
  UniqueExternalLinkage,
41
42
  /// No linkage according to the standard, but is visible from other
43
  /// translation units because of types defined in a inline function.
44
  VisibleNoLinkage,
45
46
  /// Internal linkage according to the Modules TS, but can be referred
47
  /// to from other translation units indirectly through inline functions and
48
  /// templates in the module interface.
49
  ModuleInternalLinkage,
50
51
  /// Module linkage, which indicates that the entity can be referred
52
  /// to from other translation units within the same module, and indirectly
53
  /// from arbitrary other translation units through inline functions and
54
  /// templates in the module interface.
55
  ModuleLinkage,
56
57
  /// External linkage, which indicates that the entity can
58
  /// be referred to from other translation units.
59
  ExternalLinkage
60
};
61
62
/// Describes the different kinds of language linkage
63
/// (C++ [dcl.link]) that an entity may have.
64
enum LanguageLinkage {
65
  CLanguageLinkage,
66
  CXXLanguageLinkage,
67
  NoLanguageLinkage
68
};
69
70
/// A more specific kind of linkage than enum Linkage.
71
///
72
/// This is relevant to CodeGen and AST file reading.
73
enum GVALinkage {
74
  GVA_Internal,
75
  GVA_AvailableExternally,
76
  GVA_DiscardableODR,
77
  GVA_StrongExternal,
78
  GVA_StrongODR
79
};
80
81
6.15M
inline bool isDiscardableGVALinkage(GVALinkage L) {
82
6.15M
  return L <= GVA_DiscardableODR;
83
6.15M
}
84
85
40.2M
inline bool isExternallyVisible(Linkage L) {
86
40.2M
  return L >= VisibleNoLinkage;
87
40.2M
}
88
89
30.1M
inline Linkage getFormalLinkage(Linkage L) {
90
30.1M
  switch (L) {
91
30.1M
  case UniqueExternalLinkage:
92
11.7k
    return ExternalLinkage;
93
30.1M
  case VisibleNoLinkage:
94
11.2k
    return NoLinkage;
95
30.1M
  case ModuleInternalLinkage:
96
255
    return InternalLinkage;
97
30.1M
  default:
98
30.0M
    return L;
99
30.1M
  }
100
30.1M
}
101
102
22.4M
inline bool isExternalFormalLinkage(Linkage L) {
103
22.4M
  return getFormalLinkage(L) == ExternalLinkage;
104
22.4M
}
105
106
/// Compute the minimum linkage given two linkages.
107
///
108
/// The linkage can be interpreted as a pair formed by the formal linkage and
109
/// a boolean for external visibility. This is just what getFormalLinkage and
110
/// isExternallyVisible return. We want the minimum of both components. The
111
/// Linkage enum is defined in an order that makes this simple, we just need
112
/// special cases for when VisibleNoLinkage would lose the visible bit and
113
/// become NoLinkage.
114
9.31M
inline Linkage minLinkage(Linkage L1, Linkage L2) {
115
9.31M
  if (L2 == VisibleNoLinkage)
116
3.75k
    std::swap(L1, L2);
117
9.31M
  if (L1 == VisibleNoLinkage) {
118
4.29k
    if (L2 == InternalLinkage)
119
4
      return NoLinkage;
120
4.29k
    if (L2 == UniqueExternalLinkage)
121
0
      return NoLinkage;
122
9.31M
  }
123
9.31M
  return L1 < L2 ? 
L15.19k
:
L29.30M
;
124
9.31M
}
125
126
} // namespace clang
127
128
#endif // LLVM_CLANG_BASIC_LINKAGE_H