Make clang::CallGraph look into template instantiations

Clang's CallGraph analysis doesn't use the RecursiveASTVisitor's setting
togo into template instantiations.  The result is that anything wanting
to do call graph analysis ends up missing any template function calls.

Change-Id: Ib4af44ed59f15d43f37af91622a203146a3c3189
llvm-svn: 348942
This commit is contained in:
Erich Keane 2018-12-12 17:22:52 +00:00
parent 6753d2d180
commit f313ed5b7b
2 changed files with 21 additions and 1 deletions

View File

@ -131,6 +131,7 @@ public:
bool TraverseStmt(Stmt *S) { return true; }
bool shouldWalkTypesOfTypeLocs() const { return false; }
bool shouldVisitTemplateInstantiations() const { return true; }
private:
/// Add the given declaration to the call graph.

View File

@ -51,8 +51,27 @@ void test_single_call() {
do_nothing();
}
template<typename T>
void templ(T t) {
ccc();
}
template<>
void templ<double>(double t) {
eee();
}
void templUser() {
templ(5);
templ(5.5);
}
// CHECK:--- Call graph Dump ---
// CHECK-NEXT: {{Function: < root > calls: get5 add test_add mmm foo aaa < > bbb ddd ccc eee fff do_nothing test_single_call $}}
// CHECK-NEXT: {{Function: < root > calls: get5 add test_add mmm foo aaa < > bbb ddd ccc eee fff do_nothing test_single_call templ templ templUser $}}
// CHECK-NEXT: {{Function: templUser calls: templ templ $}}
// CHECK-NEXT: {{Function: templ calls: eee $}}
// CHECK-NEXT: {{Function: templ calls: ccc $}}
// CHECK-NEXT: {{Function: test_single_call calls: do_nothing $}}
// CHECK-NEXT: {{Function: do_nothing calls: $}}
// CHECK-NEXT: {{Function: fff calls: eee $}}