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
$ dot -Tpng -ocallgraph.png callgraph.dot
일부 빛나는 그림을 생성합니다 ( main
외부 연결이 있고 해당 번역 단위 외부에서도 호출 될 수 있으므로 "외부 노드" 가 있음).
를 사용하여이를 후 처리하여 c++filt
관련된 함수 및 클래스의 이름을 엉망으로 만들 수 있습니다. 다음과 같이
#include <vector>
struct A {
A(int);
void f();
};
int main() {
std::vector<A> v;
v.push_back(42);
v[0].f();
}
$ clang++ -S -emit-llvm main1.cpp -o - |
opt -analyze -std-link-opts -dot-callgraph
$ cat callgraph.dot |
c++filt |
sed 's,>,\\>,g; s,-\\>,->,g; s,<,\\<,g' |
gawk '/external node/{id=$1} $1 != id' |
dot -Tpng -ocallgraph.png
이 아름다움을 낳습니다 (오 마이, 최적화가 설정되지 않은 크기가 너무 컸습니다!)
이 신비한 이름없는 함수 Node0x884c4e0
는 정의를 알 수없는 함수에 의해 호출되는 것으로 간주되는 자리 표시 자입니다.