일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Android
- linux debugging
- v8 tracing
- anti debugging
- Obfuscator
- so inject
- linux thread
- tracerpid
- on stack replacement
- apm
- android inject
- tracing
- uftrace
- Linux packer
- custom packer
- Linux custom packer
- 난독화
- v8 optimizing
- LLVM Obfuscator
- LLVM
- OSR
- Injection
- pthread
- LLVM 난독화
- pinpoint
- initial-exec
- on-stack replacement
- 안티디버깅
- thread local storage
- TLS
- Today
- Total
Why should I know this?
LLVM 에 패치 보내기 튜토리얼 본문
https://youtu.be/C5Y977rLqpw?si=JXvJ7RsQ-26XSW4i
패치 만들고 LLVM 에 보내기
코드를 수정한 뒤 LLVM 에 기여하는 방식은 code-review 과정을 별도의 플랫폼에서 거친다는 차이가 있습니다.
이에 대한 자세한 과정은 다음 글을 참고하시면 됩니다.
https://developers.redhat.com/articles/2022/12/20/how-contribute-llvm#implementing_the_transform
중요한 것만 정리하자면 이렇습니다.
1. 빌드 및 테스트는 전체 빌드를 추천한다.
이는 원 글에서 나온 빌드 스크립트를 따라하시면 됩니다.
cmake -GNinja -Bbuild -Hllvm \
-DLLVM_ENABLE_PROJECTS="clang" \
-DLLVM_TARGETS_TO_BUILD="all" \
-DCMAKE_BUILD_TYPE=Release \
-DLLVM_ENABLE_ASSERTIONS=true \
-DLLVM_CCACHE_BUILD=true \
-DLLVM_USE_LINKER=lld
*주의사항* 원 글에서는 LLVM_TARGET_TO_BUILD="all" 을 권장하고 있습니다. 이는 특정 OPT PASS가 아키텍처 등의 문제로 테스트가 되지 않을 수 있는 경우를 방지하기 위함입니다.
*기타 TIP* DLLVM_ENABLE_PROJECTS 에 clang만 지정되어 있는데, 테스트 및 디버깅을 위해서 llvm도 함께 빌드하시길 추천합니다. 또한 DCMAKE_BUILD_TYPE 에 Release가 아닌 Debug를 지정하면 디버깅할 때 도움이 크게 됩니다.
2. 빌드 및 테스트는 이렇게
# Build LLVM
ninja -Cbuild
# Run all LLVM tests
ninja -Cbuild check-llvm
# Run tests in a specific directory.
# -v will print additional information for failures.
build/bin/llvm-lit -v llvm/test/Transforms/InstCombine
위 cmake 명령으로 빌드 및 테스트를 수행하는 방법입니다.
그리고 마지막 명령 줄은 특정 PASS에 국한한 테스트를 진행하게 됩니다.
build/bin/llvm-lit -v llvm/test/Transforms/InstCombine
예를 들어, 본인이 수정한 최적화 PASS가 InstCombine이라면 해당 경로의 테스트들만 할 수 있습니다.
3. 본인이 최적하고자 하는 방식이 논리적으로 맞는지 우선 alive2에서 검증해볼 수 있습니다.
제가 작성한 검증 링크 : https://alive2.llvm.org/ce/z/Po2nL4
4. 작성한 커밋의 diff 를 뽑아 코드리뷰를 받자.
코드 리뷰를 받을 수 있는 플랫폼은 아래 주소에 있습니다.
https://reviews.llvm.org/differential/diff/create/
이곳이 메인 주소입니다. 여기서 가입 / 질문 / 토의 등 도 할 수 있습니다.
이곳에 올릴 diff를 뽑는 방식은 다음과 같습니다.
$ git show -U99999 HEAD^ > patch_tests
$ git show -U99999 > patch_transform
첫 번째 명령은 HEAD^ 를, 두 번째 명령은 HEAD를 파일로 만드는 명령입니다.
사이트 주소로 가시면 이런 UI 가 보이실텐데 당황하지 마시고
Raw Diff From File 에 위에서 만든 파일을 올리면 됩니다.
그리고 CreateDiff를 클릭하시면 이런 화면을
기본 선택지가 Create a new Revision 입니다. 여기서 Continue를 누르시면
Revision을 등록하는 화면으로 오게 됩니다.
제목과 패치 내용을 작성하시고, 여기에 검증했던 Alive2 링크를 기재하시면 좋습니다.
이제 중요한 것은 Review 요청할 사람을 등록해야 하는데, 여기에 tip을 하나 드리면 review 사이트 메인으로 가셔서 왼쪽에 보이는 메뉴중에 differential - All Revision 순으로 선택합니다. 주소는 다음과 같습니다.
https://reviews.llvm.org/differential/query/all/
여기서 우측 상단의 edit query 를 클릭하시고 쿼리를 본인이 관여하신 pass를 넣어보세요.
저의 경우 InstSimplify 를 넣었습니다.
그럼 위처럼 검색 결과가 보입니다.
각 글들의 제목 아래 Reviewers 로 등록된 사람들의 nick 이 보이실겁니다.
이 사람들을 Review 에 기재하시면 됩니다.
이상입니다!
'LLVM-STUDY' 카테고리의 다른 글
Souper 분석 관련 키워드들 (0) | 2023.09.23 |
---|---|
LLVM 에 기여하기 (feat.UFTRACE) (0) | 2023.09.15 |
LLVM Optimization study - instcombine with ChatGPT (0) | 2023.03.17 |
LLVM Optimization study - LoopInstSimplify (0) | 2023.03.13 |
LoopLatch (0) | 2023.02.26 |