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));
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));
--- /dev/null
+%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
+}
--- /dev/null
+; 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))