2017-12-17 12 views
0

LLVMは、ユーザ定義の場合(ソースファイルのユーザによって定義されている)にのみ関数名を出力します。ファンクションがLLVM-IRでユーザ定義されているかどうかチェック

ユーザー定義関数と初期化関数(または静的コンストラクター)を区別する方法が見つかりません。私は、関数が宣言されているか定義されているかどうかをチェックしようとしましたが、(__cxx_global_var_initのように)いくつかのinit関数が定義されているので、機能しません。

答えて

0

私は、あなたがやろうとしていることを達成する方法がないと知っています。

つまり、Clangは最初のコンパイル時にこれを判断する方法を提供します。参照:clang::SourceManager::isInSystemHeader()。一度optが実行されると情報がなくなるので、これを利用するにはClangプラグインまたはlibToolingベースのプログラムを書く必要があります。ここではASTの訪問者を使用してこれを行う方法の不自然な例です:

bool VisitFunctionDecl(clang::FunctionDecl* funcDecl) 
{ 
    if (sourceManager.isInSystemHeader(funcDecl->getLocStart())) 
    { 
    return true; 
    } 
} 
関連する問題