5 /* arg is a literal table index, holding a pair (symbol/dll) */
7 /* a word or quotation's general entry point */
9 /* a word's PIC entry point */
11 /* a word's tail-call PIC entry point */
12 RT_ENTRY_POINT_PIC_TAIL,
15 /* current code block */
17 /* data heap literal */
19 /* untagged fixnum literal */
21 /* address of megamorphic_cache_hits var */
22 RT_MEGAMORPHIC_CACHE_HITS,
23 /* address of vm object */
25 /* value of vm->cards_offset */
27 /* value of vm->decks_offset */
29 /* address of exception_handler -- this exists as a separate relocation
30 type since its used in a situation where relocation arguments cannot
31 be passed in, and so RT_DLSYM is inappropriate (Windows only) */
33 /* arg is a literal table index, holding a pair (symbol/dll) */
35 /* address of inline_cache_miss function. This is a separate
36 relocation to reduce compile time and size for PICs. */
38 /* address of safepoint page in code heap */
42 enum relocation_class {
43 /* absolute address in a pointer-width location */
45 /* absolute address in a 4 byte location */
47 /* relative address in a 4 byte location */
49 /* absolute address in a PowerPC LIS/ORI sequence */
51 /* absolute address in a PowerPC LWZ instruction */
53 /* relative address in a PowerPC LWZ/STW/BC instruction */
55 /* relative address in a PowerPC B/BL instruction */
57 /* relative address in an ARM B/BL instruction */
59 /* pointer to address in an ARM LDR/STR instruction */
61 /* pointer to address in an ARM LDR/STR instruction offset by 8 bytes */
63 /* absolute address in a 2 byte location */
65 /* absolute address in a 1 byte location */
67 /* absolute address in a PowerPC LIS/ORI/SLDI/ORIS/ORI sequence */
68 RC_ABSOLUTE_PPC_2_2_2_2,
71 static const cell rel_absolute_ppc_2_mask = 0x0000ffff;
72 static const cell rel_relative_ppc_2_mask = 0x0000fffc;
73 static const cell rel_relative_ppc_3_mask = 0x03fffffc;
74 static const cell rel_indirect_arm_mask = 0x00000fff;
75 static const cell rel_relative_arm_3_mask = 0x00ffffff;
77 /* code relocation table consists of a table of entries for each fixup */
78 struct relocation_entry {
81 explicit relocation_entry(u32 value_) : value(value_) {}
83 relocation_entry(relocation_type rel_type,
84 relocation_class rel_class,
87 value = (u32)((rel_type << 28) | (rel_class << 24) | offset);
90 relocation_type rel_type()
92 return (relocation_type)((value & 0xf0000000) >> 28);
95 relocation_class rel_class()
97 return (relocation_class)((value & 0x0f000000) >> 24);
102 return (value & 0x00ffffff);
105 int number_of_parameters()
115 case RT_ENTRY_POINT_PIC:
116 case RT_ENTRY_POINT_PIC_TAIL:
121 case RT_MEGAMORPHIC_CACHE_HITS:
122 case RT_CARDS_OFFSET:
123 case RT_DECKS_OFFSET:
124 case RT_EXCEPTION_HANDLER:
125 case RT_INLINE_CACHE_MISS:
128 critical_error("Bad rel type in number_of_parameters()",rel_type());
129 return -1; /* Can't happen */
134 struct instruction_operand {
135 relocation_entry rel;
136 code_block *compiled;
140 instruction_operand(relocation_entry rel_, code_block *compiled_, cell index_);
142 relocation_type rel_type()
144 return rel.rel_type();
149 return rel.rel_offset();
152 fixnum load_value_2_2();
153 fixnum load_value_2_2_2_2();
154 fixnum load_value_masked(cell mask, cell bits, cell shift);
155 fixnum load_value(cell relative_to);
157 code_block *load_code_block(cell relative_to);
158 code_block *load_code_block();
160 void store_value_2_2(fixnum value);
161 void store_value_2_2_2_2(fixnum value);
162 void store_value_masked(fixnum value, cell mask, cell shift);
163 void store_value(fixnum value);
164 void store_code_block(code_block *compiled);