U
    9%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   S/var/www/html/Darija-Ai-API/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}	qd}	n0t
|j}t	|jtjr|jjrd}	qd}	nd}	|d||t|	d}
nt	|trg }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}
nt	|tjrt|dd }| |j| j|j|}|dtd|t| j| d}
n8t	|tjrg }d	}|d ks| s*dt
| d}t|jD ]b\}}| j|}| ||}|dtdd| d|t| |d}|| |t| 7 }qn|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}
nt	|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Z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   IntTypeZ	FloatTypeZ
DoubleType
isinstancestrr?   r   Integersignedadd_debug_infoDITokenr   	enumeraterH   r0   get_abi_sizeofappendadd_metadatar   element	_var_typeZPointerTypeZpointeeZLiteralStructTypeZinner_modelszip_fields	ArrayType)r   r   r   r   mZbitsizeZint_typeZ	real_typer   ZditokmdtypemetarE   Zix	componentZcomponent_sizeZcomponent_basetypeZderived_typer]   Zel_sizeZbasetyperJ   ZmdrangemodelZfield_idfieldZmdbaser   r   r   r^   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.declarerL   .$ZDILocalVariable)r   argscopefiler   typeZDIExpression)r.   r   FunctionTypeZVoidTypeZMetaDataTyper   Zget_or_insert_functionr^   replacerW   r;   r:   call)r   r
   r   r   r   r   r   r   r   Z	arg_indexrb   Zfntydeclrc   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   argmapZdbg)dictr_   _add_subprogramr   Zset_metadata)	r   r   r   r   r    r   r   ru   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   rx   
_const_intDWARF_VERSIONr\   Zoperandsrz   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   rt   r   r   ru   Zsubpr   r   r   rw   f  s    zDIBuilder._add_subprogramc                 C   s   |  |}|S )zEmit location metatdaa
        )_di_location)r   r   locr   r   r   rs   m  s    
zDIBuilder._add_location    c                 C   s   t ||S )z0Util to create constant int in metadata
        r   rR   )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.   rW   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   )languagerm   ZproducerZruntimeVersionisOptimizedZemissionKindTrI   )r.   rW   r   rX   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.rh   ri   rL   ZDISubroutineTyper   )rY   argsr   
startswithrp   rn   r0   rZ   r^   r[   itemsZdata_model_managerZget_value_typer.   rW   r\   )r   r   r   ru   ZllfuncmdidxZllargr   r   r   rc   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linkageNamerl   rm   r   rn   ZisLocalZisDefinitionZ	scopeLiner   unitrI   )r.   rW   r:   r   r   r   r>   )r   r   rt   r   r   ru   r   r   r   r     s    zDIBuilder._di_subprogramc                 C   s   | j d|d| jd dS )NZ
DILocationr   rj   )r   columnrl   )r.   rW   r;   )r   r   r   r   r   r     s
    zDIBuilder._di_location)N)NN)r   )r%   r&   r'   r~   r   ry   rN   r1   r#   r^   r   r   r!   r$   r{   rw   rs   classmethodr}   r   r9   r=   r   r   r   r   r   r   r   r3   V   s4   
 7   
	
	r3   )__doc__r(   os.pathr6   
contextlibr   Zllvmliter   Z
numba.corer   r   Znumba.core.datamodel.modelsr   r   r   r   ABCMetar   r+   rQ   r3   r   r   r   r   <module>   s   
!