o
    qiF                     @   s   g a G d d deZG dd deZG dd deZG dd deZG dd	 d	eZG d
d deZG dd deZG dd deZ	G dd deZ
dS )c                       4   e Zd Z fddZdd Zdd Zdd Z  ZS )	
TextWriterc                    s*   t t|   || _g | _g | _g | _d S N)superr   __init__output_pathprologuecontentepilogueselfr   	__class__ K/home/app/PyTorch/test/pytorch/third_party/python-peachpy/peachpy/writer.pyr      s
   
zTextWriter.__init__c                 C   s   t |  t| jd| _| S )Nwactive_writersappendopenr   output_filer   r   r   r   	__enter__   s   
zTextWriter.__enter__c                 C   T   t |  |d u r| j|   | j  d | _d S dd l}|| jj d | _ N    )	r   remover   write	serializecloseosunlinknamer   exc_type	exc_value	tracebackr   r   r   r   __exit__      


zTextWriter.__exit__c                 C   s   dd l }| j}t|ts|jtt|}|r||jd 7 }| j}t|ts/|jtt|}| j}t|ts@|jtt|}|rI|jd | }|| | S )Nr      )	r   r   
isinstancestrlinesepjoinmapr   r	   )r   r   r   r   r	   r   r   r   r   "   s   


zTextWriter.serialize)__name__
__module____qualname__r   r   r&   r   __classcell__r   r   r   r   r      s
    r   c                       &   e Zd Zd fdd	Zdd Z  ZS )AssemblyWriterNc                    s   t t| | |dvrtd| || _ddddd| | _|dkr/dd	lm} d
| | _nd| _dd l	}|d urJ|  jdj
| j|j|d7  _n|  jdj
| j|jd7  _t| j d | _d S )N>   nasmgogasmasmzUnknown assembly format: %sz//;#)r5   r4   r7   r6   r5   r   )r+   z// +build !noasm z7{escape} Generated by PeachPy {version} from {filename})escapeversionfilenamez'{escape} Generated by PeachPy {version})r;   r<   r(   )r   r3   r   
ValueErrorassembly_formatZcomment_prefixr   r+   r   peachpyformat__version__len
splitlinesprologue_lines)r   r   r?   
input_pathr+   r@   r   r   r   r   9   s0   



zAssemblyWriter.__init__c                 C   sP   dd l }t||jjjsJ d|j| jd | jt| j	 d}|  j	|7  _	d S )Nr   FFunction must be finalized with an ABI before its assembly can be used)line_separatorline_number)
peachpy.x86_64.functionr)   x86_64functionABIFunctionrA   r?   rE   rC   r   )r   rL   r@   Zfunction_linesr   r   r   add_functionT   s   zAssemblyWriter.add_functionr   r.   r/   r0   r   rN   r1   r   r   r   r   r3   8   s    r3   c                       r   )	ImageWriterc                    s   t t|   || _d S r   )r   rP   r   r   r
   r   r   r   r   ^   s   
zImageWriter.__init__c                 C   s    t |  t| jddd| _| S )Nwbr   )	bufferingr   r   r   r   r   r   b   s   
zImageWriter.__enter__c                 C   r   r   )	r   r   r   r   encoder   r   r    r!   r"   r   r   r   r&   h   r'   zImageWriter.__exit__c                 C   s   t  S r   )	bytearrayr   r   r   r   rS   u   s   zImageWriter.encode)r.   r/   r0   r   r   r&   rS   r1   r   r   r   r   rP   ]   s
    rP   c                       .   e Zd Zd fdd	Zdd Zdd Z  ZS )		ELFWriterNc                    s   t t| | ddlm} ddlm}m} || _|||| _	| | _
| j	| j
 |ddd| _| j	| j d | _d | _d S )Nr   Image)TextSectionProgramBitsSectionz.note.GNU-stackF)allocate)r   rV   r   Zpeachpy.formats.elf.imagerX   peachpy.formats.elf.sectionrY   rZ   abiimagetext_sectionadd_sectionZgnu_stack_sectiontext_rela_sectionrodata_section)r   r   r]   rF   rX   rY   rZ   r   r   r   r   z   s   
