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//===----------------------------------------------------------------------===// 92f7f5b1f5ff023cb8c4008ae53a12b09e3ea2622James Dennett/// 102f7f5b1f5ff023cb8c4008ae53a12b09e3ea2622James Dennett/// \file 112f7f5b1f5ff023cb8c4008ae53a12b09e3ea2622James Dennett/// \brief Defines the Linkage enumeration and various utility functions. 122f7f5b1f5ff023cb8c4008ae53a12b09e3ea2622James Dennett/// 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 31af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// \brief External linkage within a unique namespace. 32af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// 33af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// From the language perspective, these entities have external 340b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor /// linkage. However, since they reside in an anonymous namespace, 350b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor /// their names are unique to this translation unit, which is 360b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor /// equivalent to having internal linkage from the code-generation 370b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor /// point of view. 380b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor UniqueExternalLinkage, 390b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor 400b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor /// \brief External linkage, which indicates that the entity can 410b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor /// be referred to from other translation units. 420b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor ExternalLinkage 430b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor}; 440b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor 45950fee2555f7a6bd193e588d6b6a941fd182391aRafael Espindola/// \brief Describes the different kinds of language linkage 46950fee2555f7a6bd193e588d6b6a941fd182391aRafael Espindola/// (C++ [dcl.link]) that an entity may have. 47950fee2555f7a6bd193e588d6b6a941fd182391aRafael Espindolaenum LanguageLinkage { 48950fee2555f7a6bd193e588d6b6a941fd182391aRafael Espindola CLanguageLinkage, 49950fee2555f7a6bd193e588d6b6a941fd182391aRafael Espindola CXXLanguageLinkage, 50950fee2555f7a6bd193e588d6b6a941fd182391aRafael Espindola NoLanguageLinkage 51950fee2555f7a6bd193e588d6b6a941fd182391aRafael Espindola}; 52950fee2555f7a6bd193e588d6b6a941fd182391aRafael Espindola 53af50aab0c317462129d73ae8000c6394c718598dJames Dennett/// \brief A more specific kind of linkage than enum Linkage. 54af50aab0c317462129d73ae8000c6394c718598dJames Dennett/// 55af50aab0c317462129d73ae8000c6394c718598dJames Dennett/// This is relevant to CodeGen and AST file reading. 5690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidisenum GVALinkage { 5790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis GVA_Internal, 5890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis GVA_C99Inline, 5990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis GVA_CXXInline, 6090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis GVA_StrongExternal, 6190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis GVA_TemplateInstantiation, 6290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis GVA_ExplicitTemplateInstantiation 6390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis}; 6490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 65af50aab0c317462129d73ae8000c6394c718598dJames Dennett/// \brief Determine whether the given linkage is semantically external. 660b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregorinline bool isExternalLinkage(Linkage L) { 670b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor return L == UniqueExternalLinkage || L == ExternalLinkage; 680b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor} 690b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor 700b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor/// \brief Compute the minimum linkage given two linages. 7110663399b1d4663e8b140eb12d9aa351be147c55Chandler Carruthinline Linkage minLinkage(Linkage L1, Linkage L2) { 720b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor return L1 < L2? L1 : L2; 730b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor} 740b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor 750b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor} // end namespace clang 760b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor 770b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor#endif // LLVM_CLANG_BASIC_LINKAGE_H 78