Add more timing scopes to top-level R8

Bug: b/307273642
Change-Id: Ibe19dccc7059f1c4ea855e678392a948c4bde8f2
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index e19a8ad..8be855e 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -28,6 +28,7 @@
 import com.android.tools.r8.graph.DirectMappedDexApplication;
 import com.android.tools.r8.graph.GenericSignatureContextBuilder;
 import com.android.tools.r8.graph.GenericSignatureCorrectnessHelper;
+import com.android.tools.r8.graph.LazyLoadedDexApplication;
 import com.android.tools.r8.graph.ProgramDefinition;
 import com.android.tools.r8.graph.PrunedItems;
 import com.android.tools.r8.graph.SubtypingInfo;
@@ -256,6 +257,7 @@
 
   @SuppressWarnings("DefaultCharset")
   private void run(AndroidApp inputApp, ExecutorService executorService) throws IOException {
+    timing.begin("Run prelude");
     assert options.programConsumer != null;
     if (options.quiet) {
       System.setOut(new PrintStream(ByteStreams.nullOutputStream()));
@@ -277,21 +279,32 @@
       System.out.println("R8 is running with max memory:" + runtime.maxMemory());
     }
     options.prepareForReportingLibraryAndProgramDuplicates();
+    timing.end();
     try {
       AppView<AppInfoWithClassHierarchy> appView;
       {
+        timing.begin("Read app");
         ApplicationReader applicationReader = new ApplicationReader(inputApp, options, timing);
-        DirectMappedDexApplication application = applicationReader.read(executorService).toDirect();
+        LazyLoadedDexApplication lazyLoaded = applicationReader.read(executorService);
+        timing.begin("To direct app");
+        DirectMappedDexApplication application = lazyLoaded.toDirect();
+        timing.end();
+        timing.end();
         options.loadMachineDesugaredLibrarySpecification(timing, application);
+        timing.begin("Read main dex classes");
         MainDexInfo mainDexInfo = applicationReader.readMainDexClassesForR8(application);
+        timing.end();
         // Now that the dex-application is fully loaded, close any internal archive providers.
-        inputApp.closeInternalArchiveProviders();
-
+        timing.time("Close providers", () -> inputApp.closeInternalArchiveProviders());
+        timing.begin("Create AppView");
         appView = AppView.createForR8(application, mainDexInfo);
-        appView.setAppServices(AppServices.builder(appView).build());
-        SyntheticItems.collectSyntheticInputs(appView);
+        timing.end();
+        timing.time(
+            "Set app services", () -> appView.setAppServices(AppServices.builder(appView).build()));
+        timing.time(
+            "Collect synthetic inputs", () -> SyntheticItems.collectSyntheticInputs(appView));
       }
-
+      timing.begin("Register references and more setup");
       assert ArtProfileCompletenessChecker.verify(appView);
 
       // Check for potentially having pass-through of Cf-code for kotlin libraries.
@@ -330,7 +343,7 @@
                 .rebuildWithClassHierarchy(
                     appView.getSyntheticItems().commit(appView.appInfo().app())));
       }
-
+      timing.end();
       timing.begin("Strip unused code");
       timing.begin("Before enqueuer");
       RuntimeTypeCheckInfo.Builder classMergingEnqueuerExtensionBuilder =
@@ -445,7 +458,7 @@
       } finally {
         timing.end();
       }
-
+      timing.begin("Run center tasks");
       assert appView.appInfo().hasLiveness();
       AppView<AppInfoWithLiveness> appViewWithLiveness = appView.withLiveness();
 
@@ -560,7 +573,7 @@
       timing.begin("AppliedGraphLens construction");
       appView.setGraphLens(new AppliedGraphLens(appView));
       timing.end();
-
+      timing.end();
       if (options.shouldRerunEnqueuer()) {
         timing.begin("Post optimization code stripping");
         try {
@@ -688,7 +701,7 @@
                       converter, executorService, timing));
         }
       }
-
+      timing.begin("Run postlude");
       performFinalMainDexTracing(appView, executorService);
 
       if (appView.appInfo().hasLiveness()) {
@@ -857,6 +870,8 @@
       }
 
       assert appView.verifyMovedMethodsHaveOriginalMethodPosition();
+      timing.end();
+
       // Generate the resulting application resources.
       writeApplication(appView, inputApp, executorService);