1 //===--- Linkage.h - Linkage enumeration and utilities ----------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
11 /// \brief Defines the Linkage enumeration and various utility functions.
13 //===----------------------------------------------------------------------===//
14 #ifndef LLVM_CLANG_BASIC_LINKAGE_H
15 #define LLVM_CLANG_BASIC_LINKAGE_H
23 /// \brief Describes the different kinds of linkage
24 /// (C++ [basic.link], C99 6.2.2) that an entity may have.
25 enum Linkage : unsigned char {
26 /// \brief No linkage, which means that the entity is unique and
27 /// can only be referred to from within its scope.
30 /// \brief Internal linkage, which indicates that the entity can
31 /// be referred to from within the translation unit (but not other
32 /// translation units).
35 /// \brief External linkage within a unique namespace.
37 /// From the language perspective, these entities have external
38 /// linkage. However, since they reside in an anonymous namespace,
39 /// their names are unique to this translation unit, which is
40 /// equivalent to having internal linkage from the code-generation
42 UniqueExternalLinkage,
44 /// \brief No linkage according to the standard, but is visible from other
45 /// translation units because of types defined in a inline function.
48 /// \brief Internal linkage according to the Modules TS, but can be referred
49 /// to from other translation units indirectly through inline functions and
50 /// templates in the module interface.
51 ModuleInternalLinkage,
53 /// \brief Module linkage, which indicates that the entity can be referred
54 /// to from other translation units within the same module, and indirectly
55 /// from arbitrary other translation units through inline functions and
56 /// templates in the module interface.
59 /// \brief External linkage, which indicates that the entity can
60 /// be referred to from other translation units.
64 /// \brief Describes the different kinds of language linkage
65 /// (C++ [dcl.link]) that an entity may have.
66 enum LanguageLinkage {
72 /// \brief A more specific kind of linkage than enum Linkage.
74 /// This is relevant to CodeGen and AST file reading.
77 GVA_AvailableExternally,
83 inline bool isDiscardableGVALinkage(GVALinkage L) {
84 return L <= GVA_DiscardableODR;
87 inline bool isExternallyVisible(Linkage L) {
88 return L >= VisibleNoLinkage;
91 inline Linkage getFormalLinkage(Linkage L) {
93 case UniqueExternalLinkage:
94 return ExternalLinkage;
95 case VisibleNoLinkage:
97 case ModuleInternalLinkage:
98 return InternalLinkage;
104 inline bool isExternalFormalLinkage(Linkage L) {
105 return getFormalLinkage(L) == ExternalLinkage;
108 /// \brief Compute the minimum linkage given two linkages.
110 /// The linkage can be interpreted as a pair formed by the formal linkage and
111 /// a boolean for external visibility. This is just what getFormalLinkage and
112 /// isExternallyVisible return. We want the minimum of both components. The
113 /// Linkage enum is defined in an order that makes this simple, we just need
114 /// special cases for when VisibleNoLinkage would lose the visible bit and
115 /// become NoLinkage.
116 inline Linkage minLinkage(Linkage L1, Linkage L2) {
117 if (L2 == VisibleNoLinkage)
119 if (L1 == VisibleNoLinkage) {
120 if (L2 == InternalLinkage)
122 if (L2 == UniqueExternalLinkage)
125 return L1 < L2 ? L1 : L2;
128 } // end namespace clang
130 #endif // LLVM_CLANG_BASIC_LINKAGE_H