a
    L±Ögõ3  ã                   @   sÌ   d Z dZdZdZdZdZddlZddlZddlZddl	Z
ddlZ
dd	„ Zd
d„ Zdadaejadd„ Zdd„ Zg d¢Zdd„ ZG dd„ dƒZG dd„ deƒZdd„ ZG dd„ deƒZd!dd„Zd"dd „ZdS )#z>
Machinery for generating tracing-related intermediate files.
u%   LluÃ­s Vilanova <vilanova@ac.upc.edu>u:   Copyright 2012-2017, LluÃ­s Vilanova <vilanova@ac.upc.edu>z3GPL version 2 or (at your option) any later versionzStefan Hajnoczizstefanha@redhat.comé    Nc                  G   s   t j d | ¡d ¡ dS )zWrite a set of error lines.Ú
N)ÚsysÚstderrÚ
writelinesÚjoin©Úlines© r	   úE/home2/Puru_Virtio_Blk/virtio-demo/qemu/scripts/tracetool/__init__.pyÚerror_write   s    r   c                  G   s   t | Ž  t d¡ dS )z$Write a set of error lines and exit.é   N)r   r   Úexitr   r	   r	   r
   Úerror   s    r   r   z<none>c                 C   s   | a t| dƒad S )NZwt)Úout_filenameÚopenÚout_fobj)Úfilenamer	   r	   r
   Úout_open%   s    r   c                  O   sX   g }| D ]6}t |d< t d |d< t|d< | || ¡ t d7 a qt d |¡d ¡ dS )aŸ  Write a set of output lines.

    You can use kwargs as a shorthand for mapping variables when formatting all
    the strings in lines.

    The 'out_lineno' kwarg is automatically added to reflect the current output
    file line number. The 'out_next_lineno' kwarg is also automatically added
    with the next output line number. The 'out_filename' kwarg is automatically
    added with the output filename.
    Ú
out_linenor   Zout_next_linenor   r   N)r   r   Úappendr   r   r   )r   ÚkwargsÚoutputÚlr	   r	   r
   Úout*   s    
r   )ÚintZlongZshortÚcharÚboolZunsignedZsignedZint8_tZuint8_tZint16_tZuint16_tZint32_tZuint32_tZint64_tZuint64_tÚvoidZsize_tZssize_tZ	uintptr_tZ	ptrdiff_tc                 C   sN   |   d¡}|D ]:}t dd|¡}|dkr*q|dkr4q|tvrtd|  ƒ‚qd S )Nú z\*Ú Zconstz³Argument type '%s' is not allowed. Only standard C types and fixed size integer types should be used. struct, union, and other complex pointer types should be declared as 'void *')ÚsplitÚreÚsubÚALLOWED_TYPESÚ
ValueError)ÚnameÚbitsÚbitr	   r	   r
   Úvalidate_type[   s    
ür(   c                   @   sl   e Zd ZdZdd„ Zdd„ Ze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S )Ú	ArgumentszEvent arguments description.c                 C   s:   g | _ |D ]*}t|tƒr(| j  |j ¡ q
| j  |¡ q
dS )z|
        Parameters
        ----------
        args :
            List of (type, name) tuples or Arguments objects.
        N)Ú_argsÚ
isinstancer)   Úextendr   )ÚselfÚargsÚargr	   r	   r
   Ú__init__m   s
    
zArguments.__init__c                 C   s   t t| jƒƒS ©zCreate a new copy.)r)   Úlistr*   ©r-   r	   r	   r
   Úcopy{   s    zArguments.copyc                 C   sŠ   g }|   d¡D ]r}| ¡ }|s&tdƒ‚|dkr0qd|v rZ| dd¡\}}|d7 }| ¡ }n| dd¡\}}t|ƒ | ||f¡ qt|ƒS )z®Build and Arguments instance from an argument string.

        Parameters
        ----------
        arg_str : str
            String describing the event arguments.
        ú,z.Empty argument (did you forget to use 'void'?)r   Ú*r   N)r    Ústripr$   Úrsplitr(   r   r)   )Zarg_strÚresr/   Zarg_typeZ
identifierr	   r	   r
   Úbuild   s    	
zArguments.buildc                 C   s&   t |tƒrt| j| ƒS | j| S d S )N)r+   Úslicer)   r*   )r-   Úindexr	   r	   r
   Ú__getitem__›   s    
zArguments.__getitem__c                 C   s
   t | jƒS )z$Iterate over the (type, name) pairs.)Úiterr*   r3   r	   r	   r
   Ú__iter__¡   s    zArguments.__iter__c                 C   s
   t | jƒS )zNumber of arguments.)Úlenr*   r3   r	   r	   r
   Ú__len__¥   s    zArguments.__len__c                 C   s,   t | jƒdkrdS d dd„ | jD ƒ¡S dS )z1String suitable for declaring function arguments.r   r   ú, c                 S   s   g | ]\}}d   ||g¡‘qS )r   )r   )Ú.0ÚtÚnr	   r	   r
   Ú
