1 /* |
|
2 * Copyright (c) 2013, 2018, 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 package org.graalvm.compiler.hotspot.phases; |
|
26 |
|
27 import org.graalvm.compiler.debug.DebugCloseable; |
|
28 import org.graalvm.compiler.graph.Node; |
|
29 import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig; |
|
30 import org.graalvm.compiler.hotspot.gc.g1.G1BarrierSet; |
|
31 import org.graalvm.compiler.hotspot.gc.shared.BarrierSet; |
|
32 import org.graalvm.compiler.hotspot.gc.shared.CardTableBarrierSet; |
|
33 import org.graalvm.compiler.nodes.StructuredGraph; |
|
34 import org.graalvm.compiler.nodes.extended.ArrayRangeWrite; |
|
35 import org.graalvm.compiler.nodes.java.AbstractCompareAndSwapNode; |
|
36 import org.graalvm.compiler.nodes.java.LoweredAtomicReadAndWriteNode; |
|
37 import org.graalvm.compiler.nodes.memory.ReadNode; |
|
38 import org.graalvm.compiler.nodes.memory.WriteNode; |
|
39 import org.graalvm.compiler.phases.Phase; |
|
40 |
|
41 public class WriteBarrierAdditionPhase extends Phase { |
|
42 |
|
43 private BarrierSet barrierSet; |
|
44 |
|
45 public WriteBarrierAdditionPhase(GraalHotSpotVMConfig config) { |
|
46 this.barrierSet = createBarrierSet(config); |
|
47 } |
|
48 |
|
49 @SuppressWarnings("try") |
|
50 @Override |
|
51 protected void run(StructuredGraph graph) { |
|
52 for (Node n : graph.getNodes()) { |
|
53 try (DebugCloseable scope = n.graph().withNodeSourcePosition(n)) { |
|
54 if (n instanceof ReadNode) { |
|
55 barrierSet.addReadNodeBarriers((ReadNode) n, graph); |
|
56 } else if (n instanceof WriteNode) { |
|
57 barrierSet.addWriteNodeBarriers((WriteNode) n, graph); |
|
58 } else if (n instanceof LoweredAtomicReadAndWriteNode) { |
|
59 LoweredAtomicReadAndWriteNode loweredAtomicReadAndWriteNode = (LoweredAtomicReadAndWriteNode) n; |
|
60 barrierSet.addAtomicReadWriteNodeBarriers(loweredAtomicReadAndWriteNode, graph); |
|
61 } else if (n instanceof AbstractCompareAndSwapNode) { |
|
62 barrierSet.addCASBarriers((AbstractCompareAndSwapNode) n, graph); |
|
63 } else if (n instanceof ArrayRangeWrite) { |
|
64 ArrayRangeWrite node = (ArrayRangeWrite) n; |
|
65 if (node.writesObjectArray()) { |
|
66 barrierSet.addArrayRangeBarriers(node, graph); |
|
67 } |
|
68 } |
|
69 } |
|
70 } |
|
71 } |
|
72 |
|
73 @Override |
|
74 public boolean checkContract() { |
|
75 return false; |
|
76 } |
|
77 |
|
78 private BarrierSet createBarrierSet(GraalHotSpotVMConfig config) { |
|
79 if (config.useG1GC) { |
|
80 return createG1BarrierSet(config); |
|
81 } else { |
|
82 return createCardTableBarrierSet(config); |
|
83 } |
|
84 } |
|
85 |
|
86 protected BarrierSet createCardTableBarrierSet(GraalHotSpotVMConfig config) { |
|
87 return new CardTableBarrierSet(config); |
|
88 } |
|
89 |
|
90 protected BarrierSet createG1BarrierSet(GraalHotSpotVMConfig config) { |
|
91 return new G1BarrierSet(config); |
|
92 } |
|
93 } |
|