o
    iuD                     @   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 || _ dS || _ w )zZSuspends the emission of debug_metadata for the duration of the context
    managed block.N)debug_metadata)builderref r   R/home/ubuntu/transcripts/venv/lib/python3.10/site-packages/numba/core/debuginfo.pysuspend_emission   s   r   c                   @   sV   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      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   r   )zAEmit source location information to the given IRBuilder.
        Nr   r   r
   r   r   r   r   mark_location$      zAbstractDIBuilder.mark_locationc                 C   r   )zAEmit source location information for the given function.
        Nr   r   functionqualnameargnamesargtypesr   r   r   r   mark_subprogram*   r   z!AbstractDIBuilder.mark_subprogramc                 C   r   )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   r   )zCFinalize the debuginfo by emitting all necessary metadata.
        Nr   r$   r   r   r   finalize6   r   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      d S Nr   r   modulefilepathcgctxdirectives_onlyr   r   r   __init__?      zDummyDIBuilder.__init__Nc	           	      C   r/   r0   r   r   r   r   r   r   B   s   zDummyDIBuilder.mark_variablec                 C   r/   r0   r   r   r   r   r   r   F   r7   zDummyDIBuilder.mark_locationc                 C   r/   r0   r   r   r   r   r   r#   I   r7   zDummyDIBuilder.mark_subprogramc                 C   r/   r0   r   r$   r   r   r   r%   L   r7   zDummyDIBuilder.initializec                 C   r/   r0   r   r$   r   r   r   r&   O   r7   zDummyDIBuilder.finalizer'   )	r(   r)   r*   r6   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 | _|| _|rd| _	nd| _	| 
  d S )NDebugDirectivesOnly	FullDebug)r2   ospathabspathr3   _di_filedifilesubprogramsr4   emission_kindr%   r1   r   r   r   r6   \   s   
zDIBuilder.__init__c                 C   s   |   | _d S r0   )_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	||| ra|d u r:t
|}t	||r7d}	nd}	nt
|j}t	|jtjrP|jjrMd}	nd}	nd}	|d||t|	d}
|
S t	|trg }d	}td
D ]<\}}|j| }| j|}|dt
|t| tdd}|dtd||t| |d}|| |t| 7 }qn|jdtd|j dt
| dt
||||ddd}
|
S t	|tr|j}| j|}| ||}|j dt
| d}|| }|dd|i}|dtd|||t
|||gd}
|
S t	|tjr?t|dd }| |j| j|j|}|dtd|t| j| d}
|
S t	|tjrg }d	}|d u sT| sdt
| d}t|jD ]1\}}| j|}| ||}|dtdd| d|t| |d}|| |t| 7 }qanF|j dt
| d}t|j|j | D ]0\}}}| j|}| j|||d}|dtd||t| |d}|| |t| 7 }q|jdtd|t
||||ddd}
|
S t	|tj!r.|j}| j|}| ||}|| }|dd|i}|dtd|t
||t
|||gd}
|
S |}|dd|i}|dd ttd!d}|dtd|t
||t
|||gd}
|
S )"Nz-->fe_typez
NO FE TYPEDW_ATE_unsignedDW_ATE_floatDW_ATE_signedDIBasicType)r   r   encodingr   )realimagDIDerivedTypeDW_TAG_member)tagr   baseTyper   offsetDICompositeTypeDW_TAG_structure_typez ())rQ   r   
identifierelementsr   Tis_distinct
DISubrangecountDW_TAG_array_type)rQ   rR   r   r   rW   rX   _pointee_modelDW_TAG_pointer_type)rQ   rR   r   zAnonymous struct (z<field >r   byteDW_ATE_unsigned_char)"_DEBUGprintgetattrr2   
_BYTE_SIZEr   IntType	FloatType
DoubleType
isinstancestrrG   r   Integersignedadd_debug_infoDITokenr   	enumeraterX   r4   get_abi_sizeofappendadd_metadatar   element	_var_typePointerTypepointeeLiteralStructTypeinner_modelszip_fields	ArrayType)r   r   r   r   mbitsizeint_type	real_typer   ditokmdtypemetarS   ix	componentcomponent_sizecomponent_basetypederived_typeru   el_sizebasetyper\   mdrangemodelfield_idfieldmdbaser   r   r   rv   o   sN  



  


