2016-08-02 7 views
1

나는 llvm :: Value를 가지고 있습니다. 값 : 덤프(),LLVM : 사용 된 유형을 찾는 방법은 무엇입니까?

보통
void (...)* bitcast (void()* @test_impl to void (...)*) 

나는 이것이 BitCastOperator이라고 가정 것이다, 그러나,이 클래스는 내가 사용하고 LLVM 3.4.2 (존재하지 않는 것 인쇄 도구 중 하나 때문에 I 와 함께 일하는 것은 아직 새로운 버전으로 이식되지 않았다).

Value의 하위 클래스는 무엇입니까? 그리고 앞으로 이러한 질문에 어떻게 대답 할 수 있습니까? 나는 시도했다 :

  • lldb로 디버깅. 이 클래스는 최상위 클래스 만 알 수 있습니다.
  • rtti 정보에 액세스 중입니다. LLVM은 typeid()와 호환되지 않으며 typeid()와 동등한 자체 RTTI 시스템을 갖고있는 것 같습니다.
  • C++ API 코드로 컴파일하면이 값을 만드는 방법을 알 수 있으며이 형식을 볼 수 있습니다. 그러나 llc -march = cpp는 모호한 오류 (잘못된 기본 유형)로 실패하고 clang -march = cpp는이 아키텍처를 알 수 없다고 말합니다. 나는 clang --version과 llc --version이 같은 버전 번호를 부여한다는 것을 확인했다.
  • dyn_cast가 작동하지 않기 때문에 BitCastInst가 아닌 것으로 확인되었습니다. 이 값의 어떤 서브 클래스

답변

1
void (...)* bitcast (void()* @test_impl to void (...)*) 

입니까?

constant expression이며, 구체적으로는 ConstantExpr 클래스로 표시되는 비트 캐스트 상수 표현식입니다. opcode는 ConstantExpr::getOpcode을 사용하거나 문자열 표현은 ConstantExpr::getOpcodeName을 사용하여 가져올 수 있습니다.

bitcast

변환 (CST 입력까지) 상수 CST, 또 다른 유형이다. 피연산자의 제약 조건은 비트 캐 스트 명령어의 제약 조건과 동일합니다.

일반적으로이 경우와 같이 상수 피연산자에 적용되는 일부 opcode가 표시되면 (bitcast (void()* %1 to void(...)*); glovals 변수가 상수 임) 상수 표현식을 먼저 생각해야합니다. 나는 constexpr 카운터 파트가 존재할 때 상수 피연산자로 참 IR 명령을 만드는 간단한 방법이 없다고 생각합니다.

그리고 앞으로 이러한 질문에 어떻게 답할 수 있습니까?

llvm::isallvm::dynamic_cast을 사용할 수 있습니다. 디버깅하는 동안 Value::getValueID도 매우 유용합니다. CPPBackend이 얼마 동안 업데이트되지 않았습니다 최근 removed을하고있다 :

llc -march=cpp는 모호한 오류

사이드 메모와 함께 실패합니다. 나는 그것이 효과가 없었던 것이 놀랄 일이 아니다.