summaryrefslogtreecommitdiffstats
path: root/llvm/lib/IR/AutoUpgrade.cpp
diff options
context:
space:
mode:
authorAkira Hatanaka <ahatanaka@apple.com>2019-04-10 06:20:20 +0000
committerAkira Hatanaka <ahatanaka@apple.com>2019-04-10 06:20:20 +0000
commit9ca9d32b6be038debc6fda9c16a5f95b59e9b806 (patch)
tree1c85ba4ddb65ada984e304eb1ec9f928134a7412 /llvm/lib/IR/AutoUpgrade.cpp
parent391d5caa106007daaa1ae0bf8214f9020f40a8b5 (diff)
downloadbcm5719-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
Diffstat (limited to 'llvm/lib/IR/AutoUpgrade.cpp')
-rw-r--r--llvm/lib/IR/AutoUpgrade.cpp12
1 files changed, 6 insertions, 6 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;
}
}
}
OpenPOWER on IntegriCloud