2017-11-25 10 views

답변

1

약간의 연구 끝에 타겟 중립적 언어 인 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 연산자를 사용할 수를 적응


.

이렇게하면 모듈 통과가 구축 된 플랫폼에서 정수 유형에 맞는 크기를 사용할 수 있습니다.

패스가 실행되는 플랫폼에서 유형의 크기를 '동적으로'감지하려면 일종의 구성 파일에 해당 정보를 제공하는 것 외에 다른 방법이 없습니다.

그러나 이것은 다양한 빌드 시스템 (예 : cmakeLLVM에 의해 사용됨)의 예를 사용하여 자동화 할 수 있으며, 컴파일하고 자동화 할 수있는 간단한 프로그램을 만들 수 있습니다.

가능한 한 이식성을 높이고 휠을 다시 만들지 않으려면 cmakeCheckTypeSize 모듈을 사용할 수 있습니다.

+0

나는 그것이 옳은 대답이라고 생각하지 않습니다. 적절한 솔루션은 TargetMachine 또는 이와 비슷한 것을 사용하여 유형 크기를 알아 내야합니다. – arrowd

+0

@arrowd 사실이며'llvm :: DataLayout'을 포함하는 해결책을 찾았지만'''size_t'''는 LLVM IR에 알려지지 않았기 때문에 문제가 지속됩니다. 그 시점에서 끝내라. – compor

+0

당신은 트리플 또는 포인터 크기에 따라 그것을 추측해야한다고 생각합니다. – arrowd