diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2014-05-06 14:51:36 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2014-05-06 14:51:36 +0000 |
commit | 55ba6a126fbed4f7cce5e727b670bb41ec938321 (patch) | |
tree | ffafabd6f3244feae7f62496912ab2084080d913 /lib | |
parent | 3524723195be6132674ed6492355230e35cdfca0 (diff) | |
download | llvm-55ba6a126fbed4f7cce5e727b670bb41ec938321.tar.gz llvm-55ba6a126fbed4f7cce5e727b670bb41ec938321.tar.bz2 llvm-55ba6a126fbed4f7cce5e727b670bb41ec938321.tar.xz |
Be more strict about not calling setAlignment on global aliases.
The fact that GlobalAlias::setAlignment exists at all is a side effect of
how the classes are organized, it should never be used.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@208094 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/IR/Globals.cpp | 9 | ||||
-rw-r--r-- | lib/Linker/LinkModules.cpp | 12 |
2 files changed, 15 insertions, 6 deletions
diff --git a/lib/IR/Globals.cpp b/lib/IR/Globals.cpp index a6cd03e622..0b49350e55 100644 --- a/lib/IR/Globals.cpp +++ b/lib/IR/Globals.cpp @@ -53,15 +53,18 @@ void GlobalValue::destroyConstant() { /// copyAttributesFrom - copy all additional attributes (those not needed to /// create a GlobalValue) from the GlobalValue Src to this one. void GlobalValue::copyAttributesFrom(const GlobalValue *Src) { - setAlignment(Src->getAlignment()); - setSection(Src->getSection()); + if (!isa<GlobalAlias>(this)) { + setAlignment(Src->getAlignment()); + setSection(Src->getSection()); + } + setVisibility(Src->getVisibility()); setUnnamedAddr(Src->hasUnnamedAddr()); setDLLStorageClass(Src->getDLLStorageClass()); } void GlobalValue::setAlignment(unsigned Align) { - assert((!isa<GlobalAlias>(this) || !Align) && + assert((!isa<GlobalAlias>(this)) && "GlobalAlias should not have an alignment!"); assert((Align & (Align-1)) == 0 && "Alignment is not a power of 2!"); assert(Align <= MaximumAlignment && diff --git a/lib/Linker/LinkModules.cpp b/lib/Linker/LinkModules.cpp index 581e8217de..55654ac25d 100644 --- a/lib/Linker/LinkModules.cpp +++ b/lib/Linker/LinkModules.cpp @@ -495,10 +495,16 @@ static void forceRenaming(GlobalValue *GV, StringRef Name) { /// a GlobalValue) from the SrcGV to the DestGV. static void copyGVAttributes(GlobalValue *DestGV, const GlobalValue *SrcGV) { // Use the maximum alignment, rather than just copying the alignment of SrcGV. - unsigned Alignment = std::max(DestGV->getAlignment(), SrcGV->getAlignment()); + unsigned Alignment; + bool IsAlias = isa<GlobalAlias>(DestGV); + if (!IsAlias) + Alignment = std::max(DestGV->getAlignment(), SrcGV->getAlignment()); + DestGV->copyAttributesFrom(SrcGV); - DestGV->setAlignment(Alignment); - + + if (!IsAlias) + DestGV->setAlignment(Alignment); + forceRenaming(DestGV, SrcGV->getName()); } |