Skip to content

Commit

Permalink
Copy Elementtype Attribute to IR at Link step
Browse files Browse the repository at this point in the history
Copying IR during linking causes a type mismatch due to the field being missing in IRMover/Valuemapper. Adds the full range of typed attributes including elementtype attribute in the copy functions.

Patch by Chenyang Liu

Differential Revision: https://reviews.llvm.org/D108796
  • Loading branch information
andykaylor committed Sep 7, 2021
1 parent abd80ec commit 34528c3
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 6 deletions.
6 changes: 3 additions & 3 deletions llvm/lib/Linker/IRMover.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -649,9 +649,9 @@ 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::ByRef,
Attribute::InAlloca}) {
for (int AttrIdx = Attribute::FirstTypeAttr;
AttrIdx <= Attribute::LastTypeAttr; AttrIdx++) {
Attribute::AttrKind TypedAttr = (Attribute::AttrKind)AttrIdx;
if (Attrs.hasAttributeAtIndex(i, TypedAttr)) {
if (Type *Ty =
Attrs.getAttributeAtIndex(i, TypedAttr).getValueAsType()) {
Expand Down
6 changes: 3 additions & 3 deletions llvm/lib/Transforms/Utils/ValueMapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -944,9 +944,9 @@ void Mapper::remapInstruction(Instruction *I) {
LLVMContext &C = CB->getContext();
AttributeList Attrs = CB->getAttributes();
for (unsigned i = 0; i < Attrs.getNumAttrSets(); ++i) {
for (Attribute::AttrKind TypedAttr :
{Attribute::ByVal, Attribute::StructRet, Attribute::ByRef,
Attribute::InAlloca}) {
for (int AttrIdx = Attribute::FirstTypeAttr;
AttrIdx <= Attribute::LastTypeAttr; AttrIdx++) {
Attribute::AttrKind TypedAttr = (Attribute::AttrKind)AttrIdx;
if (Type *Ty =
Attrs.getAttributeAtIndex(i, TypedAttr).getValueAsType()) {
Attrs = Attrs.replaceAttributeTypeAtIndex(C, i, TypedAttr,
Expand Down
8 changes: 8 additions & 0 deletions llvm/test/Linker/Inputs/elementtype-struct-2.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
%struct = type {i32, i8}

define void @struct_elementtype_2() {
call %struct* @llvm.preserve.array.access.index.p0s_structs.p0s_structs(%struct* elementtype(%struct) null, i32 0, i32 0)
ret void
}

declare %struct* @llvm.preserve.array.access.index.p0s_structs.p0s_structs(%struct*, i32, i32)
17 changes: 17 additions & 0 deletions llvm/test/Linker/elementtype-struct-1.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
; RUN: llvm-link %S/Inputs/elementtype-struct-2.ll %s -S | FileCheck %s

; Check that the attribute for elementtype matches when linking.

; CHECK: define void @struct_elementtype_2
; CHECK: call %struct* @llvm.preserve.array.access.index.p0s_structs.p0s_structs(%struct* elementtype(%struct) null, i32 0, i32 0)
; CHECK: define void @struct_elementtype
; CHECK: call %struct* @llvm.preserve.array.access.index.p0s_structs.p0s_structs(%struct* elementtype(%struct) null, i32 0, i32 0)

%struct = type {i32, i8}

define void @struct_elementtype() {
call %struct* @llvm.preserve.array.access.index.p0s_structs.p0s_structs(%struct* elementtype(%struct) null, i32 0, i32 0)
ret void
}

declare %struct* @llvm.preserve.array.access.index.p0s_structs.p0s_structs(%struct*, i32, i32)

0 comments on commit 34528c3

Please sign in to comment.