diff options
author | Akira Hatanaka <ahatanaka@apple.com> | 2019-04-10 06:20:20 +0000 |
---|---|---|
committer | Akira Hatanaka <ahatanaka@apple.com> | 2019-04-10 06:20:20 +0000 |
commit | 9ca9d32b6be038debc6fda9c16a5f95b59e9b806 (patch) | |
tree | 1c85ba4ddb65ada984e304eb1ec9f928134a7412 | |
parent | 391d5caa106007daaa1ae0bf8214f9020f40a8b5 (diff) | |
download | bcm5719-llvm-9ca9d32b6be038debc6fda9c16a5f95b59e9b806.tar.gz bcm5719-llvm-9ca9d32b6be038debc6fda9c16a5f95b59e9b806.zip |
[ObjC][ARC] Convert the retainRV marker that is passed as a named
metadata into a module flag in the auto-upgrader and make the ARC
contract pass read the marker as a module flag.
This is needed to fix 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/D60303
llvm-svn: 358047
-rw-r--r-- | llvm/lib/IR/AutoUpgrade.cpp | 12 | ||||
-rw-r--r-- | llvm/lib/Transforms/ObjCARC/ObjCARCContract.cpp | 11 | ||||
-rw-r--r-- | llvm/test/Bitcode/upgrade-objcretainrelease.ll | 4 | ||||
-rw-r--r-- | llvm/test/Transforms/ObjCARC/contract-marker-funclet.ll | 5 | ||||
-rw-r--r-- | llvm/test/Transforms/ObjCARC/contract-marker.ll | 4 | ||||
-rw-r--r-- | llvm/test/Transforms/ObjCARC/contract-testcases.ll | 4 |
6 files changed, 17 insertions, 23 deletions
diff --git a/llvm/lib/IR/AutoUpgrade.cpp b/llvm/lib/IR/AutoUpgrade.cpp index 2978d6af916..4f0a32efcae 100644 --- a/llvm/lib/IR/AutoUpgrade.cpp +++ b/llvm/lib/IR/AutoUpgrade.cpp @@ -3765,8 +3765,8 @@ bool llvm::UpgradeDebugInfo(Module &M) { bool llvm::UpgradeRetainReleaseMarker(Module &M) { bool Changed = false; - NamedMDNode *ModRetainReleaseMarker = - M.getNamedMetadata("clang.arc.retainAutoreleasedReturnValueMarker"); + const char *MarkerKey = "clang.arc.retainAutoreleasedReturnValueMarker"; + NamedMDNode *ModRetainReleaseMarker = M.getNamedMetadata(MarkerKey); if (ModRetainReleaseMarker) { MDNode *Op = ModRetainReleaseMarker->getOperand(0); if (Op) { @@ -3776,11 +3776,11 @@ bool llvm::UpgradeRetainReleaseMarker(Module &M) { ID->getString().split(ValueComp, "#"); if (ValueComp.size() == 2) { std::string NewValue = ValueComp[0].str() + ";" + ValueComp[1].str(); - Metadata *Ops[1] = {MDString::get(M.getContext(), NewValue)}; - ModRetainReleaseMarker->setOperand(0, - MDNode::get(M.getContext(), Ops)); - Changed = true; + ID = MDString::get(M.getContext(), NewValue); } + M.addModuleFlag(Module::Error, MarkerKey, ID); + M.eraseNamedMetadata(ModRetainReleaseMarker); + Changed = true; } } } diff --git a/llvm/lib/Transforms/ObjCARC/ObjCARCContract.cpp b/llvm/lib/Transforms/ObjCARC/ObjCARCContract.cpp index 6613f6a76d0..ff07cfe00d4 100644 --- a/llvm/lib/Transforms/ObjCARC/ObjCARCContract.cpp +++ b/llvm/lib/Transforms/ObjCARC/ObjCARCContract.cpp @@ -744,15 +744,8 @@ bool ObjCARCContract::doInitialization(Module &M) { EP.init(&M); // Initialize RVInstMarker. - RVInstMarker = nullptr; - if (NamedMDNode *NMD = - M.getNamedMetadata("clang.arc.retainAutoreleasedReturnValueMarker")) - if (NMD->getNumOperands() == 1) { - const MDNode *N = NMD->getOperand(0); - if (N->getNumOperands() == 1) - if (const MDString *S = dyn_cast<MDString>(N->getOperand(0))) - RVInstMarker = S; - } + const char *MarkerKey = "clang.arc.retainAutoreleasedReturnValueMarker"; + RVInstMarker = dyn_cast_or_null<MDString>(M.getModuleFlag(MarkerKey)); return false; } diff --git a/llvm/test/Bitcode/upgrade-objcretainrelease.ll b/llvm/test/Bitcode/upgrade-objcretainrelease.ll index 5397327f80a..2456eb48693 100644 --- a/llvm/test/Bitcode/upgrade-objcretainrelease.ll +++ b/llvm/test/Bitcode/upgrade-objcretainrelease.ll @@ -2,5 +2,5 @@ ; ; RUN: llvm-dis < %s.bc | FileCheck %s -; CHECK: "mov\09fp, fp\09\09; marker for objc_retainAutoreleaseReturnValue" - +; CHECK: !llvm.module.flags = !{!0} +; CHECK: !0 = !{i32 1, !"clang.arc.retainAutoreleasedReturnValueMarker", !"mov\09fp, fp\09\09; marker for objc_retainAutoreleaseReturnValue"} diff --git a/llvm/test/Transforms/ObjCARC/contract-marker-funclet.ll b/llvm/test/Transforms/ObjCARC/contract-marker-funclet.ll index 462b24c42b1..c0d6e0033dd 100644 --- a/llvm/test/Transforms/ObjCARC/contract-marker-funclet.ll +++ b/llvm/test/Transforms/ObjCARC/contract-marker-funclet.ll @@ -48,8 +48,9 @@ declare dllimport i8* @llvm.objc.retainAutoreleasedReturnValue(i8*) declare dllimport void @llvm.objc.release(i8*) -!clang.arc.retainAutoreleasedReturnValueMarker = !{!0} -!0 = !{!"movl\09%ebp, %ebp\09\09// marker for objc_retainAutoreleaseReturnValue"} +!llvm.module.flags = !{!0} + +!0 = !{i32 1, !"clang.arc.retainAutoreleasedReturnValueMarker", !"movl\09%ebp, %ebp\09\09// marker for objc_retainAutoreleaseReturnValue"} ; CHECK-LABEL: catch ; CHECK: call void asm sideeffect "movl{{.*}}%ebp, %ebp{{.*}}", ""() [ "funclet"(token %1) ] diff --git a/llvm/test/Transforms/ObjCARC/contract-marker.ll b/llvm/test/Transforms/ObjCARC/contract-marker.ll index 6dc93feb045..a93bbe3a290 100644 --- a/llvm/test/Transforms/ObjCARC/contract-marker.ll +++ b/llvm/test/Transforms/ObjCARC/contract-marker.ll @@ -38,8 +38,8 @@ declare i8* @llvm.objc.retainAutoreleasedReturnValue(i8*) declare i8* @llvm.objc.unsafeClaimAutoreleasedReturnValue(i8*) declare void @bar(i8*) -!clang.arc.retainAutoreleasedReturnValueMarker = !{!0} +!llvm.module.flags = !{!0} -!0 = !{!"mov\09r7, r7\09\09@ marker for return value optimization"} +!0 = !{i32 1, !"clang.arc.retainAutoreleasedReturnValueMarker", !"mov\09r7, r7\09\09@ marker for return value optimization"} ; CHECK: attributes [[NUW]] = { nounwind } diff --git a/llvm/test/Transforms/ObjCARC/contract-testcases.ll b/llvm/test/Transforms/ObjCARC/contract-testcases.ll index 57157356d73..b5298023f68 100644 --- a/llvm/test/Transforms/ObjCARC/contract-testcases.ll +++ b/llvm/test/Transforms/ObjCARC/contract-testcases.ll @@ -87,9 +87,9 @@ lpad: ; preds = %entry resume { i8*, i32 } undef } -!clang.arc.retainAutoreleasedReturnValueMarker = !{!0} +!llvm.module.flags = !{!0} -!0 = !{!"mov\09r7, r7\09\09@ marker for objc_retainAutoreleaseReturnValue"} +!0 = !{i32 1, !"clang.arc.retainAutoreleasedReturnValueMarker", !"mov\09r7, r7\09\09@ marker for objc_retainAutoreleaseReturnValue"} ; CHECK: attributes #0 = { optsize } ; CHECK: attributes [[NUW]] = { nounwind } |