1 //===-- Globals.cpp - Implement the GlobalValue & GlobalVariable class ----===// 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 implements the GlobalValue & GlobalVariable classes for the IR 10 // library. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "LLVMContextImpl.h" 15 #include "llvm/IR/ConstantRange.h" 16 #include "llvm/IR/Constants.h" 17 #include "llvm/IR/DerivedTypes.h" 18 #include "llvm/IR/GlobalAlias.h" 19 #include "llvm/IR/GlobalValue.h" 20 #include "llvm/IR/GlobalVariable.h" 21 #include "llvm/IR/Module.h" 22 #include "llvm/Support/Error.h" 23 #include "llvm/Support/ErrorHandling.h" 24 #include "llvm/TargetParser/Triple.h" 25 using namespace llvm; 26 27 //===----------------------------------------------------------------------===// 28 // GlobalValue Class 29 //===----------------------------------------------------------------------===// 30 31 // GlobalValue should be a Constant, plus a type, a module, some flags, and an 32 // intrinsic ID. Add an assert to prevent people from accidentally growing 33 // GlobalValue while adding flags. 34 static_assert(sizeof(GlobalValue) == 35 sizeof(Constant) + 2 * sizeof(void *) + 2 * sizeof(unsigned), 36 "unexpected GlobalValue size growth"); 37 38 // GlobalObject adds a comdat. 39 static_assert(sizeof(GlobalObject) == sizeof(GlobalValue) + sizeof(void *), 40 "unexpected GlobalObject size growth"); 41 42 bool GlobalValue::isMaterializable() const { 43 if (const Function *F = dyn_cast<Function>(this)) 44 return F->isMaterializable(); 45 return false; 46 } 47 Error GlobalValue::materialize() { return getParent()->materialize(this); } 48 49 /// Override destroyConstantImpl to make sure it doesn't get called on 50 /// GlobalValue's because they shouldn't be treated like other constants. 51 void GlobalValue::destroyConstantImpl() { 52 llvm_unreachable("You can't GV->destroyConstantImpl()!"); 53 } 54 55 Value *GlobalValue::handleOperandChangeImpl(Value *From, Value *To) { 56 llvm_unreachable("Unsupported class for handleOperandChange()!"); 57 } 58 59 /// copyAttributesFrom - copy all additional attributes (those not needed to 60 /// create a GlobalValue) from the GlobalValue Src to this one. 61 void GlobalValue::copyAttributesFrom(const GlobalValue *Src) { 62 setVisibility(Src->getVisibility()); 63 setUnnamedAddr(Src->getUnnamedAddr()); 64 setThreadLocalMode(Src->getThreadLocalMode()); 65 setDLLStorageClass(Src->getDLLStorageClass()); 66 setDSOLocal(Src->isDSOLocal()); 67 setPartition(Src->getPartition()); 68 if (Src->hasSanitizerMetadata()) 69 setSanitizerMetadata(Src->getSanitizerMetadata()); 70 else 71 removeSanitizerMetadata(); 72 } 73 74 void GlobalValue::removeFromParent() { 75 switch (getValueID()) { 76 #define HANDLE_GLOBAL_VALUE(NAME) \ 77 case Value::NAME##Val: \ 78 return static_cast<NAME *>(this)->removeFromParent(); 79 #include "llvm/IR/Value.def" 80 default: 81 break; 82 } 83 llvm_unreachable("not a global"); 84 } 85 86 void GlobalValue::eraseFromParent() { 87 switch (getValueID()) { 88 #define HANDLE_GLOBAL_VALUE(NAME) \ 89 case Value::NAME##Val: \ 90 return static_cast<NAME *>(this)->eraseFromParent(); 91 #include "llvm/IR/Value.def" 92 default: 93 break; 94 } 95 llvm_unreachable("not a global"); 96 } 97 98 GlobalObject::~GlobalObject() { setComdat(nullptr); } 99 100 bool GlobalValue::isInterposable() const { 101 if (isInterposableLinkage(getLinkage())) 102 return true; 103 return getParent() && getParent()->getSemanticInterposition() && 104 !isDSOLocal(); 105 } 106 107 bool GlobalValue::canBenefitFromLocalAlias() const { 108 // See AsmPrinter::getSymbolPreferLocal(). For a deduplicate comdat kind, 109 // references to a discarded local symbol from outside the group are not 110 // allowed, so avoid the local alias. 111 auto isDeduplicateComdat = [](const Comdat *C) { 112 return C && C->getSelectionKind() != Comdat::NoDeduplicate; 113 }; 114 return hasDefaultVisibility() && 115 GlobalObject::isExternalLinkage(getLinkage()) && !isDeclaration() && 116 !isa<GlobalIFunc>(this) && !isDeduplicateComdat(getComdat()); 117 } 118 119 void GlobalObject::setAlignment(MaybeAlign Align) { 120 assert((!Align || *Align <= MaximumAlignment) && 121 "Alignment is greater than MaximumAlignment!"); 122 unsigned AlignmentData = encode(Align); 123 unsigned OldData = getGlobalValueSubClassData(); 124 setGlobalValueSubClassData((OldData & ~AlignmentMask) | AlignmentData); 125 assert(getAlign() == Align && "Alignment representation error!"); 126 } 127 128 void GlobalObject::setAlignment(Align Align) { 129 assert(Align <= MaximumAlignment && 130 "Alignment is greater than MaximumAlignment!"); 131 unsigned AlignmentData = encode(Align); 132 unsigned OldData = getGlobalValueSubClassData(); 133 setGlobalValueSubClassData((OldData & ~AlignmentMask) | AlignmentData); 134 assert(getAlign() && *getAlign() == Align && 135 "Alignment representation error!"); 136 } 137 138 void GlobalObject::copyAttributesFrom(const GlobalObject *Src) { 139 GlobalValue::copyAttributesFrom(Src); 140 setAlignment(Src->getAlign()); 141 setSection(Src->getSection()); 142 } 143 144 std::string GlobalValue::getGlobalIdentifier(StringRef Name, 145 GlobalValue::LinkageTypes Linkage, 146 StringRef FileName) { 147 148 // Value names may be prefixed with a binary '1' to indicate 149 // that the backend should not modify the symbols due to any platform 150 // naming convention. Do not include that '1' in the PGO profile name. 151 if (Name[0] == '\1') 152 Name = Name.substr(1); 153 154 std::string NewName = std::string(Name); 155 if (llvm::GlobalValue::isLocalLinkage(Linkage)) { 156 // For local symbols, prepend the main file name to distinguish them. 157 // Do not include the full path in the file name since there's no guarantee 158 // that it will stay the same, e.g., if the files are checked out from 159 // version control in different locations. 160 if (FileName.empty()) 161 NewName = NewName.insert(0, "<unknown>:"); 162 else 163 NewName = NewName.insert(0, FileName.str() + ":"); 164 } 165 return NewName; 166 } 167 168 std::string GlobalValue::getGlobalIdentifier() const { 169 return getGlobalIdentifier(getName(), getLinkage(), 170 getParent()->getSourceFileName()); 171 } 172 173 StringRef GlobalValue::getSection() const { 174 if (auto *GA = dyn_cast<GlobalAlias>(this)) { 175 // In general we cannot compute this at the IR level, but we try. 176 if (const GlobalObject *GO = GA->getAliaseeObject()) 177 return GO->getSection(); 178 return ""; 179 } 180 return cast<GlobalObject>(this)->getSection(); 181 } 182 183 const Comdat *GlobalValue::getComdat() const { 184 if (auto *GA = dyn_cast<GlobalAlias>(this)) { 185 // In general we cannot compute this at the IR level, but we try. 186 if (const GlobalObject *GO = GA->getAliaseeObject()) 187 return const_cast<GlobalObject *>(GO)->getComdat(); 188 return nullptr; 189 } 190 // ifunc and its resolver are separate things so don't use resolver comdat. 191 if (isa<GlobalIFunc>(this)) 192 return nullptr; 193 return cast<GlobalObject>(this)->getComdat(); 194 } 195 196 void GlobalObject::setComdat(Comdat *C) { 197 if (ObjComdat) 198 ObjComdat->removeUser(this); 199 ObjComdat = C; 200 if (C) 201 C->addUser(this); 202 } 203 204 StringRef GlobalValue::getPartition() const { 205 if (!hasPartition()) 206 return ""; 207 return getContext().pImpl->GlobalValuePartitions[this]; 208 } 209 210 void GlobalValue::setPartition(StringRef S) { 211 // Do nothing if we're clearing the partition and it is already empty. 212 if (!hasPartition() && S.empty()) 213 return; 214 215 // Get or create a stable partition name string and put it in the table in the 216 // context. 217 if (!S.empty()) 218 S = getContext().pImpl->Saver.save(S); 219 getContext().pImpl->GlobalValuePartitions[this] = S; 220 221 // Update the HasPartition field. Setting the partition to the empty string 222 // means this global no longer has a partition. 223 HasPartition = !S.empty(); 224 } 225 226 using SanitizerMetadata = GlobalValue::SanitizerMetadata; 227 const SanitizerMetadata &GlobalValue::getSanitizerMetadata() const { 228 assert(hasSanitizerMetadata()); 229 assert(getContext().pImpl->GlobalValueSanitizerMetadata.count(this)); 230 return getContext().pImpl->GlobalValueSanitizerMetadata[this]; 231 } 232 233 void GlobalValue::setSanitizerMetadata(SanitizerMetadata Meta) { 234 getContext().pImpl->GlobalValueSanitizerMetadata[this] = Meta; 235 HasSanitizerMetadata = true; 236 } 237 238 void GlobalValue::removeSanitizerMetadata() { 239 DenseMap<const GlobalValue *, SanitizerMetadata> &MetadataMap = 240 getContext().pImpl->GlobalValueSanitizerMetadata; 241 MetadataMap.erase(this); 242 HasSanitizerMetadata = false; 243 } 244 245 StringRef GlobalObject::getSectionImpl() const { 246 assert(hasSection()); 247 return getContext().pImpl->GlobalObjectSections[this]; 248 } 249 250 void GlobalObject::setSection(StringRef S) { 251 // Do nothing if we're clearing the section and it is already empty. 252 if (!hasSection() && S.empty()) 253 return; 254 255 // Get or create a stable section name string and put it in the table in the 256 // context. 257 if (!S.empty()) 258 S = getContext().pImpl->Saver.save(S); 259 getContext().pImpl->GlobalObjectSections[this] = S; 260 261 // Update the HasSectionHashEntryBit. Setting the section to the empty string 262 // means this global no longer has a section. 263 setGlobalObjectFlag(HasSectionHashEntryBit, !S.empty()); 264 } 265 266 bool GlobalValue::isNobuiltinFnDef() const { 267 const Function *F = dyn_cast<Function>(this); 268 if (!F || F->empty()) 269 return false; 270 return F->hasFnAttribute(Attribute::NoBuiltin); 271 } 272 273 bool GlobalValue::isDeclaration() const { 274 // Globals are definitions if they have an initializer. 275 if (const GlobalVariable *GV = dyn_cast<GlobalVariable>(this)) 276 return GV->getNumOperands() == 0; 277 278 // Functions are definitions if they have a body. 279 if (const Function *F = dyn_cast<Function>(this)) 280 return F->empty() && !F->isMaterializable(); 281 282 // Aliases and ifuncs are always definitions. 283 assert(isa<GlobalAlias>(this) || isa<GlobalIFunc>(this)); 284 return false; 285 } 286 287 bool GlobalObject::canIncreaseAlignment() const { 288 // Firstly, can only increase the alignment of a global if it 289 // is a strong definition. 290 if (!isStrongDefinitionForLinker()) 291 return false; 292 293 // It also has to either not have a section defined, or, not have 294 // alignment specified. (If it is assigned a section, the global 295 // could be densely packed with other objects in the section, and 296 // increasing the alignment could cause padding issues.) 297 if (hasSection() && getAlign()) 298 return false; 299 300 // On ELF platforms, we're further restricted in that we can't 301 // increase the alignment of any variable which might be emitted 302 // into a shared library, and which is exported. If the main 303 // executable accesses a variable found in a shared-lib, the main 304 // exe actually allocates memory for and exports the symbol ITSELF, 305 // overriding the symbol found in the library. That is, at link 306 // time, the observed alignment of the variable is copied into the 307 // executable binary. (A COPY relocation is also generated, to copy 308 // the initial data from the shadowed variable in the shared-lib 309 // into the location in the main binary, before running code.) 310 // 311 // And thus, even though you might think you are defining the 312 // global, and allocating the memory for the global in your object 313 // file, and thus should be able to set the alignment arbitrarily, 314 // that's not actually true. Doing so can cause an ABI breakage; an 315 // executable might have already been built with the previous 316 // alignment of the variable, and then assuming an increased 317 // alignment will be incorrect. 318 319 // Conservatively assume ELF if there's no parent pointer. 320 bool isELF = 321 (!Parent || Triple(Parent->getTargetTriple()).isOSBinFormatELF()); 322 if (isELF && !isDSOLocal()) 323 return false; 324 325 return true; 326 } 327 328 template <typename Operation> 329 static const GlobalObject * 330 findBaseObject(const Constant *C, DenseSet<const GlobalAlias *> &Aliases, 331 const Operation &Op) { 332 if (auto *GO = dyn_cast<GlobalObject>(C)) { 333 Op(*GO); 334 return GO; 335 } 336 if (auto *GA = dyn_cast<GlobalAlias>(C)) { 337 Op(*GA); 338 if (Aliases.insert(GA).second) 339 return findBaseObject(GA->getOperand(0), Aliases, Op); 340 } 341 if (auto *CE = dyn_cast<ConstantExpr>(C)) { 342 switch (CE->getOpcode()) { 343 case Instruction::Add: { 344 auto *LHS = findBaseObject(CE->getOperand(0), Aliases, Op); 345 auto *RHS = findBaseObject(CE->getOperand(1), Aliases, Op); 346 if (LHS && RHS) 347 return nullptr; 348 return LHS ? LHS : RHS; 349 } 350 case Instruction::Sub: { 351 if (findBaseObject(CE->getOperand(1), Aliases, Op)) 352 return nullptr; 353 return findBaseObject(CE->getOperand(0), Aliases, Op); 354 } 355 case Instruction::IntToPtr: 356 case Instruction::PtrToInt: 357 case Instruction::BitCast: 358 case Instruction::GetElementPtr: 359 return findBaseObject(CE->getOperand(0), Aliases, Op); 360 default: 361 break; 362 } 363 } 364 return nullptr; 365 } 366 367 const GlobalObject *GlobalValue::getAliaseeObject() const { 368 DenseSet<const GlobalAlias *> Aliases; 369 return findBaseObject(this, Aliases, [](const GlobalValue &) {}); 370 } 371 372 bool GlobalValue::isAbsoluteSymbolRef() const { 373 auto *GO = dyn_cast<GlobalObject>(this); 374 if (!GO) 375 return false; 376 377 return GO->getMetadata(LLVMContext::MD_absolute_symbol); 378 } 379 380 std::optional<ConstantRange> GlobalValue::getAbsoluteSymbolRange() const { 381 auto *GO = dyn_cast<GlobalObject>(this); 382 if (!GO) 383 return std::nullopt; 384 385 MDNode *MD = GO->getMetadata(LLVMContext::MD_absolute_symbol); 386 if (!MD) 387 return std::nullopt; 388 389 return getConstantRangeFromMetadata(*MD); 390 } 391 392 bool GlobalValue::canBeOmittedFromSymbolTable() const { 393 if (!hasLinkOnceODRLinkage()) 394 return false; 395 396 // We assume that anyone who sets global unnamed_addr on a non-constant 397 // knows what they're doing. 398 if (hasGlobalUnnamedAddr()) 399 return true; 400 401 // If it is a non constant variable, it needs to be uniqued across shared 402 // objects. 403 if (auto *Var = dyn_cast<GlobalVariable>(this)) 404 if (!Var->isConstant()) 405 return false; 406 407 return hasAtLeastLocalUnnamedAddr(); 408 } 409 410 //===----------------------------------------------------------------------===// 411 // GlobalVariable Implementation 412 //===----------------------------------------------------------------------===// 413 414 GlobalVariable::GlobalVariable(Type *Ty, bool constant, LinkageTypes Link, 415 Constant *InitVal, const Twine &Name, 416 ThreadLocalMode TLMode, unsigned AddressSpace, 417 bool isExternallyInitialized) 418 : GlobalObject(Ty, Value::GlobalVariableVal, 419 OperandTraits<GlobalVariable>::op_begin(this), 420 InitVal != nullptr, Link, Name, AddressSpace), 421 isConstantGlobal(constant), 422 isExternallyInitializedConstant(isExternallyInitialized) { 423 assert(!Ty->isFunctionTy() && PointerType::isValidElementType(Ty) && 424 "invalid type for global variable"); 425 setThreadLocalMode(TLMode); 426 if (InitVal) { 427 assert(InitVal->getType() == Ty && 428 "Initializer should be the same type as the GlobalVariable!"); 429 Op<0>() = InitVal; 430 } 431 } 432 433 GlobalVariable::GlobalVariable(Module &M, Type *Ty, bool constant, 434 LinkageTypes Link, Constant *InitVal, 435 const Twine &Name, GlobalVariable *Before, 436 ThreadLocalMode TLMode, 437 std::optional<unsigned> AddressSpace, 438 bool isExternallyInitialized) 439 : GlobalVariable(Ty, constant, Link, InitVal, Name, TLMode, 440 AddressSpace 441 ? *AddressSpace 442 : M.getDataLayout().getDefaultGlobalsAddressSpace(), 443 isExternallyInitialized) { 444 if (Before) 445 Before->getParent()->insertGlobalVariable(Before->getIterator(), this); 446 else 447 M.insertGlobalVariable(this); 448 } 449 450 void GlobalVariable::removeFromParent() { 451 getParent()->removeGlobalVariable(this); 452 } 453 454 void GlobalVariable::eraseFromParent() { 455 getParent()->eraseGlobalVariable(this); 456 } 457 458 void GlobalVariable::setInitializer(Constant *InitVal) { 459 if (!InitVal) { 460 if (hasInitializer()) { 461 // Note, the num operands is used to compute the offset of the operand, so 462 // the order here matters. Clearing the operand then clearing the num 463 // operands ensures we have the correct offset to the operand. 464 Op<0>().set(nullptr); 465 setGlobalVariableNumOperands(0); 466 } 467 } else { 468 assert(InitVal->getType() == getValueType() && 469 "Initializer type must match GlobalVariable type"); 470 // Note, the num operands is used to compute the offset of the operand, so 471 // the order here matters. We need to set num operands to 1 first so that 472 // we get the correct offset to the first operand when we set it. 473 if (!hasInitializer()) 474 setGlobalVariableNumOperands(1); 475 Op<0>().set(InitVal); 476 } 477 } 478 479 /// Copy all additional attributes (those not needed to create a GlobalVariable) 480 /// from the GlobalVariable Src to this one. 481 void GlobalVariable::copyAttributesFrom(const GlobalVariable *Src) { 482 GlobalObject::copyAttributesFrom(Src); 483 setExternallyInitialized(Src->isExternallyInitialized()); 484 setAttributes(Src->getAttributes()); 485 } 486 487 void GlobalVariable::dropAllReferences() { 488 User::dropAllReferences(); 489 clearMetadata(); 490 } 491 492 //===----------------------------------------------------------------------===// 493 // GlobalAlias Implementation 494 //===----------------------------------------------------------------------===// 495 496 GlobalAlias::GlobalAlias(Type *Ty, unsigned AddressSpace, LinkageTypes Link, 497 const Twine &Name, Constant *Aliasee, 498 Module *ParentModule) 499 : GlobalValue(Ty, Value::GlobalAliasVal, &Op<0>(), 1, Link, Name, 500 AddressSpace) { 501 setAliasee(Aliasee); 502 if (ParentModule) 503 ParentModule->insertAlias(this); 504 } 505 506 GlobalAlias *GlobalAlias::create(Type *Ty, unsigned AddressSpace, 507 LinkageTypes Link, const Twine &Name, 508 Constant *Aliasee, Module *ParentModule) { 509 return new GlobalAlias(Ty, AddressSpace, Link, Name, Aliasee, ParentModule); 510 } 511 512 GlobalAlias *GlobalAlias::create(Type *Ty, unsigned AddressSpace, 513 LinkageTypes Linkage, const Twine &Name, 514 Module *Parent) { 515 return create(Ty, AddressSpace, Linkage, Name, nullptr, Parent); 516 } 517 518 GlobalAlias *GlobalAlias::create(Type *Ty, unsigned AddressSpace, 519 LinkageTypes Linkage, const Twine &Name, 520 GlobalValue *Aliasee) { 521 return create(Ty, AddressSpace, Linkage, Name, Aliasee, Aliasee->getParent()); 522 } 523 524 GlobalAlias *GlobalAlias::create(LinkageTypes Link, const Twine &Name, 525 GlobalValue *Aliasee) { 526 return create(Aliasee->getValueType(), Aliasee->getAddressSpace(), Link, Name, 527 Aliasee); 528 } 529 530 GlobalAlias *GlobalAlias::create(const Twine &Name, GlobalValue *Aliasee) { 531 return create(Aliasee->getLinkage(), Name, Aliasee); 532 } 533 534 void GlobalAlias::removeFromParent() { getParent()->removeAlias(this); } 535 536 void GlobalAlias::eraseFromParent() { getParent()->eraseAlias(this); } 537 538 void GlobalAlias::setAliasee(Constant *Aliasee) { 539 assert((!Aliasee || Aliasee->getType() == getType()) && 540 "Alias and aliasee types should match!"); 541 Op<0>().set(Aliasee); 542 } 543 544 const GlobalObject *GlobalAlias::getAliaseeObject() const { 545 DenseSet<const GlobalAlias *> Aliases; 546 return findBaseObject(getOperand(0), Aliases, [](const GlobalValue &) {}); 547 } 548 549 //===----------------------------------------------------------------------===// 550 // GlobalIFunc Implementation 551 //===----------------------------------------------------------------------===// 552 553 GlobalIFunc::GlobalIFunc(Type *Ty, unsigned AddressSpace, LinkageTypes Link, 554 const Twine &Name, Constant *Resolver, 555 Module *ParentModule) 556 : GlobalObject(Ty, Value::GlobalIFuncVal, &Op<0>(), 1, Link, Name, 557 AddressSpace) { 558 setResolver(Resolver); 559 if (ParentModule) 560 ParentModule->insertIFunc(this); 561 } 562 563 GlobalIFunc *GlobalIFunc::create(Type *Ty, unsigned AddressSpace, 564 LinkageTypes Link, const Twine &Name, 565 Constant *Resolver, Module *ParentModule) { 566 return new GlobalIFunc(Ty, AddressSpace, Link, Name, Resolver, ParentModule); 567 } 568 569 void GlobalIFunc::removeFromParent() { getParent()->removeIFunc(this); } 570 571 void GlobalIFunc::eraseFromParent() { getParent()->eraseIFunc(this); } 572 573 const Function *GlobalIFunc::getResolverFunction() const { 574 return dyn_cast<Function>(getResolver()->stripPointerCastsAndAliases()); 575 } 576 577 void GlobalIFunc::applyAlongResolverPath( 578 function_ref<void(const GlobalValue &)> Op) const { 579 DenseSet<const GlobalAlias *> Aliases; 580 findBaseObject(getResolver(), Aliases, Op); 581 } 582