B
      \Q2  ć               @   s   d Z ddlmZ ddlZddlZddlmZ ddlm	Z	 e	ej
G dd deZG d	d
 d
eZG dd deZG dd deZdS )z-
Implements helpers to build LLVM debuginfo.
é    )Śabsolute_importN)Śiré   )Śadd_metaclassc               @   sD   e Zd Zejdd Zejdd Zejdd Zejdd Zd	S )
ŚAbstractDIBuilderc             C   s   dS )z*Emit debug info for the variable.
        N© )ŚselfŚbuilderŚallocavalueŚnameŚlltypeŚsizeŚlocr   r   ś.lib/python3.7/site-packages/numba/debuginfo.pyŚmark_variable   s    zAbstractDIBuilder.mark_variablec             C   s   dS )zAEmit source location information to the given IRBuilder.
        Nr   )r   r	   r   r   r   r   Śmark_location   s    zAbstractDIBuilder.mark_locationc             C   s   dS )zAEmit source location information for the given function.
        Nr   )r   Śfunctionr   r   r   r   r   Śmark_subprogram   s    z!AbstractDIBuilder.mark_subprogramc             C   s   dS )zCFinalize the debuginfo by emitting all necessary metadata.
        Nr   )r   r   r   r   Śfinalize#   s    zAbstractDIBuilder.finalizeN)	Ś__name__Ś
__module__Ś__qualname__ŚabcŚabstractmethodr   r   r   r   r   r   r   r   r      s   r   c               @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )ŚDummyDIBuilderc             C   s   d S )Nr   )r   ŚmoduleŚfilepathr   r   r   Ś__init__,   s    zDummyDIBuilder.__init__c             C   s   d S )Nr   )r   r	   r
   r   r   r   r   r   r   r   r   /   s    zDummyDIBuilder.mark_variablec             C   s   d S )Nr   )r   r	   r   r   r   r   r   2   s    zDummyDIBuilder.mark_locationc             C   s   d S )Nr   )r   r   r   r   r   r   r   r   5   s    zDummyDIBuilder.mark_subprogramc             C   s   d S )Nr   )r   r   r   r   r   8   s    zDummyDIBuilder.finalizeN)r   r   r   r   r   r   r   r   r   r   r   r   r   *   s
   r   c               @   s¢   e Zd ZdZdZdZdd Zdd Zdd	 Zd
d Z	dd Z
dd Zdd Zdd Zdd Zed&ddZedd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%S )'Ś	DIBuilderé   é   zllvm.dbg.cuc             C   s2   || _ tj |”| _|  ” | _g | _|  ” | _	d S )N)
r   ŚosŚpathŚabspathr   Ś_di_fileŚdifileŚsubprogramsŚ_di_compile_unitŚdicompileunit)r   r   r   r   r   r   r   A   s
    
zDIBuilder.__init__c             C   sĘ   | j }|d }tjf}tjtjf}t||| rd| dt||t||rRt d”nt d”d”}n^|}| dd|i”}	| dddt d	”d”}
| d
t d”|
t||t|| 	|	g”d”}|S )Né   ZDIBasicTypeZDW_ATE_unsignedZDW_ATE_float)r   r   ŚencodingZ
DISubrangeŚcountZbyteZDW_ATE_unsigned_charZDICompositeTypeZDW_TAG_array_type)ŚtagZbaseTyper   r   Z
identifierŚelements)
r   r   ŚIntTypeZ	FloatTypeZ
DoubleTypeŚ
isinstanceŚadd_debug_infoŚstrŚDITokenŚadd_metadata)r   r   r   ŚmZbitsizeZint_typeZ	real_typeŚmdtyper+   ZmdrangeZmdbaser   r   r   Ś	_var_typeH   s2    
zDIBuilder._var_typec          
   C   s   | j }t t ” t ” gd ”}|j|dd}	|  ||”}
