o
    8ήc+\                     @   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 || _ dS || _ w )zZSuspends the emission of debug_metadata for the duration of the context
    managed block.N)debug_metadata)builderref r   ;/tmp/pip-target-vg8gfxp4/lib/python/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cgctxr   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   r6   zDummyDIBuilder.mark_locationc                 C   r/   r0   r   r   r   r   r   r#   I   r6   zDummyDIBuilder.mark_subprogramc                 C   r/   r0   r   r$   r   r   r   r%   L   r6   zDummyDIBuilder.initializec                 C   r/   r0   r   r$   r   r   r   r&   O   r6   zDummyDIBuilder.finalizer'   )	r(   r)   r*   r5   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 r0   )
r2   ospathabspathr3   _di_filedifilesubprogramsr4   r%   r1   r   r   r   r5   \   s   
zDIBuilder.__init__c                 C   s   |   | _d S r0   )_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	||| 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 ())rM   r   
identifierelementsr   Tis_distinct
DISubrangecountDW_TAG_array_type)rM   rN   r   r   rS   rT   _pointee_modelDW_TAG_pointer_type)rM   rN   r   zAnonymous struct (z<field >r   byteDW_ATE_unsigned_char)"_DEBUGprintgetattrr2   
_BYTE_SIZEr   IntType	FloatType
DoubleType
isinstancestrrC   r   Integersignedadd_debug_infoDITokenr   	enumeraterT   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metarO   ix	componentcomponent_sizecomponent_basetypederived_typerq   el_sizebasetyperX   mdrangemodelfield_idfieldmdbaser   r   r   rr   i   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.declarer]   .$DILocalVariable)r   argscopefiler   typeDIExpression)r2   r   FunctionTypeVoidTypeMetaDataTyper   get_or_insert_functionrr   replacerk   r@   r?   call)r   r
   r   r   r   r   r   r   r   	arg_indexrz   fntydeclr   
mdlocalvarmdexprr   r   r   r     s    zDIBuilder.mark_variablec                 C   s   |  ||_d S r0   )_add_locationr	   r   r   r   r   r   4  s   zDIBuilder.mark_locationc           	      C   sR   |}t t||}| j||j|||d}|d| d|jvr'|jd d S d S )N)r   linkagenamer   r   argmapdbgalwaysinlinenoinline)dictrw   _add_subprogramr   set_metadata
attributesadd)	r   r   r    r!   r"   r   r   r   di_subpr   r   r   r#   7  s   

zDIBuilder.mark_subprogramc                 C   s(   t | j| j}|| j |   d S r0   )r   get_or_insert_named_metadatar2   DBG_CU_NAMEr   rB   _set_module_flags)r   dbgcur   r   r   r&   D  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_VERSIONrp   operandsr   DEBUG_INFO_VERSION)r   r2   mflagsrequire_warning_behaviordwarf_versiondebuginfo_versionr   r   r   r   M  s&   






zDIBuilder._set_module_flagsc                 C   s"   |  |||||}| j| |S z!Emit subprogram metadata
        _di_subprogramr@   ro   )r   r   r   r   r   r   subpr   r   r   r   e  s   zDIBuilder._add_subprogramc                 C   s   |  |}|S )zEmit location metatdaa
        )_di_location)r   r   locr   r   r   r   l  s   
zDIBuilder._add_location    c                 C   s   t ||S )z0Util to create constant int in metadata
        r   rd   )clsnumbitsr   r   r   r   r     zDIBuilder._const_intc                 C   s   t d|S )z4Util to create constant boolean in metadata
           r   )r   booleanr   r   r   _const_boolx  r   zDIBuilder._const_boolc                 C   s(   | j dtj| jtj| jdS )NDIFile)	directoryfilename)r2   rk   r;   r<   dirnamer3   basenamer$   r   r   r   r>     s   zDIBuilder._di_filec              	   C   s.   | j jdtd| jddtjdkddddS )	NDICompileUnitDW_LANG_C_plus_pluszclang (Numba)r   r   )languager   producerruntimeVersionisOptimizedemissionKindTrU   )r2   rk   r   rl   r?   r   OPTr$   r   r   r   rA     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   r]   DISubroutineTyper   )rm   argsr   
startswithr   r   r4   rn   rr   ro   itemsdata_model_managerget_value_typer2   rk   rp   )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   unitrU   )r2   rk   r?   r   r   r   rB   )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   rk   r@   r   r   r   r   r   r     s
   zDIBuilder._di_locationr0   r'   )r   )r(   r)   r*   r   r   r   r`   r5   r%   rr   r   r   r#   r&   r   r   r   classmethodr   r   r>   rA   r   r   r   r   r   r   r   r8   V   s4    
 7
	
	r8   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   r/   r0   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)side_effectz	numba.dbg)	_last_linenor   r   r   	InlineAsmformatr   r   r   )r   r
   r   asmtyasmr   r   r   r   r   r     s   

zNvvmDIBuilder.mark_locationc                 C   s$   t t||}| j||j|d d S )N)r   r   r   )r   rw   r   r   )r   r   r    r!   r"   r   r   r   r   r   r#     s   

zNvvmDIBuilder.mark_subprogramc                 C   s   |  |||}| j| |S r   r   )r   r   r   r   r   r   r   r   r     s   zNvvmDIBuilder._add_subprogramc                 C   s$   | j tj| jtj| jgS r0   )r2   rp   r;   r<   r   r3   r   r$   r   r   r   	_filepair  s   zNvvmDIBuilder._filepairc                 C   s   | j | | j|  gS r0   )r2   rp   r   DI_Filer   r$   r   r   r   r>     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   NumbaTr   )r   r2   rp   r   r@   DI_Compile_unitDW_LANG_Pythonr   )r   filepairemptysp_metadatar   r   r   rA     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   @   )r2   rp   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)	r2   
get_globalr   rp   r   r>   DI_Subprogramr   r   )r   r   r   r   function_ptrsubroutine_typefuncvarscontextr   r   r   r   6  s4   
zNvvmDIBuilder._di_subprogramc                 C   s&   | j | || d| jd d gS )Nr   r   )r2   rp   r   r@   r   r   r   r   r   R  s   zNvvmDIBuilder._di_locationc                 C   r/   r0   r   r$   r   r   r   r%   Z  r6   zNvvmDIBuilder.initializec                    s   |   | _t   d S r0   )rA   rB   superr&   r$   	__class__r   r   r&   ]  s   
zNvvmDIBuilder.finalizer'   )r(   r)   r*   __doc__r   r   r   r   r   r   r   r   r   r   r   r#   r   r   r>   rA   r   r   r   r%   r&   __classcell__r   r   r  r   r     s0    
r   )r  r+   os.pathr;   
contextlibr   llvmliter   
numba.corer   r   numba.core.datamodel.modelsr   r   r   r   ABCMetar   r.   rc   r8   r   r   r   r   r   <module>   s"    
!  v