초비망록: 교과서대로 CFG를 출력할 수 없을 때 사용한 수법
왜 교과서처럼 opt가 움직이지 않습니다.
Clang과 llvm (또는 opt)을 사용하면 쉽게 콜 그래프와 CFG를 그릴 수 있습니다 ... 라고 교과서에는 쓰고 있습니다.
교과서라고 말하는 것은
토카
라든지입니다.
쓰는 방법은 다음과 같이 일반적으로 기술되어 있습니다.
$ clang -emit-llvm -S -o test.ll -c test.c
$ opt -dot-cfg test.ll
하지만 움직이지 않는다. 출력되는 기색도 없다.
게다가 화난다.
$ opt -dot-cfg test.ll
WARNING: You're attempting to print out a bitcode file.
This is inadvisable as it may cause display problems. If
you REALLY want to taste LLVM bitcode first-hand, you
can force output with the `-f' option.
구세주 나타난다
너무 수수께끼였지만, 아래의 예를 참고로 해 보았습니다.
코드와 최종 명령은 여기 ↓를 사용했습니다.
main1.cppstatic void D() { }
static void Y() { D(); }
static void X() { Y(); }
static void C() { D(); X(); }
static void B() { C(); }
static void S() { D(); }
static void P() { S(); }
static void O() { P(); }
static void N() { O(); }
static void M() { N(); }
static void G() { M(); }
static void A() { B(); G(); }
int main() {
A();
}
$ clang++ -S -emit-llvm main1.cpp -o - | opt -analyze -dot-callgraph --callgraph-dot-filename-prefix=main
Cannot specify -analyze under new pass manager, either specify '-enable-new-pm=0', or use the corresponding new pass manager pass, e.g. '-passes=print<scalar-evolution>'. For a full list of passes, see the '--print-passes' flag.
흠, 이제 한 걸음 같아…
거기서 사람 궁리, 라고 할까 에러의 지시에 따라 작성.
$ clang++ -S -emit-llvm main1.cpp -o - | opt -enable-new-pm=0 -analyze -dot-callgraph --callgraph-dot-filename-prefix=test
Writing 'test.callgraph.dot'...
Printing analysis 'Print call graph to 'dot' file':
Pass::print not implemented for pass: 'Print call graph to 'dot' file'!
음, 출력 된 것 같습니다.
겨자
$ dot -Tpng test.callgraph.dot > test.png
그러면…
했다.
앞으로 자세히 살펴 보겠습니다만, 옛날과 같이는 가지 않을지도 모릅니다.
비망록이므로, 더 이상의 것은 붙지 않는다. 이상.
알아봐
옛날에는 analyze 명령이 있었던 것 같습니다. 지금은 없지만. 그래서,
지금은 opt 에 -analyze 를 붙이지 않으면 해석해주지 않는 것 같다.
…라는 것은 알았다.
Reference
이 문제에 관하여(초비망록: 교과서대로 CFG를 출력할 수 없을 때 사용한 수법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/evakichi/items/e6c3bd0c7f510fda7cbd
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
$ clang -emit-llvm -S -o test.ll -c test.c
$ opt -dot-cfg test.ll
$ opt -dot-cfg test.ll
WARNING: You're attempting to print out a bitcode file.
This is inadvisable as it may cause display problems. If
you REALLY want to taste LLVM bitcode first-hand, you
can force output with the `-f' option.
static void D() { }
static void Y() { D(); }
static void X() { Y(); }
static void C() { D(); X(); }
static void B() { C(); }
static void S() { D(); }
static void P() { S(); }
static void O() { P(); }
static void N() { O(); }
static void M() { N(); }
static void G() { M(); }
static void A() { B(); G(); }
int main() {
A();
}
$ clang++ -S -emit-llvm main1.cpp -o - | opt -analyze -dot-callgraph --callgraph-dot-filename-prefix=main
Cannot specify -analyze under new pass manager, either specify '-enable-new-pm=0', or use the corresponding new pass manager pass, e.g. '-passes=print<scalar-evolution>'. For a full list of passes, see the '--print-passes' flag.
$ clang++ -S -emit-llvm main1.cpp -o - | opt -enable-new-pm=0 -analyze -dot-callgraph --callgraph-dot-filename-prefix=test
Writing 'test.callgraph.dot'...
Printing analysis 'Print call graph to 'dot' file':
Pass::print not implemented for pass: 'Print call graph to 'dot' file'!
$ dot -Tpng test.callgraph.dot > test.png
Reference
이 문제에 관하여(초비망록: 교과서대로 CFG를 출력할 수 없을 때 사용한 수법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/evakichi/items/e6c3bd0c7f510fda7cbd텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)