diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2014-06-06 01:20:28 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2014-06-06 01:20:28 +0000 |
commit | 42a4c9f9e094419c27e53c4fbc4f2fd23887c7c5 (patch) | |
tree | 63f9a89579652de86471aef88e3f56f911476343 /llvm/lib/Linker/LinkModules.cpp | |
parent | f251e0051c269ac5f60839f5cbce7675ea158ca0 (diff) | |
download | bcm5719-llvm-42a4c9f9e094419c27e53c4fbc4f2fd23887c7c5.tar.gz bcm5719-llvm-42a4c9f9e094419c27e53c4fbc4f2fd23887c7c5.zip |
Allow aliases to be unnamed_addr.
Alias with unnamed_addr were in a strange state. It is stored in GlobalValue,
the language reference talks about "unnamed_addr aliases" but the verifier
was rejecting them.
It seems natural to allow unnamed_addr in aliases:
* It is a property of how it is accessed, not of the data itself.
* It is perfectly possible to write code that depends on the address
of an alias.
This patch then makes unname_addr legal for aliases. One side effect is that
the syntax changes for a corner case: In globals, unnamed_addr is now printed
before the address space.
llvm-svn: 210302
Diffstat (limited to 'llvm/lib/Linker/LinkModules.cpp')
-rw-r--r-- | llvm/lib/Linker/LinkModules.cpp | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/llvm/lib/Linker/LinkModules.cpp b/llvm/lib/Linker/LinkModules.cpp index ad8e01dc1be..8e205bb621e 100644 --- a/llvm/lib/Linker/LinkModules.cpp +++ b/llvm/lib/Linker/LinkModules.cpp @@ -893,6 +893,7 @@ bool ModuleLinker::linkFunctionProto(Function *SF) { bool ModuleLinker::linkAliasProto(GlobalAlias *SGA) { GlobalValue *DGV = getLinkedToGlobal(SGA); llvm::Optional<GlobalValue::VisibilityTypes> NewVisibility; + bool HasUnnamedAddr = SGA->hasUnnamedAddr(); if (DGV) { GlobalValue::LinkageTypes NewLinkage = GlobalValue::InternalLinkage; @@ -901,11 +902,13 @@ bool ModuleLinker::linkAliasProto(GlobalAlias *SGA) { if (getLinkageResult(DGV, SGA, NewLinkage, NV, LinkFromSrc)) return true; NewVisibility = NV; + HasUnnamedAddr = HasUnnamedAddr && DGV->hasUnnamedAddr(); if (!LinkFromSrc) { // Set calculated linkage. DGV->setLinkage(NewLinkage); DGV->setVisibility(*NewVisibility); + DGV->setUnnamedAddr(HasUnnamedAddr); // Make sure to remember this mapping. ValueMap[SGA] = ConstantExpr::getBitCast(DGV,TypeMap.get(SGA->getType())); @@ -926,6 +929,7 @@ bool ModuleLinker::linkAliasProto(GlobalAlias *SGA) { copyGVAttributes(NewDA, SGA); if (NewVisibility) NewDA->setVisibility(*NewVisibility); + NewDA->setUnnamedAddr(HasUnnamedAddr); if (DGV) { // Any uses of DGV need to change to NewDA, with cast. |