U
    ,‰d+\  ã                   @   s°   d Z ddlZddlZddlmZ ddlmZ ddlm	Z	m
Z
 ddlmZmZ ddlmZ edd	„ ƒZG d
d„ dejdZG dd„ deƒZdZG dd„ deƒZG dd„ deƒZdS )z-
Implements helpers to build LLVM debuginfo.
é    N)Úcontextmanager)Úir)ÚcgutilsÚtypes)ÚComplexModelÚUniTupleModel)Úconfigc                 c   s$   | j }d| _ z
dV  W 5 || _ X dS )zZSuspends the emission of debug_metadata for the duration of the context
    managed block.N)Údebug_metadata)ÚbuilderÚref© r   ú8/tmp/pip-unpacked-wheel-eu7e0c37/numba/core/debuginfo.pyÚsuspend_emission   s
    
r   c                   @   sT   e Zd Zejddd„ƒZejdd„ ƒZejdd„ ƒZejdd	„ ƒZejd
d„ ƒZ	dS )ÚAbstractDIBuilderNc	           	      C   s   dS )z*Emit debug info for the variable.
        Nr   ©	Úselfr
   ÚallocavalueÚnameÚlltypeÚsizeÚlineÚ	datamodelÚargidxr   r   r   Ú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   ÚfunctionÚqualnameÚargnamesÚargtypesr   r   r   r   Úmark_subprogram*   s    z!AbstractDIBuilder.mark_subprogramc                 C   s   dS )zvInitialize the debug info. An opportunity for the debuginfo to
        prepare any necessary data structures.
        Nr   ©r   r   r   r   Ú
initialize0   s    zAbstractDIBuilder.initializec                 C   s   dS )zCFinalize the debuginfo by emitting all necessary metadata.
        Nr   r"   r   r   r   Úfinalize6   s    zAbstractDIBuilder.finalize)NN)
Ú__name__Ú
__module__Ú__qualname__ÚabcÚabstractmethodr   r   r!   r#   r$   r   r   r   r   r      s      ÿ