| dd”}| d|d| j	d | j
|j|
d	”}| d
i ”}| |	|||g”S )Nr    zllvm.dbg.declare)r   Ś.ś$ZDILocalVariabler   é’’’’)r   ŚargŚscopeŚfileŚlineŚtypeZDIExpression)r   r   ŚFunctionTypeŚVoidTypeZMetaDataTypeZget_or_insert_functionr6   Śreplacer0   r&   r%   r=   Ścall)r   r	   r
   r   r   r   r   r4   ZfntyZdeclr5   Z
mdlocalvarZmdexprr   r   r   r   m   s    
zDIBuilder.mark_variablec             C   s   |   |j”|_d S )N)Ś_add_locationr=   Zdebug_metadata)r   r	   r   r   r   r   r      s    zDIBuilder.mark_locationc             C   s0   | j ||j|jd}| d|” |j d” d S )N)r   Ślinkagenamer=   ZdbgZnoinline)Ś_add_subprogramr   r=   Śset_metadataZ
attributesŚadd)r   r   r   r   Zdi_subpr   r   r   r      s    

zDIBuilder.mark_subprogramc             C   s&   | j  | j”}| | j” |  ”  d S )N)r   Śget_or_insert_named_metadataŚDBG_CU_NAMErG   r(   Ś_set_module_flags)r   Zdbgcur   r   r   r      s    zDIBuilder.finalizec             C   s   | j }| d”}|  d”}| jdk	rP| |d|  | j”g”}||jkrP| |” | |d|  | j”g”}||jkr|| |” dS )z&Set the module flags metadata
        zllvm.module.flagsé   NzDwarf VersionzDebug Info Version)r   rH   Ś
_const_intŚDWARF_VERSIONr3   ZoperandsrG   ŚDEBUG_INFO_VERSION)r   r   ZmflagsZrequire_warning_behaviorZdwarf_versionZdebuginfo_versionr   r   r   rJ      s     





zDIBuilder._set_module_flagsc             C   s   |   |||”}| j |” |S )z Emit subprogram metdata
        )Ś_di_subprogramr&   Śappend)r   r   rD   r=   Zsubpr   r   r   rE   «   s    zDIBuilder._add_subprogramc             C   s   |   |”}|S )zEmit location metatdaa
        )Ś_di_location)r   r=   r   r   r   r   rC   ²   s    
zDIBuilder._add_locationé    c             C   s   t  |”|S )z0Util to create constant int in metadata
        )r   r.   )ŚclsZnumŚbitsr   r   r   rL   ø   s    zDIBuilder._const_intc             C   s   t  d”|S )z4Util to create constant boolean in metadata
        r   )r   r.   )rS   Zbooleanr   r   r   Ś_const_bool¾   s    zDIBuilder._const_boolc             C   s(   | j  dtj | j”tj | j”d”S )NZDIFile)Z	directoryŚfilename)r   r0   r!   r"   Śdirnamer   Śbasename)r   r   r   r   r$   Č   s    zDIBuilder._di_filec          	   C   s(   | j jdt d”| jdddddddS )	NZDICompileUnitŚDW_LANG_PythonŚNumbar   Tr   )Zlanguager<   ZproducerZruntimeVersionŚisOptimizedZemissionKind)Śis_distinct)r   r0   r   r2   r%   )r   r   r   r   r'   Ī   s    zDIBuilder._di_compile_unitc             C   s   | j  dd| j  g ”i”S )NZDISubroutineTypeŚtypes)r   r0   r3   )r   r   r   r   Ś_di_subroutine_typeŲ   s    zDIBuilder._di_subroutine_typec             C   s4   | j jd||| j| j||  ” dd|d| jdddS )NZDISubprogramFT)r   ZlinkageNamer;   r<   r=   r>   ZisLocalZisDefinitionZ	scopeLiner[   Zunit)r\   )r   r0   r%   r^   r(   )r   r   rD   r=   r   r   r   rO   Ż   s    zDIBuilder._di_subprogramc             C   s   | j  d|d| jd d”S )NZ
