1 /*
2  * Copyright (c) 2016, 2020, 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 
25 
26 package jdk.tools.jaotc;
27 
28 import java.util.List;
29 
30 import org.graalvm.compiler.code.CompilationResult;
31 import org.graalvm.compiler.hotspot.HotSpotMarkId;
32 
33 final class CodeOffsets {
34     private final int entry;
35     private final int verifiedEntry;
36     private final int exceptionHandler;
37     private final int deoptHandler;
38     private final int deoptMHHandler;
39 
CodeOffsets(int entry, int verifiedEntry, int exceptionHandler, int deoptHandler, int deoptMHHandler)40     private CodeOffsets(int entry, int verifiedEntry, int exceptionHandler, int deoptHandler, int deoptMHHandler) {
41         this.entry = entry;
42         this.verifiedEntry = verifiedEntry;
43         this.exceptionHandler = exceptionHandler;
44         this.deoptHandler = deoptHandler;
45         this.deoptMHHandler = deoptMHHandler;
46     }
47 
buildFrom(List<CompilationResult.CodeMark> marks)48     static CodeOffsets buildFrom(List<CompilationResult.CodeMark> marks) {
49         int entry = 0;
50         int verifiedEntry = 0;
51         int exceptionHandler = -1;
52         int deoptHandler = -1;
53         int deoptMHHandler = -1;
54 
55         for (CompilationResult.CodeMark mark : marks) {
56             HotSpotMarkId markId = (HotSpotMarkId) mark.id;
57             switch (markId) {
58                 case UNVERIFIED_ENTRY:
59                     entry = mark.pcOffset;
60                     break;
61                 case VERIFIED_ENTRY:
62                     verifiedEntry = mark.pcOffset;
63                     break;
64                 case OSR_ENTRY:
65                     // Unhandled
66                     break;
67                 case EXCEPTION_HANDLER_ENTRY:
68                     exceptionHandler = mark.pcOffset;
69                     break;
70                 case DEOPT_HANDLER_ENTRY:
71                     deoptHandler = mark.pcOffset;
72                     break;
73                 case DEOPT_MH_HANDLER_ENTRY:
74                     deoptMHHandler = mark.pcOffset;
75                     break;
76                 default:
77                     break; // Ignore others
78             }
79         }
80         return new CodeOffsets(entry, verifiedEntry, exceptionHandler, deoptHandler, deoptMHHandler);
81     }
82 
entry()83     int entry() {
84         return entry;
85     }
86 
verifiedEntry()87     int verifiedEntry() {
88         return verifiedEntry;
89     }
90 
exceptionHandler()91     int exceptionHandler() {
92         return exceptionHandler;
93     }
94 
deoptHandler()95     int deoptHandler() {
96         return deoptHandler;
97     }
98 
deoptMHHandler()99     int deoptMHHandler() {
100         return deoptMHHandler;
101     }
102 }
103