diff options
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Bitcode/Reader/BitcodeReader.cpp | 3 | ||||
-rw-r--r-- | llvm/lib/IR/AutoUpgrade.cpp | 24 |
2 files changed, 27 insertions, 0 deletions
diff --git a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp index 75374e7bef3..1a65cee0bf9 100644 --- a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp @@ -4788,6 +4788,9 @@ Error BitcodeReader::materializeModule() { UpgradeDebugInfo(*TheModule); UpgradeModuleFlags(*TheModule); + + UpgradeRetainReleaseMarker(*TheModule); + return Error::success(); } diff --git a/llvm/lib/IR/AutoUpgrade.cpp b/llvm/lib/IR/AutoUpgrade.cpp index 0cf28c9fd22..1c0a3195a75 100644 --- a/llvm/lib/IR/AutoUpgrade.cpp +++ b/llvm/lib/IR/AutoUpgrade.cpp @@ -2685,6 +2685,30 @@ bool llvm::UpgradeDebugInfo(Module &M) { return Modified; } +bool llvm::UpgradeRetainReleaseMarker(Module &M) { + bool Changed = false; + NamedMDNode *ModRetainReleaseMarker = + M.getNamedMetadata("clang.arc.retainAutoreleasedReturnValueMarker"); + if (ModRetainReleaseMarker) { + MDNode *Op = ModRetainReleaseMarker->getOperand(0); + if (Op) { + MDString *ID = dyn_cast_or_null<MDString>(Op->getOperand(0)); + if (ID) { + SmallVector<StringRef, 4> ValueComp; + 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; + } + } + } + } + return Changed; +} + bool llvm::UpgradeModuleFlags(Module &M) { NamedMDNode *ModFlags = M.getModuleFlagsMetadata(); if (!ModFlags) |