annotate agent/src/share/classes/sun/jvm/hotspot/memory/MemRegion.java @ 1913:3b2dea75431e

6984311: JSR 292 needs optional bootstrap method parameters Summary: Allow CONSTANT_InvokeDynamic nodes to have any number of extra operands. Reviewed-by: twisti
author jrose
date Sat, 30 Oct 2010 13:08:23 -0700
parents c18cbe5936b8
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
diff changeset
2 * Copyright (c) 2000, 2001, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
a61af66fc99e Initial load
duke
parents:
diff changeset
25 package sun.jvm.hotspot.memory;
a61af66fc99e Initial load
duke
parents:
diff changeset
26
a61af66fc99e Initial load
duke
parents:
diff changeset
27 import java.util.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
28
a61af66fc99e Initial load
duke
parents:
diff changeset
29 import sun.jvm.hotspot.debugger.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
30 import sun.jvm.hotspot.runtime.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
31 import sun.jvm.hotspot.types.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
32 import sun.jvm.hotspot.utilities.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
33
a61af66fc99e Initial load
duke
parents:
diff changeset
34 /** A very simple data structure representing a contigous region of
a61af66fc99e Initial load
duke
parents:
diff changeset
35 address space. */
a61af66fc99e Initial load
duke
parents:
diff changeset
36
a61af66fc99e Initial load
duke
parents:
diff changeset
37 public class MemRegion implements Cloneable {
a61af66fc99e Initial load
duke
parents:
diff changeset
38 private Address start;
a61af66fc99e Initial load
duke
parents:
diff changeset
39 private long byteSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
40
a61af66fc99e Initial load
duke
parents:
diff changeset
41 private static AddressField startField;
a61af66fc99e Initial load
duke
parents:
diff changeset
42 private static CIntegerField wordSizeField;
a61af66fc99e Initial load
duke
parents:
diff changeset
43
a61af66fc99e Initial load
duke
parents:
diff changeset
44 static {
a61af66fc99e Initial load
duke
parents:
diff changeset
45 VM.registerVMInitializedObserver(new Observer() {
a61af66fc99e Initial load
duke
parents:
diff changeset
46 public void update(Observable o, Object data) {
a61af66fc99e Initial load
duke
parents:
diff changeset
47 initialize(VM.getVM().getTypeDataBase());
a61af66fc99e Initial load
duke
parents:
diff changeset
48 }
a61af66fc99e Initial load
duke
parents:
diff changeset
49 });
a61af66fc99e Initial load
duke
parents:
diff changeset
50 }
a61af66fc99e Initial load
duke
parents:
diff changeset
51
a61af66fc99e Initial load
duke
parents:
diff changeset
52 private static synchronized void initialize(TypeDataBase db) {
a61af66fc99e Initial load
duke
parents:
diff changeset
53 Type type = db.lookupType("MemRegion");
a61af66fc99e Initial load
duke
parents:
diff changeset
54
a61af66fc99e Initial load
duke
parents:
diff changeset
55 startField = type.getAddressField("_start");
a61af66fc99e Initial load
duke
parents:
diff changeset
56 wordSizeField = type.getCIntegerField("_word_size");
a61af66fc99e Initial load
duke
parents:
diff changeset
57 }
a61af66fc99e Initial load
duke
parents:
diff changeset
58
a61af66fc99e Initial load
duke
parents:
diff changeset
59 public MemRegion() {
a61af66fc99e Initial load
duke
parents:
diff changeset
60 }
a61af66fc99e Initial load
duke
parents:
diff changeset
61
a61af66fc99e Initial load
duke
parents:
diff changeset
62 /** This constructor takes a "MemRegion*" in the target process */
a61af66fc99e Initial load
duke
parents:
diff changeset
63 public MemRegion(Address memRegionAddr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
64 this(startField.getValue(memRegionAddr),
a61af66fc99e Initial load
duke
parents:
diff changeset
65 wordSizeField.getValue(memRegionAddr));
a61af66fc99e Initial load
duke
parents:
diff changeset
66 }
a61af66fc99e Initial load
duke
parents:
diff changeset
67
a61af66fc99e Initial load
duke
parents:
diff changeset
68 public MemRegion(Address start, long wordSize) {
a61af66fc99e Initial load
duke
parents:
diff changeset
69 setStart(start);
a61af66fc99e Initial load
duke
parents:
diff changeset
70 setWordSize(wordSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
71 }
a61af66fc99e Initial load
duke
parents:
diff changeset
72
a61af66fc99e Initial load
duke
parents:
diff changeset
73 public MemRegion(Address start, Address limit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
74 setStart(start);
a61af66fc99e Initial load
duke
parents:
diff changeset
75 byteSize = limit.minus(start);
a61af66fc99e Initial load
duke
parents:
diff changeset
76 }
a61af66fc99e Initial load
duke
parents:
diff changeset
77
a61af66fc99e Initial load
duke
parents:
diff changeset
78 public Object clone() {
a61af66fc99e Initial load
duke
parents:
diff changeset
79 return new MemRegion(start, byteSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
80 }
a61af66fc99e Initial load
duke
parents:
diff changeset
81
a61af66fc99e Initial load
duke
parents:
diff changeset
82 public MemRegion copy() {
a61af66fc99e Initial load
duke
parents:
diff changeset
83 return (MemRegion) clone();
a61af66fc99e Initial load
duke
parents:
diff changeset
84 }
a61af66fc99e Initial load
duke
parents:
diff changeset
85
a61af66fc99e Initial load
duke
parents:
diff changeset
86 public MemRegion intersection(MemRegion mr2) {
a61af66fc99e Initial load
duke
parents:
diff changeset
87 MemRegion res = new MemRegion();
a61af66fc99e Initial load
duke
parents:
diff changeset
88 if (AddressOps.gt(mr2.start(), start())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
89 res.setStart(mr2.start());
a61af66fc99e Initial load
duke
parents:
diff changeset
90 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
91 res.setStart(start());
a61af66fc99e Initial load
duke
parents:
diff changeset
92 }
a61af66fc99e Initial load
duke
parents:
diff changeset
93 Address resEnd;
a61af66fc99e Initial load
duke
parents:
diff changeset
94 Address end = end();
a61af66fc99e Initial load
duke
parents:
diff changeset
95 Address mr2End = mr2.end();
a61af66fc99e Initial load
duke
parents:
diff changeset
96 if (AddressOps.lt(end, mr2End)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
97 resEnd = end;
a61af66fc99e Initial load
duke
parents:
diff changeset
98 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
99 resEnd = mr2End;
a61af66fc99e Initial load
duke
parents:
diff changeset
100 }
a61af66fc99e Initial load
duke
parents:
diff changeset
101 if (AddressOps.lt(resEnd, res.start())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
102 res.setStart(null);
a61af66fc99e Initial load
duke
parents:
diff changeset
103 res.setWordSize(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
104 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
105 res.setEnd(resEnd);
a61af66fc99e Initial load
duke
parents:
diff changeset
106 }
a61af66fc99e Initial load
duke
parents:
diff changeset
107 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
108 }
a61af66fc99e Initial load
duke
parents:
diff changeset
109
a61af66fc99e Initial load
duke
parents:
diff changeset
110 public MemRegion union(MemRegion mr2) {
a61af66fc99e Initial load
duke
parents:
diff changeset
111 MemRegion res = new MemRegion();
a61af66fc99e Initial load
duke
parents:
diff changeset
112 if (AddressOps.lt(mr2.start(), start())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
113 res.setStart(mr2.start());
a61af66fc99e Initial load
duke
parents:
diff changeset
114 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
115 res.setStart(start());
a61af66fc99e Initial load
duke
parents:
diff changeset
116 }
a61af66fc99e Initial load
duke
parents:
diff changeset
117 Address resEnd;
a61af66fc99e Initial load
duke
parents:
diff changeset
118 Address end = end();
a61af66fc99e Initial load
duke
parents:
diff changeset
119 Address mr2End = mr2.end();
a61af66fc99e Initial load
duke
parents:
diff changeset
120 if (AddressOps.gt(end, mr2End)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
121 resEnd = end;
a61af66fc99e Initial load
duke
parents:
diff changeset
122 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
123 resEnd = mr2End;
a61af66fc99e Initial load
duke
parents:
diff changeset
124 }
a61af66fc99e Initial load
duke
parents:
diff changeset
125 res.setEnd(resEnd);
a61af66fc99e Initial load
duke
parents:
diff changeset
126 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
127 }
a61af66fc99e Initial load
duke
parents:
diff changeset
128
a61af66fc99e Initial load
duke
parents:
diff changeset
129 public Address start() {
a61af66fc99e Initial load
duke
parents:
diff changeset
130 return start;
a61af66fc99e Initial load
duke
parents:
diff changeset
131 }
a61af66fc99e Initial load
duke
parents:
diff changeset
132
a61af66fc99e Initial load
duke
parents:
diff changeset
133 public OopHandle startAsOopHandle() {
a61af66fc99e Initial load
duke
parents:
diff changeset
134 return start().addOffsetToAsOopHandle(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
135 }
a61af66fc99e Initial load
duke
parents:
diff changeset
136
a61af66fc99e Initial load
duke
parents:
diff changeset
137 public Address end() {
a61af66fc99e Initial load
duke
parents:
diff changeset
138 return start.addOffsetTo(byteSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
139 }
a61af66fc99e Initial load
duke
parents:
diff changeset
140
a61af66fc99e Initial load
duke
parents:
diff changeset
141 public OopHandle endAsOopHandle() {
a61af66fc99e Initial load
duke
parents:
diff changeset
142 return end().addOffsetToAsOopHandle(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
143 }
a61af66fc99e Initial load
duke
parents:
diff changeset
144
a61af66fc99e Initial load
duke
parents:
diff changeset
145 public void setStart(Address start) {
a61af66fc99e Initial load
duke
parents:
diff changeset
146 this.start = start;
a61af66fc99e Initial load
duke
parents:
diff changeset
147 }
a61af66fc99e Initial load
duke
parents:
diff changeset
148
a61af66fc99e Initial load
duke
parents:
diff changeset
149 public void setEnd(Address end) {
a61af66fc99e Initial load
duke
parents:
diff changeset
150 byteSize = end.minus(start);
a61af66fc99e Initial load
duke
parents:
diff changeset
151 }
a61af66fc99e Initial load
duke
parents:
diff changeset
152
a61af66fc99e Initial load
duke
parents:
diff changeset
153 public void setWordSize(long wordSize) {
a61af66fc99e Initial load
duke
parents:
diff changeset
154 byteSize = VM.getVM().getAddressSize() * wordSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
155 }
a61af66fc99e Initial load
duke
parents:
diff changeset
156
a61af66fc99e Initial load
duke
parents:
diff changeset
157 public boolean contains(MemRegion mr2) {
a61af66fc99e Initial load
duke
parents:
diff changeset
158 return AddressOps.lte(start, mr2.start) && AddressOps.gte(end(), mr2.end());
a61af66fc99e Initial load
duke
parents:
diff changeset
159 }
a61af66fc99e Initial load
duke
parents:
diff changeset
160
a61af66fc99e Initial load
duke
parents:
diff changeset
161 public boolean contains(Address addr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
162 return AddressOps.gte(addr, start()) && AddressOps.lt(addr, end());
a61af66fc99e Initial load
duke
parents:
diff changeset
163 }
a61af66fc99e Initial load
duke
parents:
diff changeset
164
a61af66fc99e Initial load
duke
parents:
diff changeset
165 public long byteSize() {
a61af66fc99e Initial load
duke
parents:
diff changeset
166 return byteSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
167 }
a61af66fc99e Initial load
duke
parents:
diff changeset
168
a61af66fc99e Initial load
duke
parents:
diff changeset
169 public long wordSize() {
a61af66fc99e Initial load
duke
parents:
diff changeset
170 return byteSize / VM.getVM().getAddressSize();
a61af66fc99e Initial load
duke
parents:
diff changeset
171 }
a61af66fc99e Initial load
duke
parents:
diff changeset
172 }