programing

clang을 llvm IR로 컴파일하는 방법

shortcode 2022. 8. 16. 21:45
반응형

clang을 llvm IR로 컴파일하는 방법

C/C++ 코드를 바이너리 실행 파일이 아닌 LLVM 비트 코드로 컴파일하고 싶습니다.어떻게 하면 좋을까요?

LLVM 비트코드가 있는 경우 어떻게 하면 바이너리 실행 파일로 컴파일할 수 있을까요?

바이너리 실행 파일로 컴파일하기 전에 자체 코드를 LLVM 비트코드에 추가하고 싶습니다.

특정 C/C++ 파일foo.c:

> clang -S -emit-llvm foo.c

생산하다foo.llLLVM IR 파일입니다.

-emit-llvm옵션을 컴파일러 프런트 엔드에 직접 전달할 수도 있습니다.-cc1:

> clang -cc1 foo.c -emit-llvm

생산하다foo.llIR과 함께. -cc1다음과 같은 쿨한 옵션이 추가되어 있습니다.-ast-print. 체크 아웃-cc1 --help자세한 것은, 을 참조해 주세요.


LLVM IR을 어셈블리로 컴파일하려면llc도구:

> llc foo.ll

생산하다foo.s(어셈블리를 실행하는 머신아키텍처가 디폴트로 되어 있습니다). llc는 LLVM 툴의1개입니다.이 문서는 다음과 같습니다.

파일이 여러 개 있고 각 파일을 입력할 필요가 없다면 다음 간단한 절차를 따를 것을 권장합니다.clang-3.8다른 버전을 사용할 수 있습니다).

  1. 모두 생성하다.ll파일

    clang-3.8 -S -emit-llvm *.c
    
  2. 그것들을 하나로 연결하다

    llvm-link-3.8 -S -v -o single.ll *.ll
    
  3. (옵션) 코드를 최적화합니다(일부 에일리어스 분석).

    opt-3.8 -S -O3 -aa -basicaaa -tbaa -licm single.ll -o optimised.ll
    
  4. 어셈블리 생성(a 생성)optimised.s파일)

    llc-3.8 optimised.ll
    
  5. 실행 파일 생성(이름 지정)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

반응형