Linkage.h revision 360784
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 19namespace clang { 20 21/// Describes the different kinds of linkage 22/// (C++ [basic.link], C99 6.2.2) that an entity may have. 23enum 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. 64enum 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. 73enum GVALinkage { 74 GVA_Internal, 75 GVA_AvailableExternally, 76 GVA_DiscardableODR, 77 GVA_StrongExternal, 78 GVA_StrongODR 79}; 80 81inline bool isDiscardableGVALinkage(GVALinkage L) { 82 return L <= GVA_DiscardableODR; 83} 84 85/// Do we know that this will be the only definition of this symbol (excluding 86/// inlining-only definitions)? 87inline bool isUniqueGVALinkage(GVALinkage L) { 88 return L == GVA_Internal || L == GVA_StrongExternal; 89} 90 91inline bool isExternallyVisible(Linkage L) { 92 return L >= VisibleNoLinkage; 93} 94 95inline Linkage getFormalLinkage(Linkage L) { 96 switch (L) { 97 case UniqueExternalLinkage: 98 return ExternalLinkage; 99 case VisibleNoLinkage: 100 return NoLinkage; 101 case ModuleInternalLinkage: 102 return InternalLinkage; 103 default: 104 return L; 105 } 106} 107 108inline bool isExternalFormalLinkage(Linkage L) { 109 return getFormalLinkage(L) == ExternalLinkage; 110} 111 112/// Compute the minimum linkage given two linkages. 113/// 114/// The linkage can be interpreted as a pair formed by the formal linkage and 115/// a boolean for external visibility. This is just what getFormalLinkage and 116/// isExternallyVisible return. We want the minimum of both components. The 117/// Linkage enum is defined in an order that makes this simple, we just need 118/// special cases for when VisibleNoLinkage would lose the visible bit and 119/// become NoLinkage. 120inline Linkage minLinkage(Linkage L1, Linkage L2) { 121 if (L2 == VisibleNoLinkage) 122 std::swap(L1, L2); 123 if (L1 == VisibleNoLinkage) { 124 if (L2 == InternalLinkage) 125 return NoLinkage; 126 if (L2 == UniqueExternalLinkage) 127 return NoLinkage; 128 } 129 return L1 < L2 ? L1 : L2; 130} 131 132} // namespace clang 133 134#endif // LLVM_CLANG_BASIC_LINKAGE_H 135