r   )Ú	metaclassc                   @   s>   e Zd Zdd„ Zd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ÚfilepathÚcgctxr   r   r   Ú__init__?   s    zDummyDIBuilder.__init__Nc	           	      C   s   d S r,   r   r   r   r   r   r   B   s    zDummyDIBuilder.mark_variablec                 C   s   d S r,   r   r   r   r   r   r   F   s    zDummyDIBuilder.mark_locationc                 C   s   d S r,   r   r   r   r   r   r!   I   s    zDummyDIBuilder.mark_subprogramc                 C   s   d S r,   r   r"   r   r   r   r#   L   s    zDummyDIBuilder.initializec                 C   s   d S r,   r   r"   r   r   r   r$   O   s    zDummyDIBuilder.finalize)NN)	r%   r&   r'   r1   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Zdd„ Zdd„ Zd)d
d„Z	d*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.cuFc                 C   s6   || _ tj |¡| _|  ¡ | _g | _|| _|  	¡  d S r,   )
r.   ÚosÚpathÚabspathr/   Ú_di_fileÚdifileÚsubprogramsr0   r#   r-   r   r   r   r1   \   s    
zDIBuilder.__init__c                 C   s   |   ¡ | _d S r,   )Ú_di_compile_unitÚdicompileunitr"   r   r   r   r#   d   s    zDIBuilder.initializeNc                 C   s¼  | j rtd|||t|ddƒƒ | j}t| }tjf}tjtjf}t	||| ƒrÂ|d krtt
|ƒ}t	||ƒrnd}	q¤d}	n0t
|jƒ}t	|jtjƒr |jjršd}	q¤d}	nd}	| d||t |	¡dœ¡}
nöt	|tƒršg }d	}td
ƒD ]x\}}|j| }| j |¡}| dt
|ƒt| t d¡dœ¡}| dt d¡||t| |dœ¡}| |¡ |t| 7 }qÞ|jdt d¡|j› dt
|ƒ› dt
|ƒ| |¡|dœdd}
nt	|tƒr"|j}| j |¡}|  ||¡}|j› dt
|ƒ› d}|| }| dd|i¡}| dt d¡|||t
|ƒ| |g¡dœ¡}
n–t	|tjƒr€t|dd ƒ}|  |j| j |j¡|¡}| dt d¡|t| j |¡ dœ¡}
n8t	|tjƒräg }d	}|d ksª| ¡ s*dt
|ƒ› d}t|jƒD ]b\}}| j |¡}|  ||¡}| dt d¡d|› d|t| |dœ¡}| |¡ |t| 7 }qÄnŒ|j› dt
|ƒ› d}t|j|j | ¡ ƒD ]`\}}}| j |¡}| j|||d}| dt d¡||t| |dœ¡}| |¡ |t| 7 }qT|jdt d¡|t
|ƒ| |¡|dœdd}
nÔt	|tj!ƒrZ|j}| j |¡}|  ||¡}|| }| dd|i¡}| dt d¡|t
|ƒ|t
|ƒ| |g¡dœ¡}
n^|}| dd|i¡}| dd tt d!¡dœ¡}| dt d¡|t
|ƒ|t
|ƒ| |g¡dœ¡}
|
S )"Nz-->Úfe_typez
NO FE TYPEZDW_ATE_unsignedZDW_ATE_floatZDW_ATE_signedZDIBasicType)r   r   Úencodingr   )ÚrealÚimagZDIDerivedTypeZDW_TAG_member)Útagr   ÚbaseTyper   ÚoffsetZDICompositeTypeZDW_TAG_structure_typez (ú))rB   r   Ú
identifierÚelementsr   T©Zis_distinctZ
DISubrangeÚcountZDW_TAG_array_type)rB   rC   r   r   rF   rG   Z_pointee_modelZDW_TAG_pointer_type)rB   rC   r   zAnonymous struct (z<field ú>©r   ÚbyteZDW_ATE_unsigned_char)"Ú_DEBUGÚprintÚgetattrr.   Ú
_BYTE_SIZEr   ÚIntTypeZ	FloatTypeZ
DoubleTypeÚ
isinstanceÚstrr>   r   ZIntegerÚsignedÚadd_debug_infoÚDITokenr   Ú	enumeraterG   r0   Úget_abi_sizeofÚappendÚadd_metadatar   ÚelementÚ	_var_typeZPointerTypeZpointeeZLiteralStructTypeZinner_modelsÚzipÚ_fieldsZ	ArrayType)r   r   r   r   ÚmZbitsizeZint_typeZ	real_typer   ZditokÚmdtypeÚmetarD   ÚixÚ	componentZcomponent_sizeZcomponent_basetypeZderived_typer[   Zel_sizeZbasetyperI   ZmdrangeÚmodelZfield_idÚfieldZmdbaser   r   r   r\   i   sB   

ÿ

ý
ýû
ûú
 ÿ
úþý
û
þû
ûú ÿ
ú

 ÿý
ú	zDIBuilder._var_typec	              
   C   sš   |d krdn|}	| j }
t t ¡ t ¡ gd ¡}t |
|d¡}| j|||d}| dd¡}|
 	d||	| j
d | j||d	œ¡}|
 	d
i ¡}| ||||g¡S )Nr   r5   zllvm.dbg.declarerK   Ú.ú$ZDILocalVariableéÿÿÿÿ)r   ÚargÚscopeÚfiler   ÚtypeZDIExpression)r.   r   ÚFunctionTypeÚVoidTypeZMetaDataTyper   Zget_or_insert_functionr\   ÚreplacerU   r;   r:   Úcall)r   r
   r   r   r   r   r   r   r   Z	arg_indexr_   ZfntyÚdeclr`   Z
