10b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor//===--- Linkage.h - Linkage enumeration and utilities ----------*- C++ -*-===// 20b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor// 30b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor// The LLVM Compiler Infrastructure 40b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor// 50b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor// This file is distributed under the University of Illinois Open Source 60b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor// License. See LICENSE.TXT for details. 70b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor// 80b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor//===----------------------------------------------------------------------===// 90b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor// 100b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor// This file defines the Linkage enumeration and various utility 110b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor// functions. 120b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor// 130b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor//===----------------------------------------------------------------------===// 140b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor#ifndef LLVM_CLANG_BASIC_LINKAGE_H 150b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor#define LLVM_CLANG_BASIC_LINKAGE_H 160b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor 170b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregornamespace clang { 180b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor 190b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor/// \brief Describes the different kinds of linkage 200b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor/// (C++ [basic.link], C99 6.2.2) that an entity may have. 210b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregorenum Linkage { 220b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor /// \brief No linkage, which means that the entity is unique and 230b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor /// can only be referred to from within its scope. 240b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor NoLinkage = 0, 250b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor 260b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor /// \brief Internal linkage, which indicates that the entity can 270b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor /// be referred to from within the translation unit (but not other 280b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor /// translation units). 290b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor InternalLinkage, 300b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor 310b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor /// \brief External linkage within a unique namespace. From the 320be8fb5bdfe7e07a57f07a740649ec8bfb690284Nick Lewycky /// language perspective, these entities have external 330b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor /// linkage. However, since they reside in an anonymous namespace, 340b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor /// their names are unique to this translation unit, which is 350b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor /// equivalent to having internal linkage from the code-generation 360b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor /// point of view. 370b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor UniqueExternalLinkage, 380b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor 390b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor /// \brief External linkage, which indicates that the entity can 400b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor /// be referred to from other translation units. 410b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor ExternalLinkage 420b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor}; 430b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor 4490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis/// \brief A more specific kind of linkage. This is relevant to CodeGen and 453c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl/// AST file reading. 4690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidisenum GVALinkage { 4790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis GVA_Internal, 4890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis GVA_C99Inline, 4990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis GVA_CXXInline, 5090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis GVA_StrongExternal, 5190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis GVA_TemplateInstantiation, 5290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis GVA_ExplicitTemplateInstantiation 5390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis}; 5490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 550b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor/// \brief Determine whether the given linkage is semantically 560b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor/// external. 570b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregorinline bool isExternalLinkage(Linkage L) { 580b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor return L == UniqueExternalLinkage || L == ExternalLinkage; 590b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor} 600b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor 610b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor/// \brief Compute the minimum linkage given two linages. 620b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregorstatic inline Linkage minLinkage(Linkage L1, Linkage L2) { 630b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor return L1 < L2? L1 : L2; 640b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor} 650b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor 660b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor} // end namespace clang 670b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor 680b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor#endif // LLVM_CLANG_BASIC_LINKAGE_H 69