[llvm] 34528c3 - Copy Elementtype Attribute to IR at Link step

Andy Kaylor via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 7 11:46:58 PDT 2021


Author: Andy Kaylor
Date: 2021-09-07T11:41:43-07:00
New Revision: 34528c32d23f98312434bb8d67510bef616e5b44

URL: https://github.com/llvm/llvm-project/commit/34528c32d23f98312434bb8d67510bef616e5b44
DIFF: https://github.com/llvm/llvm-project/commit/34528c32d23f98312434bb8d67510bef616e5b44.diff

LOG: 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

Added: 
    llvm/test/Linker/Inputs/elementtype-struct-2.ll
    llvm/test/Linker/elementtype-struct-1.ll

Modified: 
    llvm/lib/Linker/IRMover.cpp
    llvm/lib/Transforms/Utils/ValueMapper.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Linker/IRMover.cpp b/llvm/lib/Linker/IRMover.cpp
index 316d9b652e0d9..ba8ce5a3ed703 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 c3093be329709..468c0449cc03d 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 0000000000000..f36d30655cc3e
--- /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 0000000000000..464636c5b577f
--- /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)


        


More information about the llvm-commits mailing list