명백한 이유로 C 컴파일러는 플랫폼의 호출 규칙 및 기타 ABI 요구 사항을 준수하도록 다른 공유 라이브러리에서 외부에서 볼 수있는 모든 함수를 컴파일해야합니다. 그러나 필자는 외부 모듈에서 절대 호출 할 수없는 기능을 위해 반드시 그렇게 할 필요는 없다는 것을 배웠습니다.C 컴파일러는 호출 규칙을 무시할 수 있습니까?
컴파일러가 해당 함수에 대해 true인지 여부를 어떻게 그리고 언제 결정할 수 있습니까?
정적 함수는 동일한 컴파일 단위의 다른 함수에서만 볼 수 있으므로 이러한 ABI- 위반 최적화에 적합한 후보가됩니다. 그러나 정적 함수에 대한 함수 포인터는 여전히 다른 모듈로 전달 될 수 있습니다. 컴파일러는 함수 포인터가 코드의 아무 곳이나 전달되는지 확인하려고합니까?
gcc 컴파일러에는 심볼을 기본값, 숨김 또는 내부로 선언 할 수있는 some extensions이 있으며 설명서에는이 정보를 사용하여 외부에서 볼 수있는 funcitons에서는 불가능했던 몇 가지 종류의 최적화를 수행 할 수 있다고 명시되어 있습니다. 함수 포인터가 내부 코드로 주석 처리 된 함수의 외부 코드에 전달되면 어떻게됩니까?
다른 라이브러리와의 상호 운용성을 보장하면서 가능한 한 많은 최적화를 수행하는 데 도움이되는 가장 좋은 방법은 무엇입니까? 컴파일러 옵션을 사용하여 모든 함수를 내부로 정의하고 외부에서 표시해야하는 모든 함수의 특성으로 재정의해야합니까?
일부 ARM 시스템에서는 부동 소수점 값이 다른 매개 변수와 동일한 방식으로 전달 될 것으로 예상되는 코드와 FP 레지스터에서 호환성 문제가있을 수 있습니다. 그것이 함수 포인터가 아니라면, FPU를 사용하는 코드를 생성하는 컴파일러가 FPU 레지스터를 사용하는 맹 글링 된 이름을 가진 함수 버전을 생성하고, "weakly-linked"래퍼가 일반 매개 변수를 FPU 레지스터에 복사하고 변형 된 버전을 호출하는 un-mangled 이름입니다. – supercat
FPU를 사용하고 FPU 레지스터 버전을 호출하려는 컴파일러 proudicng 코드는 변환 된 이름 버전에 대한 호출을 생성하고 FPU 레지스터를 일반 매개 변수에 복사하고 비 맹 글링 버전을 호출하는 약 링크 된 래퍼를 생성합니다 . 이렇게하면 호출자와 호출 된 코드 FPU 사용간에 "보편적 인"동작이 허용됩니다. 함수 포인터에 관해서는, 나는 ABI 분산의 문제를 피할 수 있다고 생각한다. "특별히"선언하지 않는 한 그들은 항상 가장 기본적인 ABI를 사용하는 방법을 가리킨다. 그게 효과가있는 것 같습니까? – supercat