
    dQ                     `    d dl Z d dlmZ ddlmZ d dlmZ d dlZ edd      Z G d d	e	      Z
y)
    N)
namedtuple   )struct_parse)bisect_rightARangeEntryzKbegin_addr length info_offset unit_length version address_size segment_sizec                   *    e Zd ZdZd Zd ZddZd Zy)ARangesz ARanges table in DWARF

        stream, size:
            A stream holding the .debug_aranges section, and its size

        structs:
            A DWARFStructs instance for parsing the data
    c                     || _         || _        || _        | j                         | _        | j                  j                  d        | j                  D cg c]  }|j                   c}| _        y c c}w )Nc                     | j                   S )N)
begin_addr)entrys    8/usr/lib/python3/dist-packages/elftools/dwarf/aranges.py<lambda>z"ARanges.__init__.<locals>.<lambda>)   s    E,<,<     )key)streamsizestructs_get_entriesentriessortr   keys)selfr   r   r   r   s        r   __init__zARanges.__init__    sb    	 ((* 	<= 48<<@%U%%@	@s   A2c                     | j                   t        | j                  |      dz
     }|j                  |cxk  r'|j                  |j                  z   k  r|j
                  S  yy)z Given an address, get the offset of the CU it belongs to, where
            'offset' refers to the offset in the .debug_info section.
           N)r   r   r   r   lengthinfo_offset)r   addrtups      r   cu_offset_at_addrzARanges.cu_offset_at_addr/   sU     ll<		481<=>>T?CNNSZZ$????" @ r   c                     | j                   j                  d       g }d}|| j                  k  rt        | j                  j
                  | j                   |      }| j                  |d         }|d   dk(  r8|d   dz  }| j                   j                         }t        t        j                  |t        |      z        |z        }| j                   j                  |       d}	t         |d      | j                         }
t         |d      | j                         }|
dk7  s	|dk7  s|	s|r|j                  t        |
||d   |d	   |d
   |d   |d                d}	|
dk7  s|dk7  r8t         |d      | j                         }
t         |d      | j                         }|
dk7  rz|dk7  r|	s|rn|d   dk7  rt        d      ||j                  z   | j                  j!                         z   }|| j                  k  r|S )aM   Populate self.entries with ARangeEntry tuples for each range of addresses

            Terminating null entries of CU blocks are not returned, unless
            need_empty is set to True and the CU block contains nothing but
            a null entry. The null entry will have both address and length
            set to 0. 
        r   address_sizesegment_sizer   Fr   r   debug_info_offsetunit_lengthversion)r   r   r   r&   r'   r#   r$   TzSegmentation not implemented)r   seekr   r   r   Dwarf_aranges_header_get_addr_size_structtellintmathceilfloatappendr   NotImplementedErrorr&   initial_length_field_size)r   
need_emptyr   offsetaranges_header	addr_size
tuple_sizefpseek_togot_entriesr   r   s               r   r   zARanges._get_entries;   s    	 tyy )$,,*K*KV%N22>.3QRI n-2+N;a?
[[%%'dii5+<(<=
JK  )
 $ $If$5t{{C%i&94;;Gai6Q;{zNN#t#)(67J(K(6}(E$29$=)7)G)7)GIJ #'KqyFaK+If,=t{{K!-i.A4;;!O ai6Q;{z   /14)*HII ,,-,,88:;FQ tyy X r   c                 r    |dk(  r| j                   j                  S |dk(  sJ | j                   j                  S )z} Given this set's header value (int) for the address size,
            get the Construct representation of that size
              )r   Dwarf_uint32Dwarf_uint64)r   addr_header_values     r   r*   zARanges._get_addr_size_structv   s:     !<<,,,$)))<<,,,r   N)F)__name__
__module____qualname____doc__r   r!   r   r*    r   r   r	   r	      s    A9v-r   r	   )oscollectionsr   common.utilsr   bisectr   r-   r   objectr	   rE   r   r   <module>rK      s6    
 " '   QSg-f g-r   