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
は、いくつかの光沢のある画像が得られる:
これをc++filt
で後処理したい場合は、次のようにunmangledな名前を得ることができますe関数とクラスが含まれています。次
#include <vector>
struct A {
A(int);
void f(); // not defined, prevents inlining it!
};
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
は、と仮定プレースホルダであることを(私のオハイオ州、最適化せずにサイズがオンになってあまりにも大きかったです!)
を、この美しさを生み出すのように定義がわからない関数によって呼び出されます。
あなたは、複数のファイルをプロジェクトにこれを行っていますか?ツールとして非常にクールに見える – dirvine
これを行う方法がありますので、互いに呼び出すすべてのstd関数のようなファイル/ファイルに対してローカルではない関数は呼び出されません。 – soandos
+1なんらかの理由で、名前を解くために-nオプションをC++ filtに渡さなければなりませんでした。他の誰かが同じ問題に直面した場合、私はここでそれを言及したいと思った。 – Aky