2016-06-12 6 views
5

스트레이트 포인트 - 두 개 이상의 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에서) 등으로 정의된다 :

이 기능은 모듈 A를 선언하고 C. 지금, 모든 것이 잘 보인다 좋은
define i1 @_ZN9Character7hasDataEv(%Character*) { } 

-이 기능이 두 모듈 A에서 호출되고 3 개 모듈을 서로 연결하면, 뭔가가 이러한 유형에 발생합니다 :

    %21 = call i1 @_ZN9Character7hasDataEv(%Character* %4) 
    
    여기

    문제가 온다 : C, 그리고 IR은과 같이, 정상 보인다

  1. 그들은 이름이 없으므로 %2 (%String) 및 %3 (%Character)이됩니다.
  2. 그들은 함께 병합 된 것처럼 보입니다. 이러한 전환은 두 모듈 A 및 C에서 발생하는 동안

이상하게 버그은 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 그런 버그는 없습니다.

감사 ...?

+0

모든 최적화를 사용하지 않으려 했습니까? 다른 최적화를 사용하면 차이가 있습니까? 이상한 오류가 발생하는 경우 가장 먼저 의심되는 점은 최적화 과정에서 코드가 엉망입니다. – user2600312

+0

모든 최적화 과정을 사용 중지했습니다. 나는 해결책을 찾았고, 나는 그것을 질문으로 편집 할 것이다. – zhiayang

답변

1

좋아요, llvm IRC 채널에서 일부 파고 들자 llvm :: Linker는 빈 모듈 인 llvm :: Module을 시작 모듈로 사용하기 위해 만들어졌습니다.

또한 나의 유스 케이스에서 나는 함께 링크하는 다른 모듈에 걸쳐 동일한 llvm :: Type (메모리의 실제 내용)을 재사용하고있다. 그들은 불법이 아니라고 말했지만 결코 테스트되지 않았습니다. ...

그래서 어쨌든, 빈 모듈로 시작하여 링커에 전달하면 문제가 해결되었습니다. .