
    d.                     <    d dl mZ  G d de      Z G d de      Zy)    )
namedtuplec                      e Zd ZdZd Zd Zd Zd ZdZd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z  e!dd       Z" e"d!d"e#       e"d!d$e#       e"d%d&e#       e"d'd(e#       e"d'd)e#       e"d%d*e#       e"d+d,e#       e"d+d-e#       e"d'd.e#       e"d'd/e#       e"d'd0e#       e"d'd1e#       e"d2d3e#       e"d+d4e#       e"d'd5e#       e"d'd6e#       e"d'd7e#       e"d'd8e#       e"d7d7e#       e"d+d!e#       e"d+d9e#       e"d!d!e#      fZ#y:);EHABIBytecodeDecodera   Decoder of a sequence of ARM exception handler abi bytecode.

        Reference:
        https://github.com/llvm/llvm-project/blob/master/llvm/tools/llvm-readobj/ARMEHABIPrinter.h
        https://developer.arm.com/documentation/ihi0038/b/

        Accessible attributes:

            mnemonic_array:
                MnemonicItem array.

        Parameters:

            bytecode_array:
                Integer array, raw data of bytecode.

    c                 N    || _         d | _        d | _        | j                          y N)_bytecode_array_indexmnemonic_array_decode)selfbytecode_arrays     8/usr/lib/python3/dist-packages/elftools/ehabi/decoder.py__init__zEHABIBytecodeDecoder.__init__   s"    -"    c                    d| _         g | _        | j                   t        | j                        k  r| j                  D ]y  \  }}}| j                  | j                      |z  |k(  s'| j                   } ||       }| j                   }| j                  j                  t        | j                  || |              n | j                   t        | j                        k  ryy)z@ Decode bytecode array, put result into mnemonic_array.
        r   N)r	   r
   lenr   ringappendMnemonicItem)r   maskvaluehandler	start_idxmnemonicend_idxs          r   r   zEHABIBytecodeDecoder._decode%   s      kkC 4 455(,		 $eW((5<F $I&t}H"kkG''..$T%9%9)W%MxXZ kkC 4 455r   c                 z    | j                   | j                     }| xj                  dz  c_        d|dz  dz  dz   z  S )N   vsp = vsp + %u?         r   r	   r   opcodes     r   _decode_00xxxxxxz%EHABIBytecodeDecoder._decode_00xxxxxx4   ?     %%dkk2qVd]q$8A#=>>r   c                 z    | j                   | j                     }| xj                  dz  c_        d|dz  dz  dz   z  S )Nr   zvsp = vsp - %ur   r    r!   r"   r#   s     r   _decode_01xxxxxxz%EHABIBytecodeDecoder._decode_01xxxxxx;   r&   r   )r0r1r2r3r4r5r6r7r8r9r10fpipsplrpcc                     d|dz   z  dz
  |z  S )Nr    )r   startcounts      r   _calculate_rangez%EHABIBytecodeDecoder._calculate_rangeE   s    uqy!Q&500r   c                     t        d      D cg c]  }|d|z  z  dk7  s| j                  |    }}ddj                  |      z  S c c}w N    r   r   z{%s}z, )rangegpr_register_namesjoin)r   gpr_maskihitss       r   	_printGPRzEHABIBytecodeDecoder._printGPRH   sO    49"IZqQRSVATXYAY''*ZZ		$'' [s
   AAc                     t        d      D cg c]  }|d|z  z  dk7  s|t        |      z    }}ddj                  |      z  S c c}w r?   )rA   strrC   )r   vfp_maskprefixrE   rF   s        r   _print_registersz%EHABIBytecodeDecoder._print_registersL   sJ    ).rOAh!q&6IQ6NQOO		$'' Ps
   AAc                 
   | j                   | j                     }| xj                  dz  c_        | j                   | j                     }| xj                  dz  c_        |dz  |dz  dz  z  }|dk(  ryd| j                  |      z  S )Nr   r!         r   zrefuse to unwindpop %s)r   r	   rG   )r   op0op1rD   s       r   _decode_1000iiii_iiiiiiiiz.EHABIBytecodeDecoder._decode_1000iiii_iiiiiiiiP   s}    ""4;;/q""4;;/q 1H#*!34q=%dnnX666r   c                 .    | xj                   dz  c_         y)Nr   zreserved (ARM MOVrr)r	   r   s    r   _decode_10011101z%EHABIBytecodeDecoder._decode_10011101a   s    q%r   c                 .    | xj                   dz  c_         y)Nr   zreserved (WiMMX MOVrr)rU   rV   s    r   _decode_10011111z%EHABIBytecodeDecoder._decode_10011111e   s    q'r   c                 n    | j                   | j                     }| xj                  dz  c_        d|dz  z  S )Nr   z	vsp = r%urN   r"   r#   s     r   _decode_1001nnnnz%EHABIBytecodeDecoder._decode_1001nnnni   s3    %%dkk2qftm,,r   c                     | j                   | j                     }| xj                  dz  c_        d| j                  | j                  d|dz              z  S )Nr   rP   r!      r   r	   rG   r=   r#   s     r   _decode_10100nnnz%EHABIBytecodeDecoder._decode_10100nnno   sK     %%dkk2q$..)>)>q&4-)PQQQr   c                     | j                   | j                     }| xj                  dz  c_        d| j                  | j                  d|dz        dz        z  S )Nr   rP   r!   r]   i @  r^   r#   s     r   _decode_10101nnnz%EHABIBytecodeDecoder._decode_10101nnnv   sQ     %%dkk2q$..)>)>q&4-)PT[)\]]]r   c                 .    | xj                   dz  c_         y)Nr   finishrU   rV   s    r   _decode_10110000z%EHABIBytecodeDecoder._decode_10110000}   s    qr   c                     | xj                   dz  c_         | j                  | j                      }| xj                   dz  c_         |dz  dk7  s|dk(  ryd| j                  |dz        z  S )Nr      r   sparerP   rN   )r	   r   rG   r   rR   s     r   _decode_10110001_0000iiiiz.EHABIBytecodeDecoder._decode_10110001_0000iiii   sa     	q""4;;/q$J1tdnncDj:::r   c                    | xj                   dz  c_         | j                  | j                      g}| xj                   dz  c_         | j                  | j                      dz  dk(  r]|j                  | j                  | j                             | xj                   dz  c_         | j                  | j                      dz  dk(  r]d}t        |      D ]  }|dz  |dz  z   } dd|dz  z   z  S )	Nr      r   r]      r   i  r    )r	   r   r   reversed)r   uleb_bufferr   bs       r   _decode_10110010_uleb128z-EHABIBytecodeDecoder._decode_10110010_uleb128   s     	q++DKK89q""4;;/$6!;t33DKK@AKK1K ""4;;/$6!; +& 	.AaZAH-E	.5EQJ#788r   c                 "    | j                         S r   )_decode_11001001_ssssccccrV   s    r   _decode_10110011_ssssccccz.EHABIBytecodeDecoder._decode_10110011_sssscccc   s    --//r   c                 "    | j                         S r   _sparerV   s    r   _decode_101101nnz%EHABIBytecodeDecoder._decode_101101nn       {{}r   c                     | j                   | j                     }| xj                  dz  c_        d| j                  | j                  d|dz        d      z  S )Nr   rP      r]   dr   r	   rL   r=   r#   s     r   _decode_10111nnnz%EHABIBytecodeDecoder._decode_10111nnn   sQ     %%dkk2q$//0E0EaRV0WY\]]]r   c                     | xj                   dz  c_         | j                  | j                      }| xj                   dz  c_         |dz  dz	  }|dz  dz	  }d| j                  | j                  ||      d      z  S )Nr   rf   r!   rN   r   rP   wRr	   r   rL   r=   r   rR   r;   r<   s       r   _decode_11000110_ssssccccz.EHABIBytecodeDecoder._decode_11000110_sssscccc   sv    
 	q""4;;/q*"*"$//0E0EeU0SUYZZZr   c                     | xj                   dz  c_         | j                  | j                      }| xj                   dz  c_         |dz  dk7  s|dk(  ryd| j                  |dz  d      z  S )Nr   rf   r   rg   rP   rN   wCGR)r	   r   rL   rh   s     r   _decode_11000111_0000iiiiz.EHABIBytecodeDecoder._decode_11000111_0000iiii   se     	q""4;;/q$J1td33C$JGGGr   c                     | xj                   dz  c_         | j                  | j                      }| xj                   dz  c_         d|dz  dz	  z   }|dz  dz	  }d| j                  | j                  ||      d      z  S )	Nr      rf   r!   rN   r   rP   r{   r   r   s       r   _decode_11001000_ssssccccz.EHABIBytecodeDecoder._decode_11001000_sssscccc   s{    
 	q""4;;/qsTza'(*"$//0E0EeU0SUXYYYr   c                     | xj                   dz  c_         | j                  | j                      }| xj                   dz  c_         |dz  dz	  }|dz  dz	  }d| j                  | j                  ||      d      z  S )Nr   rf   r!   rN   r   rP   r{   r   r   s       r   rr   z.EHABIBytecodeDecoder._decode_11001001_sssscccc   sv    
 	q""4;;/q*"*"$//0E0EeU0SUXYYYr   c                 "    | j                         S r   ru   rV   s    r   _decode_11001yyyz%EHABIBytecodeDecoder._decode_11001yyy   rx   r   c                     | j                   | j                     }| xj                  dz  c_        d| j                  | j                  d|dz        d      z  S )Nr   rP   
   r]   r   r|   r#   s     r   _decode_11000nnnz%EHABIBytecodeDecoder._decode_11000nnn   sQ     %%dkk2q$//0E0Eb&SW-0XZ^___r   c                 "    | j                         S r   )r}   rV   s    r   _decode_11010nnnz%EHABIBytecodeDecoder._decode_11010nnn   s    $$&&r   c                 "    | j                         S r   ru   rV   s    r   _decode_11xxxyyyz%EHABIBytecodeDecoder._decode_11xxxyyy   rx   r   c                 .    | xj                   dz  c_         y)Nr   rg   rU   rV   s    r   rv   zEHABIBytecodeDecoder._spare   s    qr   _DECODE_RECIPE_TYPEzmask value handler   r   )r   r   r   @   rf   rk                                                            N)$__name__
__module____qualname____doc__r   r   r%   r(   rB   r=   rG   rL   rS   rW   rY   r[   r_   ra   rd   ri   rp   rs   rw   r}   r   r   r   rr   r   r   r   r   rv   r   r   r   r:   r   r   r   r      s   $??K1((7"&(-R^
;9$0^
[H
Z
Z`' %%:<PQ 	T;KLT;KLT;TUT;KLT;KLT;KLT;KLT;KLT;KLT;TUT;STT;TUT;KLT;KLT;TUT;TUT;TUT;TUT;KLT;KLT;KLT;KL-Dr   r   c                       e Zd ZdZd Zd Zy)r   z Single mnemonic item.
    c                      || _         || _        y r   )bytecoder   )r   r   r   s      r   r   zMnemonicItem.__init__  s      r   c                     dj                  | j                  D cg c]  }d|z  	 c}      d| j                  S c c}w )N z0x%02xz ; )rC   r   r   )r   xs     r   __repr__zMnemonicItem.__repr__  s0    HHDMM%Jqhl%JKT]][[%Js   <N)r   r   r   r   r   r   r:   r   r   r   r     s    !\r   r   N)collectionsr   objectr   r   r:   r   r   <module>r      s'    #D6 DN	\6 	\r   