초비망록: 교과서대로 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.cpp
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

그러면…



했다.

앞으로 자세히 살펴 보겠습니다만, 옛날과 같이는 가지 않을지도 모릅니다.
비망록이므로, 더 이상의 것은 붙지 않는다. 이상.

알아봐



옛날에는 analyze 명령이 있었던 것 같습니다. 지금은 없지만. 그래서,

지금은 opt 에 -analyze 를 붙이지 않으면 해석해주지 않는 것 같다.
…라는 것은 알았다.

좋은 웹페이지 즐겨찾기