[PATCH] D37909: [AutoUpgrade] Fix a compatibility issue with module flag

Steven Wu via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Sep 15 11:03:18 PDT 2017


steven_wu created this revision.
Herald added a subscriber: mehdi_amini.

After r304661, module flag to record objective-c image info section is
encoded without whitespaces after comma. The new name is equivalent to
the old one, except that when LTO a module built by old compiler and a
module built by a new compiler, it will fail with conflicting values.

Fix the issue by removing whitespaces in bitcode upgrade path.

rdar://problem/34416934


https://reviews.llvm.org/D37909

Files:
  lib/IR/AutoUpgrade.cpp
  test/Bitcode/upgrade-module-flag.ll


Index: test/Bitcode/upgrade-module-flag.ll
===================================================================
--- test/Bitcode/upgrade-module-flag.ll
+++ test/Bitcode/upgrade-module-flag.ll
@@ -1,13 +1,15 @@
 ; RUN: llvm-as < %s | llvm-dis | FileCheck %s
 ; RUN: verify-uselistorder < %s
 
-!llvm.module.flags = !{!0, !1, !2}
+!llvm.module.flags = !{!0, !1, !2, !3}
 
 !0 = !{i32 1, !"PIC Level", i32 1}
 !1 = !{i32 1, !"PIE Level", i32 1}
 !2 = !{i32 1, !"Objective-C Image Info Version", i32 0}
+!3 = !{i32 1, !"Objective-C Image Info Section", !"__DATA, __objc_imageinfo, regular, no_dead_strip"}
 
 ; CHECK: !0 = !{i32 7, !"PIC Level", i32 1}
 ; CHECK: !1 = !{i32 7, !"PIE Level", i32 1}
 ; CHECK: !2 = !{i32 1, !"Objective-C Image Info Version", i32 0}
-; CHECK: !3 = !{i32 4, !"Objective-C Class Properties", i32 0}
+; CHECK: !3 = !{i32 1, !"Objective-C Image Info Section", !"__DATA,__objc_imageinfo,regular,no_dead_strip"}
+; CHECK: !4 = !{i32 4, !"Objective-C Class Properties", i32 0}
Index: lib/IR/AutoUpgrade.cpp
===================================================================
--- lib/IR/AutoUpgrade.cpp
+++ lib/IR/AutoUpgrade.cpp
@@ -2363,6 +2363,24 @@
         }
       }
     }
+    // Upgrade Objective-C Image Info Section. Removed the whitespce in the
+    // section name so that llvm-lto will not complain about mismatching
+    // module flags that is functionally the same.
+    if (ID->getString() == "Objective-C Image Info Section") {
+      if (auto *Value = dyn_cast_or_null<MDString>(Op->getOperand(2))) {
+        SmallVector<StringRef, 4> ValueComp;
+        Value->getString().split(ValueComp, " ");
+        if (ValueComp.size() != 1) {
+          std::string NewValue;
+          for (auto &S : ValueComp)
+            NewValue += S.str();
+          Metadata *Ops[3] = {Op->getOperand(0), Op->getOperand(1),
+                              MDString::get(M.getContext(), NewValue)};
+          ModFlags->setOperand(I, MDNode::get(M.getContext(), Ops));
+          Changed = true;
+        }
+      }
+    }
   }
 
   // "Objective-C Class Properties" is recently added for Objective-C. We


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D37909.115425.patch
Type: text/x-patch
Size: 2126 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170915/1dc4cae7/attachment.bin>


More information about the llvm-commits mailing list