U
    ú¾|euD  ã                   @   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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   úQ/var/www/website-v5/atlas_env/lib/python3.8/site-packages/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ÚcgctxZdirectives_onlyr   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   sH   || _ tj |¡| _|  ¡ | _g | _|| _|r6d| _	nd| _	|  
¡  d S )NZDebugDirectivesOnlyZ	FullDebug)r.   ÚosÚpathÚabspathr/   Ú_di_fileÚdifileÚsubprogramsr0   Úemission_kindr#   r-   r   r   r   r1   \   s    
zDIBuilder.__init__c                 C   s   |   ¡ | _d S r,   )Ú_di_compile_unitÚdicompileunitr"   r   r   r   r#   j   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 (ú))rC   r   Ú
identifierÚelementsr   T©Úis_distinctZ
DISubrangeÚcountZDW_TAG_array_type)rC   rD   r   r   rG   rH   Z_pointee_modelZDW_TAG_pointer_type)rC   rD   r   zAnonymous struct (z<field ú>©r   ÚbyteZDW_ATE_unsigned_char)"Ú_DEBUGÚprintÚgetattrr.   Ú
_BYTE_SIZEr   ÚIntTypeÚ	FloatTypeÚ
DoubleTypeÚ
isinstanceÚstrr?   r   ÚIntegerÚsignedÚadd_debug_infoÚDITokenr   Ú	enumeraterH   r0   Úget_abi_sizeofÚappendÚadd_metadatar   ÚelementÚ	_var_typeÚPointerTypeÚpointeeÚLiteralStructTypeZinner_modelsÚzipÚ_fieldsÚ	ArrayType)r   r   r   r   ÚmZbitsizeÚint_typeZ	real_typer   ZditokÚmdtypeÚmetarE   ÚixÚ	componentZcomponent_sizeZcomponent_basetypeZderived_typer`   Zel_sizeÚbasetyperK   ZmdrangeÚmodelÚfield_idÚfieldZmdbaser   r   r   ra   o   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.declarerM   Ú.ú$ZDILocalVariableéÿÿÿÿ)r   ÚargÚscopeÚfiler   ÚtypeZDIExpression)r.   r   ÚFunctionTypeÚVoidTypeÚMetaDataTyper   Úget_or_insert_functionra   ÚreplacerZ   r;   r:   Úcall)r   r
   r   r   r   r   r   r   r   Z	arg_indexrh   ÚfntyÚdeclrj   Z
mdlocalvarZmdexprr   r   r   r   $  s     úzDIBuilder.mark_variablec                 C   s   |   |¡|_d S r,   )Ú_add_locationr	   r   r   r   r   r   :  s    zDIBuilder.mark_locationc           	      C   s8   |}t t||ƒƒ}| j||j|||d�}| d|¡ d S )N)r   Úlinkagenamer   r   ÚargmapÚdbg)Údictre   Ú_add_subprogramr   Úset_metadata)	r   r   r   r   r    r   r   rƒ   Zdi_subpr   r   r   r!   =  s    
 þzDIBuilder.mark_subprogramc                 C   s(   t  | j| j¡}| | j¡ |  ¡  d S r,   )r   Úget_or_insert_named_metadatar.   ÚDBG_CU_NAMEÚaddr>   Ú_set_module_flags)r   Zdbgcur   r   r   r$   E  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   rˆ   Ú
_const_intÚDWARF_VERSIONr_   ÚoperandsrŠ   ÚDEBUG_INFO_VERSION)r   r.   ZmflagsZrequire_warning_behaviorZdwarf_versionZdebuginfo_versionr   r   r   r‹   N  s$    


ý


ý
zDIBuilder._set_module_flagsc                 C   s"   |   |||||¡}| j |¡ |S )z!Emit subprogram metadata
        )Ú_di_subprogramr;   r^   )r   r   r‚   r   r   rƒ   Zsubpr   r   r   r†   f  s    zDIBuilder._add_subprogramc                 C   s   |   |¡}|S )zEmit location metatdaa
        )Ú_di_location)r   r   Úlocr   r   r   r�   m  s    
zDIBuilder._add_locationé    c                 C   s   t  |¡|ƒS )z0Util to create constant int in metadata
        ©r   rS   )ÚclsÚnumÚbitsr   r   r   r�   s  s    zDIBuilder._const_intc                 C   s   t  d¡|ƒS )z4Util to create constant boolean in metadata
        é   r•   )r–   Úbooleanr   r   r   Ú_const_booly  s    zDIBuilder._const_boolc                 C   s(   | j  dtj | j¡tj | j¡dœ¡S )NZDIFile)Ú	directoryÚfilename)r.   rZ   r6   r7   Údirnamer/   Úbasenamer"   r   r   r   r9   ƒ  s    þzDIBuilder._di_filec              
   C   s6   | j jdt d¡| jddtjdkt | j¡dœdd�S )NZDICompileUnitZDW_LANG_C_plus_pluszclang (Numba)r   )Úlanguagerw   ÚproducerZruntimeVersionÚisOptimizedZemissionKindTrI   )r.   rZ   r   r[   r:   r   ÚOPTr<   r"   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.rr   rs   rM   ZDISubroutineTyper   )r\   Úargsr   Ú
startswithr}   rx   r0   r]   ra   r^   ÚitemsÚdata_model_managerÚget_value_typer.   rZ   r_   )r   r   r   rƒ   ZllfuncÚmdÚidxZllargr   r   r   rj   Ú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linkageNamerv   rw   r   rx   ZisLocalZisDefinitionZ	scopeLiner¢   ÚunitrI   )r.   rZ   r:   r¬   r   r£   r>   )r   r   r‚   r   r   rƒ   r   r   r   r‘   ´  s    õôzDIBuilder._di_subprogramc                 C   s   | j  d|d| jd dœ¡S )NZ
DILocationr™   rt   )r   Úcolumnrv   )r.   rZ   r;   )r   r   r   r   r   r’   Ã  s
    ýzDIBuilder._di_location)N)NN)r”   )r%   r&   r'   rŽ   r�   r‰   rO   r1   r#   ra   r   r   r!   r$   r‹   r†   r�   Úclassmethodr�   r›   r9   r=   r¬   r‘   r’   r   r   r   r   r3   V   s4   
 7   ÿ
	
	r3   )Ú__doc__r(   Úos.pathr6   Ú
contextlibr   Úllvmliter   Ú
numba.corer   r   Znumba.core.datamodel.modelsr   r   r   r   ÚABCMetar   r+   rR   r3   r   r   r   r   Ú<module>   s   
!