프로그램을 실행하지 않고 constexpr 가져 오기
라이브러리 (소스 및 컴파일)가 있고 라이브러리의 일부 유형이 예를 들어 사소하게 복사 가능한지 여부를 알아야하는 프로그램 (이 라이브러리에 연결되지 않음)을 작성 중입니다.
내 프로그램이 file.cpp에 다음을 작성하도록 만들 수 있습니다.
#include "mylibrary.hpp"
int main()
{
std::cout << std::is_trivially_copyable<A>::value << '\n';
std::cout << std::is_trivially_copyable<B>::value << '\n';
std::cout << std::is_trivially_copyable<C>::value << '\n';
std::cout << std::is_trivially_copyable<D>::value << '\n';
}
그런 다음이 코드를 컴파일하고 실행하고 출력을 구문 분석합니다. 이 정보를 얻는 더 좋은 방법이 있습니까? (성능이 중요합니다). libclang이 그렇게 할 수 있습니까?
댓글로 인해 업데이트 :
XY 문제와 관련하여 : 내가하려는 것은 rust에 프로그램 (rust-bindgen이라고 함)을 작성하는 것입니다.이 프로그램은 C ++ 헤더 파일의 경로를 am 인수로 가져와 해당 헤더 파일에 대한 rust-c ++ 바인딩을 생성합니다. 유형이 사소하게 복사 가능 / 재배치 가능한지 여부에 따라 바인딩을 다르게 생성해야합니다.
따라서 C ++ 헤더 파일의 경로가 있고 해당 헤더 파일에 정의 된 지정된 유형이 간단하게 복사 가능한지 여부를 알아야합니다. 위의 접근 방식은 작동하지만 file.cpp를 컴파일하기 때문에 느립니다.
TLDR : 두 문자열을 인수로 사용하고 bool을 반환하는 빠른 rust 함수를 어떻게 작성할 수 있습니까? 첫 번째 문자열은 C ++ 헤더 파일의 경로이고 두 번째 문자열은 해당 헤더 파일에 정의 된 유형의 이름입니다. 형식이 사소하게 복사 가능한지 여부를 나타내는 부울을 반환해야합니다.
답변
최소한 IR로 코드를 컴파일해야합니다. 이는 C ++ 클래스의 사소함이 입력에 플랫폼 속성, 사용 가능한 헤더, 전 처리기 정의, 컴파일러 옵션 등을 포함 할 수있는 임의의 복잡한 계산에 의존 할 수 있으므로 C ++ 컴파일러에 의해서만 수행 될 수 있기 때문입니다.
clang을 바이너리로 호출하는 경우 IR을 내보내는 옵션 clang -S -emit-llvm
은 다음과 같습니다. 그러면 LLVM IR 출력을 구문 분석 할 수 있습니다. 예를 들어
#include <type_traits>
struct A {};
struct B { B(B const&); };
struct C { ~C(); };
struct D { D(D const&) = default; };
int a = std::is_trivially_copyable<A>::value;
int b = std::is_trivially_copyable<B>::value;
int c = std::is_trivially_copyable<C>::value;
int d = std::is_trivially_copyable<D>::value;
IR은 다음과 같습니다.
@a = dso_local local_unnamed_addr global i32 1, align 4, !dbg !0
@b = dso_local local_unnamed_addr global i32 0, align 4, !dbg !6
@c = dso_local local_unnamed_addr global i32 0, align 4, !dbg !10
@d = dso_local local_unnamed_addr global i32 1, align 4, !dbg !12
^ variable name ^ initializer
libclang을 사용 하려면 GlobalVariable 정의를 추출 할 수 있는 모듈 을 제공하는 EmitLLVMOnlyAction 을 호출해야합니다 . 참조 : LLVM IR 생성 방법