zELFWriter.__init__c                 C   s   | j jS r   )r^   as_bytearrayr   r   r   r   rS      s   zELFWriter.encodec                 C   s  dd l }ddlm} t||jjjsJ d| }t| j	j
}t|jjg|||jj|  }| j	 j
|7  _
|t|7 }| j	 j
|jj
7  _
t| j	j|jj| j	_d}|jj
r| jd u roddlm} | | _| j| j | j| j}t|jjg|||jj|  }	| j j
|	7  _
|t|	7 }| j j
|jj
7  _
t| jj|jj| j_ddlm}
m}m} t }|jjD ]/}|
 }|jd |j |_||j  |_!|j"|_"| j|_#|j$|_%|j&|_'| jj()| |||< q|jj*r3| j+d u rddlm,} || j	| jj(| _+| j| j+ ddlm-}m.} |jj*D ]}||j/||j  ||j0 |j |j1 }| j+)| q|
 }|j|_||_!t|j|_2| j	|_#|j3|_%|j|_'| jj()| d S )	Nr   rounduprG   )ReadOnlyDataSection)SymbolSymbolBinding
SymbolType.)RelocationsWithAddendSection)RelocationWithAddendRelocationType)4rJ   peachpy.utilre   r)   rK   rL   rM   rS   rC   r_   r   rT   code_sectionalignment_byte	alignmentmaxconst_sectionrb   r\   rf   r^   r`   get_content_sizer]   peachpy.formats.elf.symbolrg   rh   ri   dictsymbolsmangled_namer!   offsetvaluesizesectionlocalbindingZdata_objecttypeZsymtabaddrelocationsra   rk   rl   rm   Zx86_64_pc32symbolprogram_countercontent_sizeZglobal_)r   rL   r@   re   encoded_functioncode_offsetcode_paddingconst_offsetrf   const_paddingrg   rh   ri   
symbol_mapr   const_symbolrk   rl   rm   
relocationZelf_relocationfunction_symbolr   r   r   rN      sz   





zELFWriter.add_functionr   r.   r/   r0   r   rS   rN   r1   r   r   r   r   rV   y   s    rV   c                       s,   e Zd Z fddZdd Zdd Z  ZS )MachOWriterc                    s0   t t| | ddlm} || _||| _d S )Nr   rW   )r   r   r   Zpeachpy.formats.macho.imagerX   r]   r^   )r   r   r]   rX   r   r   r   r      s   zMachOWriter.__init__c                 C   
   | j  S r   r^   rS   r   r   r   r   rS         
zMachOWriter.encodec                 C   s  dd l }t||jjjsJ dddlm}m}m}m	}m
}m} ddlm}	 | }
t| jjj}t|
jjg|	||
jj|  }| jj j|7  _|t|7 }| jj j|
jj7  _t| jjj|
jj| jj_| jjj}t|
jjg|	||
jj|  }| jj j|7  _|t|7 }| jj j|
jj7  _t| jjj|
jj| jj_t }|
jjD ]&}|d|j d |j |j| jj||j }|j |_!| jj"#| |||< q|
jj$D ]c}||j%||j d||j& dd	}|jd |j' }|dkr1|d
@ | jjj||j < |d? d
@ | jjj||j d < |d? d
@ | jjj||j d < |d? d
@ | jjj||j d < | jjj$(| q|d|j |j| jj|d}|j |_!|j)|_*| jj"#| d S )Nr   rG   )rg   ri   SymbolDescriptionSymbolVisibility
Relocationrm   rd   _rj      T)Zis_pc_relative                  r(   )rz   )+rJ   r)   rK   rL   rM   Zpeachpy.formats.macho.symbolrg   ri   r   r   r   rm   rn   re   rS   rC   r^   r_   r   rT   ro   rp   rq   rr   rs   r   rv   rw   rx   r!   Zsection_relativery   ZdefinedZdescriptionsymbol_table
add_symbolr   Zx86_64_signedr   r   r   externalZ
visibility)r   rL   r@   rg   ri   r   r   r   rm   re   r   r   r   r   r   r   r   Zmacho_symbolr   Zmacho_relocationZrelocation_addendr   r   r   r   rN      sf    






   zMachOWriter.add_functionr   r   r   r   r   r      s    r   c                       rU   )	MSCOFFWriterNc                    sl   t t| | ddlm}m}m} || _|| _|||| _	| | _
| j	| j
 | | _| j	| j d S )Nr   )rX   rY   rf   )r   r   r   peachpy.formats.mscoffrX   rY   rf   r   r]   r^   r_   r`   rdata_section)r   r   r]   rF   rX   rY   rf   r   r   r   r     s   zMSCOFFWriter.__init__c                 C   r   r   r   r   r   r   r   rS   #  r   zMSCOFFWriter.encodec                 C   s(  dd l }t||jjjsJ dddlm} ddlm}m	}m
}m}m} | }	t| jj}
t|	jjg||
|	jj|
  }| j j|7  _|
