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