a
    	_em                     @   sN  d dl mZ d dlZd dlZd dlZd dlZd dlZejd  dkrRG dd dZnd dlZda	dd Z
G d	d
 d
eZG dd deZd{ddZdd Zdd ZedZedZedZedZdZede d ZdZejdejejB dZejdejejB dZedZedZed Z ed!Z!ed"Z"ejd#ejdZ#ejd$ejdZ$e$Z%ejd%ejdZ&ed&Z'ejd'ejdZ(ejd(ejdZ)d|d)d*Z*d}d+d,Z+d-d. Z,d/d0 Z-d1d2 Z.d3d4 Z/G d5d6 d6eZ0d7d8 Z1ed9Z2G d:d; d;Z3e3d<d=d>e3d?d@dAe3dBdCdAe3dDdEdAe3dFdGdAe3dHdIdAe3dJdKdAe3dLdMdAgZ4dNZ5dOZ6e4D ],Z7e6rte6dP7 Z6e6e7j8dQ e7j9 dR 7 Z6qbdSZ:ee5dQ e6 dR e: Z;dTZ<dUdV Z=dWdX Z>dYdZ Z?d[d\ Z@d]d^ ZAd_d` ZBdadb ZCdcdd ZDdedf ZEdgdh ZFdidj ZGdkdl ZHdmdn ZIdodp ZJdqdr ZKdsdt ZLdudv ZMdwdx ZNdydz ZOdS )~    )print_functionN   c                   @   s   e Zd ZejZdS )stringN)__name__
__module____qualname__str
expandtabs r
   r
   n/home/sylvestre/dev/debian/pkg-llvm/llvm-toolchain/branches/llvm-project/llvm/utils/UpdateTestChecks/common.pyr   
   s   r   Fc                 C   s|   | j dddd | j ddddd | j dd	dd
d | j dddd | j dddddd | j ddddd |  }|ja|S )Nz--include-generated-funcs
store_truez)Output checks for functions not in source)actionhelpz-vz	--verbosezShow verbose outputz-uz--update-onlyz,Only update test if it was already autogenedz--force-updatez:Update test even if it was autogened by a different scriptz--enableenabledTz6Activate CHECK line generation from this point forward)r   destdefaultr   z	--disablestore_falsez8Deactivate CHECK line generation from this point forward)r   r   r   )add_argument
parse_argsverbose_verbose)parserargsr
   r
   r   parse_commandline_args   s*    


r   c                   @   s   e Zd Zdd ZdS )InputLineInfoc                 C   s   || _ || _|| _|| _d S N)lineline_numberr   argv)selfr   r   r   r   r
   r
   r   __init__(   s    zInputLineInfo.__init__Nr   r   r   r    r
   r
   r
   r   r   '   s   r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )TestInfoc	           	      C   s   || _ || _|| _|| _|| _|| _t|| j| _|| _| jd u r\| j	drVd| _nd| _| jd t
 | _| j| | _|  jt|| j7  _d S )Nz.mir#; )r   argparse_callbackpathr   r   input_linesfind_run_lines	run_linescomment_prefixendswith
UTC_ADVERTautogenerated_note_prefixtest_autogenerated_noteget_autogennote_suffix)	r   testr   script_namer(   r   r   r+   r&   r
   r
   r   r    0   s    
zTestInfo.__init__c                 c   sD   t | jD ]4\}}t|| j| j| j| j\}}t||||V  q
d S r   )	enumerater(   check_for_commandr   r   r   r&   r   )r   Zline_num
input_liner   r   r
   r
   r   ro_iterlinesC   s
    zTestInfo.ro_iterlinesc                 c   s\   | | j |  D ]B}|j}|| jr,q|j| _|j| _| jjsP| | q|V  qd S r   )	appendr/   r6   r   
startswithr.   r   r   r   )r   output_lines	line_infor5   r
   r
   r   	iterlinesI   s    
zTestInfo.iterlinesN)r   r   r   r    r6   r;   r
   r
   r
   r   r"   /   s   r"   c                 c   s  | D ]}t  |}|s(td|f  q|D ]}t|}dd |D }	W d    n1 s\0    Y  | }