t|7 }
| j j|	jj7  _t| jj|	jj| j_| jj}t|	jjg|||	jj|  }| j j|7  _|t|7 }| j j|	jj7  _t| jj|	jj| j_t }|	jjD ]%}| }|j|_||j |_| j|_|j|_ |j!|_"| j#$| |||< q|	jj%D ],}|j&|j'|j(|j)|j*|j+d}||j,|j  }|||
|j ||j- }| jj%.| q| }|j/|_|
|_| j|_|j|_ |j0|_"| j#$| d S )Nr   rG   rd   )rg   ri   StorageClassr   rm   )r            r   	   )1rJ   r)   rK   rL   rM   rn   re   r   rg   ri   r   r   rm   rS   rC   r_   r   rT   ro   rp   rq   rr   r   r   rs   rv   rw   r!   ry   rz   r|   non_functionsymbol_typestaticstorage_classr^   r   r   x86_64_relocation_offset32!x86_64_relocation_plus_1_offset32!x86_64_relocation_plus_2_offset32!x86_64_relocation_plus_3_offset32!x86_64_relocation_plus_4_offset32!x86_64_relocation_plus_5_offset32r   r   r   rx   r   )r   rL   r@   re   rg   ri   r   r   rm   r   r   r   Zrdata_offsetZrdata_paddingr   r   Zmscoff_symbolr   Zrelocation_type_mapZrelocation_typeZmscoff_relocationr   r   r   r   rN   &  sp   


zMSCOFFWriter.add_functionr   r   r   r   r   r   r     s    r   c                       $   e Zd Z fddZdd Z  ZS )MetadataWriterc                    s   t t| | g | _d S r   )r   r   r   metadatar
   r   r   r   r   f  s   
zMetadataWriter.__init__c                 C   s2   dd l }t||jjjsJ d| j|j d S )Nr   rG   )rJ   r)   rK   rL   rM   r   r   )r   rL   r@   r   r   r   rN   j  s
   zMetadataWriter.add_functionrO   r   r   r   r   r   e  s    r   c                       r   )JSONMetadataWriterc                    s   t t| | d S r   )r   r   r   r
   r   r   r   r   s  s   zJSONMetadataWriter.__init__c                 C   s   dd l }|| jS r   )jsondumpsr   )r   r   r   r   r   r   v  s   zJSONMetadataWriter.serialize)r.   r/   r0   r   r   r1   r   r   r   r   r   r  s    r   c                       r2   )CHeaderWriterNc                    sb   t t| | dd l}|d urd|j|f g| _nd|j g| _|  jg d7  _g d| _d S )Nr   z%/* Generated by PeachPy %s from %s */z/* Generated by PeachPy %s */)r:   z#pragma oncer:   #ifdef __cpluspluszextern "C" {#endif)r   z} /* extern "C" */r   r:   )r   r   r   r@   rB   r   r	   )r   r   rF   r@   r   r   r   r   |  s   zCHeaderWriter.__init__c                 C   st   dd l }t||jjjsJ d|jd u rdnt|j}dd |jD }| j	|d |j
 d d| d	  d S )
Nr   rG   voidc                 S   s    g | ]}t |jd  |j qS ) )r*   c_typer!   ).0argr   r   r   
<listcomp>  s     z.CHeaderWriter.add_function.<locals>.<listcomp>r   (z, z);)rJ   r)   rK   rL   rM   result_typer*   	argumentsr   r   rx   r,   )r   rL   r@   Zreturn_typer   r   r   r   rN     s   ,zCHeaderWriter.add_functionr   rO   r   r   r   r   r   {  s    r   N)r   objectr   r3   rP   rV   r   r   r   r   r   r   r   r   r   <module>   s   1%VFP	