From b53b62eb69cd5768423786c5ced700bc2d1d2e20 Mon Sep 17 00:00:00 2001 From: Mehdi Amini Date: Fri, 16 Sep 2016 00:38:18 +0000 Subject: [PATCH] Fix autoupgrade logic for Objective-C class properties module flag 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 llvm-svn: 281685 --- llvm/lib/IR/AutoUpgrade.cpp | 8 ++++---- llvm/test/Bitcode/upgrade-module-flag.ll | 2 +- .../Inputs/objectivec-class-property-flag-mismatch.ll | 5 +++++ .../Linker/objectivec-class-property-flag-mismatch.ll | 16 ++++++++++++++++ 4 files changed, 26 insertions(+), 5 deletions(-) create mode 100644 llvm/test/Linker/Inputs/objectivec-class-property-flag-mismatch.ll create mode 100644 llvm/test/Linker/objectivec-class-property-flag-mismatch.ll diff --git a/llvm/lib/IR/AutoUpgrade.cpp b/llvm/lib/IR/AutoUpgrade.cpp index a68247b..8a5170f 100644 --- a/llvm/lib/IR/AutoUpgrade.cpp +++ b/llvm/lib/IR/AutoUpgrade.cpp @@ -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; } diff --git a/llvm/test/Bitcode/upgrade-module-flag.ll b/llvm/test/Bitcode/upgrade-module-flag.ll index fe52a32..d6741fa 100644 --- a/llvm/test/Bitcode/upgrade-module-flag.ll +++ b/llvm/test/Bitcode/upgrade-module-flag.ll @@ -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/llvm/test/Linker/Inputs/objectivec-class-property-flag-mismatch.ll b/llvm/test/Linker/Inputs/objectivec-class-property-flag-mismatch.ll new file mode 100644 index 0000000..93a5fbe --- /dev/null +++ b/llvm/test/Linker/Inputs/objectivec-class-property-flag-mismatch.ll @@ -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/llvm/test/Linker/objectivec-class-property-flag-mismatch.ll b/llvm/test/Linker/objectivec-class-property-flag-mismatch.ll new file mode 100644 index 0000000..9dd82c5 --- /dev/null +++ b/llvm/test/Linker/objectivec-class-property-flag-mismatch.ll @@ -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} -- 2.7.4