Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

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