[IR] Upgrade comment token in objc retain release marker

Older compiler issued '#' instead of ';'

llvm-svn: 329248
This commit is contained in:
Gerolf Hoflehner 2018-04-05 02:44:46 +00:00
parent 8549095eb0
commit f0bf89b366
5 changed files with 37 additions and 0 deletions

View File

@ -51,6 +51,10 @@ namespace llvm {
/// module is modified.
bool UpgradeModuleFlags(Module &M);
/// This checks for objc retain release marker which should be upgraded. It
/// returns true if module is modified.
bool UpgradeRetainReleaseMarker(Module &M);
void UpgradeSectionAttributes(Module &M);
/// If the given TBAA tag uses the scalar TBAA format, create a new node

View File

@ -4788,6 +4788,9 @@ Error BitcodeReader::materializeModule() {
UpgradeDebugInfo(*TheModule);
UpgradeModuleFlags(*TheModule);
UpgradeRetainReleaseMarker(*TheModule);
return Error::success();
}

View File

@ -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)

View File

@ -0,0 +1,6 @@
; Test that comment token for objc retain release is upgraded from '#' to ';'
;
; RUN: llvm-dis < %s.bc | FileCheck %s
; CHECK: "mov\09fp, fp\09\09; marker for objc_retainAutoreleaseReturnValue"

Binary file not shown.