1//===--- Linkage.h - Linkage enumeration and utilities ----------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
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 Defines the Linkage enumeration and various utility functions.
12///
13//===----------------------------------------------------------------------===//
14#ifndef LLVM_CLANG_BASIC_LINKAGE_H
15#define LLVM_CLANG_BASIC_LINKAGE_H
16
17namespace clang {
18
19/// \brief Describes the different kinds of linkage
20/// (C++ [basic.link], C99 6.2.2) that an entity may have.
21enum Linkage : unsigned char {
22  /// \brief No linkage, which means that the entity is unique and
23  /// can only be referred to from within its scope.
24  NoLinkage = 0,
25
26  /// \brief Internal linkage, which indicates that the entity can
27  /// be referred to from within the translation unit (but not other
28  /// translation units).
29  InternalLinkage,
30
31  /// \brief External linkage within a unique namespace.
32  ///
33  /// From the language perspective, these entities have external
34  /// linkage. However, since they reside in an anonymous namespace,
35  /// their names are unique to this translation unit, which is
36  /// equivalent to having internal linkage from the code-generation
37  /// point of view.
38  UniqueExternalLinkage,
39
40  /// \brief No linkage according to the standard, but is visible from other
41  /// translation units because of types defined in a inline function.
42  VisibleNoLinkage,
43
44  /// \brief External linkage, which indicates that the entity can
45  /// be referred to from other translation units.
46  ExternalLinkage
47};
48
49/// \brief Describes the different kinds of language linkage
50/// (C++ [dcl.link]) that an entity may have.
51enum LanguageLinkage {
52  CLanguageLinkage,
53  CXXLanguageLinkage,
54  NoLanguageLinkage
55};
56
57/// \brief A more specific kind of linkage than enum Linkage.
58///
59/// This is relevant to CodeGen and AST file reading.
60enum GVALinkage {
61  GVA_Internal,
62  GVA_AvailableExternally,
63  GVA_DiscardableODR,
64  GVA_StrongExternal,
65  GVA_StrongODR
66};
67
68inline bool isExternallyVisible(Linkage L) {
69  return L == ExternalLinkage || L == VisibleNoLinkage;
70}
71
72inline Linkage getFormalLinkage(Linkage L) {
73  if (L == UniqueExternalLinkage)
74    return ExternalLinkage;
75  if (L == VisibleNoLinkage)
76    return NoLinkage;
77  return L;
78}
79
80inline bool isExternalFormalLinkage(Linkage L) {
81  return getFormalLinkage(L) == ExternalLinkage;
82}
83
84/// \brief Compute the minimum linkage given two linkages.
85///
86/// The linkage can be interpreted as a pair formed by the formal linkage and
87/// a boolean for external visibility. This is just what getFormalLinkage and
88/// isExternallyVisible return. We want the minimum of both components. The
89/// Linkage enum is defined in an order that makes this simple, we just need
90/// special cases for when VisibleNoLinkage would lose the visible bit and
91/// become NoLinkage.
92inline Linkage minLinkage(Linkage L1, Linkage L2) {
93  if (L2 == VisibleNoLinkage)
94    std::swap(L1, L2);
95  if (L1 == VisibleNoLinkage) {
96    if (L2 == InternalLinkage)
97      return NoLinkage;
98    if (L2 == UniqueExternalLinkage)
99      return NoLinkage;
100  }
101  return L1 < L2 ? L1 : L2;
102}
103
104} // end namespace clang
105
106#endif // LLVM_CLANG_BASIC_LINKAGE_H
107