diff --git a/llvm/lib/Linker/IRMover.cpp b/llvm/lib/Linker/IRMover.cpp --- a/llvm/lib/Linker/IRMover.cpp +++ b/llvm/lib/Linker/IRMover.cpp @@ -654,9 +654,9 @@ 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 @@ else if (SGV->getValueType()->isFunctionTy()) NewGV = Function::Create(cast(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()), diff --git a/llvm/test/Linker/addrspace.ll b/llvm/test/Linker/addrspace.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Linker/addrspace.ll @@ -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 +}