Дампинг памяти с лязгом

Привет поиск способ вывести макет памяти класса / структуры / типа данных с помощью 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 — это не то место, и мне нужен другой крючок, чтобы начать?

2

Решение

Одним из способов будет использование «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";
}

никаких гарантий: код, скопированный вместе, не проверен, как напечатано здесь — но должен работать … (тм)

0

Другие решения


По вопросам рекламы [email protected]