시스템에서 제공하는 기능에 함수 선언을 추가하려고했습니다.
그러나 함수 프로토 타입은 size_t
을 반환합니다. 이는 32 비트 플랫폼에서는 int32이고 64 비트 플랫폼에서는 int64입니다.
대상 플랫폼을 감지하고 이에 따라 선언을 추가하는 방법이 있는지 알고 싶습니다.LLVM 통과에서 플랫폼 특정 함수 정의를 추가하는 방법은 무엇입니까?
답변
약간의 연구 끝에 타겟 중립적 언어 인 LLVM IR
은 타겟 특정 유형 크기를 알 수 없습니다. Chris Lattner가 주제에 대해 언급 한 this 관련 토론을 살펴보십시오. 또한 this 관련 SO 질문.
이것은 프론트 엔드의 작업이며 프런트 엔드가 대상과 해당 ABI를 "알아야"하는 추가 부기 정보를 유발합니다. 예를 들어 Loci 프로그래밍 언어의 경우 this과 같은 프로젝트가 필요할 수 있습니다. this 따른 size_t
하기위한 구체적
:
[...]
std::size_t
안전하게std::uintptr_t
가 대명사 경우에 비 부재 포인터의 값을 저장할 수있다.
따라서 DataLayout
클래스의 getIntPtrType
메서드를 사용할 수 있습니다.
다른 데이터 유형의 경우 "추측"을 얻을 수 있는지 여부는 확실하지 않습니다 (이전 참조에서 매우 멀지 않은 것으로 판단 할 수 있음).
마지막으로 또 다른 대안은 사용자 지정 내장 함수 (예 : memcpy
참조)가있는 extendingLLVM
일 수 있으며, 이는 필연적으로 대상 당 특정 정의를 거쳐야합니다. 실제로 정수형 만들기 당신이 getIntNType
호출 비트의 정확한 수를 제공하기 위해, CHAR_BIT
의 사용과 함께 sizeof
연산자를 사용할 수를 적응
.
이렇게하면 모듈 통과가 구축 된 플랫폼에서 정수 유형에 맞는 크기를 사용할 수 있습니다.
패스가 실행되는 플랫폼에서 유형의 크기를 '동적으로'감지하려면 일종의 구성 파일에 해당 정보를 제공하는 것 외에 다른 방법이 없습니다.
그러나 이것은 다양한 빌드 시스템 (예 : cmake
도 LLVM
에 의해 사용됨)의 예를 사용하여 자동화 할 수 있으며, 컴파일하고 자동화 할 수있는 간단한 프로그램을 만들 수 있습니다.
가능한 한 이식성을 높이고 휠을 다시 만들지 않으려면
cmake
의
CheckTypeSize
모듈을 사용할 수 있습니다.
나는 그것이 옳은 대답이라고 생각하지 않습니다. 적절한 솔루션은 TargetMachine 또는 이와 비슷한 것을 사용하여 유형 크기를 알아 내야합니다. – arrowd
@arrowd 사실이며'llvm :: DataLayout'을 포함하는 해결책을 찾았지만'''size_t'''는 LLVM IR에 알려지지 않았기 때문에 문제가 지속됩니다. 그 시점에서 끝내라. – compor
당신은 트리플 또는 포인터 크기에 따라 그것을 추측해야한다고 생각합니다. – arrowd