DILocationr   r9   )r=   Ścolumnr;   )r   r0   r&   )r   r=   r   r   r   rQ   ģ   s    zDIBuilder._di_locationN)rR   )r   r   r   rM   rN   rI   r   r6   r   r   r   r   rJ   rE   rC   ŚclassmethodrL   rU   r$   r'   r^   rO   rQ   r   r   r   r   r   <   s(   %	

r   c               @   s|   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
d Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZdS )ŚNvvmDIBuilderz
    Only implemented the minimal metadata to get line number information.
    See http://llvm.org/releases/3.4/docs/LangRef.html
    é   i  i  i.  i)  Nr   znumba.llvm.dbg.cuc             C   s   d S )Nr   )r   r	   r
   r   r   r   r   r   r   r   r   
  s    zNvvmDIBuilder.mark_variablec             C   sj   | j |jkrd S |j| _ t t ” g ”}tj|d |j”ddd}| |g ”}|  |j”}| 	d|” d S )Nz	// dbg {}Ś T)Zside_effectz	numba.dbg)
Ś_last_linenor=   r   r?   r@   Z	InlineAsmŚformatrB   rQ   rF   )r   r	   r   ZasmtyZasmrB   Zmdr   r   r   r     s    zNvvmDIBuilder.mark_locationc             C   s   | j ||j|jd d S )N)r   rD   r=   )rE   r   r=   )r   r   r   r   r   r   r   r     s    
zNvvmDIBuilder.mark_subprogramc             C   s$   | j  tj | j”tj | j”g”S )N)r   r3   r!   r"   rX   r   rW   )r   r   r   r   Ś	_filepair#  s    zNvvmDIBuilder._filepairc             C   s   | j  |  | j”|  ” g”S )N)r   r3   rL   ŚDI_Filerf   )r   r   r   r   r$   )  s    
zNvvmDIBuilder._di_filec             C   sh   |   ” }| j |  d”g”}| j |  | j”||  | j”d|  d”d|  d”||| j | j”||dg”S )Nr   rZ   Trc   )rf   r   r3   rL   ŚDI_Compile_unitrY   rU   r&   )r   ZfilepairŚemptyr   r   r   r'   /  s     

zNvvmDIBuilder._di_compile_unitc             C   sp   | j  d g”}| j  |  | j”|  d”d d|  d”|  dd”|  dd”|  dd”|  d”d ||  d”d d d g”S )Nr   rc   é@   )r   r3   rL   ŚDI_Subroutine_type)r   r]   r   r   r   r^   B  s"    



z!NvvmDIBuilder._di_subroutine_typec             C   s    | j  |”}|  ” }| j  |  d”g”}|  ” }| j  |  | j”|  ” |||||  |”||  d”|  d”|  d”|  d”d |  d”|  d”|d d ||  |”g”S )Nr   FT)	r   Z
get_globalr^   r3   rL   r$   ŚDI_Subprogramrf   rU   )r   r   rD   r=   Zfunction_ptrZsubroutine_typeZfuncvarsŚcontextr   r   r   rO   V  s2    
zNvvmDIBuilder._di_subprogramc             C   s&   | j  |  |”|  d”| jd d g”S )Nr   r9   )r   r3   rL   r&   )r   r=   r   r   r   rQ   r  s
    zNvvmDIBuilder._di_location)r   r   r   Ś__doc__rY   rh   rk   rl   rg   rM   rN   rI   rd   r   r   r   rf   r$   r'   r^   rO   rQ   r   r   r   r   ra   ō   s&   ra   )rn   Z
__future__r   r   Śos.pathr!   Zllvmliter   Zsixr   ŚABCMetaŚobjectr   r   r   ra   r   r   r   r   Ś<module>   s    9