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(); // 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 2012-10-10 22:05:08
有沒有辦法做到這一點,這樣的文件/文件不是本地的函數,如所有調用彼此的std函數不會被調用? – soandos 2013-03-15 22:06:51
+1由於某些原因,我不得不將-n選項傳遞給C++ filt以取消名稱。我想在這裏提到它,以防其他人面臨同樣的問題。 – Aky 2014-01-04 10:08:21