mdlocalvarZmdexprr   r   r   r     s     úzDIBuilder.mark_variablec                 C   s   |   |¡|_d S r,   )Ú_add_locationr	   r   r   r   r   r   4  s    zDIBuilder.mark_locationc           	      C   sN   |}t t||ƒƒ}| j||j|||d}| d|¡ d|jkrJ|j d¡ d S )N)r   Úlinkagenamer   r   ÚargmapZdbgZalwaysinlineZnoinline)Údictr]   Ú_add_subprogramr   Úset_metadataÚ
attributesÚadd)	r   r   r   r   r    r   r   rt   Zdi_subpr   r   r   r!   7  s    
 þ
zDIBuilder.mark_subprogramc                 C   s(   t  | j| j¡}| | j¡ |  ¡  d S r,   )r   Úget_or_insert_named_metadatar.   ÚDBG_CU_NAMEry   r=   Ú_set_module_flags)r   Zdbgcur   r   r   r$   D  s    zDIBuilder.finalizec                 C   s‚   | j }t |d¡}|  d¡}| jdk	rR| |d|  | j¡g¡}||jkrR| |¡ | |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.   r   rz   Ú
_const_intÚDWARF_VERSIONrZ   Zoperandsry   ÚDEBUG_INFO_VERSION)r   r.   ZmflagsZrequire_warning_behaviorZdwarf_versionZdebuginfo_versionr   r   r   r|   M  s$    


ý


ý
zDIBuilder._set_module_flagsc                 C   s"   |   |||||¡}| j |¡ |S ©z!Emit subprogram metadata
        ©Ú_di_subprogramr;   rY   )r   r   rs   r   r   rt   Úsubpr   r   r   rv   e  s    zDIBuilder._add_subprogramc                 C   s   |   |¡}|S )zEmit location metatdaa
        )Ú_di_location)r   r   Úlocr   r   r   rr   l  s    
zDIBuilder._add_locationé    c                 C   s   t  |¡|ƒS )z0Util to create constant int in metadata
        ©r   rQ   )ÚclsÚnumÚbitsr   r   r   r~   r  s    zDIBuilder._const_intc                 C   s   t  d¡|ƒS )z4Util to create constant boolean in metadata
        é   rˆ   )r‰   Úbooleanr   r   r   Ú_const_boolx  s    zDIBuilder._const_boolc                 C   s(   | j  dtj | j¡tj | j¡dœ¡S )NZDIFile)Ú	directoryÚfilename)r.   rU   r6   r7   Údirnamer/   Úbasenamer"   r   r   r   r9   ‚  s    þzDIBuilder._di_filec              	   C   s.   | j jdt d¡| jddtjdkddœddS )	NZDICompileUnitZDW_LANG_C_plus_pluszclang (Numba)r   rŒ   )Úlanguagerk   ZproducerZruntimeVersionÚisOptimizedZemissionKindTrH   )r.   rU   r   rV   r:   r   ÚOPTr"   r   r   r   r<   ˆ  s    	òñzDIBuilder._di_compile_unitc                 C   sà   |}g }t |jƒD ]N\}}|j d¡s|j dd¡}|j}	| j |	¡}
