Compile R8 main source set with source/target 11.

Bug: b/229695990
Change-Id: Ie9fbc266aa190bb2fe5042030e9917230a9e6d1e
diff --git a/build.gradle b/build.gradle
index db4592a..812b438 100644
--- a/build.gradle
+++ b/build.gradle
@@ -646,6 +646,12 @@
 }
 
 setJdkCompilationWithCompatibility(
+        sourceSets.main.compileJavaTaskName,
+        'jdk-11',
+        JavaVersion.VERSION_11,
+        false);
+
+setJdkCompilationWithCompatibility(
         sourceSets.examplesJava9.compileJavaTaskName,
         'openjdk-9.0.4',
         JavaVersion.VERSION_1_9,
@@ -1037,7 +1043,7 @@
             input,
             "--output", output,
             "--pg-map-output", output + ".map",
-            "--lib", "third_party/openjdk/openjdk-rt-1.8/rt.jar"
+            "--lib", org.gradle.internal.jvm.Jvm.current().javaHome,
     ] + args + libs.collectMany { ["--lib", it] } + pgConfs.collectMany { ["--pg-conf", it] }
     return baseR8CommandLine(allArgs)
 }
diff --git a/src/main/java/com/android/tools/r8/utils/StringUtils.java b/src/main/java/com/android/tools/r8/utils/StringUtils.java
index f1e4e18..84dd752 100644
--- a/src/main/java/com/android/tools/r8/utils/StringUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/StringUtils.java
@@ -320,19 +320,7 @@
   }
 
   public static String trim(String s) {
-    int beginIndex = 0;
-    int endIndex = s.length();
-    while (beginIndex < endIndex && isWhitespace(s.charAt(beginIndex))) {
-      beginIndex++;
-    }
-    while (endIndex - 1 > beginIndex && isWhitespace(s.charAt(endIndex - 1))) {
-      endIndex--;
-    }
-    if (beginIndex > 0 || endIndex < s.length()) {
-      return s.substring(beginIndex, endIndex);
-    } else {
-      return s;
-    }
+    return stripLeadingBOM(s).strip();
   }
 
   /** Returns true if {@param s} only contains the characters [0-9]. */
diff --git a/src/test/java/com/android/tools/r8/TestBase.java b/src/test/java/com/android/tools/r8/TestBase.java
index a575af1..93f6288 100644
--- a/src/test/java/com/android/tools/r8/TestBase.java
+++ b/src/test/java/com/android/tools/r8/TestBase.java
@@ -46,7 +46,6 @@
 import com.android.tools.r8.jasmin.JasminBuilder;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.origin.PathOrigin;
-import com.android.tools.r8.profile.art.ArtProfileCollection;
 import com.android.tools.r8.references.ClassReference;
 import com.android.tools.r8.references.FieldReference;
 import com.android.tools.r8.references.MethodReference;
@@ -174,6 +173,11 @@
     return ExternalR8TestBuilder.create(new TestState(temp), backend, runtime);
   }
 
+  public static ExternalR8TestBuilder testForExternalR8(TemporaryFolder temp, Backend backend) {
+    return ExternalR8TestBuilder.create(
+        new TestState(temp), backend, TestRuntime.getSystemRuntime());
+  }
+
   public static D8TestBuilder testForD8(TemporaryFolder temp, Backend backend) {
     return D8TestBuilder.create(new TestState(temp), backend);
   }
@@ -214,6 +218,10 @@
     return testForExternalR8(temp, backend, runtime);
   }
 
+  public ExternalR8TestBuilder testForExternalR8(Backend backend) {
+    return testForExternalR8(temp, backend, TestRuntime.getSystemRuntime());
+  }
+
   public D8TestBuilder testForD8() {
     return testForD8(temp, Backend.DEX);
   }
