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