|d ur~||
 tjd d  }|	r|	d nd}t|v r||vr|
jstd| | q,t|||
||\}
}n |
j	rt|vsJ td|  q,t
||||	|
|||V  q,qd S )Nz2Test file pattern '%s' was not found. Ignoring it.c                 S   s   g | ]}|  qS r
   )rstrip.0lr
   r
   r   
<listcomp>`       zitertests.<locals>.<listcomp>r    z,Skipping test which wasn't autogenerated by z)Skipping test which isn't autogenerated: )globwarnopenr   sysr   r-   Zforce_updater4   update_onlyr"   )Ztest_patternsr   r2   r+   r&   patternZ
tests_listr1   fr(   r   r   Z
first_liner
   r
   r   	itertestsW   s2    


,rJ   c                 C   s4   |   dkrdS t| }|r0|d|v r0dS dS )Nr$   F   T)stripCHECK_REmatchgroup)r5   
prefix_setmr
   r
   r   should_add_line_to_outputs   s    
rR   c                 C   s   t |^}t|tr*tj| g| |d}ntj| d | d|d}tjd dkrX| }W d    n1 sl0    Y  |ddS )	N)stdinr%   T)shellrS   r   r   z

)	rE   
isinstancelist
subprocessZcheck_outputrF   version_infodecodereplace)ZexeZcmd_argsZirZir_filestdoutr
   r
   r   invoke_tool   s    

&r]   z^\s*(?://|[;#])\s*RUN:\s*(.*)$z--?check-prefix(?:es)?[= ](\S+)z^[a-zA-Z0-9_-]+$zC^\s*(?://|[;#])\s*([^:]+?)(?:-NEXT|-NOT|-DAG|-LABEL|-SAME|-EMPTY)?:z	UTC_ARGS:z.*z\s*(?P<cmd>.*)\s*$z,NOTE: Assertions have been autogenerated by z^(\s*;\s*Function\sAttrs:\s(?P<attrs>[\w\s]+?))?\s*define\s+(?:internal\s+)?[^@]*@(?P<func>[\w.$-]+?)\s*(?P<args_and_sig>\((\)|(.*?[\w.-]+?)\))[^{]*\{)\n(?P<body>.*?)^\}$)flagsz]^\s*\'(?P<analysis>[\w\s-]+?)\'\s+for\s+function\s+\'(?P<func>[\w.$-]+?)\':\s*\n(?P<body>.*)$z6^\s*define\s+(?:internal\s+)?[^@]*@"?([\w.$-]+)"?\s*\(z$^\s*target\s+triple\s*=\s*"([^"]+)"$z-mtriple[= ]([^ ]+)z-march[= ]([^ ]+)z^(\s+)z(?!^(|  \w))[ \t]+z[ \t]+$z([ \t]|(#[0-9]+))+$z^ *#+ +kill:.*\nz*# =>This Inner Loop Header:.*|# in Loop:.*z(?<=\S)+[ \t]*#$c                 C   s(   |rd | |} td | tjd d S )N{}: {}z	ERROR: {}fileformatprintrF   stderrmsgZ	test_filer
   r
   r   error   s    rh   c                 C   s(   |rd | |} td | tjd d S )Nr_   zWARNING: {}r`   rb   rf   r
   r
   r   rD      s    rD   c                  O   s(   d|vrt j|d< tr$t| i | d S )Nra   )rF   re   r   rd   )r   kwargsr
   r
   r   debug   s    
rj   c                 C   s   t d|  dd dd |D D }t|dkr8|d gng }|dd  D ]8}|d drv|d dd	 | |d< qH|| qHt d
t||  |D ]}t d| q|S )Nz$Scanning for RUN lines in test file:c                 S   s   g | ]}|r| d qS )rK   )rO   )r>   rQ   r
   r
   r   r@      s   z"find_run_lines.<locals>.<listcomp>c                 S   s   g | ]}t |qS r
   )RUN_LINE_RErN   r=   r
   r
   r   r@      rA   r   rK   \r%   zFound {} RUN lines in {}:z	  RUN: {})rj   lenr,   r<   r7   rc   )r1   linesZ	raw_linesr*   r?   r
   r
   r   r)      s    
