[IRMover] Set Address Space for moved global values

Summary:
Set Address Space when creating a new function (from another).

Fix PR41154.

Patch by Ehud Katz <ehudkatz@gmail.com>

Reviewers: tejohnson, chandlerc

Reviewed By: tejohnson

Subscribers: hiraditya, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D69361
This commit is contained in:
Teresa Johnson 2019-11-05 14:00:58 -08:00
parent e0dd8f36ce
commit b36e3a8bac
2 changed files with 17 additions and 4 deletions

View File

@ -654,9 +654,9 @@ AttributeList IRLinker::mapAttributeTypes(LLVMContext &C, AttributeList Attrs) {
Function *IRLinker::copyFunctionProto(const Function *SF) {
// If there is no linkage to be performed or we are linking from the source,
// bring SF over.
auto *F =
Function::Create(TypeMap.get(SF->getFunctionType()),
GlobalValue::ExternalLinkage, SF->getName(), &DstM);
auto *F = Function::Create(TypeMap.get(SF->getFunctionType()),
GlobalValue::ExternalLinkage,
SF->getAddressSpace(), SF->getName(), &DstM);
F->copyAttributesFrom(SF);
F->setAttributes(mapAttributeTypes(F->getContext(), F->getAttributes()));
return F;
@ -695,7 +695,8 @@ GlobalValue *IRLinker::copyGlobalValueProto(const GlobalValue *SGV,
else if (SGV->getValueType()->isFunctionTy())
NewGV =
Function::Create(cast<FunctionType>(TypeMap.get(SGV->getValueType())),
GlobalValue::ExternalLinkage, SGV->getName(), &DstM);
GlobalValue::ExternalLinkage, SGV->getAddressSpace(),
SGV->getName(), &DstM);
else
NewGV =
new GlobalVariable(DstM, TypeMap.get(SGV->getValueType()),

View File

@ -0,0 +1,12 @@
; RUN: llvm-link %s -S | FileCheck %s
@G = addrspace(2) global i32 256
; CHECK: @G = addrspace(2) global i32
@GA = alias i32, i32 addrspace(2)* @G
; CHECK: @GA = alias i32, i32 addrspace(2)* @G
define void @foo() addrspace(3) {
; CHECK: define void @foo() addrspace(3)
ret void
}