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 // This file defines the Linkage enumeration and various utility 11 // functions. 12 // 13 //===----------------------------------------------------------------------===// 14 #ifndef LLVM_CLANG_BASIC_LINKAGE_H 15 #define LLVM_CLANG_BASIC_LINKAGE_H 16 17 namespace clang { 18 19 /// \brief Describes the different kinds of linkage 20 /// (C++ [basic.link], C99 6.2.2) that an entity may have. 21 enum Linkage { 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. From the 32 /// langauge perspective, these entities have external 33 /// linkage. However, since they reside in an anonymous namespace, 34 /// their names are unique to this translation unit, which is 35 /// equivalent to having internal linkage from the code-generation 36 /// point of view. 37 UniqueExternalLinkage, 38 39 /// \brief External linkage, which indicates that the entity can 40 /// be referred to from other translation units. 41 ExternalLinkage 42 }; 43 44 /// \brief A more specific kind of linkage. This is relevant to CodeGen and 45 /// AST file reading. 46 enum GVALinkage { 47 GVA_Internal, 48 GVA_C99Inline, 49 GVA_CXXInline, 50 GVA_StrongExternal, 51 GVA_TemplateInstantiation, 52 GVA_ExplicitTemplateInstantiation 53 }; 54 55 /// \brief Determine whether the given linkage is semantically 56 /// external. 57 inline bool isExternalLinkage(Linkage L) { 58 return L == UniqueExternalLinkage || L == ExternalLinkage; 59 } 60 61 /// \brief Compute the minimum linkage given two linages. 62 static inline Linkage minLinkage(Linkage L1, Linkage L2) { 63 return L1 < L2? L1 : L2; 64 } 65 66 } // end namespace clang 67 68 #endif // LLVM_CLANG_BASIC_LINKAGE_H 69