| Index: bin/debug_info.dart
 | 
| diff --git a/bin/debug_info.dart b/bin/debug_info.dart
 | 
| index 1c34ccad63f953463e0690a813940be6ce5c3b10..f0dd47bb98796c90ab04dd3674fbc1ab666824af 100644
 | 
| --- a/bin/debug_info.dart
 | 
| +++ b/bin/debug_info.dart
 | 
| @@ -11,6 +11,7 @@ import 'dart:io';
 | 
|  
 | 
|  import 'package:dart2js_info/info.dart';
 | 
|  import 'package:dart2js_info/src/graph.dart';
 | 
| +import 'package:dart2js_info/src/util.dart';
 | 
|  
 | 
|  main(args) {
 | 
|    if (args.length < 1) {
 | 
| @@ -28,6 +29,13 @@ main(args) {
 | 
|      debugLibName = args[2];
 | 
|    }
 | 
|  
 | 
| +  validateSize(info, debugLibName);
 | 
| +  compareGraphs(info);
 | 
| +  verifyDeps(info);
 | 
| +}
 | 
| +
 | 
| +/// Validates that codesize of elements adds up to total codesize.
 | 
| +validateSize(AllInfo info, String debugLibName) {
 | 
|    // Gather data from visiting all info elements.
 | 
|    var tracker = new _SizeTracker(debugLibName);
 | 
|    info.accept(tracker);
 | 
| @@ -67,9 +75,6 @@ main(args) {
 | 
|      var percent = (missingTotal * 100 / realTotal).toStringAsFixed(2);
 | 
|      _fail('$percent% size missing in libraries (sum of elements > lib.size)');
 | 
|    }
 | 
| -
 | 
| -  // Validate dependency data.
 | 
| -  compareGraphs(info);
 | 
|  }
 | 
|  
 | 
|  class _SizeTracker extends RecursiveInfoVisitor {
 | 
| @@ -208,6 +213,7 @@ class _State {
 | 
|    int _bodySize = 0;
 | 
|  }
 | 
|  
 | 
| +/// Validates that both forms of dependency information match.
 | 
|  void compareGraphs(AllInfo info) {
 | 
|    var g1 = new EdgeListGraph<Info>();
 | 
|    var g2 = new EdgeListGraph<Info>();
 | 
| @@ -258,5 +264,23 @@ void compareGraphs(AllInfo info) {
 | 
|    }
 | 
|  }
 | 
|  
 | 
| +// Validates that all elements are reachable from `main` in the dependency
 | 
| +// graph.
 | 
| +verifyDeps(AllInfo info) {
 | 
| +  var graph = graphFromInfo(info);
 | 
| +  var entrypoint = info.program.entrypoint;
 | 
| +  var reachables = new Set.from(graph.preOrder(entrypoint));
 | 
| +
 | 
| +  var functionsAndFields = []..addAll(info.functions)..addAll(info.fields);
 | 
| +  var unreachables =
 | 
| +      functionsAndFields.where((func) => !reachables.contains(func));
 | 
| +  if (unreachables.isNotEmpty) {
 | 
| +    _fail('${unreachables.length} elements are unreachable from the '
 | 
| +        'entrypoint');
 | 
| +  } else {
 | 
| +    _pass('all elements are reachable from the entrypoint');
 | 
| +  }
 | 
| +}
 | 
| +
 | 
|  _pass(String msg) => print('\x1b[32mPASS\x1b[0m: $msg');
 | 
|  _fail(String msg) => print('\x1b[31mFAIL\x1b[0m: $msg');
 | 
| 
 |