mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 10:42:39 +01:00
Linker: Fix linking of byref types
This wasn't properly remapping the type like with the other attributes, so this would end up hitting a verifier error after linking different modules using byref.
This commit is contained in:
parent
7e2b42617c
commit
80d9c38cea
@ -639,7 +639,7 @@ GlobalVariable *IRLinker::copyGlobalVariableProto(const GlobalVariable *SGVar) {
|
||||
AttributeList IRLinker::mapAttributeTypes(LLVMContext &C, AttributeList Attrs) {
|
||||
for (unsigned i = 0; i < Attrs.getNumAttrSets(); ++i) {
|
||||
for (Attribute::AttrKind TypedAttr :
|
||||
{Attribute::ByVal, Attribute::StructRet}) {
|
||||
{Attribute::ByVal, Attribute::StructRet, Attribute::ByRef}) {
|
||||
if (Attrs.hasAttribute(i, TypedAttr)) {
|
||||
if (Type *Ty = Attrs.getAttribute(i, TypedAttr).getValueAsType()) {
|
||||
Attrs = Attrs.replaceAttributeType(C, i, TypedAttr, TypeMap.get(Ty));
|
||||
|
@ -901,7 +901,7 @@ void Mapper::remapInstruction(Instruction *I) {
|
||||
AttributeList Attrs = CB->getAttributes();
|
||||
for (unsigned i = 0; i < Attrs.getNumAttrSets(); ++i) {
|
||||
for (Attribute::AttrKind TypedAttr :
|
||||
{Attribute::ByVal, Attribute::StructRet}) {
|
||||
{Attribute::ByVal, Attribute::StructRet, Attribute::ByRef}) {
|
||||
if (Type *Ty = Attrs.getAttribute(i, TypedAttr).getValueAsType()) {
|
||||
Attrs = Attrs.replaceAttributeType(C, i, TypedAttr,
|
||||
TypeMapper->remapType(Ty));
|
||||
|
13
test/Linker/Inputs/byref-type-input.ll
Normal file
13
test/Linker/Inputs/byref-type-input.ll
Normal file
@ -0,0 +1,13 @@
|
||||
%a = type { i64 }
|
||||
%struct = type { i32, i8 }
|
||||
|
||||
define void @g(%a* byref(%a)) {
|
||||
ret void
|
||||
}
|
||||
|
||||
declare void @baz(%struct* byref(%struct))
|
||||
|
||||
define void @foo(%struct* byref(%struct) %a) {
|
||||
call void @baz(%struct* byref(%struct) %a)
|
||||
ret void
|
||||
}
|
25
test/Linker/byref-types.ll
Normal file
25
test/Linker/byref-types.ll
Normal file
@ -0,0 +1,25 @@
|
||||
; RUN: llvm-link %s %p/Inputs/byref-type-input.ll -S | FileCheck %s
|
||||
|
||||
%a = type { i64 }
|
||||
%struct = type { i32, i8 }
|
||||
|
||||
; CHECK-LABEL: define void @f(%a* byref(%a) %0)
|
||||
define void @f(%a* byref(%a)) {
|
||||
ret void
|
||||
}
|
||||
|
||||
; CHECK-LABEL: define void @bar(
|
||||
; CHECK: call void @foo(%struct* byref(%struct) %ptr)
|
||||
define void @bar() {
|
||||
%ptr = alloca %struct
|
||||
call void @foo(%struct* byref(%struct) %ptr)
|
||||
ret void
|
||||
}
|
||||
|
||||
; CHECK-LABEL: define void @g(%a* byref(%a) %0)
|
||||
|
||||
; CHECK-LABEL: define void @foo(%struct* byref(%struct) %a)
|
||||
; CHECK-NEXT: call void @baz(%struct* byref(%struct) %a)
|
||||
declare void @foo(%struct* byref(%struct) %a)
|
||||
|
||||
; CHECK: declare void @baz(%struct* byref(%struct))
|
Loading…
Reference in New Issue
Block a user