void DIEItem::CreateCompileUnitChildren(wxTreeCtrl *tree, const wxTreeItemId& id) { // It's expensive to rescan the entire module, but it's only done lazily. DebugInfoFinder diFinder; diFinder.processModule(*const_cast<Module *>(module_)); // CU-specific Types if (diFinder.type_count() > 0) { llvm::SmallVector<llvm::MDNode*, 32> cuTypes; for (DebugInfoFinder::iterator it = diFinder.type_begin(), itEnd = diFinder.type_end(); it != itEnd; ++it) { DIType diType(*it); if (diType.getCompileUnit() == node_) { cuTypes.push_back(*it); } } if (!cuTypes.empty()) { CreateChild(tree, id, new DIETypeListItem( module_, _("Types"), cuTypes.begin(), cuTypes.end())); } } // CU-specific Global variables if (diFinder.global_variable_count() > 0) { llvm::SmallVector<llvm::MDNode*, 32> cuVariables; for (DebugInfoFinder::iterator it = diFinder.global_variable_begin(), itEnd = diFinder.global_variable_end(); it != itEnd; ++it) { DIGlobalVariable diVar(*it); if (diVar.getCompileUnit() == node_) { cuVariables.push_back(*it); } } if (!cuVariables.empty()) { CreateChild(tree, id, new DIEListItem( module_, _("Global Variables"), cuVariables.begin(), cuVariables.end())); } } // CU-specific Subprograms if (diFinder.subprogram_count() > 0) { llvm::SmallVector<llvm::MDNode*, 32> cuSubprograms; for (DebugInfoFinder::iterator it = diFinder.subprogram_begin(), itEnd = diFinder.subprogram_end(); it != itEnd; ++it) { DISubprogram diSubprogram(*it); if (diSubprogram.getCompileUnit() == node_) { cuSubprograms.push_back(*it); } } if (!cuSubprograms.empty()) { CreateChild(tree, id, new DIEListItem( module_, _("Subprograms"), cuSubprograms.begin(), cuSubprograms.end())); } } }