clang  20.0.0git
Visibility.h
Go to the documentation of this file.
1 //===--- Visibility.h - Visibility enumeration and utilities ----*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 ///
9 /// \file
10 /// Defines the clang::Visibility enumeration and various utility
11 /// functions.
12 ///
13 //===----------------------------------------------------------------------===//
14 #ifndef LLVM_CLANG_BASIC_VISIBILITY_H
15 #define LLVM_CLANG_BASIC_VISIBILITY_H
16 
17 #include "clang/Basic/Linkage.h"
18 #include "llvm/ADT/STLForwardCompat.h"
19 #include <cassert>
20 #include <cstdint>
21 
22 namespace clang {
23 
24 /// Describes the different kinds of visibility that a declaration
25 /// may have.
26 ///
27 /// Visibility determines how a declaration interacts with the dynamic
28 /// linker. It may also affect whether the symbol can be found by runtime
29 /// symbol lookup APIs.
30 ///
31 /// Visibility is not described in any language standard and
32 /// (nonetheless) sometimes has odd behavior. Not all platforms
33 /// support all visibility kinds.
34 enum Visibility {
35  /// Objects with "hidden" visibility are not seen by the dynamic
36  /// linker.
38 
39  /// Objects with "protected" visibility are seen by the dynamic
40  /// linker but always dynamically resolve to an object within this
41  /// shared object.
43 
44  /// Objects with "default" visibility are seen by the dynamic linker
45  /// and act like normal objects.
47 };
48 
50  return L < R ? L : R;
51 }
52 
53 class LinkageInfo {
54  LLVM_PREFERRED_TYPE(Linkage)
55  uint8_t linkage_ : 3;
56  LLVM_PREFERRED_TYPE(Visibility)
57  uint8_t visibility_ : 2;
58  LLVM_PREFERRED_TYPE(bool)
59  uint8_t explicit_ : 1;
60 
61  void setVisibility(Visibility V, bool E) { visibility_ = V; explicit_ = E; }
62 public:
64  : linkage_(llvm::to_underlying(Linkage::External)),
65  visibility_(DefaultVisibility), explicit_(false) {}
67  : linkage_(llvm::to_underlying(L)), visibility_(V), explicit_(E) {
68  assert(getLinkage() == L && getVisibility() == V &&
69  isVisibilityExplicit() == E && "Enum truncated!");
70  }
71 
72  static LinkageInfo external() {
73  return LinkageInfo();
74  }
75  static LinkageInfo internal() {
77  }
80  }
81  static LinkageInfo none() {
83  }
86  }
87 
88  Linkage getLinkage() const { return static_cast<Linkage>(linkage_); }
89  Visibility getVisibility() const { return (Visibility)visibility_; }
90  bool isVisibilityExplicit() const { return explicit_; }
91 
92  void setLinkage(Linkage L) { linkage_ = llvm::to_underlying(L); }
93 
96  }
97  void mergeLinkage(LinkageInfo other) {
98  mergeLinkage(other.getLinkage());
99  }
100 
102  Linkage ThisL = getLinkage();
103  if (!isExternallyVisible(L)) {
104  if (ThisL == Linkage::VisibleNone)
105  ThisL = Linkage::None;
106  else if (ThisL == Linkage::External)
107  ThisL = Linkage::UniqueExternal;
108  }
109  setLinkage(ThisL);
110  }
112  mergeExternalVisibility(Other.getLinkage());
113  }
114 
115  /// Merge in the visibility 'newVis'.
116  void mergeVisibility(Visibility newVis, bool newExplicit) {
117  Visibility oldVis = getVisibility();
118 
119  // Never increase visibility.
120  if (oldVis < newVis)
121  return;
122 
123  // If the new visibility is the same as the old and the new
124  // visibility isn't explicit, we have nothing to add.
125  if (oldVis == newVis && !newExplicit)
126  return;
127 
128  // Otherwise, we're either decreasing visibility or making our
129  // existing visibility explicit.
130  setVisibility(newVis, newExplicit);
131  }
134  }
135 
136  /// Merge both linkage and visibility.
137  void merge(LinkageInfo other) {
138  mergeLinkage(other);
139  mergeVisibility(other);
140  }
141 
142  /// Merge linkage and conditionally merge visibility.
143  void mergeMaybeWithVisibility(LinkageInfo other, bool withVis) {
144  mergeLinkage(other);
145  if (withVis) mergeVisibility(other);
146  }
147 };
148 }
149 
150 #endif // LLVM_CLANG_BASIC_VISIBILITY_H
#define V(N, I)
Definition: ASTContext.h:3346
Expr * E
Visibility getVisibility() const
Definition: Visibility.h:89
static LinkageInfo external()
Definition: Visibility.h:72
static LinkageInfo none()
Definition: Visibility.h:81
void setLinkage(Linkage L)
Definition: Visibility.h:92
void mergeExternalVisibility(Linkage L)
Definition: Visibility.h:101
void mergeMaybeWithVisibility(LinkageInfo other, bool withVis)
Merge linkage and conditionally merge visibility.
Definition: Visibility.h:143
void mergeLinkage(Linkage L)
Definition: Visibility.h:94
Linkage getLinkage() const
Definition: Visibility.h:88
void mergeExternalVisibility(LinkageInfo Other)
Definition: Visibility.h:111
void mergeVisibility(LinkageInfo other)
Definition: Visibility.h:132
static LinkageInfo visible_none()
Definition: Visibility.h:84
LinkageInfo(Linkage L, Visibility V, bool E)
Definition: Visibility.h:66
static LinkageInfo uniqueExternal()
Definition: Visibility.h:78
void mergeVisibility(Visibility newVis, bool newExplicit)
Merge in the visibility 'newVis'.
Definition: Visibility.h:116
void mergeLinkage(LinkageInfo other)
Definition: Visibility.h:97
bool isVisibilityExplicit() const
Definition: Visibility.h:90
void merge(LinkageInfo other)
Merge both linkage and visibility.
Definition: Visibility.h:137
Defines the Linkage enumeration and various utility functions.
The JSON file list parser is used to communicate input to InstallAPI.
Linkage minLinkage(Linkage L1, Linkage L2)
Compute the minimum linkage given two linkages.
Definition: Linkage.h:129
Linkage
Describes the different kinds of linkage (C++ [basic.link], C99 6.2.2) that an entity may have.
Definition: Linkage.h:24
@ VisibleNone
No linkage according to the standard, but is visible from other translation units because of types de...
@ None
No linkage, which means that the entity is unique and can only be referred to from within its scope.
@ UniqueExternal
External linkage within a unique namespace.
@ Internal
Internal linkage, which indicates that the entity can be referred to from within the translation unit...
@ External
External linkage, which indicates that the entity can be referred to from other translation units.
Visibility minVisibility(Visibility L, Visibility R)
Definition: Visibility.h:49
bool isExternallyVisible(Linkage L)
Definition: Linkage.h:90
@ Other
Other implicit parameter.
Visibility
Describes the different kinds of visibility that a declaration may have.
Definition: Visibility.h:34
@ HiddenVisibility
Objects with "hidden" visibility are not seen by the dynamic linker.
Definition: Visibility.h:37
@ ProtectedVisibility
Objects with "protected" visibility are seen by the dynamic linker but always dynamically resolve to ...
Definition: Visibility.h:42
@ DefaultVisibility
Objects with "default" visibility are seen by the dynamic linker and act like normal objects.
Definition: Visibility.h:46
Diagnostic wrappers for TextAPI types for error reporting.
Definition: Dominators.h:30
#define false
Definition: stdbool.h:26