@@ -209,13 +209,22 @@ def pad(self, alignment: int) -> None:
209209 self .disassembly .append (f"{ offset :x} : { ' ' .join (['00' ] * padding )} " )
210210 self .body .extend ([0 ] * padding )
211211
212- def add_nop (self , alignment : int ) -> None :
213- """Add a NOP if the offset is not aligned ."""
212+ def add_nops (self , nop : bytes , alignment : int ) -> None :
213+ """Add NOPs until there is alignment. Fail if it is not possible ."""
214214 offset = len (self .body )
215- nop = b"\x1f \x20 \x03 \xD5 "
216- if offset % alignment :
217- self .disassembly .append (f"{ offset :x} : d503201f\t \t nop" )
218- self .body .extend (nop )
215+ nop_size = len (nop )
216+
217+ # Calculate the gap to the next multiple of alignment.
218+ gap = - offset % alignment
219+ if gap :
220+ if gap % nop_size == 0 :
221+ count = gap // nop_size
222+ self .body .extend (nop * count )
223+ else :
224+ raise ValueError (
225+ f"Cannot add nops of size '{ nop_size } ' to a body with "
226+ f"offset '{ offset } ' to align with '{ alignment } '"
227+ )
219228
220229 def remove_jump (self ) -> None :
221230 """Remove a zero-length continuation jump, if it exists."""
@@ -254,7 +263,6 @@ def remove_jump(self) -> None:
254263 return
255264 if self .body [offset :] == jump :
256265 self .body = self .body [:offset ]
257- self .disassembly = self .disassembly [:- 2 ]
258266 self .holes .remove (hole )
259267
260268
@@ -275,10 +283,7 @@ class StencilGroup:
275283 _trampolines : set [int ] = dataclasses .field (default_factory = set , init = False )
276284
277285 def process_relocations (
278- self ,
279- known_symbols : dict [str , int ],
280- * ,
281- alignment : int = 1 ,
286+ self , known_symbols : dict [str , int ], * , alignment : int = 1 , nop : bytes = b""
282287 ) -> None :
283288 """Fix up all GOT and internal relocations for this stencil group."""
284289 for hole in self .code .holes .copy ():
@@ -299,7 +304,7 @@ def process_relocations(
299304 hole .addend = ordinal
300305 hole .symbol = None
301306 self .code .remove_jump ()
302- self .code .add_nop ( alignment = alignment )
307+ self .code .add_nops ( nop = nop , alignment = alignment )
303308 self .data .pad (8 )
304309 for stencil in [self .code , self .data ]:
305310 for hole in stencil .holes :
0 commit comments