1 /*
 2  * Copyright (c) 2026, Oracle and/or its affiliates. All rights reserved.
 3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 4  *
 5  * This code is free software; you can redistribute it and/or modify it
 6  * under the terms of the GNU General Public License version 2 only, as
 7  * published by the Free Software Foundation.
 8  *
 9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * version 2 for more details (a copy is included in the LICENSE file that
13  * accompanied this code).
14  *
15  * You should have received a copy of the GNU General Public License version
16  * 2 along with this work; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  */
23 
24 package compiler.ciReplay;
25 
26 import jdk.test.lib.Asserts;
27 
28 import java.io.IOException;
29 import java.nio.file.Files;
30 import java.nio.file.Paths;
31 import java.util.ArrayList;
32 import java.util.List;
33 
34 public class PrintIdeal {
35     private final String logFile;
36     private final List<String> idealGraph;
37 
38     public PrintIdeal(String logFile) {
39         this.logFile = logFile;
40         this.idealGraph = new ArrayList<>();
41     }
42 
43     public List<String> vmFlags() {
44         return new ArrayList<>(List.of(
45                 "-XX:LogFile='" + logFile + "'",
46                 "-XX:+LogCompilation",
47                 "-XX:+PrintIdeal"
48         ));
49     }
50 
51     public void parse() {
52         idealGraph.clear();
53         try (var br = Files.newBufferedReader(Paths.get(logFile))) {
54             String line;
55             boolean printIdealLine = false;
56             while ((line = br.readLine()) != null) {
57                 if (printIdealLine) {
58                     if (line.startsWith("</ideal")) {
59                         break;
60                     }
61                     idealGraph.add(line);
62                 } else {
63                     printIdealLine = line.startsWith("<ideal");
64                 }
65             }
66         } catch (IOException e) {
67             throw new Error("Failed to read " + logFile + " data: " + e, e);
68         }
69         Asserts.assertFalse(idealGraph.isEmpty(), "did not find PrintIdeal output");
70     }
71 
72     public String find(String toMatch) {
73         return idealGraph.stream()
74                 .filter(line -> line.contains(toMatch))
75                 .findFirst()
76                 .orElse("");
77     }
78 
79     public int count(String toMatch) {
80         return (int) idealGraph.stream()
81                 .filter(line -> line.contains(toMatch))
82                 .count();
83     }
84 }