디버그 구성을 사용하여 문제가없는 Xcode (4.5.2) 프로젝트가 있습니다. 그러나 이제 릴리스 구성을 작성하기 위해 문제가 발생했습니다. 즉, 인라인 어셈블리 함수 중 하나가 오류 Invalid symbol redefinition
을 얻는 중입니다. 그 오류 메시지를 검색하는 것은 저에게 컴파일러 오류가있는 사람을 찾았지 만 그것이 의미하는 바에 관한 정보는 없습니다. 내가 __sub
보호 된 이름이 될 거라고 생각하기 때문에 __sbt
와 __sub
를 대체하려고했습니다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;
}
하지만이 사건이 아니었다 다음은 기능은 주석 오류 라인,이다. 왜 이것이 릴리스에서만 발생하는지 이해하지 못합니다 - 최적화로 인한 것일 수 있습니까? 같은 1:
및 2:
및 jxx 1f
또는 jxx 1b
같은
C로 작성하면 ('int64_t'를 사용하면) 더 나은 codegen을 얻을 수 있습니다. 분기는 완전히 불필요합니다 (부호 확장 및 추가가되어야합니다). 또한 서명 된 데이터와 함께 부호없는 곱하기 명령어 ('mull')를 사용하면 문제가 발생합니다. 문제의 프로그램에 대해서는 중요하지 않지만 아마 버그 일 것입니다. –
@StephenCanon 그래서이 wisecracking 질문에 관련이 있습니까? –