@@ -209,7 +209,24 @@ 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  remove_jump (self , * , alignment : int  =  1 ) ->  None :
212+     def  add_nops (self , nop : bytes , alignment : int ) ->  None :
213+         """Add NOPs until there is alignment. Fail if it is not possible.""" 
214+         offset  =  len (self .body )
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+                 )
228+ 
229+     def  remove_jump (self ) ->  None :
213230        """Remove a zero-length continuation jump, if it exists.""" 
214231        hole  =  max (self .holes , key = lambda  hole : hole .offset )
215232        match  hole :
@@ -244,7 +261,7 @@ def remove_jump(self, *, alignment: int = 1) -> None:
244261                jump  =  b"\x00 \x00 \x00 \x14 " 
245262            case  _:
246263                return 
247-         if  self .body [offset :] ==  jump   and   offset   %   alignment   ==   0 :
264+         if  self .body [offset :] ==  jump :
248265            self .body  =  self .body [:offset ]
249266            self .holes .remove (hole )
250267
@@ -266,10 +283,7 @@ class StencilGroup:
266283    _trampolines : set [int ] =  dataclasses .field (default_factory = set , init = False )
267284
268285    def  process_relocations (
269-         self ,
270-         known_symbols : dict [str , int ],
271-         * ,
272-         alignment : int  =  1 ,
286+         self , known_symbols : dict [str , int ], * , alignment : int  =  1 , nop : bytes  =  b"" 
273287    ) ->  None :
274288        """Fix up all GOT and internal relocations for this stencil group.""" 
275289        for  hole  in  self .code .holes .copy ():
@@ -289,8 +303,8 @@ def process_relocations(
289303                self ._trampolines .add (ordinal )
290304                hole .addend  =  ordinal 
291305                hole .symbol  =  None 
292-         self .code .remove_jump (alignment = alignment )
293-         self .code .pad ( alignment )
306+         self .code .remove_jump ()
307+         self .code .add_nops ( nop = nop ,  alignment = alignment )
294308        self .data .pad (8 )
295309        for  stencil  in  [self .code , self .data ]:
296310            for  hole  in  stencil .holes :
0 commit comments