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 /// \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 
     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 : unsigned char {
     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 No linkage according to the standard, but is visible from other
     41   /// translation units because of types defined in a inline function.
     42   VisibleNoLinkage,
     43 
     44   /// \brief External linkage, which indicates that the entity can
     45   /// be referred to from other translation units.
     46   ExternalLinkage
     47 };
     48 
     49 /// \brief Describes the different kinds of language linkage
     50 /// (C++ [dcl.link]) that an entity may have.
     51 enum LanguageLinkage {
     52   CLanguageLinkage,
     53   CXXLanguageLinkage,
     54   NoLanguageLinkage
     55 };
     56 
     57 /// \brief A more specific kind of linkage than enum Linkage.
     58 ///
     59 /// This is relevant to CodeGen and AST file reading.
     60 enum GVALinkage {
     61   GVA_Internal,
     62   GVA_AvailableExternally,
     63   GVA_DiscardableODR,
     64   GVA_StrongExternal,
     65   GVA_StrongODR
     66 };
     67 
     68 inline bool isExternallyVisible(Linkage L) {
     69   return L == ExternalLinkage || L == VisibleNoLinkage;
     70 }
     71 
     72 inline Linkage getFormalLinkage(Linkage L) {
     73   if (L == UniqueExternalLinkage)
     74     return ExternalLinkage;
     75   if (L == VisibleNoLinkage)
     76     return NoLinkage;
     77   return L;
     78 }
     79 
     80 inline bool isExternalFormalLinkage(Linkage L) {
     81   return getFormalLinkage(L) == ExternalLinkage;
     82 }
     83 
     84 /// \brief Compute the minimum linkage given two linkages.
     85 ///
     86 /// The linkage can be interpreted as a pair formed by the formal linkage and
     87 /// a boolean for external visibility. This is just what getFormalLinkage and
     88 /// isExternallyVisible return. We want the minimum of both components. The
     89 /// Linkage enum is defined in an order that makes this simple, we just need
     90 /// special cases for when VisibleNoLinkage would lose the visible bit and
     91 /// become NoLinkage.
     92 inline Linkage minLinkage(Linkage L1, Linkage L2) {
     93   if (L2 == VisibleNoLinkage)
     94     std::swap(L1, L2);
     95   if (L1 == VisibleNoLinkage) {
     96     if (L2 == InternalLinkage)
     97       return NoLinkage;
     98     if (L2 == UniqueExternalLinkage)
     99       return NoLinkage;
    100   }
    101   return L1 < L2 ? L1 : L2;
    102 }
    103 
    104 } // end namespace clang
    105 
    106 #endif // LLVM_CLANG_BASIC_LINKAGE_H
    107