File indexing completed on 2026-05-10 08:44:01
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017 #ifndef LLVM_IR_GLOBALVALUE_H
0018 #define LLVM_IR_GLOBALVALUE_H
0019
0020 #include "llvm/ADT/StringRef.h"
0021 #include "llvm/ADT/Twine.h"
0022 #include "llvm/IR/Constant.h"
0023 #include "llvm/IR/DerivedTypes.h"
0024 #include "llvm/IR/Value.h"
0025 #include "llvm/Support/Casting.h"
0026 #include "llvm/Support/ErrorHandling.h"
0027 #include <cassert>
0028 #include <cstdint>
0029 #include <string>
0030
0031 namespace llvm {
0032
0033 class Comdat;
0034 class ConstantRange;
0035 class DataLayout;
0036 class Error;
0037 class GlobalObject;
0038 class Module;
0039
0040 namespace Intrinsic {
0041 typedef unsigned ID;
0042 }
0043
0044
0045
0046 inline constexpr char GlobalIdentifierDelimiter = ';';
0047
0048 class GlobalValue : public Constant {
0049 public:
0050
0051 enum LinkageTypes {
0052 ExternalLinkage = 0,
0053 AvailableExternallyLinkage,
0054 LinkOnceAnyLinkage,
0055 LinkOnceODRLinkage,
0056 WeakAnyLinkage,
0057 WeakODRLinkage,
0058 AppendingLinkage,
0059 InternalLinkage,
0060 PrivateLinkage,
0061 ExternalWeakLinkage,
0062 CommonLinkage
0063 };
0064
0065
0066 enum VisibilityTypes {
0067 DefaultVisibility = 0,
0068 HiddenVisibility,
0069 ProtectedVisibility
0070 };
0071
0072
0073 enum DLLStorageClassTypes {
0074 DefaultStorageClass = 0,
0075 DLLImportStorageClass = 1,
0076 DLLExportStorageClass = 2
0077 };
0078
0079 protected:
0080 GlobalValue(Type *Ty, ValueTy VTy, AllocInfo AllocInfo, LinkageTypes Linkage,
0081 const Twine &Name, unsigned AddressSpace)
0082 : Constant(PointerType::get(Ty->getContext(), AddressSpace), VTy,
0083 AllocInfo),
0084 ValueType(Ty), Visibility(DefaultVisibility),
0085 UnnamedAddrVal(unsigned(UnnamedAddr::None)),
0086 DllStorageClass(DefaultStorageClass), ThreadLocal(NotThreadLocal),
0087 HasLLVMReservedName(false), IsDSOLocal(false), HasPartition(false),
0088 HasSanitizerMetadata(false) {
0089 setLinkage(Linkage);
0090 setName(Name);
0091 }
0092
0093 Type *ValueType;
0094
0095 static const unsigned GlobalValueSubClassDataBits = 15;
0096
0097
0098
0099 unsigned Linkage : 4;
0100 unsigned Visibility : 2;
0101 unsigned UnnamedAddrVal : 2;
0102 unsigned DllStorageClass : 2;
0103
0104 unsigned ThreadLocal : 3;
0105
0106
0107
0108
0109
0110 unsigned HasLLVMReservedName : 1;
0111
0112
0113
0114 unsigned IsDSOLocal : 1;
0115
0116
0117
0118 unsigned HasPartition : 1;
0119
0120
0121
0122
0123 unsigned HasSanitizerMetadata : 1;
0124
0125 private:
0126
0127
0128 unsigned SubClassData : GlobalValueSubClassDataBits;
0129
0130 friend class Constant;
0131
0132 void destroyConstantImpl();
0133 Value *handleOperandChangeImpl(Value *From, Value *To);
0134
0135
0136
0137
0138 bool mayBeDerefined() const {
0139 switch (getLinkage()) {
0140 case WeakODRLinkage:
0141 case LinkOnceODRLinkage:
0142 case AvailableExternallyLinkage:
0143 return true;
0144
0145 case WeakAnyLinkage:
0146 case LinkOnceAnyLinkage:
0147 case CommonLinkage:
0148 case ExternalWeakLinkage:
0149 case ExternalLinkage:
0150 case AppendingLinkage:
0151 case InternalLinkage:
0152 case PrivateLinkage:
0153
0154
0155
0156
0157 return isInterposable() || isNobuiltinFnDef();
0158 }
0159
0160 llvm_unreachable("Fully covered switch above!");
0161 }
0162
0163
0164
0165 bool isNobuiltinFnDef() const;
0166
0167 protected:
0168
0169
0170
0171
0172
0173
0174 Intrinsic::ID IntID = (Intrinsic::ID)0U;
0175
0176 unsigned getGlobalValueSubClassData() const {
0177 return SubClassData;
0178 }
0179 void setGlobalValueSubClassData(unsigned V) {
0180 assert(V < (1 << GlobalValueSubClassDataBits) && "It will not fit");
0181 SubClassData = V;
0182 }
0183
0184 Module *Parent = nullptr;
0185
0186
0187 void setParent(Module *parent) {
0188 Parent = parent;
0189 }
0190
0191 ~GlobalValue() {
0192 removeDeadConstantUsers();
0193 }
0194
0195 public:
0196 enum ThreadLocalMode {
0197 NotThreadLocal = 0,
0198 GeneralDynamicTLSModel,
0199 LocalDynamicTLSModel,
0200 InitialExecTLSModel,
0201 LocalExecTLSModel
0202 };
0203
0204 GlobalValue(const GlobalValue &) = delete;
0205
0206 unsigned getAddressSpace() const {
0207 return getType()->getAddressSpace();
0208 }
0209
0210 enum class UnnamedAddr {
0211 None,
0212 Local,
0213 Global,
0214 };
0215
0216 bool hasGlobalUnnamedAddr() const {
0217 return getUnnamedAddr() == UnnamedAddr::Global;
0218 }
0219
0220
0221
0222
0223
0224
0225 bool hasAtLeastLocalUnnamedAddr() const {
0226 return getUnnamedAddr() != UnnamedAddr::None;
0227 }
0228
0229 UnnamedAddr getUnnamedAddr() const {
0230 return UnnamedAddr(UnnamedAddrVal);
0231 }
0232 void setUnnamedAddr(UnnamedAddr Val) { UnnamedAddrVal = unsigned(Val); }
0233
0234 static UnnamedAddr getMinUnnamedAddr(UnnamedAddr A, UnnamedAddr B) {
0235 if (A == UnnamedAddr::None || B == UnnamedAddr::None)
0236 return UnnamedAddr::None;
0237 if (A == UnnamedAddr::Local || B == UnnamedAddr::Local)
0238 return UnnamedAddr::Local;
0239 return UnnamedAddr::Global;
0240 }
0241
0242 bool hasComdat() const { return getComdat() != nullptr; }
0243 const Comdat *getComdat() const;
0244 Comdat *getComdat() {
0245 return const_cast<Comdat *>(
0246 static_cast<const GlobalValue *>(this)->getComdat());
0247 }
0248
0249 VisibilityTypes getVisibility() const { return VisibilityTypes(Visibility); }
0250 bool hasDefaultVisibility() const { return Visibility == DefaultVisibility; }
0251 bool hasHiddenVisibility() const { return Visibility == HiddenVisibility; }
0252 bool hasProtectedVisibility() const {
0253 return Visibility == ProtectedVisibility;
0254 }
0255 void setVisibility(VisibilityTypes V) {
0256 assert((!hasLocalLinkage() || V == DefaultVisibility) &&
0257 "local linkage requires default visibility");
0258 Visibility = V;
0259 if (isImplicitDSOLocal())
0260 setDSOLocal(true);
0261 }
0262
0263
0264 bool isThreadLocal() const { return getThreadLocalMode() != NotThreadLocal; }
0265 void setThreadLocal(bool Val) {
0266 setThreadLocalMode(Val ? GeneralDynamicTLSModel : NotThreadLocal);
0267 }
0268 void setThreadLocalMode(ThreadLocalMode Val) {
0269 assert(Val == NotThreadLocal || getValueID() != Value::FunctionVal);
0270 ThreadLocal = Val;
0271 }
0272 ThreadLocalMode getThreadLocalMode() const {
0273 return static_cast<ThreadLocalMode>(ThreadLocal);
0274 }
0275
0276 DLLStorageClassTypes getDLLStorageClass() const {
0277 return DLLStorageClassTypes(DllStorageClass);
0278 }
0279 bool hasDLLImportStorageClass() const {
0280 return DllStorageClass == DLLImportStorageClass;
0281 }
0282 bool hasDLLExportStorageClass() const {
0283 return DllStorageClass == DLLExportStorageClass;
0284 }
0285 void setDLLStorageClass(DLLStorageClassTypes C) {
0286 assert((!hasLocalLinkage() || C == DefaultStorageClass) &&
0287 "local linkage requires DefaultStorageClass");
0288 DllStorageClass = C;
0289 }
0290
0291 bool hasSection() const { return !getSection().empty(); }
0292 StringRef getSection() const;
0293
0294
0295 PointerType *getType() const { return cast<PointerType>(User::getType()); }
0296
0297 Type *getValueType() const { return ValueType; }
0298
0299 bool isImplicitDSOLocal() const {
0300 return hasLocalLinkage() ||
0301 (!hasDefaultVisibility() && !hasExternalWeakLinkage());
0302 }
0303
0304 void setDSOLocal(bool Local) { IsDSOLocal = Local; }
0305
0306 bool isDSOLocal() const {
0307 return IsDSOLocal;
0308 }
0309
0310 bool hasPartition() const {
0311 return HasPartition;
0312 }
0313 StringRef getPartition() const;
0314 void setPartition(StringRef Part);
0315
0316
0317
0318 struct SanitizerMetadata {
0319 SanitizerMetadata()
0320 : NoAddress(false), NoHWAddress(false),
0321 Memtag(false), IsDynInit(false) {}
0322
0323
0324
0325
0326
0327
0328
0329
0330
0331
0332
0333
0334
0335 unsigned NoAddress : 1;
0336 unsigned NoHWAddress : 1;
0337
0338
0339
0340
0341
0342
0343
0344
0345
0346
0347
0348 unsigned Memtag : 1;
0349
0350
0351
0352
0353 unsigned IsDynInit : 1;
0354 };
0355
0356 bool hasSanitizerMetadata() const { return HasSanitizerMetadata; }
0357 const SanitizerMetadata &getSanitizerMetadata() const;
0358
0359
0360
0361
0362 void setSanitizerMetadata(SanitizerMetadata Meta);
0363 void removeSanitizerMetadata();
0364 void setNoSanitizeMetadata();
0365
0366 bool isTagged() const {
0367 return hasSanitizerMetadata() && getSanitizerMetadata().Memtag;
0368 }
0369
0370 static LinkageTypes getLinkOnceLinkage(bool ODR) {
0371 return ODR ? LinkOnceODRLinkage : LinkOnceAnyLinkage;
0372 }
0373 static LinkageTypes getWeakLinkage(bool ODR) {
0374 return ODR ? WeakODRLinkage : WeakAnyLinkage;
0375 }
0376
0377 static bool isExternalLinkage(LinkageTypes Linkage) {
0378 return Linkage == ExternalLinkage;
0379 }
0380 static bool isAvailableExternallyLinkage(LinkageTypes Linkage) {
0381 return Linkage == AvailableExternallyLinkage;
0382 }
0383 static bool isLinkOnceAnyLinkage(LinkageTypes Linkage) {
0384 return Linkage == LinkOnceAnyLinkage;
0385 }
0386 static bool isLinkOnceODRLinkage(LinkageTypes Linkage) {
0387 return Linkage == LinkOnceODRLinkage;
0388 }
0389 static bool isLinkOnceLinkage(LinkageTypes Linkage) {
0390 return isLinkOnceAnyLinkage(Linkage) || isLinkOnceODRLinkage(Linkage);
0391 }
0392 static bool isWeakAnyLinkage(LinkageTypes Linkage) {
0393 return Linkage == WeakAnyLinkage;
0394 }
0395 static bool isWeakODRLinkage(LinkageTypes Linkage) {
0396 return Linkage == WeakODRLinkage;
0397 }
0398 static bool isWeakLinkage(LinkageTypes Linkage) {
0399 return isWeakAnyLinkage(Linkage) || isWeakODRLinkage(Linkage);
0400 }
0401 static bool isAppendingLinkage(LinkageTypes Linkage) {
0402 return Linkage == AppendingLinkage;
0403 }
0404 static bool isInternalLinkage(LinkageTypes Linkage) {
0405 return Linkage == InternalLinkage;
0406 }
0407 static bool isPrivateLinkage(LinkageTypes Linkage) {
0408 return Linkage == PrivateLinkage;
0409 }
0410 static bool isLocalLinkage(LinkageTypes Linkage) {
0411 return isInternalLinkage(Linkage) || isPrivateLinkage(Linkage);
0412 }
0413 static bool isExternalWeakLinkage(LinkageTypes Linkage) {
0414 return Linkage == ExternalWeakLinkage;
0415 }
0416 static bool isCommonLinkage(LinkageTypes Linkage) {
0417 return Linkage == CommonLinkage;
0418 }
0419 static bool isValidDeclarationLinkage(LinkageTypes Linkage) {
0420 return isExternalWeakLinkage(Linkage) || isExternalLinkage(Linkage);
0421 }
0422
0423
0424
0425
0426 static bool isInterposableLinkage(LinkageTypes Linkage) {
0427 switch (Linkage) {
0428 case WeakAnyLinkage:
0429 case LinkOnceAnyLinkage:
0430 case CommonLinkage:
0431 case ExternalWeakLinkage:
0432 return true;
0433
0434 case AvailableExternallyLinkage:
0435 case LinkOnceODRLinkage:
0436 case WeakODRLinkage:
0437
0438
0439 case ExternalLinkage:
0440 case AppendingLinkage:
0441 case InternalLinkage:
0442 case PrivateLinkage:
0443 return false;
0444 }
0445 llvm_unreachable("Fully covered switch above!");
0446 }
0447
0448
0449
0450 static bool isDiscardableIfUnused(LinkageTypes Linkage) {
0451 return isLinkOnceLinkage(Linkage) || isLocalLinkage(Linkage) ||
0452 isAvailableExternallyLinkage(Linkage);
0453 }
0454
0455
0456
0457
0458
0459 static bool isWeakForLinker(LinkageTypes Linkage) {
0460 return Linkage == WeakAnyLinkage || Linkage == WeakODRLinkage ||
0461 Linkage == LinkOnceAnyLinkage || Linkage == LinkOnceODRLinkage ||
0462 Linkage == CommonLinkage || Linkage == ExternalWeakLinkage;
0463 }
0464
0465
0466
0467
0468
0469
0470
0471
0472
0473
0474
0475
0476
0477
0478
0479
0480
0481
0482
0483
0484
0485
0486
0487
0488
0489
0490
0491 bool isDefinitionExact() const {
0492 return !mayBeDerefined();
0493 }
0494
0495
0496 bool hasExactDefinition() const {
0497
0498
0499
0500
0501
0502 return !isDeclaration() && isDefinitionExact();
0503 }
0504
0505
0506
0507
0508
0509 bool isInterposable() const;
0510 bool canBenefitFromLocalAlias() const;
0511
0512 bool hasExternalLinkage() const { return isExternalLinkage(getLinkage()); }
0513 bool hasAvailableExternallyLinkage() const {
0514 return isAvailableExternallyLinkage(getLinkage());
0515 }
0516 bool hasLinkOnceLinkage() const { return isLinkOnceLinkage(getLinkage()); }
0517 bool hasLinkOnceAnyLinkage() const {
0518 return isLinkOnceAnyLinkage(getLinkage());
0519 }
0520 bool hasLinkOnceODRLinkage() const {
0521 return isLinkOnceODRLinkage(getLinkage());
0522 }
0523 bool hasWeakLinkage() const { return isWeakLinkage(getLinkage()); }
0524 bool hasWeakAnyLinkage() const { return isWeakAnyLinkage(getLinkage()); }
0525 bool hasWeakODRLinkage() const { return isWeakODRLinkage(getLinkage()); }
0526 bool hasAppendingLinkage() const { return isAppendingLinkage(getLinkage()); }
0527 bool hasInternalLinkage() const { return isInternalLinkage(getLinkage()); }
0528 bool hasPrivateLinkage() const { return isPrivateLinkage(getLinkage()); }
0529 bool hasLocalLinkage() const { return isLocalLinkage(getLinkage()); }
0530 bool hasExternalWeakLinkage() const {
0531 return isExternalWeakLinkage(getLinkage());
0532 }
0533 bool hasCommonLinkage() const { return isCommonLinkage(getLinkage()); }
0534 bool hasValidDeclarationLinkage() const {
0535 return isValidDeclarationLinkage(getLinkage());
0536 }
0537
0538 void setLinkage(LinkageTypes LT) {
0539 if (isLocalLinkage(LT)) {
0540 Visibility = DefaultVisibility;
0541 DllStorageClass = DefaultStorageClass;
0542 }
0543 Linkage = LT;
0544 if (isImplicitDSOLocal())
0545 setDSOLocal(true);
0546 }
0547 LinkageTypes getLinkage() const { return LinkageTypes(Linkage); }
0548
0549 bool isDiscardableIfUnused() const {
0550 return isDiscardableIfUnused(getLinkage());
0551 }
0552
0553 bool isWeakForLinker() const { return isWeakForLinker(getLinkage()); }
0554
0555 protected:
0556
0557
0558 void copyAttributesFrom(const GlobalValue *Src);
0559
0560 public:
0561
0562
0563
0564
0565
0566
0567
0568 static StringRef dropLLVMManglingEscape(StringRef Name) {
0569 Name.consume_front("\1");
0570 return Name;
0571 }
0572
0573
0574
0575
0576
0577 static std::string getGlobalIdentifier(StringRef Name,
0578 GlobalValue::LinkageTypes Linkage,
0579 StringRef FileName);
0580
0581
0582
0583 std::string getGlobalIdentifier() const;
0584
0585
0586
0587
0588 using GUID = uint64_t;
0589
0590
0591
0592 static GUID getGUID(StringRef GlobalName);
0593
0594
0595
0596 GUID getGUID() const { return getGUID(getGlobalIdentifier()); }
0597
0598
0599
0600
0601
0602
0603
0604
0605
0606
0607
0608 bool isMaterializable() const;
0609
0610
0611 Error materialize();
0612
0613
0614
0615
0616
0617 bool isDeclaration() const;
0618
0619 bool isDeclarationForLinker() const {
0620 if (hasAvailableExternallyLinkage())
0621 return true;
0622
0623 return isDeclaration();
0624 }
0625
0626
0627
0628
0629
0630
0631
0632 bool isStrongDefinitionForLinker() const {
0633 return !(isDeclarationForLinker() || isWeakForLinker());
0634 }
0635
0636 const GlobalObject *getAliaseeObject() const;
0637 GlobalObject *getAliaseeObject() {
0638 return const_cast<GlobalObject *>(
0639 static_cast<const GlobalValue *>(this)->getAliaseeObject());
0640 }
0641
0642
0643 bool isAbsoluteSymbolRef() const;
0644
0645
0646
0647 std::optional<ConstantRange> getAbsoluteSymbolRange() const;
0648
0649
0650
0651 void removeFromParent();
0652
0653
0654 void eraseFromParent();
0655
0656
0657 Module *getParent() { return Parent; }
0658 const Module *getParent() const { return Parent; }
0659
0660
0661
0662
0663 const DataLayout &getDataLayout() const;
0664
0665
0666 static bool classof(const Value *V) {
0667 return V->getValueID() == Value::FunctionVal ||
0668 V->getValueID() == Value::GlobalVariableVal ||
0669 V->getValueID() == Value::GlobalAliasVal ||
0670 V->getValueID() == Value::GlobalIFuncVal;
0671 }
0672
0673
0674
0675
0676
0677
0678 bool canBeOmittedFromSymbolTable() const;
0679 };
0680
0681 }
0682
0683 #endif