Привет поиск способ вывести макет памяти класса / структуры / типа данных с помощью Clang.
У меня есть простое приложение, основанное на этот руководство.
Я также добавил эту функцию
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 — это не то место, и мне нужен другой крючок, чтобы начать?
Одним из способов будет использование «AST Record Layout» данного const clang::CXXRecordDecl* decl
в llvm / clang-3.4:
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";
}
никаких гарантий: код, скопированный вместе, не проверен, как напечатано здесь — но должен работать … (тм)