2013-07-31 2 views
0

연타는 LLVM 적외선의 구체적인 종류를 정의하는 다음 방식을 사용 scheme이 사용 된 경우 :세그멘테이션 폴트

%0 = load %"mytype"** %this 
%1 = bitcast %"mytype"* %0 to i32 (%"mytype"*)*** 
%vtable = load i32 (%"mytype"*)*** %1 
%method = getelementptr inbounds i32 (%"mytype"*)** %vtable, i64 0 (index of f() in vt) 
%ld = load i32 (%"mytype"*)** %method 
%call = call i32 (%"mytype"*)* %ld (%"mytype"* %0) 

그러나 다음 스키마가 대신 사용되면 seg fault를 방지하기 위해 위의 코드에서 무엇을 변경해야합니까?

%1 = bitcast %"mytype"* %0 to i32 (%"mytype"*)*** 

대신 객체의 끝에 vptr에서 배치하면 :

%"mytype" = type {field_types, super_types, virtual_method_types} 

답변

0

이 줄은 vptr에서 (가상 테이블에 대한 포인터) 인 객체의 시작 포인터를 가져옵니다 이 코드는 %0extractvalue을 사용하여 vptr의 올바른 위치 (또는 은 %this에 포인터를 가져 오지만 어쨌든 %this을로드해야하므로 실제로 도움이되지 않습니다)로 포인터를 변경해야합니다. 예를 들어 vptr이 %"mytype"의 12 번째 입력란 인 경우 다음과 같이 입력해야합니다.

%1 = extractvalue %"mytype" %0, 12