xref: /freebsd/contrib/llvm-project/llvm/lib/IR/Globals.cpp (revision cb14a3fe5122c879eae1fb480ed7ce82a699ddb6)
10b57cec5SDimitry Andric //===-- Globals.cpp - Implement the GlobalValue & GlobalVariable class ----===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric // This file implements the GlobalValue & GlobalVariable classes for the IR
100b57cec5SDimitry Andric // library.
110b57cec5SDimitry Andric //
120b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
130b57cec5SDimitry Andric 
140b57cec5SDimitry Andric #include "LLVMContextImpl.h"
150b57cec5SDimitry Andric #include "llvm/IR/ConstantRange.h"
160b57cec5SDimitry Andric #include "llvm/IR/Constants.h"
170b57cec5SDimitry Andric #include "llvm/IR/DerivedTypes.h"
180b57cec5SDimitry Andric #include "llvm/IR/GlobalAlias.h"
190b57cec5SDimitry Andric #include "llvm/IR/GlobalValue.h"
200b57cec5SDimitry Andric #include "llvm/IR/GlobalVariable.h"
210b57cec5SDimitry Andric #include "llvm/IR/Module.h"
220b57cec5SDimitry Andric #include "llvm/Support/Error.h"
230b57cec5SDimitry Andric #include "llvm/Support/ErrorHandling.h"
2406c3fb27SDimitry Andric #include "llvm/TargetParser/Triple.h"
250b57cec5SDimitry Andric using namespace llvm;
260b57cec5SDimitry Andric 
270b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
280b57cec5SDimitry Andric //                            GlobalValue Class
290b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
300b57cec5SDimitry Andric 
310b57cec5SDimitry Andric // GlobalValue should be a Constant, plus a type, a module, some flags, and an
320b57cec5SDimitry Andric // intrinsic ID. Add an assert to prevent people from accidentally growing
330b57cec5SDimitry Andric // GlobalValue while adding flags.
340b57cec5SDimitry Andric static_assert(sizeof(GlobalValue) ==
350b57cec5SDimitry Andric                   sizeof(Constant) + 2 * sizeof(void *) + 2 * sizeof(unsigned),
360b57cec5SDimitry Andric               "unexpected GlobalValue size growth");
370b57cec5SDimitry Andric 
380b57cec5SDimitry Andric // GlobalObject adds a comdat.
390b57cec5SDimitry Andric static_assert(sizeof(GlobalObject) == sizeof(GlobalValue) + sizeof(void *),
400b57cec5SDimitry Andric               "unexpected GlobalObject size growth");
410b57cec5SDimitry Andric 
420b57cec5SDimitry Andric bool GlobalValue::isMaterializable() const {
430b57cec5SDimitry Andric   if (const Function *F = dyn_cast<Function>(this))
440b57cec5SDimitry Andric     return F->isMaterializable();
450b57cec5SDimitry Andric   return false;
460b57cec5SDimitry Andric }
4706c3fb27SDimitry Andric Error GlobalValue::materialize() { return getParent()->materialize(this); }
480b57cec5SDimitry Andric 
490b57cec5SDimitry Andric /// Override destroyConstantImpl to make sure it doesn't get called on
500b57cec5SDimitry Andric /// GlobalValue's because they shouldn't be treated like other constants.
510b57cec5SDimitry Andric void GlobalValue::destroyConstantImpl() {
520b57cec5SDimitry Andric   llvm_unreachable("You can't GV->destroyConstantImpl()!");
530b57cec5SDimitry Andric }
540b57cec5SDimitry Andric 
550b57cec5SDimitry Andric Value *GlobalValue::handleOperandChangeImpl(Value *From, Value *To) {
560b57cec5SDimitry Andric   llvm_unreachable("Unsupported class for handleOperandChange()!");
570b57cec5SDimitry Andric }
580b57cec5SDimitry Andric 
590b57cec5SDimitry Andric /// copyAttributesFrom - copy all additional attributes (those not needed to
600b57cec5SDimitry Andric /// create a GlobalValue) from the GlobalValue Src to this one.
610b57cec5SDimitry Andric void GlobalValue::copyAttributesFrom(const GlobalValue *Src) {
620b57cec5SDimitry Andric   setVisibility(Src->getVisibility());
630b57cec5SDimitry Andric   setUnnamedAddr(Src->getUnnamedAddr());
645ffd83dbSDimitry Andric   setThreadLocalMode(Src->getThreadLocalMode());
650b57cec5SDimitry Andric   setDLLStorageClass(Src->getDLLStorageClass());
660b57cec5SDimitry Andric   setDSOLocal(Src->isDSOLocal());
670b57cec5SDimitry Andric   setPartition(Src->getPartition());
6881ad6265SDimitry Andric   if (Src->hasSanitizerMetadata())
6981ad6265SDimitry Andric     setSanitizerMetadata(Src->getSanitizerMetadata());
7081ad6265SDimitry Andric   else
7181ad6265SDimitry Andric     removeSanitizerMetadata();
720b57cec5SDimitry Andric }
730b57cec5SDimitry Andric 
740b57cec5SDimitry Andric void GlobalValue::removeFromParent() {
750b57cec5SDimitry Andric   switch (getValueID()) {
760b57cec5SDimitry Andric #define HANDLE_GLOBAL_VALUE(NAME)                                              \
770b57cec5SDimitry Andric   case Value::NAME##Val:                                                       \
780b57cec5SDimitry Andric     return static_cast<NAME *>(this)->removeFromParent();
790b57cec5SDimitry Andric #include "llvm/IR/Value.def"
800b57cec5SDimitry Andric   default:
810b57cec5SDimitry Andric     break;
820b57cec5SDimitry Andric   }
830b57cec5SDimitry Andric   llvm_unreachable("not a global");
840b57cec5SDimitry Andric }
850b57cec5SDimitry Andric 
860b57cec5SDimitry Andric void GlobalValue::eraseFromParent() {
870b57cec5SDimitry Andric   switch (getValueID()) {
880b57cec5SDimitry Andric #define HANDLE_GLOBAL_VALUE(NAME)                                              \
890b57cec5SDimitry Andric   case Value::NAME##Val:                                                       \
900b57cec5SDimitry Andric     return static_cast<NAME *>(this)->eraseFromParent();
910b57cec5SDimitry Andric #include "llvm/IR/Value.def"
920b57cec5SDimitry Andric   default:
930b57cec5SDimitry Andric     break;
940b57cec5SDimitry Andric   }
950b57cec5SDimitry Andric   llvm_unreachable("not a global");
960b57cec5SDimitry Andric }
970b57cec5SDimitry Andric 
9804eeddc0SDimitry Andric GlobalObject::~GlobalObject() { setComdat(nullptr); }
9904eeddc0SDimitry Andric 
1005ffd83dbSDimitry Andric bool GlobalValue::isInterposable() const {
1015ffd83dbSDimitry Andric   if (isInterposableLinkage(getLinkage()))
1025ffd83dbSDimitry Andric     return true;
1035ffd83dbSDimitry Andric   return getParent() && getParent()->getSemanticInterposition() &&
1045ffd83dbSDimitry Andric          !isDSOLocal();
1050b57cec5SDimitry Andric }
1065ffd83dbSDimitry Andric 
1075ffd83dbSDimitry Andric bool GlobalValue::canBenefitFromLocalAlias() const {
10804eeddc0SDimitry Andric   // See AsmPrinter::getSymbolPreferLocal(). For a deduplicate comdat kind,
10904eeddc0SDimitry Andric   // references to a discarded local symbol from outside the group are not
11004eeddc0SDimitry Andric   // allowed, so avoid the local alias.
11104eeddc0SDimitry Andric   auto isDeduplicateComdat = [](const Comdat *C) {
11204eeddc0SDimitry Andric     return C && C->getSelectionKind() != Comdat::NoDeduplicate;
11304eeddc0SDimitry Andric   };
1148833aad7SDimitry Andric   return hasDefaultVisibility() &&
1158833aad7SDimitry Andric          GlobalObject::isExternalLinkage(getLinkage()) && !isDeclaration() &&
11604eeddc0SDimitry Andric          !isa<GlobalIFunc>(this) && !isDeduplicateComdat(getComdat());
1170b57cec5SDimitry Andric }
1180b57cec5SDimitry Andric 
1198bcb0991SDimitry Andric void GlobalObject::setAlignment(MaybeAlign Align) {
1205ffd83dbSDimitry Andric   assert((!Align || *Align <= MaximumAlignment) &&
1210b57cec5SDimitry Andric          "Alignment is greater than MaximumAlignment!");
1228bcb0991SDimitry Andric   unsigned AlignmentData = encode(Align);
1230b57cec5SDimitry Andric   unsigned OldData = getGlobalValueSubClassData();
1240b57cec5SDimitry Andric   setGlobalValueSubClassData((OldData & ~AlignmentMask) | AlignmentData);
125bdd1243dSDimitry Andric   assert(getAlign() == Align && "Alignment representation error!");
1260b57cec5SDimitry Andric }
1270b57cec5SDimitry Andric 
12806c3fb27SDimitry Andric void GlobalObject::setAlignment(Align Align) {
12906c3fb27SDimitry Andric   assert(Align <= MaximumAlignment &&
13006c3fb27SDimitry Andric          "Alignment is greater than MaximumAlignment!");
13106c3fb27SDimitry Andric   unsigned AlignmentData = encode(Align);
13206c3fb27SDimitry Andric   unsigned OldData = getGlobalValueSubClassData();
13306c3fb27SDimitry Andric   setGlobalValueSubClassData((OldData & ~AlignmentMask) | AlignmentData);
13406c3fb27SDimitry Andric   assert(getAlign() && *getAlign() == Align &&
13506c3fb27SDimitry Andric          "Alignment representation error!");
13606c3fb27SDimitry Andric }
13706c3fb27SDimitry Andric 
1380b57cec5SDimitry Andric void GlobalObject::copyAttributesFrom(const GlobalObject *Src) {
1390b57cec5SDimitry Andric   GlobalValue::copyAttributesFrom(Src);
1400eae32dcSDimitry Andric   setAlignment(Src->getAlign());
1410b57cec5SDimitry Andric   setSection(Src->getSection());
1420b57cec5SDimitry Andric }
1430b57cec5SDimitry Andric 
1440b57cec5SDimitry Andric std::string GlobalValue::getGlobalIdentifier(StringRef Name,
1450b57cec5SDimitry Andric                                              GlobalValue::LinkageTypes Linkage,
1460b57cec5SDimitry Andric                                              StringRef FileName) {
1470b57cec5SDimitry Andric   // Value names may be prefixed with a binary '1' to indicate
1480b57cec5SDimitry Andric   // that the backend should not modify the symbols due to any platform
1490b57cec5SDimitry Andric   // naming convention. Do not include that '1' in the PGO profile name.
1500b57cec5SDimitry Andric   if (Name[0] == '\1')
1510b57cec5SDimitry Andric     Name = Name.substr(1);
1520b57cec5SDimitry Andric 
153*cb14a3feSDimitry Andric   std::string GlobalName;
1540b57cec5SDimitry Andric   if (llvm::GlobalValue::isLocalLinkage(Linkage)) {
1550b57cec5SDimitry Andric     // For local symbols, prepend the main file name to distinguish them.
1560b57cec5SDimitry Andric     // Do not include the full path in the file name since there's no guarantee
1570b57cec5SDimitry Andric     // that it will stay the same, e.g., if the files are checked out from
1580b57cec5SDimitry Andric     // version control in different locations.
1590b57cec5SDimitry Andric     if (FileName.empty())
160*cb14a3feSDimitry Andric       GlobalName += "<unknown>";
1610b57cec5SDimitry Andric     else
162*cb14a3feSDimitry Andric       GlobalName += FileName;
163*cb14a3feSDimitry Andric 
164*cb14a3feSDimitry Andric     GlobalName += kGlobalIdentifierDelimiter;
1650b57cec5SDimitry Andric   }
166*cb14a3feSDimitry Andric   GlobalName += Name;
167*cb14a3feSDimitry Andric   return GlobalName;
1680b57cec5SDimitry Andric }
1690b57cec5SDimitry Andric 
1700b57cec5SDimitry Andric std::string GlobalValue::getGlobalIdentifier() const {
1710b57cec5SDimitry Andric   return getGlobalIdentifier(getName(), getLinkage(),
1720b57cec5SDimitry Andric                              getParent()->getSourceFileName());
1730b57cec5SDimitry Andric }
1740b57cec5SDimitry Andric 
1750b57cec5SDimitry Andric StringRef GlobalValue::getSection() const {
1760b57cec5SDimitry Andric   if (auto *GA = dyn_cast<GlobalAlias>(this)) {
1770b57cec5SDimitry Andric     // In general we cannot compute this at the IR level, but we try.
178349cc55cSDimitry Andric     if (const GlobalObject *GO = GA->getAliaseeObject())
1790b57cec5SDimitry Andric       return GO->getSection();
1800b57cec5SDimitry Andric     return "";
1810b57cec5SDimitry Andric   }
1820b57cec5SDimitry Andric   return cast<GlobalObject>(this)->getSection();
1830b57cec5SDimitry Andric }
1840b57cec5SDimitry Andric 
1850b57cec5SDimitry Andric const Comdat *GlobalValue::getComdat() const {
1860b57cec5SDimitry Andric   if (auto *GA = dyn_cast<GlobalAlias>(this)) {
1870b57cec5SDimitry Andric     // In general we cannot compute this at the IR level, but we try.
188349cc55cSDimitry Andric     if (const GlobalObject *GO = GA->getAliaseeObject())
1890b57cec5SDimitry Andric       return const_cast<GlobalObject *>(GO)->getComdat();
1900b57cec5SDimitry Andric     return nullptr;
1910b57cec5SDimitry Andric   }
1920b57cec5SDimitry Andric   // ifunc and its resolver are separate things so don't use resolver comdat.
1930b57cec5SDimitry Andric   if (isa<GlobalIFunc>(this))
1940b57cec5SDimitry Andric     return nullptr;
1950b57cec5SDimitry Andric   return cast<GlobalObject>(this)->getComdat();
1960b57cec5SDimitry Andric }
1970b57cec5SDimitry Andric 
19804eeddc0SDimitry Andric void GlobalObject::setComdat(Comdat *C) {
19904eeddc0SDimitry Andric   if (ObjComdat)
20004eeddc0SDimitry Andric     ObjComdat->removeUser(this);
20104eeddc0SDimitry Andric   ObjComdat = C;
20204eeddc0SDimitry Andric   if (C)
20304eeddc0SDimitry Andric     C->addUser(this);
20404eeddc0SDimitry Andric }
20504eeddc0SDimitry Andric 
2060b57cec5SDimitry Andric StringRef GlobalValue::getPartition() const {
2070b57cec5SDimitry Andric   if (!hasPartition())
2080b57cec5SDimitry Andric     return "";
2090b57cec5SDimitry Andric   return getContext().pImpl->GlobalValuePartitions[this];
2100b57cec5SDimitry Andric }
2110b57cec5SDimitry Andric 
2120b57cec5SDimitry Andric void GlobalValue::setPartition(StringRef S) {
2130b57cec5SDimitry Andric   // Do nothing if we're clearing the partition and it is already empty.
2140b57cec5SDimitry Andric   if (!hasPartition() && S.empty())
2150b57cec5SDimitry Andric     return;
2160b57cec5SDimitry Andric 
2170b57cec5SDimitry Andric   // Get or create a stable partition name string and put it in the table in the
2180b57cec5SDimitry Andric   // context.
2190b57cec5SDimitry Andric   if (!S.empty())
2200b57cec5SDimitry Andric     S = getContext().pImpl->Saver.save(S);
2210b57cec5SDimitry Andric   getContext().pImpl->GlobalValuePartitions[this] = S;
2220b57cec5SDimitry Andric 
2230b57cec5SDimitry Andric   // Update the HasPartition field. Setting the partition to the empty string
2240b57cec5SDimitry Andric   // means this global no longer has a partition.
2250b57cec5SDimitry Andric   HasPartition = !S.empty();
2260b57cec5SDimitry Andric }
2270b57cec5SDimitry Andric 
22881ad6265SDimitry Andric using SanitizerMetadata = GlobalValue::SanitizerMetadata;
22981ad6265SDimitry Andric const SanitizerMetadata &GlobalValue::getSanitizerMetadata() const {
23081ad6265SDimitry Andric   assert(hasSanitizerMetadata());
23181ad6265SDimitry Andric   assert(getContext().pImpl->GlobalValueSanitizerMetadata.count(this));
23281ad6265SDimitry Andric   return getContext().pImpl->GlobalValueSanitizerMetadata[this];
23381ad6265SDimitry Andric }
23481ad6265SDimitry Andric 
23581ad6265SDimitry Andric void GlobalValue::setSanitizerMetadata(SanitizerMetadata Meta) {
23681ad6265SDimitry Andric   getContext().pImpl->GlobalValueSanitizerMetadata[this] = Meta;
23781ad6265SDimitry Andric   HasSanitizerMetadata = true;
23881ad6265SDimitry Andric }
23981ad6265SDimitry Andric 
24081ad6265SDimitry Andric void GlobalValue::removeSanitizerMetadata() {
24181ad6265SDimitry Andric   DenseMap<const GlobalValue *, SanitizerMetadata> &MetadataMap =
24281ad6265SDimitry Andric       getContext().pImpl->GlobalValueSanitizerMetadata;
24381ad6265SDimitry Andric   MetadataMap.erase(this);
24481ad6265SDimitry Andric   HasSanitizerMetadata = false;
24581ad6265SDimitry Andric }
24681ad6265SDimitry Andric 
2470b57cec5SDimitry Andric StringRef GlobalObject::getSectionImpl() const {
2480b57cec5SDimitry Andric   assert(hasSection());
2490b57cec5SDimitry Andric   return getContext().pImpl->GlobalObjectSections[this];
2500b57cec5SDimitry Andric }
2510b57cec5SDimitry Andric 
2520b57cec5SDimitry Andric void GlobalObject::setSection(StringRef S) {
2530b57cec5SDimitry Andric   // Do nothing if we're clearing the section and it is already empty.
2540b57cec5SDimitry Andric   if (!hasSection() && S.empty())
2550b57cec5SDimitry Andric     return;
2560b57cec5SDimitry Andric 
2570b57cec5SDimitry Andric   // Get or create a stable section name string and put it in the table in the
2580b57cec5SDimitry Andric   // context.
2590b57cec5SDimitry Andric   if (!S.empty())
2600b57cec5SDimitry Andric     S = getContext().pImpl->Saver.save(S);
2610b57cec5SDimitry Andric   getContext().pImpl->GlobalObjectSections[this] = S;
2620b57cec5SDimitry Andric 
2630b57cec5SDimitry Andric   // Update the HasSectionHashEntryBit. Setting the section to the empty string
2640b57cec5SDimitry Andric   // means this global no longer has a section.
2650b57cec5SDimitry Andric   setGlobalObjectFlag(HasSectionHashEntryBit, !S.empty());
2660b57cec5SDimitry Andric }
2670b57cec5SDimitry Andric 
268bdd1243dSDimitry Andric bool GlobalValue::isNobuiltinFnDef() const {
269bdd1243dSDimitry Andric   const Function *F = dyn_cast<Function>(this);
270bdd1243dSDimitry Andric   if (!F || F->empty())
271bdd1243dSDimitry Andric     return false;
272bdd1243dSDimitry Andric   return F->hasFnAttribute(Attribute::NoBuiltin);
273bdd1243dSDimitry Andric }
274bdd1243dSDimitry Andric 
2750b57cec5SDimitry Andric bool GlobalValue::isDeclaration() const {
2760b57cec5SDimitry Andric   // Globals are definitions if they have an initializer.
2770b57cec5SDimitry Andric   if (const GlobalVariable *GV = dyn_cast<GlobalVariable>(this))
2780b57cec5SDimitry Andric     return GV->getNumOperands() == 0;
2790b57cec5SDimitry Andric 
2800b57cec5SDimitry Andric   // Functions are definitions if they have a body.
2810b57cec5SDimitry Andric   if (const Function *F = dyn_cast<Function>(this))
2820b57cec5SDimitry Andric     return F->empty() && !F->isMaterializable();
2830b57cec5SDimitry Andric 
2840b57cec5SDimitry Andric   // Aliases and ifuncs are always definitions.
285349cc55cSDimitry Andric   assert(isa<GlobalAlias>(this) || isa<GlobalIFunc>(this));
2860b57cec5SDimitry Andric   return false;
2870b57cec5SDimitry Andric }
2880b57cec5SDimitry Andric 
2895ffd83dbSDimitry Andric bool GlobalObject::canIncreaseAlignment() const {
2900b57cec5SDimitry Andric   // Firstly, can only increase the alignment of a global if it
2910b57cec5SDimitry Andric   // is a strong definition.
2920b57cec5SDimitry Andric   if (!isStrongDefinitionForLinker())
2930b57cec5SDimitry Andric     return false;
2940b57cec5SDimitry Andric 
2950b57cec5SDimitry Andric   // It also has to either not have a section defined, or, not have
2960b57cec5SDimitry Andric   // alignment specified. (If it is assigned a section, the global
2970b57cec5SDimitry Andric   // could be densely packed with other objects in the section, and
2980b57cec5SDimitry Andric   // increasing the alignment could cause padding issues.)
29981ad6265SDimitry Andric   if (hasSection() && getAlign())
3000b57cec5SDimitry Andric     return false;
3010b57cec5SDimitry Andric 
3020b57cec5SDimitry Andric   // On ELF platforms, we're further restricted in that we can't
3030b57cec5SDimitry Andric   // increase the alignment of any variable which might be emitted
3040b57cec5SDimitry Andric   // into a shared library, and which is exported. If the main
3050b57cec5SDimitry Andric   // executable accesses a variable found in a shared-lib, the main
3060b57cec5SDimitry Andric   // exe actually allocates memory for and exports the symbol ITSELF,
3070b57cec5SDimitry Andric   // overriding the symbol found in the library. That is, at link
3080b57cec5SDimitry Andric   // time, the observed alignment of the variable is copied into the
3090b57cec5SDimitry Andric   // executable binary. (A COPY relocation is also generated, to copy
3100b57cec5SDimitry Andric   // the initial data from the shadowed variable in the shared-lib
3110b57cec5SDimitry Andric   // into the location in the main binary, before running code.)
3120b57cec5SDimitry Andric   //
3130b57cec5SDimitry Andric   // And thus, even though you might think you are defining the
3140b57cec5SDimitry Andric   // global, and allocating the memory for the global in your object
3150b57cec5SDimitry Andric   // file, and thus should be able to set the alignment arbitrarily,
3160b57cec5SDimitry Andric   // that's not actually true. Doing so can cause an ABI breakage; an
3170b57cec5SDimitry Andric   // executable might have already been built with the previous
3180b57cec5SDimitry Andric   // alignment of the variable, and then assuming an increased
3190b57cec5SDimitry Andric   // alignment will be incorrect.
3200b57cec5SDimitry Andric 
3210b57cec5SDimitry Andric   // Conservatively assume ELF if there's no parent pointer.
3220b57cec5SDimitry Andric   bool isELF =
3230b57cec5SDimitry Andric       (!Parent || Triple(Parent->getTargetTriple()).isOSBinFormatELF());
3240b57cec5SDimitry Andric   if (isELF && !isDSOLocal())
3250b57cec5SDimitry Andric     return false;
3260b57cec5SDimitry Andric 
3270b57cec5SDimitry Andric   return true;
3280b57cec5SDimitry Andric }
3290b57cec5SDimitry Andric 
330fcaf7f86SDimitry Andric template <typename Operation>
331349cc55cSDimitry Andric static const GlobalObject *
332fcaf7f86SDimitry Andric findBaseObject(const Constant *C, DenseSet<const GlobalAlias *> &Aliases,
333fcaf7f86SDimitry Andric                const Operation &Op) {
334fcaf7f86SDimitry Andric   if (auto *GO = dyn_cast<GlobalObject>(C)) {
335fcaf7f86SDimitry Andric     Op(*GO);
3360b57cec5SDimitry Andric     return GO;
337fcaf7f86SDimitry Andric   }
338fcaf7f86SDimitry Andric   if (auto *GA = dyn_cast<GlobalAlias>(C)) {
339fcaf7f86SDimitry Andric     Op(*GA);
340349cc55cSDimitry Andric     if (Aliases.insert(GA).second)
341fcaf7f86SDimitry Andric       return findBaseObject(GA->getOperand(0), Aliases, Op);
342fcaf7f86SDimitry Andric   }
343349cc55cSDimitry Andric   if (auto *CE = dyn_cast<ConstantExpr>(C)) {
344349cc55cSDimitry Andric     switch (CE->getOpcode()) {
345349cc55cSDimitry Andric     case Instruction::Add: {
346fcaf7f86SDimitry Andric       auto *LHS = findBaseObject(CE->getOperand(0), Aliases, Op);
347fcaf7f86SDimitry Andric       auto *RHS = findBaseObject(CE->getOperand(1), Aliases, Op);
348349cc55cSDimitry Andric       if (LHS && RHS)
3490b57cec5SDimitry Andric         return nullptr;
350349cc55cSDimitry Andric       return LHS ? LHS : RHS;
351349cc55cSDimitry Andric     }
352349cc55cSDimitry Andric     case Instruction::Sub: {
353fcaf7f86SDimitry Andric       if (findBaseObject(CE->getOperand(1), Aliases, Op))
354349cc55cSDimitry Andric         return nullptr;
355fcaf7f86SDimitry Andric       return findBaseObject(CE->getOperand(0), Aliases, Op);
356349cc55cSDimitry Andric     }
357349cc55cSDimitry Andric     case Instruction::IntToPtr:
358349cc55cSDimitry Andric     case Instruction::PtrToInt:
359349cc55cSDimitry Andric     case Instruction::BitCast:
360349cc55cSDimitry Andric     case Instruction::GetElementPtr:
361fcaf7f86SDimitry Andric       return findBaseObject(CE->getOperand(0), Aliases, Op);
362349cc55cSDimitry Andric     default:
363349cc55cSDimitry Andric       break;
364349cc55cSDimitry Andric     }
365349cc55cSDimitry Andric   }
366349cc55cSDimitry Andric   return nullptr;
367349cc55cSDimitry Andric }
368349cc55cSDimitry Andric 
369349cc55cSDimitry Andric const GlobalObject *GlobalValue::getAliaseeObject() const {
370349cc55cSDimitry Andric   DenseSet<const GlobalAlias *> Aliases;
371fcaf7f86SDimitry Andric   return findBaseObject(this, Aliases, [](const GlobalValue &) {});
3720b57cec5SDimitry Andric }
3730b57cec5SDimitry Andric 
3740b57cec5SDimitry Andric bool GlobalValue::isAbsoluteSymbolRef() const {
3750b57cec5SDimitry Andric   auto *GO = dyn_cast<GlobalObject>(this);
3760b57cec5SDimitry Andric   if (!GO)
3770b57cec5SDimitry Andric     return false;
3780b57cec5SDimitry Andric 
3790b57cec5SDimitry Andric   return GO->getMetadata(LLVMContext::MD_absolute_symbol);
3800b57cec5SDimitry Andric }
3810b57cec5SDimitry Andric 
382bdd1243dSDimitry Andric std::optional<ConstantRange> GlobalValue::getAbsoluteSymbolRange() const {
3830b57cec5SDimitry Andric   auto *GO = dyn_cast<GlobalObject>(this);
3840b57cec5SDimitry Andric   if (!GO)
385bdd1243dSDimitry Andric     return std::nullopt;
3860b57cec5SDimitry Andric 
3870b57cec5SDimitry Andric   MDNode *MD = GO->getMetadata(LLVMContext::MD_absolute_symbol);
3880b57cec5SDimitry Andric   if (!MD)
389bdd1243dSDimitry Andric     return std::nullopt;
3900b57cec5SDimitry Andric 
3910b57cec5SDimitry Andric   return getConstantRangeFromMetadata(*MD);
3920b57cec5SDimitry Andric }
3930b57cec5SDimitry Andric 
3940b57cec5SDimitry Andric bool GlobalValue::canBeOmittedFromSymbolTable() const {
3950b57cec5SDimitry Andric   if (!hasLinkOnceODRLinkage())
3960b57cec5SDimitry Andric     return false;
3970b57cec5SDimitry Andric 
3980b57cec5SDimitry Andric   // We assume that anyone who sets global unnamed_addr on a non-constant
3990b57cec5SDimitry Andric   // knows what they're doing.
4000b57cec5SDimitry Andric   if (hasGlobalUnnamedAddr())
4010b57cec5SDimitry Andric     return true;
4020b57cec5SDimitry Andric 
4030b57cec5SDimitry Andric   // If it is a non constant variable, it needs to be uniqued across shared
4040b57cec5SDimitry Andric   // objects.
4050b57cec5SDimitry Andric   if (auto *Var = dyn_cast<GlobalVariable>(this))
4060b57cec5SDimitry Andric     if (!Var->isConstant())
4070b57cec5SDimitry Andric       return false;
4080b57cec5SDimitry Andric 
4090b57cec5SDimitry Andric   return hasAtLeastLocalUnnamedAddr();
4100b57cec5SDimitry Andric }
4110b57cec5SDimitry Andric 
4120b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
4130b57cec5SDimitry Andric // GlobalVariable Implementation
4140b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
4150b57cec5SDimitry Andric 
4160b57cec5SDimitry Andric GlobalVariable::GlobalVariable(Type *Ty, bool constant, LinkageTypes Link,
4170b57cec5SDimitry Andric                                Constant *InitVal, const Twine &Name,
4180b57cec5SDimitry Andric                                ThreadLocalMode TLMode, unsigned AddressSpace,
4190b57cec5SDimitry Andric                                bool isExternallyInitialized)
4200b57cec5SDimitry Andric     : GlobalObject(Ty, Value::GlobalVariableVal,
4210b57cec5SDimitry Andric                    OperandTraits<GlobalVariable>::op_begin(this),
4220b57cec5SDimitry Andric                    InitVal != nullptr, Link, Name, AddressSpace),
4230b57cec5SDimitry Andric       isConstantGlobal(constant),
4240b57cec5SDimitry Andric       isExternallyInitializedConstant(isExternallyInitialized) {
4250b57cec5SDimitry Andric   assert(!Ty->isFunctionTy() && PointerType::isValidElementType(Ty) &&
4260b57cec5SDimitry Andric          "invalid type for global variable");
4270b57cec5SDimitry Andric   setThreadLocalMode(TLMode);
4280b57cec5SDimitry Andric   if (InitVal) {
4290b57cec5SDimitry Andric     assert(InitVal->getType() == Ty &&
4300b57cec5SDimitry Andric            "Initializer should be the same type as the GlobalVariable!");
4310b57cec5SDimitry Andric     Op<0>() = InitVal;
4320b57cec5SDimitry Andric   }
4330b57cec5SDimitry Andric }
4340b57cec5SDimitry Andric 
4350b57cec5SDimitry Andric GlobalVariable::GlobalVariable(Module &M, Type *Ty, bool constant,
4360b57cec5SDimitry Andric                                LinkageTypes Link, Constant *InitVal,
4370b57cec5SDimitry Andric                                const Twine &Name, GlobalVariable *Before,
438e8d8bef9SDimitry Andric                                ThreadLocalMode TLMode,
439bdd1243dSDimitry Andric                                std::optional<unsigned> AddressSpace,
4400b57cec5SDimitry Andric                                bool isExternallyInitialized)
44106c3fb27SDimitry Andric     : GlobalVariable(Ty, constant, Link, InitVal, Name, TLMode,
442e8d8bef9SDimitry Andric                      AddressSpace
443e8d8bef9SDimitry Andric                          ? *AddressSpace
44406c3fb27SDimitry Andric                          : M.getDataLayout().getDefaultGlobalsAddressSpace(),
44506c3fb27SDimitry Andric                      isExternallyInitialized) {
4460b57cec5SDimitry Andric   if (Before)
44706c3fb27SDimitry Andric     Before->getParent()->insertGlobalVariable(Before->getIterator(), this);
4480b57cec5SDimitry Andric   else
44906c3fb27SDimitry Andric     M.insertGlobalVariable(this);
4500b57cec5SDimitry Andric }
4510b57cec5SDimitry Andric 
4520b57cec5SDimitry Andric void GlobalVariable::removeFromParent() {
45306c3fb27SDimitry Andric   getParent()->removeGlobalVariable(this);
4540b57cec5SDimitry Andric }
4550b57cec5SDimitry Andric 
4560b57cec5SDimitry Andric void GlobalVariable::eraseFromParent() {
45706c3fb27SDimitry Andric   getParent()->eraseGlobalVariable(this);
4580b57cec5SDimitry Andric }
4590b57cec5SDimitry Andric 
4600b57cec5SDimitry Andric void GlobalVariable::setInitializer(Constant *InitVal) {
4610b57cec5SDimitry Andric   if (!InitVal) {
4620b57cec5SDimitry Andric     if (hasInitializer()) {
4630b57cec5SDimitry Andric       // Note, the num operands is used to compute the offset of the operand, so
4640b57cec5SDimitry Andric       // the order here matters.  Clearing the operand then clearing the num
4650b57cec5SDimitry Andric       // operands ensures we have the correct offset to the operand.
4660b57cec5SDimitry Andric       Op<0>().set(nullptr);
4670b57cec5SDimitry Andric       setGlobalVariableNumOperands(0);
4680b57cec5SDimitry Andric     }
4690b57cec5SDimitry Andric   } else {
4700b57cec5SDimitry Andric     assert(InitVal->getType() == getValueType() &&
4710b57cec5SDimitry Andric            "Initializer type must match GlobalVariable type");
4720b57cec5SDimitry Andric     // Note, the num operands is used to compute the offset of the operand, so
4730b57cec5SDimitry Andric     // the order here matters.  We need to set num operands to 1 first so that
4740b57cec5SDimitry Andric     // we get the correct offset to the first operand when we set it.
4750b57cec5SDimitry Andric     if (!hasInitializer())
4760b57cec5SDimitry Andric       setGlobalVariableNumOperands(1);
4770b57cec5SDimitry Andric     Op<0>().set(InitVal);
4780b57cec5SDimitry Andric   }
4790b57cec5SDimitry Andric }
4800b57cec5SDimitry Andric 
4810b57cec5SDimitry Andric /// Copy all additional attributes (those not needed to create a GlobalVariable)
4820b57cec5SDimitry Andric /// from the GlobalVariable Src to this one.
4830b57cec5SDimitry Andric void GlobalVariable::copyAttributesFrom(const GlobalVariable *Src) {
4840b57cec5SDimitry Andric   GlobalObject::copyAttributesFrom(Src);
4850b57cec5SDimitry Andric   setExternallyInitialized(Src->isExternallyInitialized());
4860b57cec5SDimitry Andric   setAttributes(Src->getAttributes());
4875f757f3fSDimitry Andric   if (auto CM = Src->getCodeModel())
4885f757f3fSDimitry Andric     setCodeModel(*CM);
4890b57cec5SDimitry Andric }
4900b57cec5SDimitry Andric 
4910b57cec5SDimitry Andric void GlobalVariable::dropAllReferences() {
4920b57cec5SDimitry Andric   User::dropAllReferences();
4930b57cec5SDimitry Andric   clearMetadata();
4940b57cec5SDimitry Andric }
4950b57cec5SDimitry Andric 
4965f757f3fSDimitry Andric void GlobalVariable::setCodeModel(CodeModel::Model CM) {
4975f757f3fSDimitry Andric   unsigned CodeModelData = static_cast<unsigned>(CM) + 1;
4985f757f3fSDimitry Andric   unsigned OldData = getGlobalValueSubClassData();
4995f757f3fSDimitry Andric   unsigned NewData = (OldData & ~(CodeModelMask << CodeModelShift)) |
5005f757f3fSDimitry Andric                      (CodeModelData << CodeModelShift);
5015f757f3fSDimitry Andric   setGlobalValueSubClassData(NewData);
5025f757f3fSDimitry Andric   assert(getCodeModel() == CM && "Code model representation error!");
5035f757f3fSDimitry Andric }
5045f757f3fSDimitry Andric 
5050b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
5060b57cec5SDimitry Andric // GlobalAlias Implementation
5070b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
5080b57cec5SDimitry Andric 
5090b57cec5SDimitry Andric GlobalAlias::GlobalAlias(Type *Ty, unsigned AddressSpace, LinkageTypes Link,
5100b57cec5SDimitry Andric                          const Twine &Name, Constant *Aliasee,
5110b57cec5SDimitry Andric                          Module *ParentModule)
512349cc55cSDimitry Andric     : GlobalValue(Ty, Value::GlobalAliasVal, &Op<0>(), 1, Link, Name,
513349cc55cSDimitry Andric                   AddressSpace) {
514349cc55cSDimitry Andric   setAliasee(Aliasee);
5150b57cec5SDimitry Andric   if (ParentModule)
51606c3fb27SDimitry Andric     ParentModule->insertAlias(this);
5170b57cec5SDimitry Andric }
5180b57cec5SDimitry Andric 
5190b57cec5SDimitry Andric GlobalAlias *GlobalAlias::create(Type *Ty, unsigned AddressSpace,
5200b57cec5SDimitry Andric                                  LinkageTypes Link, const Twine &Name,
5210b57cec5SDimitry Andric                                  Constant *Aliasee, Module *ParentModule) {
5220b57cec5SDimitry Andric   return new GlobalAlias(Ty, AddressSpace, Link, Name, Aliasee, ParentModule);
5230b57cec5SDimitry Andric }
5240b57cec5SDimitry Andric 
5250b57cec5SDimitry Andric GlobalAlias *GlobalAlias::create(Type *Ty, unsigned AddressSpace,
5260b57cec5SDimitry Andric                                  LinkageTypes Linkage, const Twine &Name,
5270b57cec5SDimitry Andric                                  Module *Parent) {
5280b57cec5SDimitry Andric   return create(Ty, AddressSpace, Linkage, Name, nullptr, Parent);
5290b57cec5SDimitry Andric }
5300b57cec5SDimitry Andric 
5310b57cec5SDimitry Andric GlobalAlias *GlobalAlias::create(Type *Ty, unsigned AddressSpace,
5320b57cec5SDimitry Andric                                  LinkageTypes Linkage, const Twine &Name,
5330b57cec5SDimitry Andric                                  GlobalValue *Aliasee) {
5340b57cec5SDimitry Andric   return create(Ty, AddressSpace, Linkage, Name, Aliasee, Aliasee->getParent());
5350b57cec5SDimitry Andric }
5360b57cec5SDimitry Andric 
5370b57cec5SDimitry Andric GlobalAlias *GlobalAlias::create(LinkageTypes Link, const Twine &Name,
5380b57cec5SDimitry Andric                                  GlobalValue *Aliasee) {
539fe6060f1SDimitry Andric   return create(Aliasee->getValueType(), Aliasee->getAddressSpace(), Link, Name,
5400b57cec5SDimitry Andric                 Aliasee);
5410b57cec5SDimitry Andric }
5420b57cec5SDimitry Andric 
5430b57cec5SDimitry Andric GlobalAlias *GlobalAlias::create(const Twine &Name, GlobalValue *Aliasee) {
5440b57cec5SDimitry Andric   return create(Aliasee->getLinkage(), Name, Aliasee);
5450b57cec5SDimitry Andric }
5460b57cec5SDimitry Andric 
54706c3fb27SDimitry Andric void GlobalAlias::removeFromParent() { getParent()->removeAlias(this); }
5480b57cec5SDimitry Andric 
54906c3fb27SDimitry Andric void GlobalAlias::eraseFromParent() { getParent()->eraseAlias(this); }
5500b57cec5SDimitry Andric 
5510b57cec5SDimitry Andric void GlobalAlias::setAliasee(Constant *Aliasee) {
5520b57cec5SDimitry Andric   assert((!Aliasee || Aliasee->getType() == getType()) &&
5530b57cec5SDimitry Andric          "Alias and aliasee types should match!");
554349cc55cSDimitry Andric   Op<0>().set(Aliasee);
555349cc55cSDimitry Andric }
556349cc55cSDimitry Andric 
557349cc55cSDimitry Andric const GlobalObject *GlobalAlias::getAliaseeObject() const {
558349cc55cSDimitry Andric   DenseSet<const GlobalAlias *> Aliases;
559fcaf7f86SDimitry Andric   return findBaseObject(getOperand(0), Aliases, [](const GlobalValue &) {});
5600b57cec5SDimitry Andric }
5610b57cec5SDimitry Andric 
5620b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
5630b57cec5SDimitry Andric // GlobalIFunc Implementation
5640b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
5650b57cec5SDimitry Andric 
5660b57cec5SDimitry Andric GlobalIFunc::GlobalIFunc(Type *Ty, unsigned AddressSpace, LinkageTypes Link,
5670b57cec5SDimitry Andric                          const Twine &Name, Constant *Resolver,
5680b57cec5SDimitry Andric                          Module *ParentModule)
569349cc55cSDimitry Andric     : GlobalObject(Ty, Value::GlobalIFuncVal, &Op<0>(), 1, Link, Name,
570349cc55cSDimitry Andric                    AddressSpace) {
571349cc55cSDimitry Andric   setResolver(Resolver);
5720b57cec5SDimitry Andric   if (ParentModule)
57306c3fb27SDimitry Andric     ParentModule->insertIFunc(this);
5740b57cec5SDimitry Andric }
5750b57cec5SDimitry Andric 
5760b57cec5SDimitry Andric GlobalIFunc *GlobalIFunc::create(Type *Ty, unsigned AddressSpace,
5770b57cec5SDimitry Andric                                  LinkageTypes Link, const Twine &Name,
5780b57cec5SDimitry Andric                                  Constant *Resolver, Module *ParentModule) {
5790b57cec5SDimitry Andric   return new GlobalIFunc(Ty, AddressSpace, Link, Name, Resolver, ParentModule);
5800b57cec5SDimitry Andric }
5810b57cec5SDimitry Andric 
58206c3fb27SDimitry Andric void GlobalIFunc::removeFromParent() { getParent()->removeIFunc(this); }
5830b57cec5SDimitry Andric 
58406c3fb27SDimitry Andric void GlobalIFunc::eraseFromParent() { getParent()->eraseIFunc(this); }
585349cc55cSDimitry Andric 
586349cc55cSDimitry Andric const Function *GlobalIFunc::getResolverFunction() const {
587bdd1243dSDimitry Andric   return dyn_cast<Function>(getResolver()->stripPointerCastsAndAliases());
588fcaf7f86SDimitry Andric }
589fcaf7f86SDimitry Andric 
590fcaf7f86SDimitry Andric void GlobalIFunc::applyAlongResolverPath(
591fcaf7f86SDimitry Andric     function_ref<void(const GlobalValue &)> Op) const {
592fcaf7f86SDimitry Andric   DenseSet<const GlobalAlias *> Aliases;
593fcaf7f86SDimitry Andric   findBaseObject(getResolver(), Aliases, Op);
594349cc55cSDimitry Andric }
595