Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
14 | pmbaty | 1 | //===-- llvm/GlobalValue.h - Class to represent a global value --*- 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 | // This file is a common base class of all globally definable objects. As such, |
||
10 | // it is subclassed by GlobalVariable, GlobalAlias and by Function. This is |
||
11 | // used because you can do certain things with these global objects that you |
||
12 | // can't do to anything else. For example, use the address of one as a |
||
13 | // constant. |
||
14 | // |
||
15 | //===----------------------------------------------------------------------===// |
||
16 | |||
17 | #ifndef LLVM_IR_GLOBALVALUE_H |
||
18 | #define LLVM_IR_GLOBALVALUE_H |
||
19 | |||
20 | #include "llvm/ADT/StringRef.h" |
||
21 | #include "llvm/ADT/Twine.h" |
||
22 | #include "llvm/IR/Constant.h" |
||
23 | #include "llvm/IR/DerivedTypes.h" |
||
24 | #include "llvm/IR/Value.h" |
||
25 | #include "llvm/Support/Casting.h" |
||
26 | #include "llvm/Support/ErrorHandling.h" |
||
27 | #include "llvm/Support/MD5.h" |
||
28 | #include <cassert> |
||
29 | #include <cstdint> |
||
30 | #include <string> |
||
31 | |||
32 | namespace llvm { |
||
33 | |||
34 | class Comdat; |
||
35 | class ConstantRange; |
||
36 | class Error; |
||
37 | class GlobalObject; |
||
38 | class Module; |
||
39 | |||
40 | namespace Intrinsic { |
||
41 | typedef unsigned ID; |
||
42 | } // end namespace Intrinsic |
||
43 | |||
44 | class GlobalValue : public Constant { |
||
45 | public: |
||
46 | /// An enumeration for the kinds of linkage for global values. |
||
47 | enum LinkageTypes { |
||
48 | ExternalLinkage = 0,///< Externally visible function |
||
49 | AvailableExternallyLinkage, ///< Available for inspection, not emission. |
||
50 | LinkOnceAnyLinkage, ///< Keep one copy of function when linking (inline) |
||
51 | LinkOnceODRLinkage, ///< Same, but only replaced by something equivalent. |
||
52 | WeakAnyLinkage, ///< Keep one copy of named function when linking (weak) |
||
53 | WeakODRLinkage, ///< Same, but only replaced by something equivalent. |
||
54 | AppendingLinkage, ///< Special purpose, only applies to global arrays |
||
55 | InternalLinkage, ///< Rename collisions when linking (static functions). |
||
56 | PrivateLinkage, ///< Like Internal, but omit from symbol table. |
||
57 | ExternalWeakLinkage,///< ExternalWeak linkage description. |
||
58 | CommonLinkage ///< Tentative definitions. |
||
59 | }; |
||
60 | |||
61 | /// An enumeration for the kinds of visibility of global values. |
||
62 | enum VisibilityTypes { |
||
63 | DefaultVisibility = 0, ///< The GV is visible |
||
64 | HiddenVisibility, ///< The GV is hidden |
||
65 | ProtectedVisibility ///< The GV is protected |
||
66 | }; |
||
67 | |||
68 | /// Storage classes of global values for PE targets. |
||
69 | enum DLLStorageClassTypes { |
||
70 | DefaultStorageClass = 0, |
||
71 | DLLImportStorageClass = 1, ///< Function to be imported from DLL |
||
72 | DLLExportStorageClass = 2 ///< Function to be accessible from DLL. |
||
73 | }; |
||
74 | |||
75 | protected: |
||
76 | GlobalValue(Type *Ty, ValueTy VTy, Use *Ops, unsigned NumOps, |
||
77 | LinkageTypes Linkage, const Twine &Name, unsigned AddressSpace) |
||
78 | : Constant(PointerType::get(Ty, AddressSpace), VTy, Ops, NumOps), |
||
79 | ValueType(Ty), Visibility(DefaultVisibility), |
||
80 | UnnamedAddrVal(unsigned(UnnamedAddr::None)), |
||
81 | DllStorageClass(DefaultStorageClass), ThreadLocal(NotThreadLocal), |
||
82 | HasLLVMReservedName(false), IsDSOLocal(false), HasPartition(false), |
||
83 | HasSanitizerMetadata(false) { |
||
84 | setLinkage(Linkage); |
||
85 | setName(Name); |
||
86 | } |
||
87 | |||
88 | Type *ValueType; |
||
89 | |||
90 | static const unsigned GlobalValueSubClassDataBits = 15; |
||
91 | |||
92 | // All bitfields use unsigned as the underlying type so that MSVC will pack |
||
93 | // them. |
||
94 | unsigned Linkage : 4; // The linkage of this global |
||
95 | unsigned Visibility : 2; // The visibility style of this global |
||
96 | unsigned UnnamedAddrVal : 2; // This value's address is not significant |
||
97 | unsigned DllStorageClass : 2; // DLL storage class |
||
98 | |||
99 | unsigned ThreadLocal : 3; // Is this symbol "Thread Local", if so, what is |
||
100 | // the desired model? |
||
101 | |||
102 | /// True if the function's name starts with "llvm.". This corresponds to the |
||
103 | /// value of Function::isIntrinsic(), which may be true even if |
||
104 | /// Function::intrinsicID() returns Intrinsic::not_intrinsic. |
||
105 | unsigned HasLLVMReservedName : 1; |
||
106 | |||
107 | /// If true then there is a definition within the same linkage unit and that |
||
108 | /// definition cannot be runtime preempted. |
||
109 | unsigned IsDSOLocal : 1; |
||
110 | |||
111 | /// True if this symbol has a partition name assigned (see |
||
112 | /// https://lld.llvm.org/Partitions.html). |
||
113 | unsigned HasPartition : 1; |
||
114 | |||
115 | /// True if this symbol has sanitizer metadata available. Should only happen |
||
116 | /// if sanitizers were enabled when building the translation unit which |
||
117 | /// contains this GV. |
||
118 | unsigned HasSanitizerMetadata : 1; |
||
119 | |||
120 | private: |
||
121 | // Give subclasses access to what otherwise would be wasted padding. |
||
122 | // (15 + 4 + 2 + 2 + 2 + 3 + 1 + 1 + 1 + 1) == 32. |
||
123 | unsigned SubClassData : GlobalValueSubClassDataBits; |
||
124 | |||
125 | friend class Constant; |
||
126 | |||
127 | void destroyConstantImpl(); |
||
128 | Value *handleOperandChangeImpl(Value *From, Value *To); |
||
129 | |||
130 | /// Returns true if the definition of this global may be replaced by a |
||
131 | /// differently optimized variant of the same source level function at link |
||
132 | /// time. |
||
133 | bool mayBeDerefined() const { |
||
134 | switch (getLinkage()) { |
||
135 | case WeakODRLinkage: |
||
136 | case LinkOnceODRLinkage: |
||
137 | case AvailableExternallyLinkage: |
||
138 | return true; |
||
139 | |||
140 | case WeakAnyLinkage: |
||
141 | case LinkOnceAnyLinkage: |
||
142 | case CommonLinkage: |
||
143 | case ExternalWeakLinkage: |
||
144 | case ExternalLinkage: |
||
145 | case AppendingLinkage: |
||
146 | case InternalLinkage: |
||
147 | case PrivateLinkage: |
||
148 | // Optimizations may assume builtin semantics for functions defined as |
||
149 | // nobuiltin due to attributes at call-sites. To avoid applying IPO based |
||
150 | // on nobuiltin semantics, treat such function definitions as maybe |
||
151 | // derefined. |
||
152 | return isInterposable() || isNobuiltinFnDef(); |
||
153 | } |
||
154 | |||
155 | llvm_unreachable("Fully covered switch above!"); |
||
156 | } |
||
157 | |||
158 | /// Returns true if the global is a function definition with the nobuiltin |
||
159 | /// attribute. |
||
160 | bool isNobuiltinFnDef() const; |
||
161 | |||
162 | protected: |
||
163 | /// The intrinsic ID for this subclass (which must be a Function). |
||
164 | /// |
||
165 | /// This member is defined by this class, but not used for anything. |
||
166 | /// Subclasses can use it to store their intrinsic ID, if they have one. |
||
167 | /// |
||
168 | /// This is stored here to save space in Function on 64-bit hosts. |
||
169 | Intrinsic::ID IntID = (Intrinsic::ID)0U; |
||
170 | |||
171 | unsigned getGlobalValueSubClassData() const { |
||
172 | return SubClassData; |
||
173 | } |
||
174 | void setGlobalValueSubClassData(unsigned V) { |
||
175 | assert(V < (1 << GlobalValueSubClassDataBits) && "It will not fit"); |
||
176 | SubClassData = V; |
||
177 | } |
||
178 | |||
179 | Module *Parent = nullptr; // The containing module. |
||
180 | |||
181 | // Used by SymbolTableListTraits. |
||
182 | void setParent(Module *parent) { |
||
183 | Parent = parent; |
||
184 | } |
||
185 | |||
186 | ~GlobalValue() { |
||
187 | removeDeadConstantUsers(); // remove any dead constants using this. |
||
188 | } |
||
189 | |||
190 | public: |
||
191 | enum ThreadLocalMode { |
||
192 | NotThreadLocal = 0, |
||
193 | GeneralDynamicTLSModel, |
||
194 | LocalDynamicTLSModel, |
||
195 | InitialExecTLSModel, |
||
196 | LocalExecTLSModel |
||
197 | }; |
||
198 | |||
199 | GlobalValue(const GlobalValue &) = delete; |
||
200 | |||
201 | unsigned getAddressSpace() const { |
||
202 | return getType()->getAddressSpace(); |
||
203 | } |
||
204 | |||
205 | enum class UnnamedAddr { |
||
206 | None, |
||
207 | Local, |
||
208 | Global, |
||
209 | }; |
||
210 | |||
211 | bool hasGlobalUnnamedAddr() const { |
||
212 | return getUnnamedAddr() == UnnamedAddr::Global; |
||
213 | } |
||
214 | |||
215 | /// Returns true if this value's address is not significant in this module. |
||
216 | /// This attribute is intended to be used only by the code generator and LTO |
||
217 | /// to allow the linker to decide whether the global needs to be in the symbol |
||
218 | /// table. It should probably not be used in optimizations, as the value may |
||
219 | /// have uses outside the module; use hasGlobalUnnamedAddr() instead. |
||
220 | bool hasAtLeastLocalUnnamedAddr() const { |
||
221 | return getUnnamedAddr() != UnnamedAddr::None; |
||
222 | } |
||
223 | |||
224 | UnnamedAddr getUnnamedAddr() const { |
||
225 | return UnnamedAddr(UnnamedAddrVal); |
||
226 | } |
||
227 | void setUnnamedAddr(UnnamedAddr Val) { UnnamedAddrVal = unsigned(Val); } |
||
228 | |||
229 | static UnnamedAddr getMinUnnamedAddr(UnnamedAddr A, UnnamedAddr B) { |
||
230 | if (A == UnnamedAddr::None || B == UnnamedAddr::None) |
||
231 | return UnnamedAddr::None; |
||
232 | if (A == UnnamedAddr::Local || B == UnnamedAddr::Local) |
||
233 | return UnnamedAddr::Local; |
||
234 | return UnnamedAddr::Global; |
||
235 | } |
||
236 | |||
237 | bool hasComdat() const { return getComdat() != nullptr; } |
||
238 | const Comdat *getComdat() const; |
||
239 | Comdat *getComdat() { |
||
240 | return const_cast<Comdat *>( |
||
241 | static_cast<const GlobalValue *>(this)->getComdat()); |
||
242 | } |
||
243 | |||
244 | VisibilityTypes getVisibility() const { return VisibilityTypes(Visibility); } |
||
245 | bool hasDefaultVisibility() const { return Visibility == DefaultVisibility; } |
||
246 | bool hasHiddenVisibility() const { return Visibility == HiddenVisibility; } |
||
247 | bool hasProtectedVisibility() const { |
||
248 | return Visibility == ProtectedVisibility; |
||
249 | } |
||
250 | void setVisibility(VisibilityTypes V) { |
||
251 | assert((!hasLocalLinkage() || V == DefaultVisibility) && |
||
252 | "local linkage requires default visibility"); |
||
253 | Visibility = V; |
||
254 | if (isImplicitDSOLocal()) |
||
255 | setDSOLocal(true); |
||
256 | } |
||
257 | |||
258 | /// If the value is "Thread Local", its value isn't shared by the threads. |
||
259 | bool isThreadLocal() const { return getThreadLocalMode() != NotThreadLocal; } |
||
260 | void setThreadLocal(bool Val) { |
||
261 | setThreadLocalMode(Val ? GeneralDynamicTLSModel : NotThreadLocal); |
||
262 | } |
||
263 | void setThreadLocalMode(ThreadLocalMode Val) { |
||
264 | assert(Val == NotThreadLocal || getValueID() != Value::FunctionVal); |
||
265 | ThreadLocal = Val; |
||
266 | } |
||
267 | ThreadLocalMode getThreadLocalMode() const { |
||
268 | return static_cast<ThreadLocalMode>(ThreadLocal); |
||
269 | } |
||
270 | |||
271 | DLLStorageClassTypes getDLLStorageClass() const { |
||
272 | return DLLStorageClassTypes(DllStorageClass); |
||
273 | } |
||
274 | bool hasDLLImportStorageClass() const { |
||
275 | return DllStorageClass == DLLImportStorageClass; |
||
276 | } |
||
277 | bool hasDLLExportStorageClass() const { |
||
278 | return DllStorageClass == DLLExportStorageClass; |
||
279 | } |
||
280 | void setDLLStorageClass(DLLStorageClassTypes C) { |
||
281 | assert((!hasLocalLinkage() || C == DefaultStorageClass) && |
||
282 | "local linkage requires DefaultStorageClass"); |
||
283 | DllStorageClass = C; |
||
284 | } |
||
285 | |||
286 | bool hasSection() const { return !getSection().empty(); } |
||
287 | StringRef getSection() const; |
||
288 | |||
289 | /// Global values are always pointers. |
||
290 | PointerType *getType() const { return cast<PointerType>(User::getType()); } |
||
291 | |||
292 | Type *getValueType() const { return ValueType; } |
||
293 | |||
294 | bool isImplicitDSOLocal() const { |
||
295 | return hasLocalLinkage() || |
||
296 | (!hasDefaultVisibility() && !hasExternalWeakLinkage()); |
||
297 | } |
||
298 | |||
299 | void setDSOLocal(bool Local) { IsDSOLocal = Local; } |
||
300 | |||
301 | bool isDSOLocal() const { |
||
302 | return IsDSOLocal; |
||
303 | } |
||
304 | |||
305 | bool hasPartition() const { |
||
306 | return HasPartition; |
||
307 | } |
||
308 | StringRef getPartition() const; |
||
309 | void setPartition(StringRef Part); |
||
310 | |||
311 | // ASan, HWASan and Memtag sanitizers have some instrumentation that applies |
||
312 | // specifically to global variables. |
||
313 | struct SanitizerMetadata { |
||
314 | SanitizerMetadata() |
||
315 | : NoAddress(false), NoHWAddress(false), |
||
316 | Memtag(false), IsDynInit(false) {} |
||
317 | // For ASan and HWASan, this instrumentation is implicitly applied to all |
||
318 | // global variables when built with -fsanitize=*. What we need is a way to |
||
319 | // persist the information that a certain global variable should *not* have |
||
320 | // sanitizers applied, which occurs if: |
||
321 | // 1. The global variable is in the sanitizer ignore list, or |
||
322 | // 2. The global variable is created by the sanitizers itself for internal |
||
323 | // usage, or |
||
324 | // 3. The global variable has __attribute__((no_sanitize("..."))) or |
||
325 | // __attribute__((disable_sanitizer_instrumentation)). |
||
326 | // |
||
327 | // This is important, a some IR passes like GlobalMerge can delete global |
||
328 | // variables and replace them with new ones. If the old variables were |
||
329 | // marked to be unsanitized, then the new ones should also be. |
||
330 | unsigned NoAddress : 1; |
||
331 | unsigned NoHWAddress : 1; |
||
332 | |||
333 | // Memtag sanitization works differently: sanitization is requested by clang |
||
334 | // when `-fsanitize=memtag-globals` is provided, and the request can be |
||
335 | // denied (and the attribute removed) by the AArch64 global tagging pass if |
||
336 | // it can't be fulfilled (e.g. the global variable is a TLS variable). |
||
337 | // Memtag sanitization has to interact with other parts of LLVM (like |
||
338 | // supressing certain optimisations, emitting assembly directives, or |
||
339 | // creating special relocation sections). |
||
340 | // |
||
341 | // Use `GlobalValue::isTagged()` to check whether tagging should be enabled |
||
342 | // for a global variable. |
||
343 | unsigned Memtag : 1; |
||
344 | |||
345 | // ASan-specific metadata. Is this global variable dynamically initialized |
||
346 | // (from a C++ language perspective), and should therefore be checked for |
||
347 | // ODR violations. |
||
348 | unsigned IsDynInit : 1; |
||
349 | }; |
||
350 | |||
351 | bool hasSanitizerMetadata() const { return HasSanitizerMetadata; } |
||
352 | const SanitizerMetadata &getSanitizerMetadata() const; |
||
353 | // Note: Not byref as it's a POD and otherwise it's too easy to call |
||
354 | // G.setSanitizerMetadata(G2.getSanitizerMetadata()), and the argument becomes |
||
355 | // dangling when the backing storage allocates the metadata for `G`, as the |
||
356 | // storage is shared between `G1` and `G2`. |
||
357 | void setSanitizerMetadata(SanitizerMetadata Meta); |
||
358 | void removeSanitizerMetadata(); |
||
359 | |||
360 | bool isTagged() const { |
||
361 | return hasSanitizerMetadata() && getSanitizerMetadata().Memtag; |
||
362 | } |
||
363 | |||
364 | static LinkageTypes getLinkOnceLinkage(bool ODR) { |
||
365 | return ODR ? LinkOnceODRLinkage : LinkOnceAnyLinkage; |
||
366 | } |
||
367 | static LinkageTypes getWeakLinkage(bool ODR) { |
||
368 | return ODR ? WeakODRLinkage : WeakAnyLinkage; |
||
369 | } |
||
370 | |||
371 | static bool isExternalLinkage(LinkageTypes Linkage) { |
||
372 | return Linkage == ExternalLinkage; |
||
373 | } |
||
374 | static bool isAvailableExternallyLinkage(LinkageTypes Linkage) { |
||
375 | return Linkage == AvailableExternallyLinkage; |
||
376 | } |
||
377 | static bool isLinkOnceAnyLinkage(LinkageTypes Linkage) { |
||
378 | return Linkage == LinkOnceAnyLinkage; |
||
379 | } |
||
380 | static bool isLinkOnceODRLinkage(LinkageTypes Linkage) { |
||
381 | return Linkage == LinkOnceODRLinkage; |
||
382 | } |
||
383 | static bool isLinkOnceLinkage(LinkageTypes Linkage) { |
||
384 | return isLinkOnceAnyLinkage(Linkage) || isLinkOnceODRLinkage(Linkage); |
||
385 | } |
||
386 | static bool isWeakAnyLinkage(LinkageTypes Linkage) { |
||
387 | return Linkage == WeakAnyLinkage; |
||
388 | } |
||
389 | static bool isWeakODRLinkage(LinkageTypes Linkage) { |
||
390 | return Linkage == WeakODRLinkage; |
||
391 | } |
||
392 | static bool isWeakLinkage(LinkageTypes Linkage) { |
||
393 | return isWeakAnyLinkage(Linkage) || isWeakODRLinkage(Linkage); |
||
394 | } |
||
395 | static bool isAppendingLinkage(LinkageTypes Linkage) { |
||
396 | return Linkage == AppendingLinkage; |
||
397 | } |
||
398 | static bool isInternalLinkage(LinkageTypes Linkage) { |
||
399 | return Linkage == InternalLinkage; |
||
400 | } |
||
401 | static bool isPrivateLinkage(LinkageTypes Linkage) { |
||
402 | return Linkage == PrivateLinkage; |
||
403 | } |
||
404 | static bool isLocalLinkage(LinkageTypes Linkage) { |
||
405 | return isInternalLinkage(Linkage) || isPrivateLinkage(Linkage); |
||
406 | } |
||
407 | static bool isExternalWeakLinkage(LinkageTypes Linkage) { |
||
408 | return Linkage == ExternalWeakLinkage; |
||
409 | } |
||
410 | static bool isCommonLinkage(LinkageTypes Linkage) { |
||
411 | return Linkage == CommonLinkage; |
||
412 | } |
||
413 | static bool isValidDeclarationLinkage(LinkageTypes Linkage) { |
||
414 | return isExternalWeakLinkage(Linkage) || isExternalLinkage(Linkage); |
||
415 | } |
||
416 | |||
417 | /// Whether the definition of this global may be replaced by something |
||
418 | /// non-equivalent at link time. For example, if a function has weak linkage |
||
419 | /// then the code defining it may be replaced by different code. |
||
420 | static bool isInterposableLinkage(LinkageTypes Linkage) { |
||
421 | switch (Linkage) { |
||
422 | case WeakAnyLinkage: |
||
423 | case LinkOnceAnyLinkage: |
||
424 | case CommonLinkage: |
||
425 | case ExternalWeakLinkage: |
||
426 | return true; |
||
427 | |||
428 | case AvailableExternallyLinkage: |
||
429 | case LinkOnceODRLinkage: |
||
430 | case WeakODRLinkage: |
||
431 | // The above three cannot be overridden but can be de-refined. |
||
432 | |||
433 | case ExternalLinkage: |
||
434 | case AppendingLinkage: |
||
435 | case InternalLinkage: |
||
436 | case PrivateLinkage: |
||
437 | return false; |
||
438 | } |
||
439 | llvm_unreachable("Fully covered switch above!"); |
||
440 | } |
||
441 | |||
442 | /// Whether the definition of this global may be discarded if it is not used |
||
443 | /// in its compilation unit. |
||
444 | static bool isDiscardableIfUnused(LinkageTypes Linkage) { |
||
445 | return isLinkOnceLinkage(Linkage) || isLocalLinkage(Linkage) || |
||
446 | isAvailableExternallyLinkage(Linkage); |
||
447 | } |
||
448 | |||
449 | /// Whether the definition of this global may be replaced at link time. NB: |
||
450 | /// Using this method outside of the code generators is almost always a |
||
451 | /// mistake: when working at the IR level use isInterposable instead as it |
||
452 | /// knows about ODR semantics. |
||
453 | static bool isWeakForLinker(LinkageTypes Linkage) { |
||
454 | return Linkage == WeakAnyLinkage || Linkage == WeakODRLinkage || |
||
455 | Linkage == LinkOnceAnyLinkage || Linkage == LinkOnceODRLinkage || |
||
456 | Linkage == CommonLinkage || Linkage == ExternalWeakLinkage; |
||
457 | } |
||
458 | |||
459 | /// Return true if the currently visible definition of this global (if any) is |
||
460 | /// exactly the definition we will see at runtime. |
||
461 | /// |
||
462 | /// Non-exact linkage types inhibits most non-inlining IPO, since a |
||
463 | /// differently optimized variant of the same function can have different |
||
464 | /// observable or undefined behavior than in the variant currently visible. |
||
465 | /// For instance, we could have started with |
||
466 | /// |
||
467 | /// void foo(int *v) { |
||
468 | /// int t = 5 / v[0]; |
||
469 | /// (void) t; |
||
470 | /// } |
||
471 | /// |
||
472 | /// and "refined" it to |
||
473 | /// |
||
474 | /// void foo(int *v) { } |
||
475 | /// |
||
476 | /// However, we cannot infer readnone for `foo`, since that would justify |
||
477 | /// DSE'ing a store to `v[0]` across a call to `foo`, which can cause |
||
478 | /// undefined behavior if the linker replaces the actual call destination with |
||
479 | /// the unoptimized `foo`. |
||
480 | /// |
||
481 | /// Inlining is okay across non-exact linkage types as long as they're not |
||
482 | /// interposable (see \c isInterposable), since in such cases the currently |
||
483 | /// visible variant is *a* correct implementation of the original source |
||
484 | /// function; it just isn't the *only* correct implementation. |
||
485 | bool isDefinitionExact() const { |
||
486 | return !mayBeDerefined(); |
||
487 | } |
||
488 | |||
489 | /// Return true if this global has an exact defintion. |
||
490 | bool hasExactDefinition() const { |
||
491 | // While this computes exactly the same thing as |
||
492 | // isStrongDefinitionForLinker, the intended uses are different. This |
||
493 | // function is intended to help decide if specific inter-procedural |
||
494 | // transforms are correct, while isStrongDefinitionForLinker's intended use |
||
495 | // is in low level code generation. |
||
496 | return !isDeclaration() && isDefinitionExact(); |
||
497 | } |
||
498 | |||
499 | /// Return true if this global's definition can be substituted with an |
||
500 | /// *arbitrary* definition at link time or load time. We cannot do any IPO or |
||
501 | /// inlining across interposable call edges, since the callee can be |
||
502 | /// replaced with something arbitrary. |
||
503 | bool isInterposable() const; |
||
504 | bool canBenefitFromLocalAlias() const; |
||
505 | |||
506 | bool hasExternalLinkage() const { return isExternalLinkage(getLinkage()); } |
||
507 | bool hasAvailableExternallyLinkage() const { |
||
508 | return isAvailableExternallyLinkage(getLinkage()); |
||
509 | } |
||
510 | bool hasLinkOnceLinkage() const { return isLinkOnceLinkage(getLinkage()); } |
||
511 | bool hasLinkOnceAnyLinkage() const { |
||
512 | return isLinkOnceAnyLinkage(getLinkage()); |
||
513 | } |
||
514 | bool hasLinkOnceODRLinkage() const { |
||
515 | return isLinkOnceODRLinkage(getLinkage()); |
||
516 | } |
||
517 | bool hasWeakLinkage() const { return isWeakLinkage(getLinkage()); } |
||
518 | bool hasWeakAnyLinkage() const { return isWeakAnyLinkage(getLinkage()); } |
||
519 | bool hasWeakODRLinkage() const { return isWeakODRLinkage(getLinkage()); } |
||
520 | bool hasAppendingLinkage() const { return isAppendingLinkage(getLinkage()); } |
||
521 | bool hasInternalLinkage() const { return isInternalLinkage(getLinkage()); } |
||
522 | bool hasPrivateLinkage() const { return isPrivateLinkage(getLinkage()); } |
||
523 | bool hasLocalLinkage() const { return isLocalLinkage(getLinkage()); } |
||
524 | bool hasExternalWeakLinkage() const { |
||
525 | return isExternalWeakLinkage(getLinkage()); |
||
526 | } |
||
527 | bool hasCommonLinkage() const { return isCommonLinkage(getLinkage()); } |
||
528 | bool hasValidDeclarationLinkage() const { |
||
529 | return isValidDeclarationLinkage(getLinkage()); |
||
530 | } |
||
531 | |||
532 | void setLinkage(LinkageTypes LT) { |
||
533 | if (isLocalLinkage(LT)) { |
||
534 | Visibility = DefaultVisibility; |
||
535 | DllStorageClass = DefaultStorageClass; |
||
536 | } |
||
537 | Linkage = LT; |
||
538 | if (isImplicitDSOLocal()) |
||
539 | setDSOLocal(true); |
||
540 | } |
||
541 | LinkageTypes getLinkage() const { return LinkageTypes(Linkage); } |
||
542 | |||
543 | bool isDiscardableIfUnused() const { |
||
544 | return isDiscardableIfUnused(getLinkage()); |
||
545 | } |
||
546 | |||
547 | bool isWeakForLinker() const { return isWeakForLinker(getLinkage()); } |
||
548 | |||
549 | protected: |
||
550 | /// Copy all additional attributes (those not needed to create a GlobalValue) |
||
551 | /// from the GlobalValue Src to this one. |
||
552 | void copyAttributesFrom(const GlobalValue *Src); |
||
553 | |||
554 | public: |
||
555 | /// If the given string begins with the GlobalValue name mangling escape |
||
556 | /// character '\1', drop it. |
||
557 | /// |
||
558 | /// This function applies a specific mangling that is used in PGO profiles, |
||
559 | /// among other things. If you're trying to get a symbol name for an |
||
560 | /// arbitrary GlobalValue, this is not the function you're looking for; see |
||
561 | /// Mangler.h. |
||
562 | static StringRef dropLLVMManglingEscape(StringRef Name) { |
||
563 | if (!Name.empty() && Name[0] == '\1') |
||
564 | return Name.substr(1); |
||
565 | return Name; |
||
566 | } |
||
567 | |||
568 | /// Return the modified name for a global value suitable to be |
||
569 | /// used as the key for a global lookup (e.g. profile or ThinLTO). |
||
570 | /// The value's original name is \c Name and has linkage of type |
||
571 | /// \c Linkage. The value is defined in module \c FileName. |
||
572 | static std::string getGlobalIdentifier(StringRef Name, |
||
573 | GlobalValue::LinkageTypes Linkage, |
||
574 | StringRef FileName); |
||
575 | |||
576 | /// Return the modified name for this global value suitable to be |
||
577 | /// used as the key for a global lookup (e.g. profile or ThinLTO). |
||
578 | std::string getGlobalIdentifier() const; |
||
579 | |||
580 | /// Declare a type to represent a global unique identifier for a global value. |
||
581 | /// This is a 64 bits hash that is used by PGO and ThinLTO to have a compact |
||
582 | /// unique way to identify a symbol. |
||
583 | using GUID = uint64_t; |
||
584 | |||
585 | /// Return a 64-bit global unique ID constructed from global value name |
||
586 | /// (i.e. returned by getGlobalIdentifier()). |
||
587 | static GUID getGUID(StringRef GlobalName) { return MD5Hash(GlobalName); } |
||
588 | |||
589 | /// Return a 64-bit global unique ID constructed from global value name |
||
590 | /// (i.e. returned by getGlobalIdentifier()). |
||
591 | GUID getGUID() const { return getGUID(getGlobalIdentifier()); } |
||
592 | |||
593 | /// @name Materialization |
||
594 | /// Materialization is used to construct functions only as they're needed. |
||
595 | /// This |
||
596 | /// is useful to reduce memory usage in LLVM or parsing work done by the |
||
597 | /// BitcodeReader to load the Module. |
||
598 | /// @{ |
||
599 | |||
600 | /// If this function's Module is being lazily streamed in functions from disk |
||
601 | /// or some other source, this method can be used to check to see if the |
||
602 | /// function has been read in yet or not. |
||
603 | bool isMaterializable() const; |
||
604 | |||
605 | /// Make sure this GlobalValue is fully read. |
||
606 | Error materialize(); |
||
607 | |||
608 | /// @} |
||
609 | |||
610 | /// Return true if the primary definition of this global value is outside of |
||
611 | /// the current translation unit. |
||
612 | bool isDeclaration() const; |
||
613 | |||
614 | bool isDeclarationForLinker() const { |
||
615 | if (hasAvailableExternallyLinkage()) |
||
616 | return true; |
||
617 | |||
618 | return isDeclaration(); |
||
619 | } |
||
620 | |||
621 | /// Returns true if this global's definition will be the one chosen by the |
||
622 | /// linker. |
||
623 | /// |
||
624 | /// NB! Ideally this should not be used at the IR level at all. If you're |
||
625 | /// interested in optimization constraints implied by the linker's ability to |
||
626 | /// choose an implementation, prefer using \c hasExactDefinition. |
||
627 | bool isStrongDefinitionForLinker() const { |
||
628 | return !(isDeclarationForLinker() || isWeakForLinker()); |
||
629 | } |
||
630 | |||
631 | const GlobalObject *getAliaseeObject() const; |
||
632 | GlobalObject *getAliaseeObject() { |
||
633 | return const_cast<GlobalObject *>( |
||
634 | static_cast<const GlobalValue *>(this)->getAliaseeObject()); |
||
635 | } |
||
636 | |||
637 | /// Returns whether this is a reference to an absolute symbol. |
||
638 | bool isAbsoluteSymbolRef() const; |
||
639 | |||
640 | /// If this is an absolute symbol reference, returns the range of the symbol, |
||
641 | /// otherwise returns std::nullopt. |
||
642 | std::optional<ConstantRange> getAbsoluteSymbolRange() const; |
||
643 | |||
644 | /// This method unlinks 'this' from the containing module, but does not delete |
||
645 | /// it. |
||
646 | void removeFromParent(); |
||
647 | |||
648 | /// This method unlinks 'this' from the containing module and deletes it. |
||
649 | void eraseFromParent(); |
||
650 | |||
651 | /// Get the module that this global value is contained inside of... |
||
652 | Module *getParent() { return Parent; } |
||
653 | const Module *getParent() const { return Parent; } |
||
654 | |||
655 | // Methods for support type inquiry through isa, cast, and dyn_cast: |
||
656 | static bool classof(const Value *V) { |
||
657 | return V->getValueID() == Value::FunctionVal || |
||
658 | V->getValueID() == Value::GlobalVariableVal || |
||
659 | V->getValueID() == Value::GlobalAliasVal || |
||
660 | V->getValueID() == Value::GlobalIFuncVal; |
||
661 | } |
||
662 | |||
663 | /// True if GV can be left out of the object symbol table. This is the case |
||
664 | /// for linkonce_odr values whose address is not significant. While legal, it |
||
665 | /// is not normally profitable to omit them from the .o symbol table. Using |
||
666 | /// this analysis makes sense when the information can be passed down to the |
||
667 | /// linker or we are in LTO. |
||
668 | bool canBeOmittedFromSymbolTable() const; |
||
669 | }; |
||
670 | |||
671 | } // end namespace llvm |
||
672 | |||
673 | #endif // LLVM_IR_GLOBALVALUE_H |