r)   c                 C   s(   t d| } t| d} td| } | S )Nr%   r   rB   )SCRUB_WHITESPACE_REsubr   r	   !SCRUB_TRAILING_WHITESPACE_TEST_RE)bodyr
   r
   r   
scrub_body   s    rt   c                 C   s8   |r(t |}||d _|| g|R  S || g|R  S )Nr   )copyZdeepcopyextra_scrub)rs   scrubberscrubber_argsextraZ
local_argsr
   r
   r   do_scrub   s
    

rz   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )function_bodyc                 C   s   || _ || _|| _|| _d S r   )scrub
extrascrubargs_and_sigattrs)r   r   ry   r~   r   r
   r
   r   r       s    zfunction_body.__init__c           
         s   t    fdd} fdd}| j|kr,dS t|| j}t||}||krRdS t|| j}t||}	td|}td|	}	||	kS )Nc                    s&     | d | d| | j S )N   rK   )addrO   	lastindexrN   	arg_namesr
   r   drop_arg_names   s    z>function_body.is_same_except_arg_names.<locals>.drop_arg_namesc                    sR   |  dd ur2|  d v r2|  d|  | j S |  d|  d |  | j S )Nr   rK   r   )rO   r   r   r   r
   r   repl_arg_names   s    z>function_body.is_same_except_arg_names.<locals>.repl_arg_namesFrB   )setr   IR_VALUE_RErq   r~   r}   SCRUB_IR_COMMENT_RE)
r   r}   r~   r   r   r   Zans0Zans1Zes0Zes1r
   r   r   is_same_except_arg_names   s    
z&function_body.is_same_except_arg_namesc                 C   s   | j S r   )r|   )r   r
   r
   r   __str__  s    zfunction_body.__str__N)r   r   r   r    r   r   r
   r
   r
   r   r{      s   r{   c
                 C   s&  |  |D ]}
|
sq
|
d}|
d}|	r8|
dnd}|r`d|
 v r`t|
d }nd|
 v rrd}nd}t|||dd}t|||d	d}d
|
 v r|
d
}| dkrtd|f  |drd	|
 dd  }|r td| tjd |
 D ]}td| tjd q|D ]}||| v rt|| | |ks|| | r|| | j|ks|| | j|kr|| | r|| | |||r||| | _||| | _q$n.||d krtd|f  nd || |< q$t|||||| |< || | q$q
