Mercurial > hg > truffle
comparison src/share/vm/runtime/virtualspace.hpp @ 237:1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
Summary: allocate alignment-sized page(s) below java heap so that memory accesses at heap_base+1page give signal and cause an implicit null check
Reviewed-by: kvn, jmasa, phh, jcoomes
author | coleenp |
---|---|
date | Sat, 19 Jul 2008 17:38:22 -0400 |
parents | a61af66fc99e |
children | 9ee9cf798b59 |
comparison
equal
deleted
inserted
replaced
235:9c2ecc2ffb12 | 237:1fdb98a17101 |
---|---|
27 class ReservedSpace VALUE_OBJ_CLASS_SPEC { | 27 class ReservedSpace VALUE_OBJ_CLASS_SPEC { |
28 friend class VMStructs; | 28 friend class VMStructs; |
29 private: | 29 private: |
30 char* _base; | 30 char* _base; |
31 size_t _size; | 31 size_t _size; |
32 size_t _noaccess_prefix; | |
32 size_t _alignment; | 33 size_t _alignment; |
33 bool _special; | 34 bool _special; |
34 | 35 |
35 // ReservedSpace | 36 // ReservedSpace |
36 ReservedSpace(char* base, size_t size, size_t alignment, bool special); | 37 ReservedSpace(char* base, size_t size, size_t alignment, bool special); |
37 void initialize(size_t size, size_t alignment, bool large, | 38 void initialize(size_t size, size_t alignment, bool large, |
38 char* requested_address = NULL); | 39 char* requested_address, |
40 const size_t noaccess_prefix); | |
39 | 41 |
40 // Release parts of an already-reserved memory region [addr, addr + len) to | 42 // Release parts of an already-reserved memory region [addr, addr + len) to |
41 // get a new region that has "compound alignment." Return the start of the | 43 // get a new region that has "compound alignment." Return the start of the |
42 // resulting region, or NULL on failure. | 44 // resulting region, or NULL on failure. |
43 // | 45 // |
57 const size_t prefix_size, | 59 const size_t prefix_size, |
58 const size_t prefix_align, | 60 const size_t prefix_align, |
59 const size_t suffix_size, | 61 const size_t suffix_size, |
60 const size_t suffix_align); | 62 const size_t suffix_align); |
61 | 63 |
64 protected: | |
65 // Create protection page at the beginning of the space. | |
66 void protect_noaccess_prefix(const size_t size); | |
67 | |
62 public: | 68 public: |
63 // Constructor | 69 // Constructor |
64 ReservedSpace(size_t size); | 70 ReservedSpace(size_t size); |
65 ReservedSpace(size_t size, size_t alignment, bool large, | 71 ReservedSpace(size_t size, size_t alignment, bool large, |
66 char* requested_address = NULL); | 72 char* requested_address = NULL, |
73 const size_t noaccess_prefix = 0); | |
67 ReservedSpace(const size_t prefix_size, const size_t prefix_align, | 74 ReservedSpace(const size_t prefix_size, const size_t prefix_align, |
68 const size_t suffix_size, const size_t suffix_align); | 75 const size_t suffix_size, const size_t suffix_align, |
76 const size_t noaccess_prefix); | |
69 | 77 |
70 // Accessors | 78 // Accessors |
71 char* base() const { return _base; } | 79 char* base() const { return _base; } |
72 size_t size() const { return _size; } | 80 size_t size() const { return _size; } |
73 size_t alignment() const { return _alignment; } | 81 size_t alignment() const { return _alignment; } |
74 bool special() const { return _special; } | 82 bool special() const { return _special; } |
83 | |
84 size_t noaccess_prefix() const { return _noaccess_prefix; } | |
75 | 85 |
76 bool is_reserved() const { return _base != NULL; } | 86 bool is_reserved() const { return _base != NULL; } |
77 void release(); | 87 void release(); |
78 | 88 |
79 // Splitting | 89 // Splitting |
101 | 111 |
102 ReservedSpace ReservedSpace::last_part(size_t partition_size) | 112 ReservedSpace ReservedSpace::last_part(size_t partition_size) |
103 { | 113 { |
104 return last_part(partition_size, alignment()); | 114 return last_part(partition_size, alignment()); |
105 } | 115 } |
116 | |
117 // Class encapsulating behavior specific of memory space reserved for Java heap | |
118 class ReservedHeapSpace : public ReservedSpace { | |
119 public: | |
120 // Constructor | |
121 ReservedHeapSpace(size_t size, size_t forced_base_alignment, | |
122 bool large, char* requested_address); | |
123 ReservedHeapSpace(const size_t prefix_size, const size_t prefix_align, | |
124 const size_t suffix_size, const size_t suffix_align); | |
125 }; | |
106 | 126 |
107 // VirtualSpace is data structure for committing a previously reserved address range in smaller chunks. | 127 // VirtualSpace is data structure for committing a previously reserved address range in smaller chunks. |
108 | 128 |
109 class VirtualSpace VALUE_OBJ_CLASS_SPEC { | 129 class VirtualSpace VALUE_OBJ_CLASS_SPEC { |
110 friend class VMStructs; | 130 friend class VMStructs; |