diff options
| author | Rafael Espindola <rafael.espindola@gmail.com> | 2014-09-09 17:48:18 +0000 |
|---|---|---|
| committer | Rafael Espindola <rafael.espindola@gmail.com> | 2014-09-09 17:48:18 +0000 |
| commit | fe3842cda7d1bc18ea5cecf63ec4a3380d3cdc9f (patch) | |
| tree | c9eb99ccc4b863de771adc3db0eaffcb8b3f3389 /llvm/lib | |
| parent | ea0257a9d9b618182144e504b93c6ff8b6080c3b (diff) | |
| download | bcm5719-llvm-fe3842cda7d1bc18ea5cecf63ec4a3380d3cdc9f.tar.gz bcm5719-llvm-fe3842cda7d1bc18ea5cecf63ec4a3380d3cdc9f.zip | |
Merge alignment of common GlobalValue.
Fixes pr20882.
llvm-svn: 217455
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Linker/LinkModules.cpp | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/llvm/lib/Linker/LinkModules.cpp b/llvm/lib/Linker/LinkModules.cpp index 65fe30c94f7..0313e2b8a7e 100644 --- a/llvm/lib/Linker/LinkModules.cpp +++ b/llvm/lib/Linker/LinkModules.cpp @@ -1001,6 +1001,7 @@ bool ModuleLinker::linkGlobalProto(GlobalVariable *SGV) { GlobalValue *DGV = getLinkedToGlobal(SGV); llvm::Optional<GlobalValue::VisibilityTypes> NewVisibility; bool HasUnnamedAddr = SGV->hasUnnamedAddr(); + unsigned Alignment = SGV->getAlignment(); bool LinkFromSrc = false; Comdat *DC = nullptr; @@ -1025,15 +1026,22 @@ bool ModuleLinker::linkGlobalProto(GlobalVariable *SGV) { return true; NewVisibility = NV; HasUnnamedAddr = HasUnnamedAddr && DGV->hasUnnamedAddr(); + if (DGV->hasCommonLinkage() && SGV->hasCommonLinkage()) + Alignment = std::max(Alignment, DGV->getAlignment()); + else if (!LinkFromSrc) + Alignment = DGV->getAlignment(); // If we're not linking from the source, then keep the definition that we // have. if (!LinkFromSrc) { // Special case for const propagation. - if (GlobalVariable *DGVar = dyn_cast<GlobalVariable>(DGV)) + if (GlobalVariable *DGVar = dyn_cast<GlobalVariable>(DGV)) { + DGVar->setAlignment(Alignment); + if (DGVar->isDeclaration() && SGV->isConstant() && !DGVar->isConstant()) DGVar->setConstant(true); + } // Set calculated linkage, visibility and unnamed_addr. DGV->setLinkage(NewLinkage); @@ -1071,6 +1079,7 @@ bool ModuleLinker::linkGlobalProto(GlobalVariable *SGV) { SGV->getType()->getAddressSpace()); // Propagate alignment, visibility and section info. copyGVAttributes(NewDGV, SGV); + NewDGV->setAlignment(Alignment); if (NewVisibility) NewDGV->setVisibility(*NewVisibility); NewDGV->setUnnamedAddr(HasUnnamedAddr); |