d S )Nfuncrs   r   rB   r~   (F)ry   Tanalysiszcost model analysiszUnsupported analysis mode: %r!ZstressrU   rl   zProcessing function: r`   z  z0Found conflicting asm under the same prefix: %r!)finditerrO   	groupdictrt   rL   rz   lowerrD   r8   join
splitlinesrd   rF   re   r   r~   r   r   r|   r{   r7   )function_rerw   rx   raw_tool_outputprefixes	func_dict
func_orderr   Zrecord_argsZcheck_attributesrQ   r   rs   r   r~   Zscrubbed_bodyZscrubbed_extrar   r?   prefixr
   r
   r   build_function_body_dictionary  sH    



L&r   z\s*;.*c                   @   s   e Zd Zdd ZdS )NamelessValuec                 C   s   || _ || _|| _d S r   )check_prefix	ir_prefix	ir_regexp)r   r   r   r   r
   r
   r   r    8  s    zNamelessValue.__init__Nr!   r
   r
   r
   r   r   7  s   r   ZTMP%z[\w.-]+?ZGLOB@z[0-9]+?ZATTRr#   ZDBGz!dbg !ZTBAAz!tbaa !ZRNGz!range !ZLOOPz!llvm.loop !ZMETAz
metadata !z(\s+)rB   |r   )z([,\s\(\)]|\Z)r   c                 C   s8   t t| jD ]}| |d ur|t   S qtd dS )Nz7Unable to identify the kind of IR value from the match!r   )range&first_nameless_group_in_ir_value_matchr   rO   rh   )rN   ir
   r
   r   get_idx_from_ir_value_match]  s
    r   c                 C   s   |  t| t S r   )rO   r   r   r   r
   r
   r   get_name_from_ir_value_matche  s    r   c                 C   s   t t|  jS r   )nameless_valuesr   r   r   r
   r
   r   -get_nameless_check_prefix_from_ir_value_matchj  s    r   c                 C   s   t t|  jS r   r   r   r   r   r
   r
   r   !get_ir_prefix_from_ir_value_matcho  s    r   c                 C   s   t t|  jdkS )Nr   r   r   r
   r
   r   is_local_ir_value_matchs  s    r   c                 C   s4   |   rt||  } | dd} | dd} |  S )N._-)isdigitr   r[   uppervarrN   r
   r
   r   get_value_namew  s
    r   c                 C   s   dt | | d t| d S )N[[:z.*]])r   r   r   r
   r
   r   get_value_definition  s    r   c                 C   s   dt | | d S )Nr   z]])r   r   r
   r
   r   get_value_use  s    r   c           
         sr    fdd}g }t | D ]R\}}|dd}td|}|| |< |sd}	|	rtj|| | dd\| |< }	qJq| S )	Nc                    s   t | }t| }tD ],}td|j d |tjrtd|f  q||fv sZ||f v rft|| }n0t	| r~
||f n 
||f t|| }| d| | | j S )N^z[0-9]+?$zTChange IR value name '%s' to prevent possible conflict with scripted FileCheck name.rK   )r   r   r   rerN   r   
IGNORECASErD   r   r   r   r   rO   r   )rN   Zprer   nameless_valueZrvglobal_vars_seen	vars_seenr
   r   transform_line_vars  s    
z3generalize_check_lines.<locals>.transform_line_varsz%.z%dotrB   TrK   )count)r3   r[   r   rq   r   subn)
ro   
is_analyzer   r   r   Zlines_with_defr   r   Zscrubbed_lineZchangedr
   r   r   generalize_check_lines  s     r   c	              
      sz  t  }	g }
|D ]2}|d }tt fdd|r|	t |O }	qq|D ],}|d }|D ]}||
v rj qF||	v rtqX |  sqX|rt|
dkr| | ||vrt  ||< || }t  }|
| t |  j}|dkrdn|}|r| d|||f  t |  j}t|g|||d }d|v r\| ||df  | d|||f  n| |||f  t |  	 }|r| d	|||d f  |d
d  D ]<}|
 dkr| d||f  n| d|||f  q qFt||||}d}|D ]\}|
 dkr d}qtd|}|rH| d||| n| d||| d}q| |  qFqXqFd S )Nr   c                    s    |  vS r   r
   )checkprefixr   	func_namer
   r   <lambda>  rA   zadd_checks.<locals>.<lambda>NonerB   z%s %s: Function Attrs: %sr   z%s %s-SAME: %sz%s %s:       %srK   z%s %s-EMPTY:z%s %s-NEXT:  %sFTz{} {}:       {}z{} {}-NEXT:  {})r   anymaprn   r7   r   r   r~   r   r   rL   r   rq   rc   )r9   comment_markerprefix_listr   r   check_label_formatZis_asmr   global_vars_seen_dictZprefix_exclusionsZprinted_prefixespZcheckprefixesr   r   r   r   r~   Z	func_bodyZ	func_lineZis_blank_liner
   r   r   
add_checks  sv    






r   c           
   
   C   s4   |rdnd}d ||}	t| |||||	d||	 d S )Nzdefine {{[^@]+}}rB   z{} %s-LABEL: {}@%s%sFrc   r   )
r9   r   r   r   r   Zpreserve_namesZfunction_sigr   Zfunction_def_regexr   r
   r
   r   add_ir_checks  s
    r   c              
   C   s*   d |}i }t| |||||dd|	 d S )Nz{} %s-LABEL: '%s%s'FTr   )r9   r   r   r   r   r   r   r
   r
   r   add_analyze_checks  s
    
r   c                 C   s6   t | s2d}d| v r"d|  d }td| |   d S )NrB   ,z  Did you mean '--check-prefixes=z'?zkSupplied prefix '%s' is invalid. Prefix must contain only alphanumeric characters, hyphens and underscores.)	PREFIX_RErN   rD   )r   hintr
   r
   r   r   %  s    
r   c                 C   s   |   }|D ]r}d|v r2| ddd }t| qd|v r| ddd  d}|D ](}t| ||dkrTtd|f  qTqd S )Nzcheck-prefix==rK   zcheck-prefixes=r   z6Supplied prefix '%s' is not unique in the prefix list.)splitr   r   rD   )Zfc_cmdZfc_cmd_partspartr   r   r
   r
   r   verify_filecheck_prefixes.  s    
r   c                 C   s   d}| j D ]z}t||jsq
|jdv r(q
t||j}|jd urJ||jkrJq
| |j|kr\q
||jd d 7 }|jd u r
|d| 7 }q
|rdt|d d f }|S )NrB   )testsrG   Z
opt_binary
llc_binaryZclangZoptZllvm_binr   r   r%   z%s z %s %srl   )_actionshasattrr   getattrconstget_defaultoption_stringsUTC_ARGS_KEY)r   r   Zautogenerated_note_argsr   valuer
   r
   r   r0   <  s$    




r0   c                    sZ   t | }|rR|d d}|| }|t fdd| |d urR|   |fS )Ncmdr%   c                    s
   |  j vS r   )r   )argr   r
   r   r   Z  rA   z#check_for_command.<locals>.<lambda>)UTC_ARGS_CMDrN   rO   rL   r   r   filter)r   r   r   r   r&   Zcmd_mr   r
   r   r   r4   U  s    
r4   c                 C   s   || j }|s|rd}|  D ]j}|j}|dsB| dkrBd}||j }|rtr|rtd|| tj	d td|tj	d  qq|S )NFr$   rB   Tz0WARNING: Found {} in line following test start: r`   z*WARNING: Consider moving {} to top of file)
r   r6   r   r8   rL   rD   rd   rc   rF   re   )	test_infoZget_arg_to_check
arg_stringZ	is_globalresultZsaw_liner:   r   r
   r
   r   find_arg_in_test_  s(    



r   c                 C   sj   | | D ]Z}|j}|j}| |kr(q
| |rTt|}|rT|d|v rTq
| 	|
d q
d S )NrK   rU   )r;   r   r   rL   lstripr8   rM   rN   rO   r7   r<   )r9   r   rP   comment_stringZinput_line_infor   r   rQ   r
   r
   r   dump_input_linesv  s    
