clang을 llvm IR로 컴파일하는 방법
C/C++ 코드를 바이너리 실행 파일이 아닌 LLVM 비트 코드로 컴파일하고 싶습니다.어떻게 하면 좋을까요?
LLVM 비트코드가 있는 경우 어떻게 하면 바이너리 실행 파일로 컴파일할 수 있을까요?
바이너리 실행 파일로 컴파일하기 전에 자체 코드를 LLVM 비트코드에 추가하고 싶습니다.
특정 C/C++ 파일foo.c
:
> clang -S -emit-llvm foo.c
생산하다foo.ll
LLVM IR 파일입니다.
그-emit-llvm
옵션을 컴파일러 프런트 엔드에 직접 전달할 수도 있습니다.-cc1
:
> clang -cc1 foo.c -emit-llvm
생산하다foo.ll
IR과 함께. -cc1
다음과 같은 쿨한 옵션이 추가되어 있습니다.-ast-print
. 체크 아웃-cc1 --help
자세한 것은, 을 참조해 주세요.
LLVM IR을 어셈블리로 컴파일하려면llc
도구:
> llc foo.ll
생산하다foo.s
(어셈블리를 실행하는 머신아키텍처가 디폴트로 되어 있습니다). llc
는 LLVM 툴의1개입니다.이 문서는 다음과 같습니다.
파일이 여러 개 있고 각 파일을 입력할 필요가 없다면 다음 간단한 절차를 따를 것을 권장합니다.clang-3.8
다른 버전을 사용할 수 있습니다).
모두 생성하다
.ll
파일clang-3.8 -S -emit-llvm *.c
그것들을 하나로 연결하다
llvm-link-3.8 -S -v -o single.ll *.ll
(옵션) 코드를 최적화합니다(일부 에일리어스 분석).
opt-3.8 -S -O3 -aa -basicaaa -tbaa -licm single.ll -o optimised.ll
어셈블리 생성(a 생성)
optimised.s
파일)llc-3.8 optimised.ll
실행 파일 생성(이름 지정)
a.out
)clang-3.8 optimised.s
소스 파일이 여러 개 있는 경우 링크 시간 최적화를 사용하여 프로그램 전체에 대해1개의 비트 코드파일을 출력하는 것이 좋습니다.그 외의 회답은, 모든 소스 파일의 비트 코드 파일이 됩니다.
대신 link-time-optimization을 사용하여 컴파일합니다.
clang -flto -c program1.c -o program1.o
clang -flto -c program2.c -o program2.o
그리고 마지막 링크 단계에 -Wl,-plugin-opt=also-emit-llvm 인수를 추가합니다.
clang -flto -Wl,-plugin-opt=also-emit-llvm program1.o program2.o -o program
이를 통해 컴파일된 프로그램과 이에 대응하는 비트코드(program.bc)가 제공됩니다.그런 다음 원하는 방식으로 program.bc를 수정하고 언제든지 수정한 프로그램을 다시 컴파일할 수 있습니다.
clang program.bc -o program
단, 이 단계에서 필요한 링커플래그(외부 라이브러리 등)를 다시 포함해야 합니다.
이 기능을 사용하려면 골드링커를 사용해야 합니다.특정 링커를 강제로 사용하려면 컴퓨터 어딘가에 있는 "fakebin"이라는 특수 디렉터리에 "ld"라는 이름의 링커에 대한 심볼 링크를 만들고 옵션을 추가하십시오.
-B/home/jeremy/fakebin
위의 링크 스텝으로 이동합니다.
사용하다
clang -emit-llvm -o foo.bc -c foo.c
clang -o foo foo.bc
문서 읽어보셨어요?당신은 아마 당신이 찾고 있을 것이다.-emit-llvm
.
언급URL : https://stackoverflow.com/questions/9148890/how-to-make-clang-compile-to-llvm-ir
'programing' 카테고리의 다른 글
VueJs - 테이블 페이지 표시 및 필터 (0) | 2022.08.23 |
---|---|
줄 바꿈의 세미콜론을 대체하는 메서드를 작성하려면 어떻게 해야 합니까? (0) | 2022.08.23 |
C 코드에서 C++ 라이브러리 사용 (0) | 2022.08.16 |
Vue의 'this' 키워드 이해 (0) | 2022.08.16 |
Vuejs에서 Axios 메서드 글로벌 가져오기 (0) | 2022.08.16 |