2017-01-09 1 views
0

저는 장난감 프로그램에서 테스트 한 바 있습니다. 이제는 대형 프로그램에서 실행하고 싶습니다. 많은 프로그램은 memcached와 같은 오픈 소스 프로그램입니다. 이러한 프로그램에는 자체 Makefile과 복잡한 컴파일 절차가 있습니다. 이러한 프로그램에 대한 비트 코드 파일을 생성하여 내 패스를 처리하려고합니다. 도움과 제안을 부탁드립니다!많은 소스 코드 파일과 거대한 Makefile (예 : memcached)이있는 대형 프로그램 용 llvm 비트 코드를 생성하는 방법은 무엇입니까?

답변

1

당신이 수하고있다 :

  • LTO 빌드 다음 CFLAGS에 -flto 추가하고 자신의 내장 링커 플러그인을 사용하여 응용 프로그램을 빌드는 빌드 시스템의 관점에서 매우 원활 보기의. 그러나 LTO를 설정하는 방법에 대해 어느 정도 이해해야합니다.
  • 자신의 빌드 clang으로 빌드 : 패스를 정적으로 LLVM 파이프 라인에 추가하고 자신 만의 clang을 사용하십시오. 빌드 시스템에 따라 설치된 clang을 가리키는 CC/CXX 환경 변수를 내 보내면 충분합니다.
  • 패스를 동적으로로드하여 빌드하십시오. 예를 들어 Polly은 (선택 사항) 수행합니다.
+0

고마워요 조키! 그래서이 세 가지 옵션 중 하나를 수행해야합니까? 처음 2 가지 옵션에 대한 기존 예제가 있습니까? –

+0

그렇게 생각하지는 않지만 옵션 2는 설치하기 어렵지 않습니다. 패스가있는 경우 PassManagerBuilder.cpp의 올바른 위치에 추가하고 clang을 빌드하십시오. – Joky

+0

그래서 내가 한 것은 Makefile을 편집하고 gcc/g ++를 대체 할 clang과 관련 플래그를 넣는 것입니다. 따라서 코드에서 패스가 작동합니다. 내 패스는 함수 호출을 추가하여 프로그램을 호출하고 그 함수는 다른 .c 파일에 있습니다. 하지만 clang에서 정의되지 않은 참조 오류가 발생합니다. 이 문제는 여기에 게시했습니다 : http://stackoverflow.com/questions/41650417/clang-linking-error-undefined-reference-to-function-calls-added-by-llvm-pass 보세요. 정말 고맙습니다! –

0

clim 플래그에 -emit-llvm을 추가하면 어셈블리 대신 개체 파일이나 LL 파일 대신 BC 파일이 방출됩니다.

올바른 방향으로 시작해야하는 경우 makefile을 조금 더 수정해야 할 것입니다. 당신이 통과하는지에 따라

+0

답장을 보내 주셔서 감사합니다. 그래서 내가 그 프로그램의 기존 Makefile을 수정하고 bcc 플래그로 gcc를 clang으로 수동으로 대체해야한다고 생각한다. 기존 도구가 있습니까? –

관련 문제