r   c           
      C   sh   t  }|D ]X}|d }|d }|D ]>}|| D ]0}	|r@| | ||	 || |g|fg|	 q.q"q
d S )Nr   rK   )r   r7   r   )
r9   r   r   r   Zcheck_generatorZaddedr   r   Z	tool_argsr   r
   r
   r   add_checks_at_end  s    


r   )NN)N)N)P
__future__r   ru   rC   r   rX   rF   rY   r   r   r   objectr   r"   rJ   rR   r]   compilerk   CHECK_PREFIX_REr   rM   r   r   r-   MSZOPT_FUNCTION_REXZANALYZE_FUNCTION_REIR_FUNCTION_RETRIPLE_IR_RETRIPLE_ARG_REMARCH_ARG_REZSCRUB_LEADING_WHITESPACE_RErp   SCRUB_TRAILING_WHITESPACE_RErr   Z+SCRUB_TRAILING_WHITESPACE_AND_ATTRIBUTES_RESCRUB_KILL_COMMENT_RESCRUB_LOOP_COMMENT_RESCRUB_TAILING_COMMENT_TOKEN_RErh   rD   rj   r)   rt   rz   r{   r   r   r   r   ZIR_VALUE_REGEXP_PREFIXZIR_VALUE_REGEXP_STRINGr   r   r   ZIR_VALUE_REGEXP_SUFFIXr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r0   r4   r   r   r   r
   r
   r
   r   <module>   s   (















.
	







*e	
