我在Xcode(4.5.2)中有一個使用Debug配置生成良好的項目。但是,現在我已經切換到構建Release配置,我遇到了一個問題:我的一個內聯彙編函數出現錯誤Invalid symbol redefinition
。用谷歌搜索那個錯誤信息發現我有幾個人得到了編譯器錯誤,但沒有關於它的含義的信息。這裏的功能,帶註釋的錯誤行:LLVM上的內聯ASM中的「無效的符號重定義」
inline int MulDivAdd(int nNumber,
int nNumerator,
int nDenominator,
int nToAdd)
{
int nRet;
__asm__ __volatile__ (
"mov %4, %%ecx \n"
"mov %1, %%eax \n"
"mull %2 \n"
"cmp $0, %%ecx \n"
"jl __sub \n"
"addl %%ecx, %%eax \n"
"adc $0, %%edx \n"
"jmp __div \n"
"__sub: \n" // "Invalid symbol redefinition"
"neg %%ecx \n"
"subl %%ecx, %%eax \n"
"sbb $0, %%edx \n"
"__div: \n" // "Invalid symbol redefinition"
"divl %3 \n"
"mov %%eax, %0 \n"
: "=m" (nRet)
: "m" (nNumber),
"m" (nNumerator),
"m" (nDenominator),
"m" (nToAdd)
: "eax", "ecx", "edx"
);
return nRet;
}
我試着__sbt
更換__sub
,因爲我認爲__sub
可能是一個受保護的名字,但事實並非如此。我不明白爲什麼這隻發生在發佈雖然 - 可能是由於優化?
如果你用C編寫(使用'int64_t'),你會得到更好的代碼。該分支是完全不必要的(它應該是一個符號擴展和添加)。我也對使用帶符號數據的無符號乘法指令('mull')感到困擾。雖然對於有問題的程序可能無關緊要,但這可能是一個錯誤。 –
@StephenCanon那麼這個俏皮話是如何與這個問題相關的呢? –