diff options
Diffstat (limited to 'llvm/lib/IR/Globals.cpp')
-rw-r--r-- | llvm/lib/IR/Globals.cpp | 33 |
1 files changed, 14 insertions, 19 deletions
diff --git a/llvm/lib/IR/Globals.cpp b/llvm/lib/IR/Globals.cpp index 46a9696b2944..dd8e62164de1 100644 --- a/llvm/lib/IR/Globals.cpp +++ b/llvm/lib/IR/Globals.cpp @@ -65,6 +65,7 @@ Value *GlobalValue::handleOperandChangeImpl(Value *From, Value *To) { void GlobalValue::copyAttributesFrom(const GlobalValue *Src) { setVisibility(Src->getVisibility()); setUnnamedAddr(Src->getUnnamedAddr()); + setThreadLocalMode(Src->getThreadLocalMode()); setDLLStorageClass(Src->getDLLStorageClass()); setDSOLocal(Src->isDSOLocal()); setPartition(Src->getPartition()); @@ -94,18 +95,17 @@ void GlobalValue::eraseFromParent() { llvm_unreachable("not a global"); } -unsigned GlobalValue::getAlignment() const { - if (auto *GA = dyn_cast<GlobalAlias>(this)) { - // In general we cannot compute this at the IR level, but we try. - if (const GlobalObject *GO = GA->getBaseObject()) - return GO->getAlignment(); +bool GlobalValue::isInterposable() const { + if (isInterposableLinkage(getLinkage())) + return true; + return getParent() && getParent()->getSemanticInterposition() && + !isDSOLocal(); +} - // FIXME: we should also be able to handle: - // Alias = Global + Offset - // Alias = Absolute - return 0; - } - return cast<GlobalObject>(this)->getAlignment(); +bool GlobalValue::canBenefitFromLocalAlias() const { + // See AsmPrinter::getSymbolPreferLocal(). + return GlobalObject::isExternalLinkage(getLinkage()) && !isDeclaration() && + !isa<GlobalIFunc>(this) && !hasComdat(); } unsigned GlobalValue::getAddressSpace() const { @@ -113,12 +113,8 @@ unsigned GlobalValue::getAddressSpace() const { return PtrTy->getAddressSpace(); } -void GlobalObject::setAlignment(unsigned Align) { - setAlignment(MaybeAlign(Align)); -} - void GlobalObject::setAlignment(MaybeAlign Align) { - assert((!Align || Align <= MaximumAlignment) && + assert((!Align || *Align <= MaximumAlignment) && "Alignment is greater than MaximumAlignment!"); unsigned AlignmentData = encode(Align); unsigned OldData = getGlobalValueSubClassData(); @@ -143,7 +139,7 @@ std::string GlobalValue::getGlobalIdentifier(StringRef Name, if (Name[0] == '\1') Name = Name.substr(1); - std::string NewName = Name; + std::string NewName = std::string(Name); if (llvm::GlobalValue::isLocalLinkage(Linkage)) { // For local symbols, prepend the main file name to distinguish them. // Do not include the full path in the file name since there's no guarantee @@ -242,7 +238,7 @@ bool GlobalValue::isDeclaration() const { return false; } -bool GlobalValue::canIncreaseAlignment() const { +bool GlobalObject::canIncreaseAlignment() const { // Firstly, can only increase the alignment of a global if it // is a strong definition. if (!isStrongDefinitionForLinker()) @@ -410,7 +406,6 @@ void GlobalVariable::setInitializer(Constant *InitVal) { /// from the GlobalVariable Src to this one. void GlobalVariable::copyAttributesFrom(const GlobalVariable *Src) { GlobalObject::copyAttributesFrom(Src); - setThreadLocalMode(Src->getThreadLocalMode()); setExternallyInitialized(Src->isExternallyInitialized()); setAttributes(Src->getAttributes()); } |