A tool based on clang which generates a call graph from a given C++ codebase.
./clang-callgraph.py file.cpp|compile_commands.json [options] [extra clang args...]
Understood options
are:
-x name1,name2
: a coma separated list of excluded prefixes, likestd::,boost::
. All symbols starting with one of those will be hidden in the callgraph.-p path1,path2
: a coma separated list of excluded prefixes, like/usr
. All symbols defined or used in files whose name starts with of those will be hidden in the callgraph.
The easiest way to generate the file compile_commands.json for any make based
compilation chain is to use Bear and recompile with bear make
.
When running the python script, after parsing all the codebase, you are prompted to type in the function's name for which you wan to obtain the callgraph
$ bear make
<output omitted>
$ clang-callgraph.py compile_commands.json -I/usr/lib/llvm-3.8/lib/clang/3.8.0/include/
reading source files...
/home/vermeille/CPAsim/src/module.cpp
/home/vermeille/CPAsim/src/module/modulevalues.cpp
/home/vermeille/CPAsim/src/main.cpp
/home/vermeille/CPAsim/src/parser.cpp
> main
matching:
main(int, char **)
> main(int, char **)
main(int, char **)
Parser::ParseModuleDef(std::istream &)
Parser::EatWord(std::istream &, const std::string &)
Parser::FuckSpaces(std::istream &)
Parser::EatChar(std::istream &, char)
Parser::ParseWord(std::istream &)
Parser::FuckSpaces(std::istream &)
Module::Module(const std::string &)
Parser::FuckSpaces(std::istream &)
Parser::EatChar(std::istream &, char)
Parser::FuckSpaces(std::istream &)
Parser::EatChar(std::istream &, char)
Module::AddInput(std::unique_ptr<WireDecl>)
WireDecl::name()
WireDecl::name()
WireDecl::name()
Parser::ParseWireDecl(std::istream &)
Parser::ParseWord(std::istream &)
Parser::FuckSpaces(std::istream &)
Parser::EatChar(std::istream &, char)
Parser::FuckSpaces(std::istream &)
Parser::ParseDecimalInt(std::istream &)
Parser::FuckSpaces(std::istream &)
Parser::FuckSpaces(std::istream &)
Parser::EatChar(std::istream &, char)
Parser::FuckSpaces(std::istream &)
WireDecl::WireDecl(const std::string &, int)
$ clang-callgraph.py compile_commands.json -x Parser:: -I/usr/lib/llvm-3.8/lib/clang/3.8.0/include/
reading source files...
/home/vermeille/CPAsim/src/module.cpp
/home/vermeille/CPAsim/src/module/modulevalues.cpp
/home/vermeille/CPAsim/src/main.cpp
/home/vermeille/CPAsim/src/parser.cpp
> main(int, char **)
main(int, char **)
Module::BindUsagesToDef()
Module::BindUsagesToDef_Rec(Expr *)
Module::BindUsagesToDef_Rec(Expr *)
Module::BindUsagesToDef_Rec(Expr *)
Binop::lhs()
Module::BindUsagesToDef_Rec(Expr *)
Binop::rhs()
Module::BindUsagesToDef_Rec(Expr *)
Not::rhs()
WireUsage::name()
WireUsage::name()
WireUsage::SetDeclRef(WireDecl *)
WireUsage::IsUseValid()
WireDecl::size()
WireDecl::size()
WireDecl::size()
WireUsage::name()
WireUsage::index()
WireUsage::index()
WireDecl::size()