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