diff --git a/src/test/java/com/android/tools/r8/TestCompilerBuilder.java b/src/test/java/com/android/tools/r8/TestCompilerBuilder.java
index 165cd83..cd6df4f 100644
--- a/src/test/java/com/android/tools/r8/TestCompilerBuilder.java
+++ b/src/test/java/com/android/tools/r8/TestCompilerBuilder.java
@@ -10,7 +10,6 @@
 
 import com.android.tools.r8.TestBase.Backend;
 import com.android.tools.r8.benchmarks.BenchmarkResults;
-import com.android.tools.r8.debug.DebugTestConfig;
 import com.android.tools.r8.optimize.argumentpropagation.ArgumentPropagatorEventConsumer;
 import com.android.tools.r8.optimize.argumentpropagation.codescanner.MethodStateCollectionByReference;
 import com.android.tools.r8.testing.AndroidBuildVersion;
@@ -32,6 +31,7 @@
 import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 import java.util.Optional;
 import java.util.Set;
@@ -226,6 +226,18 @@
     return internalCompileAndBenchmark(null);
   }
 
+  private Collection<Path> getDefaultLibraryFiles() {
+    if (backend == Backend.DEX) {
+      assert builder.isMinApiLevelSet();
+      return Collections.singletonList(
+          ToolHelper.getFirstSupportedAndroidJar(
+              AndroidApiLevel.getAndroidApiLevel(builder.getMinApiLevel())));
+    } else {
+      assert backend == Backend.CF;
+      return Collections.singletonList(ToolHelper.getJava8RuntimeJar());
+    }
+  }
+
   private CR internalCompileAndBenchmark(BenchmarkResults benchmark)
       throws CompilationFailedException {
     AndroidAppConsumers sink = new AndroidAppConsumers();
@@ -249,14 +261,7 @@
     }
     builder.setOptimizeMultidexForLinearAlloc(optimizeMultidexForLinearAlloc);
     if (useDefaultRuntimeLibrary) {
-      if (backend == Backend.DEX) {
-        assert builder.isMinApiLevelSet();
-        builder.addLibraryFiles(
-            ToolHelper.getFirstSupportedAndroidJar(
-                AndroidApiLevel.getAndroidApiLevel(builder.getMinApiLevel())));
-      } else {
-        builder.addLibraryFiles(TestBase.runtimeJar(backend));
-      }
+      builder.addLibraryFiles(getDefaultLibraryFiles());
     }
     assertNull(oldStdout);
     oldStdout = System.out;
diff --git a/src/test/java/com/android/tools/r8/TestRuntime.java b/src/test/java/com/android/tools/r8/TestRuntime.java
index 3524d63..0d937dd 100644
--- a/src/test/java/com/android/tools/r8/TestRuntime.java
+++ b/src/test/java/com/android/tools/r8/TestRuntime.java
@@ -10,6 +10,7 @@
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.ListUtils;
+import com.android.tools.r8.utils.structural.Ordered;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableList.Builder;
 import com.google.common.collect.ImmutableMap;
@@ -28,7 +29,7 @@
 public abstract class TestRuntime {
 
   // Enum describing the possible/supported CF runtimes.
-  public enum CfVm {
+  public enum CfVm implements Ordered<CfVm> {
     JDK8("jdk8", 52),
     JDK9("jdk9", 53),
     JDK10("jdk10", 54),
@@ -66,17 +67,21 @@
     }
 
     public boolean lessThan(CfVm other) {
-      return this.ordinal() < other.ordinal();
+      return isLessThan(other);
     }
 
     public boolean lessThanOrEqual(CfVm other) {
-      return this.ordinal() <= other.ordinal();
+      return isLessThanOrEqualTo(other);
     }
 
     @Override
     public String toString() {
       return name;
     }
+
+    public static CfVm getMinimumSystemVersion() {
+      return JDK11;
+    }
   }
 
   private static final Path JDK8_PATH = Paths.get(ToolHelper.THIRD_PARTY_DIR, "openjdk", "jdk8");
diff --git a/src/test/java/com/android/tools/r8/cf/bootstrap/BootstrapCurrentEqualityTest.java b/src/test/java/com/android/tools/r8/cf/bootstrap/BootstrapCurrentEqualityTest.java
index b26a1cf..f41ac28 100644
--- a/src/test/java/com/android/tools/r8/cf/bootstrap/BootstrapCurrentEqualityTest.java
+++ b/src/test/java/com/android/tools/r8/cf/bootstrap/BootstrapCurrentEqualityTest.java
@@ -14,10 +14,12 @@
 
 import com.android.tools.r8.CompilationMode;
 import com.android.tools.r8.ExternalR8TestCompileResult;
+import com.android.tools.r8.JdkClassFileProvider;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.TestRuntime;
+import com.android.tools.r8.TestRuntime.CfVm;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.ProcessResult;
 import com.android.tools.r8.retrace.ProguardMapProducer;
@@ -56,6 +58,7 @@
     "}",
     "-allowaccessmodification"
   };
