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.

llvm-svn: 208094
This commit is contained in:
Rafael Espindola 2014-05-06 14:51:36 +00:00
parent 484033b188
commit a7d9c69cc8
2 changed files with 15 additions and 6 deletions

View File

@ -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 &&

View File

@ -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());
}