p
`S


+

	zDIBuilder._var_typec	              
   C   s   |d u 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   r;   zllvm.dbg.declarera   .$DILocalVariable)r   argscopefiler   typeDIExpression)r2   r   FunctionTypeVoidTypeMetaDataTyper   get_or_insert_functionrv   replacero   rC   rB   call)r   r
   r   r   r   r   r   r   r   	arg_indexr~   fntydeclr   
mdlocalvarmdexprr   r   r   r   $  s    zDIBuilder.mark_variablec                 C   s   |  ||_d S r0   )_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)dictr{   _add_subprogramr   set_metadata)	r   r   r    r!   r"   r   r   r   di_subpr   r   r   r#   =  s   
zDIBuilder.mark_subprogramc                 C   s(   t | j| j}|| j |   d S r0   )r   get_or_insert_named_metadatar2   DBG_CU_NAMEaddrF   _set_module_flags)r   dbgcur   r   r   r&   E  s   zDIBuilder.finalizec                 C   s   | j }t|d}| d}| jdur)||d| | jg}||jvr)|| ||d| | jg}||jvrA|| dS dS )z&Set the module flags metadata
        zllvm.module.flags   NzDwarf VersionzDebug Info Version)	r2   r   r   
_const_intDWARF_VERSIONrt   operandsr   DEBUG_INFO_VERSION)r   r2   mflagsrequire_warning_behaviordwarf_versiondebuginfo_versionr   r   r   r   N  s&   






zDIBuilder._set_module_flagsc                 C   s"   |  |||||}| j| |S )z!Emit subprogram metadata
        )_di_subprogramrC   rs   )r   r   r   r   r   r   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   rh   )clsnumbitsr   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_booly  r   zDIBuilder._const_boolc                 C   s(   | j dtj| jtj| jdS )NDIFile)	directoryfilename)r2   ro   r>   r?   dirnamer3   basenamer$   r   r   r   rA     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 )NDICompileUnitDW_LANG_C_plus_pluszclang (Numba)r   )languager   producerruntimeVersionisOptimizedemissionKindTrY   )r2   ro   r   rp   rB   r   OPTrD   r$   r   r   r   rE     s   	
zDIBuilder._di_compile_unitc                 C   s   |}g }t |jD ]'\}}|jds0|jdd}|j}	| j|	}
| j|	|
d d}|	| q	t |
 D ]+\}\}}|dd}| jj| }| j|}	| j|	}
| j|	|
|d}|	| q7| jdd| j|iS )Nzarg.r   r   ra   DISubroutineTyper   )rq   argsr   
startswithr   r   r4   rr   rv   rs   itemsdata_model_managerget_value_typer2   ro   rt   )r   r   r   r   llfuncmdidxllargr   r   r   r   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 )NDISubprogramFTr   )r   linkageNamer   r   r   r   isLocalisDefinition	scopeLiner   unitrY   )r2   ro   rB   r   r   r   rF   )r   r   r   r   r   r   r   r   r   r     s   zDIBuilder._di_subprogramc                 C   s   | j d|d| jd dS )N
DILocationr   r   )r   columnr   )r2   ro   rC   )r   r   r   r   r   r     s
   zDIBuilder._di_locationr0   r'   )r   )r(   r)   r*   r   r   r   rd   r6   r%   rv   r   r   r#   r&   r   r   r   classmethodr   r   rA   rE   r   r   r   r   r   r   r   r9   V   s4    
 7
	
	r9   )__doc__r+   os.pathr>   
contextlibr   llvmliter   
numba.corer   r   numba.core.datamodel.modelsr   r   r   r   ABCMetar   r.   rg   r9   r   r   r   r   <module>   s    
!