Home | History | Annotate | Download | only in Basic
      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 // This file defines the Linkage enumeration and various utility
     11 // functions.
     12 //
     13 //===----------------------------------------------------------------------===//
     14 #ifndef LLVM_CLANG_BASIC_LINKAGE_H
     15 #define LLVM_CLANG_BASIC_LINKAGE_H
     16 
     17 namespace clang {
     18 
     19 /// \brief Describes the different kinds of linkage
     20 /// (C++ [basic.link], C99 6.2.2) that an entity may have.
     21 enum 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. From the
     32   /// language perspective, these entities have external
     33   /// linkage. However, since they reside in an anonymous namespace,
     34   /// their names are unique to this translation unit, which is
     35   /// equivalent to having internal linkage from the code-generation
     36   /// point of view.
     37   UniqueExternalLinkage,
     38 
     39   /// \brief External linkage, which indicates that the entity can
     40   /// be referred to from other translation units.
     41   ExternalLinkage
     42 };
     43 
     44 /// \brief A more specific kind of linkage. This is relevant to CodeGen and
     45 /// AST file reading.
     46 enum GVALinkage {
     47   GVA_Internal,
     48   GVA_C99Inline,
     49   GVA_CXXInline,
     50   GVA_StrongExternal,
     51   GVA_TemplateInstantiation,
     52   GVA_ExplicitTemplateInstantiation
     53 };
     54 
     55 /// \brief Determine whether the given linkage is semantically
     56 /// external.
     57 inline bool isExternalLinkage(Linkage L) {
     58   return L == UniqueExternalLinkage || L == ExternalLinkage;
     59 }
     60 
     61 /// \brief Compute the minimum linkage given two linages.
     62 static inline Linkage minLinkage(Linkage L1, Linkage L2) {
     63   return L1 < L2? L1 : L2;
     64 }
     65 
     66 } // end namespace clang
     67 
     68 #endif // LLVM_CLANG_BASIC_LINKAGE_H
     69