스트레이트 포인트 - 두 개 이상의 llvm 모듈을 연결하려고하는데 LLVM과 관련하여 이상한 오류가 있습니다.링크 할 때 LLVM IR 유형이 잘못 붕괴되었습니다 (C++ API)
너무 많은 코드를 게시하고 싶지 않으므로 여기서 의사를 사용하겠습니다.
저는 3 개의 모듈을 가지고 있습니다. A, B, C라고 가정 해 봅니다. A가 기본 모듈입니다. 나는 그것으로 llvm::Linker
을 초기화한다. B와 C는 2 차 모듈입니다. linker.linkInModule(B and C)
으로 전화합니다.
모든 3 모듈은, 무엇보다도,이 두 가지 유형의 정의 : 그들은 같은 멤버 유형이
%String = type { i8*, i64 }
%Character = type { i8*, i64 }
하는 것으로. 또한, 기능 foo
가 (모듈 B에서) 등으로 정의된다 :
define i1 @_ZN9Character7hasDataEv(%Character*) { }
-이 기능이 두 모듈 A에서 호출되고 3 개 모듈을 서로 연결하면, 뭔가가 이러한 유형에 발생합니다 :
-
를
- 그들은 이름이 없으므로
%2
(%String
) 및%3
(%Character
)이됩니다. - 그들은 함께 병합 된 것처럼 보입니다. 이러한 전환은 두 모듈 A 및 C에서 발생하는 동안
%21 = call i1 @_ZN9Character7hasDataEv(%Character* %4)
여기
문제가 온다 : C, 그리고 IR은과 같이, 정상 보인다
이상하게 버그은 C에서 발생 -있는 소위 "메인"모듈에 참고.
링크 된 파일의 함수 정의는 %Character
, 또는 %3
이 %2
으로되어있어 어떻게 지금
define i1 @_ZN9Character7hasDataEv(%2*)
주입니다. 또한, 아마도하기 위해 어떤 유형을 해제 병합 callsite에,에,이 얻을 : 함수가 %3 (%2*)
에 i1 (%2*)
에서 주조되었지만, 호기심
%10 = call i1 bitcast (i1 (%2*)* @_ZN9Character7hasDataEv to i1 (%3*)*)(%2* %2)
을 통과 인수 (. ARG 1) 여전히 %2
유형입니다. 무슨 일이야?
모듈 A에서 진행중인 모든 작업이 올바르게 수행되고 오류가 없음을 유의하십시오. 이 기능의 번호를 발생,하지만 모듈 C.에
나는 .ll
파일에 복사 붙여 넣기 이러한하여 재생 및 llvm-dis
다음 llvm-link
를 호출하려고했지만, 1 유형은 통합되지 않으며, 2 그런 버그는 없습니다.
감사 ...?
모든 최적화를 사용하지 않으려 했습니까? 다른 최적화를 사용하면 차이가 있습니까? 이상한 오류가 발생하는 경우 가장 먼저 의심되는 점은 최적화 과정에서 코드가 엉망입니다. – user2600312
모든 최적화 과정을 사용 중지했습니다. 나는 해결책을 찾았고, 나는 그것을 질문으로 편집 할 것이다. – zhiayang