您正在寻找一种使用clang转储类/结构/数据类型的内存布局的方法。 我有一个基于this教程的简单应用程序。
我还添加了这个功能
bool VisitFieldDecl(FieldDecl *F)
{
F->dump();
std::cerr << F->getQualifiedNameAsString() << " " << F->getBitWidthValue(*Context) << " " << std::endl;
F->dump() ;
std::cerr << "-----------------------------------------" << std::endl;
return true;
}
不幸的是,getBitWidthValue也为我的类型返回零。
我需要递归地为每个类和所有嵌套类型提供完整的内存布局。包括尺寸/偏移量。
也许AST是错误的地方,我需要另一个钩子才能开始?
答案 0 :(得分:0)
一种方法是在llvm / clang-3.4中使用给定const clang::CXXRecordDecl* decl
的“AST记录布局”:
const clang::ASTRecordLayout &typeLayout(decl->getASTContext().getASTRecordLayout(decl));
std::cout << "record '" << decl->getQualifiedNameAsString() << "' with " << typeLayout.getSize().getQuantity() << "bytes\n";
for(clang::RecordDecl::field_iterator fit = decl->field_begin(); fit != decl->field_end(); fit++) {
const clang::QualType qualType = fit->getType().getLocalUnqualifiedType().getCanonicalType();
size_t fieldOffset = typeLayout.getFieldOffset(fit->getFieldIndex());
std::cout << "member '" << qualType.getAsString() << "' with " << fieldOffset << "bytes offset\n";
}
无保证:代码一起复制,未在此处键入测试 - 但应该有效...(tm)