Функция, которая ломается, является ObjCARCOpt::runOnFunction(llvm::Function&)
. Просто для смеха, я разместил код runOnFunction () ниже. Цель этой функции - оптимизировать объектный код, связанный с ARC, в передаваемом объекте llvm::Function
. Это нормально, но, похоже, в компиляторе есть ошибка, связанная с обработкой в Objective-C ++, что, откровенно говоря, не удивляет я.
Отчеты об ошибках уже отправлены в Apple ( здесь , здесь , возможно, в других местах). Вы тоже должны сообщить об этом.
До этого я мог бы предложить несколько вещей.
1) Поскольку проблема временная, просто продолжайте свой проект. Это может сработать для вас, а может и нет. В конце концов, компиляторы должны быть детерминированными ...
2) Попробуйте отключить ARC для вашего Obj-C ++. Это, наверное, самый простой способ.
3) Отключить оптимизацию ARC. Сделайте это, пропустив -enable-objc-arc-opts
из вашей сборки. Как это сделать с помощью настроек сборки XCode оставлено в качестве упражнения для читателя. В любом случае, я думаю, что ваша лучшая ставка - 2).
Код от llvm-3.0.src/lib/Transforms/Scalar/ObjCARC.cpp
ниже. Лучше всего выйти на if (!Run) return false;
. Run
будет ложным, если ARC отключен в анализируемом модуле. Удачи, не забудьте отправить отчет об ошибке!
bool ObjCARCOpt::runOnFunction(Function &F) {
if (!EnableARCOpts)
return false;
// If nothing in the Module uses ARC, don't do anything.
if (!Run)
return false;
Changed = false;
PA.setAA(&getAnalysis<AliasAnalysis>());
// This pass performs several distinct transformations. As a compile-time aid
// when compiling code that isn't ObjC, skip these if the relevant ObjC
// library functions aren't declared.
// Preliminary optimizations. This also computs UsedInThisFunction.
OptimizeIndividualCalls(F);
// Optimizations for weak pointers.
if (UsedInThisFunction & ((1 << IC_LoadWeak) |
(1 << IC_LoadWeakRetained) |
(1 << IC_StoreWeak) |
(1 << IC_InitWeak) |
(1 << IC_CopyWeak) |
(1 << IC_MoveWeak) |
(1 << IC_DestroyWeak)))
OptimizeWeakCalls(F);
// Optimizations for retain+release pairs.
if (UsedInThisFunction & ((1 << IC_Retain) |
(1 << IC_RetainRV) |
(1 << IC_RetainBlock)))
if (UsedInThisFunction & (1 << IC_Release))
// Run OptimizeSequences until it either stops making changes or
// no retain+release pair nesting is detected.
while (OptimizeSequences(F)) {}
// Optimizations if objc_autorelease is used.
if (UsedInThisFunction &
((1 << IC_Autorelease) | (1 << IC_AutoreleaseRV)))
OptimizeReturns(F);
return Changed;
}