2014-03-24 1 views
1

더 디버깅 가능한 상태로 seabios를 컴파일하려고하므로 인라인 함수를 취소하고 싶습니다.왜 cant seabios가 -fno-inline으로 컴파일합니까

이렇게하려면, 나는 -fon 인라인 컴파일 플래그를 추가했지만 그때 컴파일 오류가 발생합니다 :

asm volatile(
    "calll __call16big_from32" 
    : "+a" (callregs), "+m" (*callregs) 
    : 
    : "ebx", "ecx", "edx", "esi", "edi", "cc", "memory"); 

I : 다음 코드에 complaning됩니다

error: can't find a register in class 'GENERAL_REGS' while reloading 'asm' 

이 오류를 보았는데 컴파일러가 레지스터를 다 써 버렸기 때문에 asm 문을 컴파일 할 수 없다는 것을 알게되었습니다.

사실 똑같은 코드가 -fon-inline없이 잘 컴파일됩니다. 그 이유는 무엇입니까?

답변

0

asm의 첫 번째 인수는 첫 번째 인수가 수정되어 두 번째 주소와 레지스터를 공유하지 못할 수 있습니다. 함수가 인라인 된 경우 callregs는 스택 포인터에서 상수 또는 오프셋이 될 수 있으므로 별도의 레지스터가 필요하지 않습니다.

휘발성 메모리와 "메모리"가 있고 이에 대한 참조가 없으면 두 번째 인수가 제거 될 수 있습니다.

+0

하지만 callregs가 부모 함수에서 esp (또는 상수, 나는 그게 중요하지 않음)로부터의 오프셋 인 경우,이 함수에도 인수로 전달되어야하므로 여전히 그대로 유지됩니다. esp로부터의 오프셋, 그리고 추가 레지스터가 필요하지 않습니다. – buc030

관련 문제