マクロはclang::Preprocessorの範疇であるが、Preprocessorはマクロの展開情報を直接扱わない。clangにはPreprocessingRecordおよびPreprocessedEntryというクラスがあり、これらを利用する。
まず、Preprocessorが処理においてPreprocessingEntryを保存してくれるよう、PreprocessingRecordをセットアップする。
clang::InitializePreprocessor(pp, ppOpts, headerSearchOpts, frontendOpts); pp.createPreprocessingRecord(true);
そうすると、プリプロセッシングの後でPreprocessorに設定されたPreprocessingRecordが、PreprocessedEntryを反復してくれる。PreprocessedEntryの派生クラスとしてMacroExpansionがあるので、キャストして情報を得ればよい。
clang::PreprocessingRecord* ppRecord = pp.getPreprocessingRecord();
clang::PreprocessingRecord::iterator ppr = ppRecord->begin();
clang::PreprocessingRecord::iterator eoppr = ppRecord->end();
for(; ppr != eoppr; ++ppr)
{
if((*ppr)->getKind() == clang::PreprocessedEntity::MacroExpansionKind)
{
clang::MacroExpansion* expansion
= llvm::dyn_cast<clang::MacroExpansion>(*ppr);
if(expansion->getName()->getName() == "MY_MACRO")
{
clang::SourceRange range = expansion->getSourceRange();
range.getBegin().dump(srcMgr);
}
}
}
0 件のコメント:
コメントを投稿