@@ -74,13 +74,14 @@ class EntryAddressInfo:
7474 value : int
7575 rom_hi : int
7676 rom_lo : int
77+ ori : bool
7778
7879 @staticmethod
7980 def new (
80- value : Optional [int ], hi : Optional [int ], lo : Optional [int ]
81+ value : Optional [int ], hi : Optional [int ], lo : Optional [int ], ori : Optional [ int ]
8182 ) -> Optional ["EntryAddressInfo" ]:
8283 if value is not None and hi is not None and lo is not None :
83- return EntryAddressInfo (value , hi , lo )
84+ return EntryAddressInfo (value , hi , lo , ori == lo )
8485 return None
8586
8687
@@ -94,6 +95,7 @@ class N64EntrypointInfo:
9495 main_address : Optional [EntryAddressInfo ]
9596 stack_top : Optional [EntryAddressInfo ]
9697 traditional_entrypoint : bool
98+ ori_entrypoint : bool
9799
98100 def segment_size (self ) -> int :
99101 if self .data_size is not None :
@@ -120,6 +122,10 @@ def parse_rom_bytes(
120122 completed_pair = [False for _ in range (32 )]
121123 hi_assignments : List [Optional [int ]] = [None for _ in range (32 )]
122124 lo_assignments : List [Optional [int ]] = [None for _ in range (32 )]
125+ # We need to track if something was paired using an ori instead of an
126+ # addiu or similar, because if that's the case we can't emit normal
127+ # relocations in the generated symbol_addrs file for it.
128+ ori_assignments : List [Optional [int ]] = [None for _ in range (32 )]
123129
124130 register_bss_address : Optional [int ] = None
125131 register_bss_size : Optional [int ] = None
@@ -130,6 +136,7 @@ def parse_rom_bytes(
130136 bss_end_address : Optional [EntryAddressInfo ] = None
131137
132138 traditional_entrypoint = True
139+ ori_entrypoint = False
133140 decrementing_bss_routine = True
134141 data_size : Optional [int ] = None
135142 func_call_target : Optional [EntryAddressInfo ] = None
@@ -163,6 +170,9 @@ def parse_rom_bytes(
163170 )
164171 completed_pair [insn .rt .value ] = True
165172 lo_assignments [insn .rt .value ] = current_rom
173+ if insn .isUnsigned ():
174+ ori_assignments [insn .rt .value ] = current_rom
175+ ori_entrypoint = True
166176 elif insn .doesStore ():
167177 if insn .rt == rabbitizer .RegGprO32 .zero :
168178 # Try to detect the zero-ing bss algorithm
@@ -208,11 +218,13 @@ def parse_rom_bytes(
208218 register_values [insn .rs .value ],
209219 hi_assignments [insn .rs .value ],
210220 lo_assignments [insn .rs .value ],
221+ ori_assignments [insn .rs .value ],
211222 )
212223 bss_end_address = EntryAddressInfo .new (
213224 register_values [insn .rt .value ],
214225 hi_assignments [insn .rt .value ],
215226 lo_assignments [insn .rt .value ],
227+ ori_assignments [insn .rt .value ],
216228 )
217229
218230 elif insn .isFunctionCall ():
@@ -221,7 +233,7 @@ def parse_rom_bytes(
221233 # entrypoint to actual code.
222234 traditional_entrypoint = False
223235 func_call_target = EntryAddressInfo (
224- insn .getInstrIndexAsVram (), current_rom , current_rom
236+ insn .getInstrIndexAsVram (), current_rom , current_rom , False
225237 )
226238
227239 elif insn .uniqueId == rabbitizer .InstrId .cpu_break :
@@ -254,19 +266,22 @@ def parse_rom_bytes(
254266 register_values [register_bss_address ],
255267 hi_assignments [register_bss_address ],
256268 lo_assignments [register_bss_address ],
269+ ori_assignments [register_bss_address ],
257270 )
258271 if register_bss_size is not None :
259272 bss_size = EntryAddressInfo .new (
260273 register_values [register_bss_size ],
261274 hi_assignments [register_bss_size ],
262275 lo_assignments [register_bss_size ],
276+ ori_assignments [register_bss_size ],
263277 )
264278
265279 if register_main_address is not None :
266280 main_address = EntryAddressInfo .new (
267281 register_values [register_main_address ],
268282 hi_assignments [register_main_address ],
269283 lo_assignments [register_main_address ],
284+ ori_assignments [register_main_address ],
270285 )
271286 else :
272287 main_address = None
@@ -275,6 +290,7 @@ def parse_rom_bytes(
275290 register_values [rabbitizer .RegGprO32 .sp .value ],
276291 hi_assignments [rabbitizer .RegGprO32 .sp .value ],
277292 lo_assignments [rabbitizer .RegGprO32 .sp .value ],
293+ ori_assignments [rabbitizer .RegGprO32 .sp .value ],
278294 )
279295
280296 if not traditional_entrypoint :
@@ -299,6 +315,7 @@ def parse_rom_bytes(
299315 main_address ,
300316 stack_top ,
301317 traditional_entrypoint ,
318+ ori_entrypoint ,
302319 )
303320
304321
0 commit comments