]> granicus.if.org Git - llvm/commitdiff
Fix autoupgrade logic for Objective-C class properties module flag
authorMehdi Amini <mehdi.amini@apple.com>
Fri, 16 Sep 2016 00:38:18 +0000 (00:38 +0000)
committerMehdi Amini <mehdi.amini@apple.com>
Fri, 16 Sep 2016 00:38:18 +0000 (00:38 +0000)
Previous we were issuing an error when linking a module containing
the new Objective-C metadata structure for class properties with an
"old" one.
Now instead we downgrade the module flag so that the Objective-C
runtime does not expect the new metadata structure.

This is consistent with what ld64 is doing on binary files.

Differential Revision: https://reviews.llvm.org/D24620

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@281685 91177308-0d34-0410-b5e6-96231b3b80d8

lib/IR/AutoUpgrade.cpp
test/Bitcode/upgrade-module-flag.ll
test/Linker/Inputs/objectivec-class-property-flag-mismatch.ll [new file with mode: 0644]
test/Linker/objectivec-class-property-flag-mismatch.ll [new file with mode: 0644]

index a68247be97392d026d81d760c1d827b18d775a60..8a5170fb631369da79d096fe3e42fa2ab6c914cf 100644 (file)
@@ -1587,11 +1587,11 @@ bool llvm::UpgradeModuleFlags(Module &M) {
   }
   // "Objective-C Class Properties" is recently added for Objective-C. We
   // upgrade ObjC bitcodes to contain a "Objective-C Class Properties" module
-  // flag of value 0, so we can correclty report error when trying to link
-  // an ObjC bitcode without this module flag with an ObjC bitcode with this
-  // module flag.
+  // flag of value 0, so we can correclty downgrade this flag when trying to
+  // link an ObjC bitcode without this module flag with an ObjC bitcode with
+  // this module flag.
   if (HasObjCFlag && !HasClassProperties) {
-    M.addModuleFlag(llvm::Module::Error, "Objective-C Class Properties",
+    M.addModuleFlag(llvm::Module::Override, "Objective-C Class Properties",
                     (uint32_t)0);
     return true;
   }
index fe52a3298e4b094ba7d4a81b76d8a7e8588dd92f..d6741faa837ff0b92f90c7beebc872ba0393de32 100644 (file)
@@ -6,4 +6,4 @@
 !0 = !{i32 1, !"Objective-C Image Info Version", i32 0}
 
 ; CHECK: !0 = !{i32 1, !"Objective-C Image Info Version", i32 0}
-; CHECK: !1 = !{i32 1, !"Objective-C Class Properties", i32 0}
+; CHECK: !1 = !{i32 4, !"Objective-C Class Properties", i32 0}
diff --git a/test/Linker/Inputs/objectivec-class-property-flag-mismatch.ll b/test/Linker/Inputs/objectivec-class-property-flag-mismatch.ll
new file mode 100644 (file)
index 0000000..93a5fbe
--- /dev/null
@@ -0,0 +1,5 @@
+
+!llvm.module.flags = !{!0, !1}
+
+!0 = !{i32 1, !"Objective-C Image Info Version", i32 0}
+!1 = !{i32 1, !"Objective-C Class Properties", i32 64}
diff --git a/test/Linker/objectivec-class-property-flag-mismatch.ll b/test/Linker/objectivec-class-property-flag-mismatch.ll
new file mode 100644 (file)
index 0000000..9dd82c5
--- /dev/null
@@ -0,0 +1,16 @@
+; RUN: llvm-as < %s -o %t1.bc
+; RUN: llvm-as < %p/Inputs/objectivec-class-property-flag-mismatch.ll -o %t2.bc
+
+
+; RUN: llvm-link %t1.bc %t2.bc -S | FileCheck %s
+; RUN: llvm-link %t2.bc %t1.bc -S | FileCheck %s
+
+
+; CHECK: !0 = !{i32 1, !"Objective-C Image Info Version", i32 0}
+; CHECK: !1 = !{i32 4, !"Objective-C Class Properties", i32 0}
+
+
+
+!llvm.module.flags = !{!0}
+
+!0 = !{i32 1, !"Objective-C Image Info Version", i32 0}