| j|	|
d d}| 	|¡ qt | 
¡ ƒD ]V\}\}}| dd¡}| jj| }| j |¡}	| j |	¡}
| j|	|
|d}| 	|¡ qn| j dd| j |¡i¡S )Nzarg.rf   rg   rK   ZDISubroutineTyper   )rW   Úargsr   Ú
startswithro   rl   r0   rX   r\   rY   ÚitemsZdata_model_managerZget_value_typer.   rU   rZ   )r   r   r   rt   ZllfuncÚmdÚidxZllargr   r   r   r`   Znbtyper   r   r   r   Ú_di_subroutine_typeš  s(     
ÿzDIBuilder._di_subroutine_typec                 C   s@   | j jd||| j| j||  |||¡dd|tjdk| jdœddS )NZDISubprogramFTr   )r   ZlinkageNamerj   rk   r   rl   ZisLocalZisDefinitionZ	scopeLiner”   ÚunitrH   )r.   rU   r:   r›   r   r•   r=   )r   r   rs   r   r   rt   r   r   r   rƒ   ³  s    õôzDIBuilder._di_subprogramc                 C   s   | j  d|d| jd dœ¡S )NZ
DILocationrŒ   rh   )r   Úcolumnrj   )r.   rU   r;   ©r   r   r   r   r   r…   Â  s
    ýzDIBuilder._di_location)N)NN)r‡   )r%   r&   r'   r   r€   r{   rM   r1   r#   r\   r   r   r!   r$   r|   rv   rr   Úclassmethodr~   rŽ   r9   r<   r›   rƒ   r…   r   r   r   r   r3   V   s4   
 7   ÿ
	
	r3   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
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d„ Z‡ fd d!„Z‡  Z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 r,   r   r   r   r   r   r   à  s    zNvvmDIBuilder.mark_variablec                 C   sb   | j |krd S || _ t t ¡ g ¡}tj|d |¡ddd}| |g ¡}|  |¡}| d|¡ d S )Nz	// dbg {}Ú T)Zside_effectz	numba.dbg)	Ú_last_linenor   rm   rn   Z	InlineAsmÚformatrp   r…   rw   )r   r
   r   ZasmtyZasmrp   r™   r   r   r   r   å  s    
ÿ
zNvvmDIBuilder.mark_locationc                 C   s$   t t||ƒƒ}| j||j|d d S )N)r   rs   r   )ru   r]   rv   r   )r   r   r   r   r    r   rt   r   r   r   r!   ò  s    
ÿzNvvmDIBuilder.mark_subprogramc                 C   s   |   |||¡}| j |¡ |S r   r‚   )r   r   rs   r   r„   r   r   r   rv   ÷  s    zNvvmDIBuilder._add_subprogramc                 C   s$   | j  tj | j¡tj | j¡g¡S r,   )r.   rZ   r6   r7   r’   r/   r‘   r"   r   r   r   Ú	_filepair  s    þzNvvmDIBuilder._filepairc                 C   s   | j  |  | j¡|  ¡ g¡S r,   )r.   rZ   r~   ÚDI_Filer¥   r"   r   r   r   r9     s    
þzNvvmDIBuilder._di_filec                 C   sv   |   ¡ }| j |  d¡g¡}| j | j¡}| j |  | j¡||  | j¡d|  d¡d|  d¡||| j | j¡||dg¡S )Nr   ZNumbaTr¢   )r¥   r.   rZ   r~   r;   ÚDI_Compile_unitÚDW_LANG_PythonrŽ   )r   ZfilepairÚemptyZsp_metadatar   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   r¢   é@   )r.   rZ   r~   ÚDI_Subroutine_type)r   r   r   r   r   r›   "  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›   rZ   r~   r9   ÚDI_Subprogramr¥   rŽ   )r   r   rs   r   Zfunction_ptrZsubroutine_typeZfuncvarsÚcontextr   r   r   rƒ   6  s4    
ìzNvvmDIBuilder._di_subprogramc                 C   s&   | j  |  |¡|  d¡| jd d g¡S )Nr   rh   )r.   rZ   r~   r;   rž   r   r   r   r…   R  s    üzNvvmDIBuilder._di_locationc                 C   s   d S r,   r   r"   r   r   r   r#   Z  s    zNvvmDIBuilder.initializec                    s   |   ¡ | _tƒ  ¡  d S r,   )r<   r=   Úsuperr$   r"   ©Ú	__class__r   r   r$   ]  s    
zNvvmDIBuilder.finalize)NN)r%   r&   r'   Ú__doc__r¨   r§   r«   r¬   r¦   r   r€   r{   r£   r   r   r!   rv   r¥   r9   r<   r›   rƒ   r…   r#   r$   Ú__classcell__r   r   r¯   r   r    Ê  s0      ÿ
r    )r±   r(   Úos.pathr6   Ú
contextlibr   Zllvmliter   Z
numba.corer   r   Znumba.core.datamodel.modelsr   r   r   r   ÚABCMetar   r+   rP   r3   r    r   r   r   r   Ú<module>   s    
!  v