From 34528c32d23f98312434bb8d67510bef616e5b44 Mon Sep 17 00:00:00 2001 From: Andy Kaylor Date: Fri, 3 Sep 2021 18:24:09 -0700 Subject: [PATCH] Copy Elementtype Attribute to IR at Link step 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 --- llvm/lib/Linker/IRMover.cpp | 6 +++--- llvm/lib/Transforms/Utils/ValueMapper.cpp | 6 +++--- llvm/test/Linker/Inputs/elementtype-struct-2.ll | 8 ++++++++ llvm/test/Linker/elementtype-struct-1.ll | 17 +++++++++++++++++ 4 files changed, 31 insertions(+), 6 deletions(-) create mode 100644 llvm/test/Linker/Inputs/elementtype-struct-2.ll create mode 100644 llvm/test/Linker/elementtype-struct-1.ll diff --git a/llvm/lib/Linker/IRMover.cpp b/llvm/lib/Linker/IRMover.cpp index 316d9b6..ba8ce5a 100644 --- a/llvm/lib/Linker/IRMover.cpp +++ b/llvm/lib/Linker/IRMover.cpp @@ -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()) { diff --git a/llvm/lib/Transforms/Utils/ValueMapper.cpp b/llvm/lib/Transforms/Utils/ValueMapper.cpp index c3093be..468c044 100644 --- a/llvm/lib/Transforms/Utils/ValueMapper.cpp +++ b/llvm/lib/Transforms/Utils/ValueMapper.cpp @@ -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, diff --git a/llvm/test/Linker/Inputs/elementtype-struct-2.ll b/llvm/test/Linker/Inputs/elementtype-struct-2.ll new file mode 100644 index 0000000..f36d306 --- /dev/null +++ b/llvm/test/Linker/Inputs/elementtype-struct-2.ll @@ -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) diff --git a/llvm/test/Linker/elementtype-struct-1.ll b/llvm/test/Linker/elementtype-struct-1.ll new file mode 100644 index 0000000..464636c --- /dev/null +++ b/llvm/test/Linker/elementtype-struct-1.ll @@ -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) -- 2.7.4