+  private static String HELLO_EXPECTED = StringUtils.lines("Hello, world");
 
   private static Pair<Path, Path> r8R8Debug;
   private static Pair<Path, Path> r8R8Release;
@@ -75,7 +78,9 @@
 
   @Parameters(name = "{0}")
   public static TestParametersCollection data() {
-    return getTestParameters().withCfRuntimes().build();
+    return getTestParameters()
+        .withCfRuntimesStartingFromIncluding(CfVm.getMinimumSystemVersion())
+        .build();
   }
 
   public BootstrapCurrentEqualityTest(TestParameters parameters) {
@@ -87,10 +92,11 @@
     final Path jar = testFolder.newFolder().toPath().resolve("out.jar");
     final Path map = testFolder.newFolder().toPath().resolve("out.map");
     if (testExternal) {
-      testForExternalR8(newTempFolder(), Backend.CF, TestRuntime.getCheckedInJdk9())
+      testForExternalR8(newTempFolder(), Backend.CF)
           .useR8WithRelocatedDeps()
           .setMode(mode)
           .addProgramFiles(ToolHelper.R8_WITH_RELOCATED_DEPS_JAR)
+          .addLibraryFiles(TestRuntime.getSystemRuntime().getJavaHome())
           .addKeepRuleFiles(MAIN_KEEP)
           .compile()
           .apply(c -> FileUtils.writeTextFile(map, c.getProguardMap()))
@@ -99,6 +105,7 @@
       testForR8(newTempFolder(), Backend.CF)
           .setMode(mode)
           .addProgramFiles(ToolHelper.R8_WITH_RELOCATED_DEPS_JAR)
+          .addLibraryProvider(JdkClassFileProvider.fromSystemJdk())
           .addKeepRuleFiles(MAIN_KEEP)
           .compile()
           .apply(c -> FileUtils.writeTextFile(map, c.getProguardMap()))
@@ -167,6 +174,7 @@
         testForExternalR8(parameters.getBackend(), parameters.getRuntime())
             .useProvidedR8(ToolHelper.R8LIB_JAR)
             .addProgramFiles(ToolHelper.R8_WITH_RELOCATED_DEPS_JAR)
+            .addLibraryFiles(parameters.asCfRuntime().getJavaHome())
             .addKeepRuleFiles(MAIN_KEEP)
             .setMode(CompilationMode.RELEASE)
             .compile()
@@ -176,6 +184,7 @@
             .useProvidedR8(ToolHelper.R8LIB_EXCLUDE_DEPS_JAR)
             .addR8ExternalDepsToClasspath()
             .addProgramFiles(ToolHelper.R8_WITH_RELOCATED_DEPS_JAR)
+            .addLibraryFiles(parameters.asCfRuntime().getJavaHome())
             .addKeepRuleFiles(MAIN_KEEP)
             .setMode(CompilationMode.RELEASE)
             .compile()
@@ -190,13 +199,15 @@
 
   @Test
   public void test() throws Exception {
-    Path helloJar = Paths.get(ToolHelper.EXAMPLES_BUILD_DIR, "hello" + JAR_EXTENSION);
-    ProcessResult runResult = ToolHelper.runJava(helloJar, "hello.Hello");
-    assertEquals(0, runResult.exitCode);
-    compareR8(helloJar, runResult, KEEP_HELLO, "hello.Hello");
+    Path program = Paths.get(ToolHelper.EXAMPLES_BUILD_DIR, "hello" + JAR_EXTENSION);
+    testForJvm()
+        .addProgramFiles(program)
+        .run(parameters.getRuntime(), HELLO_NAME)
+        .assertSuccessWithOutput(HELLO_EXPECTED)
+        .apply(r -> compareR8(program, HELLO_EXPECTED, KEEP_HELLO, HELLO_NAME));
   }
 
-  private void compareR8(Path program, ProcessResult runResult, String[] keep, String... args)
+  private void compareR8(Path program, String expectedOutput, String[] keep, String main)
       throws Exception {
     ExternalR8TestCompileResult runR8Debug =
         testForExternalR8(newTempFolder(), parameters.getBackend(), parameters.getRuntime())
@@ -205,7 +216,10 @@
             .addKeepRules(keep)
             .setMode(CompilationMode.DEBUG)
             .compile();
-    assertEquals(runResult.toString(), ToolHelper.runJava(runR8Debug.outputJar(), args).toString());
+    testForJvm()
+        .addProgramFiles(runR8Debug.outputJar())
+        .run(parameters.getRuntime(), main)
+        .assertSuccessWithOutput(expectedOutput);
     ExternalR8TestCompileResult runR8Release =
         testForExternalR8(newTempFolder(), parameters.getBackend(), parameters.getRuntime())
             .useR8WithRelocatedDeps()
@@ -213,8 +227,10 @@
             .addKeepRules(keep)
             .setMode(CompilationMode.RELEASE)
             .compile();
-    assertEquals(
-        runResult.toString(), ToolHelper.runJava(runR8Release.outputJar(), args).toString());
+    testForJvm()
+        .addProgramFiles(runR8Release.outputJar())
+        .run(parameters.getRuntime(), main)
+        .assertSuccessWithOutput(expectedOutput);
     RunR8AndCheck(r8R8Debug, program, runR8Debug, keep, CompilationMode.DEBUG);
     RunR8AndCheck(r8R8Debug, program, runR8Release, keep, CompilationMode.RELEASE);
     RunR8AndCheck(r8R8Release, program, runR8Debug, keep, CompilationMode.DEBUG);
diff --git a/src/test/java/com/android/tools/r8/naming/b173184123/ClassExtendsInterfaceNamingTest.java b/src/test/java/com/android/tools/r8/naming/b173184123/ClassExtendsInterfaceNamingTest.java
index 470b542..2de209b 100644
--- a/src/test/java/com/android/tools/r8/naming/b173184123/ClassExtendsInterfaceNamingTest.java
+++ b/src/test/java/com/android/tools/r8/naming/b173184123/ClassExtendsInterfaceNamingTest.java
@@ -11,7 +11,6 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.TestRuntime;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.android.tools.r8.utils.ZipUtils.ZipBuilder;
@@ -50,9 +49,7 @@
                 .setSuper(DescriptorUtils.javaTypeToDescriptor(Interface.class.getTypeName()))
                 .transform())
         .build();
-    testForExternalR8(
-            parameters.getBackend(),
-            parameters.isCfRuntime() ? parameters.getRuntime() : TestRuntime.getCheckedInJdk11())
+    testForExternalR8(parameters.getBackend())
         .addProgramFiles(classFiles)
         .addTestingAnnotationsAsProgramClasses()
         .enableAssertions(false)
diff --git a/src/test/java/com/android/tools/r8/retrace/RetraceStackTraceFunctionalCompositionTest.java b/src/test/java/com/android/tools/r8/retrace/RetraceStackTraceFunctionalCompositionTest.java
index 3c4c536..37ac4f0 100644
--- a/src/test/java/com/android/tools/r8/retrace/RetraceStackTraceFunctionalCompositionTest.java
+++ b/src/test/java/com/android/tools/r8/retrace/RetraceStackTraceFunctionalCompositionTest.java
@@ -11,6 +11,7 @@
 import static org.objectweb.asm.Opcodes.INVOKESTATIC;
 
 import com.android.tools.r8.CompilationMode;
+import com.android.tools.r8.JdkClassFileProvider;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
@@ -244,6 +245,7 @@
     testForR8(Backend.CF)
         .setMode(CompilationMode.RELEASE)
         .addProgramFiles(r8Input)
+        .addLibraryProvider(JdkClassFileProvider.fromSystemJdk())
         .addKeepRuleFiles(MAIN_KEEP)
         // TODO(b/241763080): Remove when stable version is default.
         .enableExperimentalMapFileVersion()
@@ -262,6 +264,7 @@
     testForD8(Backend.CF)
         .setMode(CompilationMode.RELEASE)
         .addProgramFiles(r8Input)
+        .addLibraryProvider(JdkClassFileProvider.fromSystemJdk())
         .enableExperimentalMapFileVersion()
         // TODO(b/241763080): Enable CF PC test mapping for this compilation.
         .addOptionsModification(
diff --git a/src/test/java/com/android/tools/r8/retrace/RetraceTests.java b/src/test/java/com/android/tools/r8/retrace/RetraceTests.java
index 431709c..e4f657f 100644
--- a/src/test/java/com/android/tools/r8/retrace/RetraceTests.java
+++ b/src/test/java/com/android/tools/r8/retrace/RetraceTests.java
@@ -100,7 +100,7 @@
   @Parameters(name = "{0}, external: {1}, verbose: {2}, stream: {3}")
   public static Collection<Object[]> data() {
     return buildParameters(
-        getTestParameters().withCfRuntimes().build(),
+        getTestParameters().withSystemRuntime().build(),
         BooleanUtils.values(),
         BooleanUtils.values(),
         BooleanUtils.values());
diff --git a/src/test/java/com/android/tools/r8/shaking/PrintConfigurationTest.java b/src/test/java/com/android/tools/r8/shaking/PrintConfigurationTest.java
index 3fc3434..9dd9eb6 100644
--- a/src/test/java/com/android/tools/r8/shaking/PrintConfigurationTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/PrintConfigurationTest.java
@@ -8,9 +8,11 @@
 import static org.hamcrest.core.StringContains.containsString;
 import static org.junit.Assert.assertEquals;
 
+import com.android.tools.r8.JdkClassFileProvider;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.TestRuntime;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.utils.FileUtils;
 import com.android.tools.r8.utils.StringUtils;
@@ -35,7 +37,7 @@
 
   @Parameters(name = "{0}")
   public static TestParametersCollection data() {
-    return getTestParameters().withCfRuntimes().build();
+    return getTestParameters().withSystemRuntime().build();
   }
 
   public PrintConfigurationTest(TestParameters parameters) {
@@ -83,8 +85,10 @@
             "-printconfiguration proguard-config-out.txt");
     FileUtils.writeTextFile(proguardConfigFile, proguardConfig.trim());
 
+    assertEquals(TestRuntime.getSystemRuntime(), parameters.getRuntime());
     testForExternalR8(Backend.DEX, parameters.getRuntime())
         .addProgramClasses(PrintConfigurationTestClass.class)
+        .addLibraryProvider(JdkClassFileProvider.fromSystemJdk())
         .addKeepRuleFiles(proguardConfigFile)
         .compile();
 
diff --git a/tools/create_r8lib.py b/tools/create_r8lib.py
index c48eaca..b6189e6 100755
--- a/tools/create_r8lib.py
+++ b/tools/create_r8lib.py
@@ -96,7 +96,7 @@
   cmd.extend(['--source-file-template', source_file_template])
   cmd.extend(['--output', args.output])
   cmd.extend(['--pg-map-output', args.output + '.map'])
-  cmd.extend(['--lib', 'third_party/openjdk/openjdk-rt-1.8/rt.jar'])
+  cmd.extend(['--lib', jdk.GetJdkHome()])
   if args.pg_conf:
     for pgconf in args.pg_conf:
       cmd.extend(['--pg-conf', pgconf])