Example #1
0
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()));
    }
  }
}