comparison src/share/vm/asm/assembler.inline.hpp @ 7198:6ab62ad83507

8003195: AbstractAssembler should not store code pointers but use the CodeSection directly Reviewed-by: twisti, kvn Contributed-by: Bharadwaj Yadavalli <bharadwaj.yadavalli@oracle.com>
author twisti
date Fri, 30 Nov 2012 11:44:05 -0800
parents 2f644f85485d
children cd3d6a6b95d9
comparison
equal deleted inserted replaced
7197:1acccb7c0b01 7198:6ab62ad83507
28 #include "asm/assembler.hpp" 28 #include "asm/assembler.hpp"
29 #include "asm/codeBuffer.hpp" 29 #include "asm/codeBuffer.hpp"
30 #include "compiler/disassembler.hpp" 30 #include "compiler/disassembler.hpp"
31 #include "runtime/threadLocalStorage.hpp" 31 #include "runtime/threadLocalStorage.hpp"
32 32
33 inline void AbstractAssembler::sync() { 33 inline address AbstractAssembler::addr_at(int pos) const {
34 CodeSection* cs = code_section(); 34 return code_section()->start() + pos;
35 guarantee(cs->start() == _code_begin, "must not shift code buffer");
36 cs->set_end(_code_pos);
37 } 35 }
38 36
39 inline void AbstractAssembler::emit_byte(int x) { 37 void AbstractAssembler::emit_int8(int8_t x) { code_section()->emit_int8 (x); }
40 assert(isByte(x), "not a byte"); 38 void AbstractAssembler::emit_int16(int16_t x) { code_section()->emit_int16(x); }
41 *(unsigned char*)_code_pos = (unsigned char)x; 39 void AbstractAssembler::emit_int32(int32_t x) { code_section()->emit_int32(x); }
42 _code_pos += sizeof(unsigned char); 40 void AbstractAssembler::emit_int64(int64_t x) { code_section()->emit_int64(x); }
43 sync();
44 }
45 41
46 42 void AbstractAssembler::emit_float(jfloat x) { code_section()->emit_float(x); }
47 inline void AbstractAssembler::emit_word(int x) { 43 void AbstractAssembler::emit_double(jdouble x) { code_section()->emit_double(x); }
48 *(short*)_code_pos = (short)x; 44 void AbstractAssembler::emit_address(address x) { code_section()->emit_address(x); }
49 _code_pos += sizeof(short);
50 sync();
51 }
52
53
54 inline void AbstractAssembler::emit_long(jint x) {
55 *(jint*)_code_pos = x;
56 _code_pos += sizeof(jint);
57 sync();
58 }
59
60 inline void AbstractAssembler::emit_address(address x) {
61 *(address*)_code_pos = x;
62 _code_pos += sizeof(address);
63 sync();
64 }
65 45
66 inline address AbstractAssembler::inst_mark() const { 46 inline address AbstractAssembler::inst_mark() const {
67 return code_section()->mark(); 47 return code_section()->mark();
68 } 48 }
69 49
70
71 inline void AbstractAssembler::set_inst_mark() { 50 inline void AbstractAssembler::set_inst_mark() {
72 code_section()->set_mark(); 51 code_section()->set_mark();
73 } 52 }
74
75 53
76 inline void AbstractAssembler::clear_inst_mark() { 54 inline void AbstractAssembler::clear_inst_mark() {
77 code_section()->clear_mark(); 55 code_section()->clear_mark();
78 } 56 }
79 57
80 58
81 inline void AbstractAssembler::relocate(RelocationHolder const& rspec, int format) { 59 inline void AbstractAssembler::relocate(RelocationHolder const& rspec, int format) {
82 assert(!pd_check_instruction_mark() 60 assert(!pd_check_instruction_mark()
83 || inst_mark() == NULL || inst_mark() == _code_pos, 61 || inst_mark() == NULL || inst_mark() == code_section()->end(),
84 "call relocate() between instructions"); 62 "call relocate() between instructions");
85 code_section()->relocate(_code_pos, rspec, format); 63 code_section()->relocate(code_section()->end(), rspec, format);
86 } 64 }
87 65
88 66
89 inline CodeBuffer* AbstractAssembler::code() const { 67 inline CodeBuffer* AbstractAssembler::code() const {
90 return code_section()->outer(); 68 return code_section()->outer();
91 } 69 }
92 70
93 inline int AbstractAssembler::sect() const { 71 inline int AbstractAssembler::sect() const {
94 return code_section()->index(); 72 return code_section()->index();
73 }
74
75 inline address AbstractAssembler::pc() const {
76 return code_section()->end();
77 }
78
79 inline int AbstractAssembler::offset() const {
80 return code_section()->size();
95 } 81 }
96 82
97 inline int AbstractAssembler::locator() const { 83 inline int AbstractAssembler::locator() const {
98 return CodeBuffer::locator(offset(), sect()); 84 return CodeBuffer::locator(offset(), sect());
99 } 85 }