Вы сможете получить эту информацию через AST MatchFinder.Простой сопоставитель, такой как
namedDecl().bind("named_decl")
, будет соответствовать всем NamedDecl
узлам.Затем в обратном вызове вы можете получить атрибут Linkage узла и соответствующим образом обработать узел.Обратный вызов, который распечатывает, какие символы имеют внешнюю связь, может выглядеть примерно так:
struct LinkagePrinter : public MatchFinder::Callback {
void run(MatchResult const & result) override {
using namespace clang;
NamedDecl const * n_decl =
result.Nodes.getNodeAs<NamedDecl("named_decl");
if(n_decl){
Linkage l = n_decl->getLinkage();
switch(l){
case ExternalLinkage:
std::cout << "symbol " << n_decl->getNameAsString()
<< " has external linkage\n";
// ... etc
}
}
return;
}
}; // LinkagePrinter
Это примерно правильно - я не проверял, что это компилируется.Зарегистрируйте совпадение и обратный вызов с помощью MatchFinder, загрузите MatchFinder в инструмент, и вы должны быть в бизнесе.В https://github.com/lanl/CoARCT.
имеется множество примеров.