54 |
54 |
55 AbstractAssembler::AbstractAssembler(CodeBuffer* code) { |
55 AbstractAssembler::AbstractAssembler(CodeBuffer* code) { |
56 if (code == NULL) return; |
56 if (code == NULL) return; |
57 CodeSection* cs = code->insts(); |
57 CodeSection* cs = code->insts(); |
58 cs->clear_mark(); // new assembler kills old mark |
58 cs->clear_mark(); // new assembler kills old mark |
|
59 if (cs->start() == NULL) { |
|
60 vm_exit_out_of_memory(0, err_msg("CodeCache: no room for %s", |
|
61 code->name())); |
|
62 } |
59 _code_section = cs; |
63 _code_section = cs; |
60 _code_begin = cs->start(); |
|
61 _code_limit = cs->limit(); |
|
62 _code_pos = cs->end(); |
|
63 _oop_recorder= code->oop_recorder(); |
64 _oop_recorder= code->oop_recorder(); |
64 DEBUG_ONLY( _short_branch_delta = 0; ) |
65 DEBUG_ONLY( _short_branch_delta = 0; ) |
65 if (_code_begin == NULL) { |
|
66 vm_exit_out_of_memory(0, err_msg("CodeCache: no room for %s", |
|
67 code->name())); |
|
68 } |
|
69 } |
66 } |
70 |
67 |
71 void AbstractAssembler::set_code_section(CodeSection* cs) { |
68 void AbstractAssembler::set_code_section(CodeSection* cs) { |
72 assert(cs->outer() == code_section()->outer(), "sanity"); |
69 assert(cs->outer() == code_section()->outer(), "sanity"); |
73 assert(cs->is_allocated(), "need to pre-allocate this section"); |
70 assert(cs->is_allocated(), "need to pre-allocate this section"); |
74 cs->clear_mark(); // new assembly into this section kills old mark |
71 cs->clear_mark(); // new assembly into this section kills old mark |
75 _code_section = cs; |
72 _code_section = cs; |
76 _code_begin = cs->start(); |
|
77 _code_limit = cs->limit(); |
|
78 _code_pos = cs->end(); |
|
79 } |
73 } |
80 |
74 |
81 // Inform CodeBuffer that incoming code and relocation will be for stubs |
75 // Inform CodeBuffer that incoming code and relocation will be for stubs |
82 address AbstractAssembler::start_a_stub(int required_space) { |
76 address AbstractAssembler::start_a_stub(int required_space) { |
83 CodeBuffer* cb = code(); |
77 CodeBuffer* cb = code(); |
84 CodeSection* cs = cb->stubs(); |
78 CodeSection* cs = cb->stubs(); |
85 assert(_code_section == cb->insts(), "not in insts?"); |
79 assert(_code_section == cb->insts(), "not in insts?"); |
86 sync(); |
|
87 if (cs->maybe_expand_to_ensure_remaining(required_space) |
80 if (cs->maybe_expand_to_ensure_remaining(required_space) |
88 && cb->blob() == NULL) { |
81 && cb->blob() == NULL) { |
89 return NULL; |
82 return NULL; |
90 } |
83 } |
91 set_code_section(cs); |
84 set_code_section(cs); |
94 |
87 |
95 // Inform CodeBuffer that incoming code and relocation will be code |
88 // Inform CodeBuffer that incoming code and relocation will be code |
96 // Should not be called if start_a_stub() returned NULL |
89 // Should not be called if start_a_stub() returned NULL |
97 void AbstractAssembler::end_a_stub() { |
90 void AbstractAssembler::end_a_stub() { |
98 assert(_code_section == code()->stubs(), "not in stubs?"); |
91 assert(_code_section == code()->stubs(), "not in stubs?"); |
99 sync(); |
|
100 set_code_section(code()->insts()); |
92 set_code_section(code()->insts()); |
101 } |
93 } |
102 |
94 |
103 // Inform CodeBuffer that incoming code and relocation will be for stubs |
95 // Inform CodeBuffer that incoming code and relocation will be for stubs |
104 address AbstractAssembler::start_a_const(int required_space, int required_align) { |
96 address AbstractAssembler::start_a_const(int required_space, int required_align) { |
105 CodeBuffer* cb = code(); |
97 CodeBuffer* cb = code(); |
106 CodeSection* cs = cb->consts(); |
98 CodeSection* cs = cb->consts(); |
107 assert(_code_section == cb->insts() || _code_section == cb->stubs(), "not in insts/stubs?"); |
99 assert(_code_section == cb->insts() || _code_section == cb->stubs(), "not in insts/stubs?"); |
108 sync(); |
|
109 address end = cs->end(); |
100 address end = cs->end(); |
110 int pad = -(intptr_t)end & (required_align-1); |
101 int pad = -(intptr_t)end & (required_align-1); |
111 if (cs->maybe_expand_to_ensure_remaining(pad + required_space)) { |
102 if (cs->maybe_expand_to_ensure_remaining(pad + required_space)) { |
112 if (cb->blob() == NULL) return NULL; |
103 if (cb->blob() == NULL) return NULL; |
113 end = cs->end(); // refresh pointer |
104 end = cs->end(); // refresh pointer |
122 |
113 |
123 // Inform CodeBuffer that incoming code and relocation will be code |
114 // Inform CodeBuffer that incoming code and relocation will be code |
124 // in section cs (insts or stubs). |
115 // in section cs (insts or stubs). |
125 void AbstractAssembler::end_a_const(CodeSection* cs) { |
116 void AbstractAssembler::end_a_const(CodeSection* cs) { |
126 assert(_code_section == code()->consts(), "not in consts?"); |
117 assert(_code_section == code()->consts(), "not in consts?"); |
127 sync(); |
|
128 set_code_section(cs); |
118 set_code_section(cs); |
129 } |
119 } |
130 |
120 |
131 void AbstractAssembler::flush() { |
121 void AbstractAssembler::flush() { |
132 sync(); |
|
133 ICache::invalidate_range(addr_at(0), offset()); |
122 ICache::invalidate_range(addr_at(0), offset()); |
134 } |
123 } |
135 |
124 |
136 |
125 |
137 void AbstractAssembler::a_byte(int x) { |
126 void AbstractAssembler::a_byte(int x) { |