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