diff options
author | Akira Hatanaka <ahatanaka@apple.com> | 2019-04-10 06:20:23 +0000 |
---|---|---|
committer | Akira Hatanaka <ahatanaka@apple.com> | 2019-04-10 06:20:23 +0000 |
commit | 60c3a3b6d0f18a0deb226c545251f83d167e087a (patch) | |
tree | e558ee2749dc136995b3ea1dfd36f3ef036d0d69 | |
parent | 9ca9d32b6be038debc6fda9c16a5f95b59e9b806 (diff) | |
download | bcm5719-llvm-60c3a3b6d0f18a0deb226c545251f83d167e087a.tar.gz bcm5719-llvm-60c3a3b6d0f18a0deb226c545251f83d167e087a.zip |
[CodeGen][ObjC] Emit the retainRV marker as a module flag instead of
named metadata.
This fixes a bug where ARC contract wasn't inserting the retainRV
marker when LTO was enabled, which caused objects returned from a
function to be auto-released.
rdar://problem/49464214
Differential Revision: https://reviews.llvm.org/D60302
llvm-svn: 358048
-rw-r--r-- | clang/lib/CodeGen/CGObjC.cpp | 12 | ||||
-rw-r--r-- | clang/test/CodeGenObjC/arc-unsafeclaim.m | 3 |
2 files changed, 6 insertions, 9 deletions
diff --git a/clang/lib/CodeGen/CGObjC.cpp b/clang/lib/CodeGen/CGObjC.cpp index 69ced587957..d5906cf994c 100644 --- a/clang/lib/CodeGen/CGObjC.cpp +++ b/clang/lib/CodeGen/CGObjC.cpp @@ -2161,14 +2161,10 @@ static void emitAutoreleasedReturnValueMarker(CodeGenFunction &CGF) { // with this marker yet, so leave a breadcrumb for the ARC // optimizer to pick up. } else { - llvm::NamedMDNode *metadata = - CGF.CGM.getModule().getOrInsertNamedMetadata( - "clang.arc.retainAutoreleasedReturnValueMarker"); - assert(metadata->getNumOperands() <= 1); - if (metadata->getNumOperands() == 0) { - auto &ctx = CGF.getLLVMContext(); - metadata->addOperand(llvm::MDNode::get(ctx, - llvm::MDString::get(ctx, assembly))); + const char *markerKey = "clang.arc.retainAutoreleasedReturnValueMarker"; + if (!CGF.CGM.getModule().getModuleFlag(markerKey)) { + auto *str = llvm::MDString::get(CGF.getLLVMContext(), assembly); + CGF.CGM.getModule().addModuleFlag(llvm::Module::Error, markerKey, str); } } } diff --git a/clang/test/CodeGenObjC/arc-unsafeclaim.m b/clang/test/CodeGenObjC/arc-unsafeclaim.m index f5982ddc04d..a8011e02418 100644 --- a/clang/test/CodeGenObjC/arc-unsafeclaim.m +++ b/clang/test/CodeGenObjC/arc-unsafeclaim.m @@ -231,4 +231,5 @@ void test_cast_to_void() { // This is always at the end of the module. -// CHECK-OPTIMIZED: !clang.arc.retainAutoreleasedReturnValueMarker = !{!0} +// CHECK-OPTIMIZED: !llvm.module.flags = !{!0, +// CHECK-OPTIMIZED: !0 = !{i32 1, !"clang.arc.retainAutoreleasedReturnValueMarker", !"mov{{.*}}marker for objc_retainAutoreleaseReturnValue"} |