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 { 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 External linkage, which indicates that the entity can 41 /// be referred to from other translation units. 42 ExternalLinkage 43}; 44 45/// \brief A more specific kind of linkage than enum Linkage. 46/// 47/// This is relevant to CodeGen and AST file reading. 48enum GVALinkage { 49 GVA_Internal, 50 GVA_C99Inline, 51 GVA_CXXInline, 52 GVA_StrongExternal, 53 GVA_TemplateInstantiation, 54 GVA_ExplicitTemplateInstantiation 55}; 56 57/// \brief Determine whether the given linkage is semantically external. 58inline bool isExternalLinkage(Linkage L) { 59 return L == UniqueExternalLinkage || L == ExternalLinkage; 60} 61 62/// \brief Compute the minimum linkage given two linages. 63inline Linkage minLinkage(Linkage L1, Linkage L2) { 64 return L1 < L2? L1 : L2; 65} 66 67} // end namespace clang 68 69#endif // LLVM_CLANG_BASIC_LINKAGE_H 70