[PATCH] D108796: Copy Elementtype Attribute to IR at Link step

Chenyang Liu via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 26 17:58:34 PDT 2021


chenyang.liu created this revision.
chenyang.liu added a reviewer: andrew.w.kaylor.
Herald added a subscriber: hiraditya.
chenyang.liu requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

Copying IR during linking causes a type mismatch due to the field being missing in IRMover/Valuemapper. Adds the elementtype attribute in the copy functions.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D108796

Files:
  llvm/lib/Linker/IRMover.cpp
  llvm/lib/Transforms/Utils/ValueMapper.cpp
  llvm/test/Linker/Inputs/elementtype-struct-2.ll
  llvm/test/Linker/elementtype-struct-1.ll


Index: llvm/test/Linker/elementtype-struct-1.ll
===================================================================
--- /dev/null
+++ 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)
Index: llvm/test/Linker/Inputs/elementtype-struct-2.ll
===================================================================
--- /dev/null
+++ 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)
\ No newline at end of file
Index: llvm/lib/Transforms/Utils/ValueMapper.cpp
===================================================================
--- llvm/lib/Transforms/Utils/ValueMapper.cpp
+++ llvm/lib/Transforms/Utils/ValueMapper.cpp
@@ -945,8 +945,8 @@
     AttributeList Attrs = CB->getAttributes();
     for (unsigned i = 0; i < Attrs.getNumAttrSets(); ++i) {
       for (Attribute::AttrKind TypedAttr :
-             {Attribute::ByVal, Attribute::StructRet, Attribute::ByRef,
-              Attribute::InAlloca}) {
+           {Attribute::ByVal, Attribute::StructRet, Attribute::ByRef,
+            Attribute::InAlloca, Attribute::ElementType}) {
         if (Type *Ty = Attrs.getAttribute(i, TypedAttr).getValueAsType()) {
           Attrs = Attrs.replaceAttributeType(C, i, TypedAttr,
                                              TypeMapper->remapType(Ty));
Index: llvm/lib/Linker/IRMover.cpp
===================================================================
--- llvm/lib/Linker/IRMover.cpp
+++ llvm/lib/Linker/IRMover.cpp
@@ -650,7 +650,7 @@
   for (unsigned i = 0; i < Attrs.getNumAttrSets(); ++i) {
     for (Attribute::AttrKind TypedAttr :
          {Attribute::ByVal, Attribute::StructRet, Attribute::ByRef,
-          Attribute::InAlloca}) {
+          Attribute::InAlloca, Attribute::ElementType}) {
       if (Attrs.hasAttribute(i, TypedAttr)) {
         if (Type *Ty = Attrs.getAttribute(i, TypedAttr).getValueAsType()) {
           Attrs = Attrs.replaceAttributeType(C, i, TypedAttr, TypeMap.get(Ty));


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D108796.369012.patch
Type: text/x-patch
Size: 3024 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210827/94aafd5f/attachment.bin>


More information about the llvm-commits mailing list