<listcomp>®   ó    z%Arguments.__str__.<locals>.<listcomp>N)r@   r*   r   r3   r	   r	   r
   Ú__str__©   s    zArguments.__str__c                 C   s   dt | ƒ S )ú0Evaluable string representation for this object.zArguments("%s"))Ústrr3   r	   r	   r
   Ú__repr__°   s    zArguments.__repr__c                 C   s   dd„ | j D ƒS )zList of argument names.c                 S   s   g | ]\}}|‘qS r	   r	   )rC   Ú_r%   r	   r	   r
   rF   ¶   rG   z#Arguments.names.<locals>.<listcomp>©r*   r3   r	   r	   r
   Únames´   s    zArguments.namesc                 C   s   dd„ | j D ƒS )zList of argument types.c                 S   s   g | ]\}}|‘qS r	   r	   )rC   Útype_rL   r	   r	   r
   rF   º   rG   z#Arguments.types.<locals>.<listcomp>rM   r3   r	   r	   r
   Útypes¸   s    zArguments.typesc                 C   s   dd„ | j D ƒS )z,List of argument names casted to their type.c                 S   s   g | ]\}}d ||f ‘qS )z(%s)%sr	   )rC   rO   r%   r	   r	   r
   rF   ¾   rG   z$Arguments.casted.<locals>.<listcomp>rM   r3   r	   r	   r
   Úcasted¼   s    zArguments.castedN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r0   r4   Ústaticmethodr:   r=   r?   rA   rH   rK   rN   rP   rQ   r	   r	   r	   r
   r)   j   s   
r)   c                   @   sˆ   e Zd ZdZe d¡ZeddgƒZddd„Z	dd	„ Z
ed
d„ ƒZdd„ Ze d¡Zdd„ ZdZde Zed ZdZdZdZddd„ZdS )ÚEventam  Event description.

    Attributes
    ----------
    name : str
        The event name.
    fmt : str
        The event format string.
    properties : set(str)
        Properties of the event.
    args : Arguments
        The event arguments.
    lineno : int
        The line number in the input file.
    filename : str
        The path to the input file.

    zl((?P<props>[\w\s]+)\s+)?(?P<name>\w+)\((?P<args>[^)]*)\)\s*(?:(?:(?P<fmt_trans>\".+),)?\s*(?P<fmt>\".+))?\s*ZdisableZvcpuNc
                 C   s¼   || _ || _|| _|| _t|ƒ| _t|ƒ| _|| _|	| _	t
|ƒdkrPtd| ƒ‚|du rft | ¡| _n|| _t| jƒ| j }
t
|
ƒdkrštdd |
¡ ƒ‚t| jtƒs¸t
| jƒdks¸J ‚dS )a¸  
        Parameters
        ----------
        name : string
            Event name.
        props : list of str
            Property names.
        fmt : str, list of str
            Event printing format string(s).
        args : Arguments
            Event arguments.
        lineno : int
            The line number in the input file.
        filename : str
            The path to the input file.
        orig : Event or None
            Original Event before transformation/generation.
        event_trans : Event or None
            Generated translation-time event ("tcg" property).
        event_exec : Event or None
            Generated execution-time event ("tcg" property).

        é
   z9Event '%s' has more than maximum permitted argument countNr   zUnknown properties: %srB   é   )r%   Ú
propertiesÚfmtr.   r   ÚlinenorJ   r   Úevent_transÚ
event_execr@   r$   ÚweakrefÚrefZoriginalÚsetÚ_VALID_PROPSr   r+   )r-   r%   Úpropsr[   r.   r\   r   Zorigr]   r^   Zunknown_propsr	   r	   r
   r0   Þ   s*    

ÿÿzEvent.__init__c              
   C   s0   t | jt| jƒ| j| j ¡ | j| j| | j	| j
ƒ	S r1   )rW   r%   r2   rZ   r[   r.   r4   r\   r   r]   r^   r3   r	   r	   r
   r4     s    
þz
Event.copyc           
      C   sÀ   t j | ¡}|dusJ ‚| d¡}|d }|d  ¡ }|d }|d }| d¡dksb| d¡dkrjtd	ƒ‚| d
