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 package org.graalvm.compiler.lir.framemap;
24
25 import static org.graalvm.compiler.lir.LIRValueUtil.isVirtualStackSlot;
26
27 import java.util.ArrayList;
28 import java.util.BitSet;
29 import java.util.EnumSet;
30 import java.util.List;
31
32 import org.graalvm.compiler.core.common.LIRKind;
33 import org.graalvm.compiler.core.common.cfg.AbstractBlockBase;
34 import org.graalvm.compiler.debug.Debug;
35 import org.graalvm.compiler.debug.GraalError;
36 import org.graalvm.compiler.lir.InstructionValueConsumer;
37 import org.graalvm.compiler.lir.LIR;
38 import org.graalvm.compiler.lir.LIRInstruction;
39 import org.graalvm.compiler.lir.LIRInstruction.OperandFlag;
40 import org.graalvm.compiler.lir.LIRInstruction.OperandMode;
41 import org.graalvm.compiler.lir.VirtualStackSlot;
42 import org.graalvm.compiler.lir.gen.LIRGenerationResult;
43
44 import jdk.vm.ci.code.CallingConvention;
45 import jdk.vm.ci.code.CodeCacheProvider;
46 import jdk.vm.ci.code.RegisterConfig;
47 import jdk.vm.ci.meta.JavaKind;
48 import jdk.vm.ci.meta.Value;
49 import jdk.vm.ci.meta.ValueKind;
50
51 /**
52 * A FrameMapBuilder that records allocation.
53 */
54 public class FrameMapBuilderImpl extends FrameMapBuilderTool {
101 }
102
103 @Override
104 public FrameMap getFrameMap() {
105 return frameMap;
106 }
107
108 @Override
109 public int getNumberOfStackSlots() {
110 return numStackSlots;
111 }
112
113 @Override
114 public void callsMethod(CallingConvention cc) {
115 calls.add(cc);
116 }
117
118 @Override
119 @SuppressWarnings("try")
120 public FrameMap buildFrameMap(LIRGenerationResult res) {
121 if (Debug.isEnabled()) {
122 verifyStackSlotAllocation(res);
123 }
124 for (CallingConvention cc : calls) {
125 frameMap.callsMethod(cc);
126 }
127 frameMap.finish();
128 return frameMap;
129 }
130
131 private static void verifyStackSlotAllocation(LIRGenerationResult res) {
132 LIR lir = res.getLIR();
133 InstructionValueConsumer verifySlots = (LIRInstruction op, Value value, OperandMode mode, EnumSet<OperandFlag> flags) -> {
134 assert !isVirtualStackSlot(value) : String.format("Instruction %s contains a virtual stack slot %s", op, value);
135 };
136 for (AbstractBlockBase<?> block : lir.getControlFlowGraph().getBlocks()) {
137 lir.getLIRforBlock(block).forEach(op -> {
138 op.visitEachInput(verifySlots);
139 op.visitEachAlive(verifySlots);
140 op.visitEachState(verifySlots);
141
|
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 package org.graalvm.compiler.lir.framemap;
24
25 import static org.graalvm.compiler.lir.LIRValueUtil.isVirtualStackSlot;
26
27 import java.util.ArrayList;
28 import java.util.BitSet;
29 import java.util.EnumSet;
30 import java.util.List;
31
32 import org.graalvm.compiler.core.common.LIRKind;
33 import org.graalvm.compiler.core.common.cfg.AbstractBlockBase;
34 import org.graalvm.compiler.debug.DebugContext;
35 import org.graalvm.compiler.debug.GraalError;
36 import org.graalvm.compiler.lir.InstructionValueConsumer;
37 import org.graalvm.compiler.lir.LIR;
38 import org.graalvm.compiler.lir.LIRInstruction;
39 import org.graalvm.compiler.lir.LIRInstruction.OperandFlag;
40 import org.graalvm.compiler.lir.LIRInstruction.OperandMode;
41 import org.graalvm.compiler.lir.VirtualStackSlot;
42 import org.graalvm.compiler.lir.gen.LIRGenerationResult;
43
44 import jdk.vm.ci.code.CallingConvention;
45 import jdk.vm.ci.code.CodeCacheProvider;
46 import jdk.vm.ci.code.RegisterConfig;
47 import jdk.vm.ci.meta.JavaKind;
48 import jdk.vm.ci.meta.Value;
49 import jdk.vm.ci.meta.ValueKind;
50
51 /**
52 * A FrameMapBuilder that records allocation.
53 */
54 public class FrameMapBuilderImpl extends FrameMapBuilderTool {
101 }
102
103 @Override
104 public FrameMap getFrameMap() {
105 return frameMap;
106 }
107
108 @Override
109 public int getNumberOfStackSlots() {
110 return numStackSlots;
111 }
112
113 @Override
114 public void callsMethod(CallingConvention cc) {
115 calls.add(cc);
116 }
117
118 @Override
119 @SuppressWarnings("try")
120 public FrameMap buildFrameMap(LIRGenerationResult res) {
121 DebugContext debug = res.getLIR().getDebug();
122 if (debug.areScopesEnabled()) {
123 verifyStackSlotAllocation(res);
124 }
125 for (CallingConvention cc : calls) {
126 frameMap.callsMethod(cc);
127 }
128 frameMap.finish();
129 return frameMap;
130 }
131
132 private static void verifyStackSlotAllocation(LIRGenerationResult res) {
133 LIR lir = res.getLIR();
134 InstructionValueConsumer verifySlots = (LIRInstruction op, Value value, OperandMode mode, EnumSet<OperandFlag> flags) -> {
135 assert !isVirtualStackSlot(value) : String.format("Instruction %s contains a virtual stack slot %s", op, value);
136 };
137 for (AbstractBlockBase<?> block : lir.getControlFlowGraph().getBlocks()) {
138 lir.getLIRforBlock(block).forEach(op -> {
139 op.visitEachInput(verifySlots);
140 op.visitEachAlive(verifySlots);
141 op.visitEachState(verifySlots);
142
|