¡r|tdƒ‚d|v rŒtdƒ‚t|ƒdkr ||g}t	 
|d ¡}	t ||||	||ƒS )a  Build an Event instance from a string.

        Parameters
        ----------
        line_str : str
            Line describing the event.
        lineno : int
            Line number in input file.
        filename : str
            Path to input file.
        Nr   r%   rc   r[   Ú	fmt_transz%méÿÿÿÿzLEvent format '%m' is forbidden, pass the error as an explicit trace argumentz\n"z2Event format must not end with a newline characterz\nz,Event format must not use new line characterr   r.   )rW   Ú_CREÚmatchÚ	groupdictr    Úfindr$   Úendswithr@   r)   r:   )
Zline_strr\   r   ÚmÚgroupsr%   rc   r[   rd   r.   r	   r	   r
   r:     s"    

zEvent.buildc                 C   sH   t | jtƒr| j}nd| jd | jd f }dd | j¡| j| j|f S )rI   z%s, %sr   r   zEvent('%s %s(%s) %s')r   )r+   r[   rJ   r   rZ   r%   r.   ©r-   r[   r	   r	   r
   rK   9  s    ýzEvent.__repr__z(%[\d\.]*\w+|%.*?PRI\S+)c                 C   s   t | jtƒrJ ‚| j | j¡S )z?List conversion specifiers in the argument print format string.)r+   r[   r2   Ú_FMTÚfindallr3   r	   r	   r
   ÚformatsG  s    zEvent.formatsztrace_%(name)sZ
_nocheck__Z_tcgz_TRACE_%(NAME)s_DSTATEzTRACE_%(NAME)s_BACKEND_DSTATEz_TRACE_%(NAME)s_EVENTc                 C   s$   |d u rt j}|| j| j ¡ dœ S )N)r%   ZNAME)rW   Ú
QEMU_TRACEr%   Úupperrm   r	   r	   r
   ÚapiS  s    z	Event.api)NNN)N)rR   rS   rT   rU   r!   Úcompilerf   ra   rb   r0   r4   rV   r:   rK   rn   rp   rq   ZQEMU_TRACE_NOCHECKZQEMU_TRACE_TCGZQEMU_DSTATEZQEMU_BACKEND_DSTATEZ
QEMU_EVENTrs   r	   r	   r	   r
   rW   Á   s&   
  ÿ
1
#
rW   c                 C   s¼   g }t | dƒD ]¨\}}|d dkr.td| ƒ‚| ¡ s8q| ¡  d¡rHqzt |||¡}W nP tyª } z8d|||jd f }|f|jdd…  |_‚ W Y d}~n
d}~0 0 | |¡ q|S )	zÞGenerate the output for the given (format, backends) pair.

    Parameters
    ----------
    fobj : file
        Event description file.
    fname : str
        Name of event file

    Returns a list of Event objects
    r   re   r   z%s does not end with a new lineú#zError at %s:%d: %sr   N)	Ú	enumerater$   r7   ÚlstripÚ
startswithrW   r:   r.   r   )ZfobjZfnameÚeventsr\   ÚlineZeventÚeZarg0r	   r	   r
   Úread_eventsY  s     r|   c                   @   s   e Zd ZdZdS )ÚTracetoolErrorz Exception for calls to generate.N)rR   rS   rT   rU   r	   r	   r	   r
   r}   {  s   r}   c                 C   sV   z<t | tƒ tƒ dgƒ}|du r(d|fW S dt|t|ƒ|ƒfW S  tyP   Y dS 0 dS )a°  Try to import a module and get an attribute from it.

    Parameters
    ----------
    mod_name : str
        Module name.
    attr_name : str, optional
        Name of an attribute in the module.
    attr_default : optional
        Default value if the attribute does not exist in the module.

    Returns
    -------
    A pair indicating whether the module could be imported and the module or
    object or attribute value.
    Ú__package__NT)FN)Ú
__import__ÚglobalsÚlocalsÚgetattrrJ   ÚImportError)Zmod_nameZ	attr_nameZattr_defaultÚmoduler	   r	   r
   Ú
try_import€  s    
r…   c                 C   s²   ddl }t|ƒ}t|ƒdkr$tdƒ‚|j |¡s<td| ƒ‚t|ƒdkrPtdƒ‚|D ]}|j |¡sTtd| ƒ‚qT|j ||¡}ddl}||jj	_
||jj	_|j | |||¡ dS )aÅ  Generate the output for the given (format, backends) pair.

    Parameters
    ----------
    events : list
        list of Event objects to generate for
    group: str
        Name of the tracing group
    format : str
        Output format name.
    backends : list
        Output backend names.
    binary : str or None
        See tracetool.backend.dtrace.BINARY.
    probe_prefix : str or None
        See tracetool.backend.dtrace.PROBEPREFIX.
    r   Nzformat not setzunknown format: %szno backends specifiedzunknown backend: %s)Ú	tracetoolrJ   r@   r}   ÚformatÚexistsÚbackendZWrapperZtracetool.backend.dtraceZdtraceZBINARYZPROBEPREFIXÚgenerate)ry   Úgroupr‡   ÚbackendsÚbinaryÚprobe_prefixr†   r‰   r	   r	   r
   rŠ   š  s     

rŠ   )NN)NN)rU   Ú
__author__Ú__copyright__Ú__license__Ú__maintainer__Ú	__email__r!   r   r_   Útracetool.formatr†   Útracetool.backendr   r   r   r   Ústdoutr   r   r   r#   r(   r)   ÚobjectrW   r|   Ú	Exceptionr}   r…   rŠ   r	   r	   r	   r
   Ú<module>   s6   W "
 ÿ