o
    Tæ«d1  ã                   @   sú  d dl Z d dl mZmZ 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	d dl
Z
d dlZd dlZd dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZ e ¡ d
krae d¡ dd„ ZdZdZdZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(g d¢Z)g d¢Z*g d¢Z+dZ,dZ-d Z.G d!d"„ d"eƒZ/G d#d$„ d$e/ƒZ0G d%d&„ d&e/ƒZ1G d'd(„ d(e/ƒZ2G d)d*„ d*e/ƒZ3G d+d,„ d,e4ƒZ5G d-d.„ d.e5ƒZ6G d/d0„ d0e/e6ƒZ7G d1d2„ d2e/ƒZ8G d3d4„ d4e/ƒZ9G d5d6„ d6e/ƒZ:G d7d8„ d8e/ƒZ;G d9d:„ d:e/ƒZ<G d;d<„ d<e4ƒZ=G d=d>„ d>e/e=ƒZ>G d?d@„ d@e/e=ƒZ?G dAdB„ dBe/e=ƒZ@G dCdD„ dDe/ƒZAG dEdF„ dFe/ƒZBG dGdH„ dHe/ƒZCG dIdJ„ dJe7ƒZDG dKdL„ dLe/ƒZEe Fe ¡  GdM¡dN¡G dOdP„ dPe/ƒƒZHG dQdR„ dRe/ƒZIG dSdT„ dTe/ƒZJG dUdV„ dVe/ƒZKeLdWkr{e M¡  dS dS )Xé    N)Ú	CFUNCTYPEÚc_int)Úfind_library)Úcontextmanager)Úmkstemp)Úir)Úbinding)Úffi)ÚTestCaseÚarmv7lzlibgcc_s.so.1c               
   C   sl   t  t j¡} z'z	t  t jd¡ W n t jy#   Y W t  t j| ¡ dS w W t  t j| ¡ dS t  t j| ¡ w )NÚde_DETF)ÚlocaleÚ	setlocaleÚLC_ALLÚError)Úcur© r   ún/home/ncw/WWW/www-new/content/articles/pi-bbp/venv/lib/python3.10/site-packages/llvmlite/tests/test_binding.pyÚno_de_locale   s   û"r   a±  
    ; ModuleID = '<string>'
    source_filename = "asm_sum.c"
    target triple = "{triple}"
    %struct.glob_type = type {{ i64, [2 x i64]}}

    @glob = global i32 0
    @glob_b = global i8 0
    @glob_f = global float 1.5
    @glob_struct = global %struct.glob_type {{i64 0, [2 x i64] [i64 0, i64 0]}}

    define i32 @sum(i32 %.1, i32 %.2) {{
      %.3 = add i32 %.1, %.2
      %.4 = add i32 0, %.3
      ret i32 %.4
    }}
    z 
    ; ModuleID = '<string>'
    target triple = "{triple}"

    define i32 @sum(i32 %.1, i32 %.2) {{
      %.3 = add i32 %.1, %.2
      ret i32 %.3
    }}
    z½
    ; ModuleID = '<string>'
    target triple = "{triple}"
    @mul_glob = global i32 0

    define i32 @mul(i32 %.1, i32 %.2) {{
      %.3 = mul i32 %.1, %.2
      ret i32 %.3
    }}
    z¡
    ; ModuleID = '<string>'
    target triple = "{triple}"

    define i32 @sum(i32 %.1, i32 %.2) {{
      %.3 = fadd i32 %.1, %.2
      ret i32 %.3
    }}
    z
    ; ModuleID = '<string>'
    target triple = "{triple}"

    define void @sum() {{
      %.bug = add i32 1, %.bug
      ret void
    }}
    zh
    ; ModuleID = '<string>'
    target triple = "{triple}"

    declare i32 @sum(i32 %.1, i32 %.2)
    z–
    ; ModuleID = '<string>'
    target triple = "{triple}"

    define void @foo() {{
      %const = fadd double 0.0, 3.14
      ret void
    }}
    zœ
    ; ModuleID = '<string>'
    target triple = "{triple}"

    define void @foo() {{
      call void asm sideeffect "nop", ""()
      ret void
    }}
    a  
    ; ModuleID = '<string>'
    target triple = "{triple}"

    define void @inlineme() {{
        ret void
    }}

    define i32 @caller(i32 %.1, i32 %.2) {{
    entry:
      %stack = alloca i32
      store i32 %.1, i32* %stack
      br label %main
    main:
      %loaded = load i32, i32* %stack
      %.3 = add i32 %loaded, %.2
      %.4 = add i32 0, %.3
      call void @inlineme()
      ret i32 %.4
    }}
aÉ  
; ModuleID = 'test.c'
source_filename = "test.c"
target triple = "{triple}"

; Function Attrs: noinline nounwind optnone ssp uwtable
define void @inlineme() noinline !dbg !15 {{
  ret void, !dbg !18
}}

; Function Attrs: noinline nounwind optnone ssp uwtable
define i32 @foo(i32 %0, i32 %1) !dbg !19 {{
  %3 = alloca i32, align 4
  %4 = alloca i32, align 4
  store i32 %0, i32* %3, align 4
  call void @llvm.dbg.declare(metadata i32* %3, metadata !23, metadata !DIExpression()), !dbg !24
  store i32 %1, i32* %4, align 4
  call void @llvm.dbg.declare(metadata i32* %4, metadata !25, metadata !DIExpression()), !dbg !26
  call void @inlineme(), !dbg !27
  %5 = load i32, i32* %3, align 4, !dbg !28
  %6 = load i32, i32* %4, align 4, !dbg !29
  %7 = add nsw i32 %5, %6, !dbg !30
  ret i32 %7, !dbg !31
}}

; Function Attrs: nofree nosync nounwind readnone speculatable willreturn
declare void @llvm.dbg.declare(metadata, metadata, metadata) #1

attributes #1 = {{ nofree nosync nounwind readnone speculatable willreturn }}

!llvm.module.flags = !{{!1, !2, !3, !4, !5, !6, !7, !8, !9, !10}}
!llvm.dbg.cu = !{{!11}}
!llvm.ident = !{{!14}}

!0 = !{{i32 2, !"SDK Version", [2 x i32] [i32 12, i32 3]}}
!1 = !{{i32 7, !"Dwarf Version", i32 4}}
!2 = !{{i32 2, !"Debug Info Version", i32 3}}
!3 = !{{i32 1, !"wchar_size", i32 4}}
!4 = !{{i32 1, !"branch-target-enforcement", i32 0}}
!5 = !{{i32 1, !"sign-return-address", i32 0}}
!6 = !{{i32 1, !"sign-return-address-all", i32 0}}
!7 = !{{i32 1, !"sign-return-address-with-bkey", i32 0}}
!8 = !{{i32 7, !"PIC Level", i32 2}}
!9 = !{{i32 7, !"uwtable", i32 1}}
!10 = !{{i32 7, !"frame-pointer", i32 1}}
!11 = distinct !DICompileUnit(language: DW_LANG_C99, file: !12, producer: "Apple clang version 13.1.6 (clang-1316.0.21.2.3)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !13, splitDebugInlining: false, nameTableKind: None, sysroot: "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk", sdk: "MacOSX.sdk")
!12 = !DIFile(filename: "test.c", directory: "/")
!13 = !{{}}
!14 = !{{!"Apple clang version 13.1.6 (clang-1316.0.21.2.3)"}}
!15 = distinct !DISubprogram(name: "inlineme", scope: !12, file: !12, line: 1, type: !16, scopeLine: 1, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !11, retainedNodes: !13)
!16 = !DISubroutineType(types: !17)
!17 = !{{null}}
!18 = !DILocation(line: 1, column: 22, scope: !15)
!19 = distinct !DISubprogram(name: "foo", scope: !12, file: !12, line: 3, type: !20, scopeLine: 3, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !11, retainedNodes: !13)
!20 = !DISubroutineType(types: !21)
!21 = !{{!22, !22, !22}}
!22 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
!23 = !DILocalVariable(name: "a", arg: 1, scope: !19, file: !12, line: 3, type: !22)
!24 = !DILocation(line: 3, column: 13, scope: !19)
!25 = !DILocalVariable(name: "b", arg: 2, scope: !19, file: !12, line: 3, type: !22)
!26 = !DILocation(line: 3, column: 20, scope: !19)
!27 = !DILocation(line: 4, column: 5, scope: !19)
!28 = !DILocation(line: 5, column: 12, scope: !19)
!29 = !DILocation(line: 5, column: 16, scope: !19)
!30 = !DILocation(line: 5, column: 14, scope: !19)
!31 = !DILocation(line: 5, column: 5, scope: !19)
aN  
; ModuleID = "<string>"
target triple = "{triple}"

define double @licm(i32 %0) {{
  %2 = alloca i32, align 4
  %3 = alloca double, align 8
  %4 = alloca i32, align 4
  %5 = alloca double, align 8
  store i32 %0, i32* %2, align 4
  store double 0.000000e+00, double* %3, align 8
  store i32 0, i32* %4, align 4
  br label %6

6:                                                ; preds = %14, %1
  %7 = load i32, i32* %4, align 4
  %8 = load i32, i32* %2, align 4
  %9 = icmp slt i32 %7, %8
  br i1 %9, label %10, label %17

10:                                               ; preds = %6
  store double 7.000000e+00, double* %5, align 8
  %11 = load double, double* %5, align 8
  %12 = load double, double* %3, align 8
  %13 = fadd double %12, %11
  store double %13, double* %3, align 8
  br label %14

14:                                               ; preds = %10
  %15 = load i32, i32* %4, align 4
  %16 = add nsw i32 %15, 1
  store i32 %16, i32* %4, align 4
  br label %6

17:                                               ; preds = %6
  %18 = load double, double* %3, align 8
  ret double %18
}}
a€  
    ; ModuleID = "<string>"
    target triple = "{triple}"

    @A = global i32 undef

    define void @ctor_A()
    {{
      store i32 10, i32* @A
      ret void
    }}

    define void @dtor_A()
    {{
      store i32 20, i32* @A
      ret void
    }}

    define i32 @foo()
    {{
      %.2 = load i32, i32* @A
      %.3 = add i32 %.2, 2
      ret i32 %.3
    }}

    @llvm.global_ctors = appending global [1 x {{i32, void ()*, i8*}}] [{{i32, void ()*, i8*}} {{i32 0, void ()* @ctor_A, i8* null}}]
    @llvm.global_dtors = appending global [1 x {{i32, void ()*, i8*}}] [{{i32, void ()*, i8*}} {{i32 0, void ()* @dtor_A, i8* null}}]
    z…; ModuleID = ""
target triple = "unknown-unknown-unknown"
target datalayout = ""

define i32 @"foo"()
{
"<>!*''#":
  ret i32 12345
}
)úaddi	sp, sp, -16zsw	a1, 8(sp)zsw	a2, 12(sp)úfld	ft0, 8(sp)zfmv.w.x	ft1, a0zfcvt.d.s	ft1, ft1úfadd.d	ft0, ft1, ft0úfsd	ft0, 8(sp)úlw	a0, 8(sp)úlw	a1, 12(sp)úaddi	sp, sp, 16Úret)r   zsw	a0, 8(sp)zsw	a1, 12(sp)r   zfcvt.d.s	ft1, fa0r   r   r   r   r   r   )zfcvt.d.s	ft0, fa0zfadd.d	fa0, ft0, fa1r   zc
declare void @a_readonly_func(i8 *) readonly

declare i8* @a_arg0_return_func(i8* returned, i32*)
Á@  7f454c4602010100000000000000000001003e000100000000000000000000000000000000000000e0000000000000000000000040000000000040000500010048c1e2204809c24889d048c1c03d4831d048b90120000480001070480fafc8000000000000000000000000000000000000000000000000002f0000000400f1ff00000000000000000000000000000000070000001200020000000000000000001f00000000000000002e74657874005f5f617279626f002e6e6f74652e474e552d737461636b002e737472746162002e73796d746162003c737472696e673e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f0000000300000000000000000000000000000000000000a800000000000000380000000000000000000000000000000100000000000000000000000000000001000000010000000600000000000000000000000000000040000000000000001f000000000000000000000000000000100000000000000000000000000000000f00000001000000000000000000000000000000000000005f00000000000000000000000000000000000000000000000100000000000000000000000000000027000000020000000000000000000000000000000000000060000000000000004800000000000000010000000200000008000000000000001800000000000000Ú>48c1e2204809c24889d048c1c03d4831d048b90120000480001070480fafc8c                   @   s<   e Zd Zdd„ Zdd„ Zedfdd„Zdd	d
„Zdd„ ZdS )ÚBaseTestc                 C   sB   t  ¡  t  ¡  t  ¡  t ¡  tjd d … | _g tjd d …< d S ©N)ÚllvmÚ
initializeÚinitialize_native_targetÚinitialize_native_asmprinterÚgcÚcollectÚgarbageÚold_garbage©Úselfr   r   r   ÚsetUp…  s   zBaseTest.setUpc                 C   s   t  ¡  |  t jg ¡ | `d S r    )r%   r&   ÚassertEqualr'   r(   r)   r   r   r   ÚtearDown  s   zBaseTest.tearDownNc                 C   s    |j t ¡ d}t ||¡}|S )N)Útriple)Úformatr!   Úget_default_tripleÚparse_assembly)r*   ÚasmÚcontextÚmodr   r   r   Úmodule–  s   zBaseTest.moduleÚglobc                 C   s   |d u r|   ¡ }| |¡S r    )r5   Úget_global_variable)r*   Únamer4   r   r   r   r6   ›  s   
zBaseTest.globc                C   s   t j ¡ }|j|dS )N©Újit)r!   ÚTargetÚfrom_default_tripleÚcreate_target_machine)r*   r:   Útargetr   r   r   Útarget_machine   s   
zBaseTest.target_machine)r6   N)	Ú__name__Ú
__module__Ú__qualname__r+   r-   Úasm_sumr5   r6   r?   r   r   r   r   r   ƒ  s    	
r   c                   @   s@   e Zd ZdZe ej d¡d¡e e	j
 d¡d¡dd„ ƒƒZdS )	ÚTestDependencieszB
    Test DLL dependencies are within a certain expected set.
    ÚlinuxzLinux-specific testÚLLVMLITE_DIST_TESTzDistribution-specific testc                 C   s<  t jj}tj ¡ }d|d< tjdd|gtj|d}| 	¡ \}}|  
d|j¡ t d¡}tƒ }| ¡  ¡ D ]/}| ¡ }	|	rc|	d dkrc|	d	 }
| |
¡}t|	ƒd
ksS|s[|  d|f ¡ | | d	¡¡ q4d|vsld|vrt|  d|f ¡ tg d¢ƒ}t ¡ dkr…| d¡ |D ]}
|
 d¡s›|
|vr›|  d|
|f ¡ q‡d S )NÚCÚLANGÚobjdumpz-p)ÚstdoutÚenvr   z$^([-_a-zA-Z0-9]+)\.so(?:\.\d+){0,3}$ÚNEEDEDé   é   zinvalid NEEDED line: %rÚlibcÚ
libpthreadz#failed parsing dependencies? got %r)	ÚlibrtÚlibdlrP   ÚlibzÚlibmÚlibgcc_srO   zld-linuxÚld64ÚPyPyÚlibtinfoz	ld-linux-zunexpected dependency %r in %r)r	   ÚlibÚ_nameÚosÚenvironÚcopyÚ
subprocessÚPopenÚPIPEÚcommunicater,   Ú
returncodeÚreÚcompileÚsetÚdecodeÚ
splitlinesÚsplitÚmatchÚlenÚfailÚaddÚgroupÚplatformÚpython_implementationÚ
startswith)r*   Úlib_pathrK   ÚpÚoutÚ_Úlib_patÚdepsÚlineÚpartsÚdepÚmÚallowedr   r   r   Ú
test_linuxª  s:   
ÿ

€
€þzTestDependencies.test_linuxN)r@   rA   rB   Ú__doc__ÚunittestÚ
skipUnlessÚsysrn   rp   r[   r\   Úgetr|   r   r   r   r   rD   ¥  s    ÿÿrD   c                       s\   e Zd ZdZdZ‡ fdd„Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dd„ Z
dd„ Zdd„ Z‡  ZS )ÚTestRISCVABIz`
    Test calling convention of floating point arguments of RISC-V
    using different ABI.
    zriscv32-unknown-linuxc                    s   t ƒ  ¡  t ¡  t ¡  d S r    )Úsuperr+   r!   Úinitialize_all_targetsÚinitialize_all_asmprintersr)   ©Ú	__class__r   r   r+   Ö  s   
zTestRISCVABI.setUpc              
   C   sX   z
t j | j¡ W d S  ty+ } zdt|ƒv r|  d¡ n|‚W Y d }~d S d }~ww )Nz/No available targets are compatible with triplez(RISCV target unsupported by linked LLVM.)r!   r;   Úfrom_tripler.   ÚRuntimeErrorÚstrÚskipTest)r*   Úer   r   r   Úcheck_riscv_targetÛ  s   þ€þzTestRISCVABI.check_riscv_targetc                 K   s   t j | j¡}|jdi |¤ŽS )Nr   )r!   r;   rˆ   r.   r=   )r*   ÚkwargÚlltargetr   r   r   Úriscv_target_machineä  s   z!TestRISCVABI.riscv_target_machinec                 C   s   t  ¡ }t  ¡ }t  |||f¡}t  ¡ }t j||dd}| ¡ }t  |¡}|j\}}	| 	||¡}
| 
|
|	¡}| |¡ t t|ƒ¡}| ¡  |S )NÚfpadd©r8   )r   Ú
DoubleTypeÚ	FloatTypeÚFunctionTypeÚModuleÚFunctionÚappend_basic_blockÚ	IRBuilderÚargsÚfpextÚfaddr   r!   r1   rŠ   Úverify)r*   Úf64Úf32Úfntyr5   ÚfuncÚblockÚbuilderÚaÚbÚarg0ÚresultÚllmodr   r   r   Úfpadd_ll_moduleè  s   


zTestRISCVABI.fpadd_ll_modulec                 C   sD   g }|  ¡ D ]}| ¡ }| d¡s| d¡s|dks| |¡ q|S )NÚ.r‘   Ú )rg   Ústriprp   Úappend)r*   r2   Úasm_listrw   Ús_liner   r   r   Úbreak_up_asmù  s   ÿ
€zTestRISCVABI.break_up_asmc                 C   s8   |   ¡  |  ¡ }| jdd}|  |  | |¡¡t¡ d S )Nú+f,+d)Úfeatures)r   r©   r   r,   r°   Úemit_assemblyÚriscv_asm_ilp32©r*   r¨   r>   r   r   r   Útest_rv32d_ilp32  s   ÿzTestRISCVABI.test_rv32d_ilp32c                 C   ó:   |   ¡  |  ¡ }| jddd}|  |  | |¡¡t¡ d S )Nr±   Úilp32f©r²   Úabiname)r   r©   r   r,   r°   r³   Úriscv_asm_ilp32frµ   r   r   r   Útest_rv32d_ilp32f	  ó   ÿzTestRISCVABI.test_rv32d_ilp32fc                 C   r·   )Nr±   Úilp32dr¹   )r   r©   r   r,   r°   r³   Úriscv_asm_ilp32drµ   r   r   r   Útest_rv32d_ilp32d  r½   zTestRISCVABI.test_rv32d_ilp32d)r@   rA   rB   r}   r.   r+   r   r   r©   r°   r¶   r¼   rÀ   Ú__classcell__r   r   r†   r   r‚   Ï  s    		r‚   c                   @   s–   e Zd Z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dd„ Zdd„ Zdd„ Ze eƒ d¡dd„ ƒZdd „ Zd!S )"ÚTestMiscz7
    Test miscellaneous functions in llvm.binding.
    c                 C   s   |   t¡ d S r    )r5   rC   r)   r   r   r   Útest_parse_assembly  ó   zTestMisc.test_parse_assemblyc                 C   sZ   |   t¡}|  t¡ W d   ƒ n1 sw   Y  t|jƒ}|  d|¡ |  d|¡ d S )Nzparsing errorzinvalid operand type)ÚassertRaisesr‰   r5   Úasm_parse_errorrŠ   Ú	exceptionÚassertIn)r*   ÚcmÚsr   r   r   Útest_parse_assembly_error   s   ÿ
z"TestMisc.test_parse_assembly_errorc                 C   sj   t  ¡ }t  t  d¡g ¡}t  ||d¡}t  |jdd¡}| t  t  d¡d¡¡ t	|ƒ}|  
|t¡ d S )Né    Úfooz<>!*''#r’   i90  )r   r–   r•   ÚIntTyper—   r™   r˜   r   ÚConstantrŠ   r,   Úasm_nonalphanum_blocklabel)r*   r4   ÚftÚfnÚbdr2   r   r   r   Útest_nonalphanum_block_name'  s   z$TestMisc.test_nonalphanum_block_namec                 C   s$   t j ¡ }t j ¡ }||ksJ ‚d S r    )r!   r3   Úget_global_context)r*   Ú	gcontext1Ú	gcontext2r   r   r   Útest_global_context0  s   

zTestMisc.test_global_contextc                 C   sH   t  dd¡ t  dd¡ t  d¡}|  |d¡ t  d¡}|  |d ¡ d S )NÚ__xyzzyiÒ  i.  Ú__foobar)r!   Ú
add_symbolÚaddress_of_symbolr,   ÚassertIs)r*   Úaddrr   r   r   Útest_dylib_symbols5  s   

zTestMisc.test_dylib_symbolsc                 C   ó"   t  ¡ }|  |t¡ |  |¡ d S r    )r!   r0   ÚassertIsInstancerŠ   Ú
assertTrue)r*   r.   r   r   r   Útest_get_default_triple=  ó   z TestMisc.test_get_default_triplec                 C   sb   dd„ }t  ¡ }t  ¡ }|  |t¡ |  |¡ || d¡d ƒ}|| d¡d ƒ}|  ||¡ d S )Nc                 S   s   | dkrdS | S )NÚpowerpc64leÚppc64ler   )Úarchr   r   r   Únormalize_ppcD  s   z7TestMisc.test_get_process_triple.<locals>.normalize_ppcú-r   )r!   Úget_process_tripler0   rá   rŠ   râ   rh   r,   )r*   rè   r.   ÚdefaultÚdefault_archÚtriple_archr   r   r   Útest_get_process_tripleB  s   
z TestMisc.test_get_process_triplec                 C   sä   t  ¡ }|  |t¡ |  |t j¡ | ¡ D ]\}}|  |t¡ |  |¡ |  |t¡ q|  | 	¡ t¡ d}d 
|¡}|  t |d¡¡ |  t |d¡¡ |  t |d¡¡ t|ƒdkre|  | 	¡ d¡ d S |  t || 	¡ ¡¡ d S )Nz[+\-][a-zA-Z0-9\._-]+z^({0}|{0}(,{0})*)?$r«   z+aaz+a,-bbr   )r!   Úget_host_cpu_featuresrá   ÚdictÚ
FeatureMapÚitemsrŠ   râ   ÚboolÚflattenr/   ÚassertIsNotNonerc   ri   rj   r,   )r*   r²   ÚkÚvÚre_termÚregexr   r   r   Útest_get_host_cpu_featuresT  s    

z#TestMisc.test_get_host_cpu_featuresc                 C   rà   r    )r!   Úget_host_cpu_namerá   rŠ   râ   )r*   Úcpur   r   r   Útest_get_host_cpu_namek  rä   zTestMisc.test_get_host_cpu_namec                 C   ó   d}t  tjd|g¡ d S )Na2  if 1:
            from llvmlite import binding as llvm

            llvm.initialize()
            llvm.initialize_native_target()
            llvm.initialize_native_asmprinter()
            llvm.initialize_all_targets()
            llvm.initialize_all_asmprinters()
            llvm.shutdown()
            ú-c©r^   Ú
check_callr€   Ú
executable©r*   Úcoder   r   r   Útest_initfinip  s   
zTestMisc.test_initfinic                 C   rþ   )Nz„if 1:
            from llvmlite import binding as llvm

            llvm.set_option("progname", "-debug-pass=Disabled")
            rÿ   r   r  r   r   r   Útest_set_option}  s   zTestMisc.test_set_optionc                 C   s6   t j\}}}g d¢}|  |f|¡ |  |tdƒ¡ d S )N))é   )é   )é   )é   é
   )r!   Úllvm_version_inforÈ   Úrange)r*   ÚmajorÚminorÚpatchÚvalidr   r   r   Útest_version‡  s   zTestMisc.test_versionc                 C   s   t  ¡  d S r    )r!   Úcheck_jit_executionr)   r   r   r   Útest_check_jit_executionŽ  s   z!TestMisc.test_check_jit_executionzLocale not availablec                 C   s8   |   t¡}t|ƒ}t tjd¡ t|ƒ}|  ||¡ d S )Nr   )r5   Úasm_double_localerŠ   r   r   r   r,   )r*   rz   ÚexpectÚgotr   r   r   Útest_print_double_locale‘  s
   
z!TestMisc.test_print_double_localec                 C   s$   d}d}t j|d|g}t |¡ d S )Nzfrom llvmlite import bindingz-Werrorrÿ   )r€   r  r^   r  )r*   r  ÚflagsÚcmdargsr   r   r   Útest_no_accidental_warnings  s   z$TestMisc.test_no_accidental_warningsN)r@   rA   rB   r}   rÃ   rË   rÔ   rØ   rß   rã   rî   rú   rý   r  r  r  r  r~   ÚskipIfr   r  r  r   r   r   r   rÂ     s$    	

rÂ   c                   @   ó´   e Z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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d+S ),ÚTestModuleRefc                 C   s*   |   ¡ }t|ƒ ¡ }|  | d¡|¡ d S )Nz; ModuleID =)r5   rŠ   r¬   râ   rp   ©r*   r4   rÊ   r   r   r   Útest_str¦  s   zTestModuleRef.test_strc                 C   sX   |   ¡ }t|ƒ | ¡  |  tj¡ t|ƒ W d   ƒ n1 s!w   Y  | ¡  d S r    )r5   rŠ   ÚcloserÅ   ÚctypesÚArgumentError©r*   r4   r   r   r   Ú
test_close«  s   
ÿzTestModuleRef.test_closec              	   C   sÔ   |   ¡ }t|ƒ | t|ƒ W d   ƒ n1 sw   Y  |  tj¡ t|ƒ W d   ƒ n1 s3w   Y  |  t¡# | W d   ƒ n1 sKw   Y  W d   ƒ d S W d   ƒ d S 1 scw   Y  d S r    )r5   rŠ   rÅ   r"  r#  r‰   r$  r   r   r   Ú	test_with³  s   
ÿ
ÿÿÿ"ÿzTestModuleRef.test_withc                 C   s4   |   ¡ }d|_|  |jd¡ d|_|  |jd¡ d S )NrÍ   Úbar)r5   r8   r,   r$  r   r   r   Ú	test_name¾  s
   zTestModuleRef.test_namec                 C   s   |   ¡ }|  |jd¡ d S )Nz	asm_sum.c)r5   r,   Úsource_filer$  r   r   r   Útest_source_fileÅ  s   zTestModuleRef.test_source_filec                 C   s2   |   ¡ }|j}|  |t¡ ||_|  ||j¡ d S r    )r5   Údata_layoutrá   rŠ   r,   r  r   r   r   Útest_data_layoutÉ  s
   zTestModuleRef.test_data_layoutc                 C   s6   |   ¡ }|j}|  |t ¡ ¡ d|_|  |jd¡ d S )Nr«   )r5   r.   r,   r!   r0   r  r   r   r   Útest_tripleÐ  s
   zTestModuleRef.test_triplec                 C   sn   |   ¡ }|  | ¡ d ¡ |   t¡}|  t¡}| ¡  W d   ƒ n1 s%w   Y  t|jƒ}|  d|¡ d S )Nz%.bug = add i32 1, %.bug)	r5   rÝ   r   Úasm_verification_failrÅ   r‰   rŠ   rÇ   rÈ   )r*   r4   rÉ   rÊ   r   r   r   Útest_verify×  s   

ÿ
zTestModuleRef.test_verifyc                 C   ór   |   ¡ }| d¡}|  |tj¡ |  |jd¡ |  t¡ | d¡ W d   ƒ n1 s,w   Y  ~t	|j ƒ d S )NÚsumrÍ   )
r5   Úget_functionrá   r!   ÚValueRefr,   r8   rÅ   Ú	NameErrorrŠ   ©r*   r4   rÒ   r   r   r   Útest_get_functionâ  ó   
ÿzTestModuleRef.test_get_functionc                 C   sp   |   ¡ }| d¡}|  |jd¡ |  t dt|ƒ¡¡ |  t	¡ | d¡ W d   ƒ d S 1 s1w   Y  d S )Nzstruct.glob_typeú8%struct\.glob_type(\.[\d]+)? = type { i64, \[2 x i64\] }zstruct.doesnt_exist)
r5   Úget_struct_typer,   r8   rõ   rc   ri   rŠ   rÅ   r4  )r*   r4   Úst_tyr   r   r   Útest_get_struct_typeï  s   
þ"ÿz"TestModuleRef.test_get_struct_typec                 C   r0  )Nr6   r'  )
r5   r7   rá   r!   r3  r,   r8   rÅ   r4  rŠ   )r*   r4   Úgvr   r   r   Útest_get_global_variableû  r7  z&TestModuleRef.test_get_global_variablec                 C   sN   |   ¡ }|j}~t|dd„ d}|  t|ƒd¡ |  dd„ |D ƒg d¢¡ d S )Nc                 S   s   | j S r    r’   )Úvaluer   r   r   Ú<lambda>  s    z5TestModuleRef.test_global_variables.<locals>.<lambda>)Úkeyé   c                 S   s   g | ]}|j ‘qS r   r’   )Ú.0Úgr   r   r   Ú
<listcomp>  s    z7TestModuleRef.test_global_variables.<locals>.<listcomp>)r6   Úglob_bÚglob_fÚglob_struct)r5   Úglobal_variablesÚsortedr,   rj   )r*   r4   ÚitÚglobsr   r   r   Útest_global_variables  s   ÿz#TestModuleRef.test_global_variablesc                 C   s>   |   ¡ }|j}~t|ƒ}|  t|ƒd¡ |  |d jd¡ d S ©NrM   r   r1  )r5   Ú	functionsÚlistr,   rj   r8   )r*   r4   rJ  Úfuncsr   r   r   Útest_functions  s   zTestModuleRef.test_functionsc                 C   s^   |   ¡ }|j}~t|ƒ}|  t|ƒd¡ |  t d|d j¡¡ |  t dt	|d ƒ¡¡ d S )NrM   ústruct\.glob_type(\.[\d]+)?r   r8  )
r5   Ústruct_typesrO  r,   rj   rõ   rc   ri   r8   rŠ   )r*   r4   rJ  Ústructsr   r   r   Útest_structs  s   
ÿ

þzTestModuleRef.test_structsc                 C   sŠ   |   ¡ }|   t¡}| |¡ |  tdd„ |jD ƒƒddg¡ | d¡ | ¡  |  t	j
¡ | d¡ W d   ƒ d S 1 s>w   Y  d S )Nc                 s   ó    | ]}|j V  qd S r    r’   ©rB  Úfr   r   r   Ú	<genexpr>*  ó   € z-TestModuleRef.test_link_in.<locals>.<genexpr>Úmulr1  )r5   Úasm_mulÚlink_inr,   rI  rN  r2  r!  rÅ   r"  r#  )r*   ÚdestÚsrcr   r   r   Útest_link_in%  s   

ÿ
"ÿzTestModuleRef.test_link_inc                 C   st   |   ¡ }|   t¡}|j|dd |  tdd„ |jD ƒƒddg¡ | ¡  |  tdd„ |jD ƒƒdg¡ | d¡ d S )NT)Úpreservec                 s   rV  r    r’   rW  r   r   r   rY  5  rZ  z6TestModuleRef.test_link_in_preserve.<locals>.<genexpr>r[  r1  c                 s   rV  r    r’   rW  r   r   r   rY  7  rZ  )r5   r\  r]  r,   rI  rN  r!  r2  )r*   r^  Úsrc2r   r   r   Útest_link_in_preserve0  s   
ÿz#TestModuleRef.test_link_in_preservec                 C   s\   |   ¡ }|   t¡}|  t¡}| |¡ W d   ƒ n1 sw   Y  |  dt|jƒ¡ d S )Nzsymbol multiply defined)r5   Úasm_sum2rÅ   r‰   r]  rÈ   rŠ   rÇ   )r*   r^  r_  rÉ   r   r   r   Útest_link_in_error:  s   
ÿz TestModuleRef.test_link_in_errorc                 C   s6   |   ¡ }| ¡ }d}d}|  | |¡p| |¡¡ d S )Ns   ÞÀs   BC)r5   Ú
as_bitcoderâ   rp   )r*   r4   ÚbcÚbitcode_wrapper_magicÚbitcode_magicr   r   r   Útest_as_bitcodeC  s   ÿzTestModuleRef.test_as_bitcodec                 C   s€   |   t¡}t d¡ W d   ƒ n1 sw   Y  |  dt|jƒ¡ tjd dk r5|  dt|jƒ¡ d S |  dt|jƒ¡ d S )Nó    zLLVM bitcode parsing errorr   é	   zInvalid bitcode signaturez(file too small to contain bitcode header)rÅ   r‰   r!   Úparse_bitcoderÈ   rŠ   rÇ   r  )r*   rÉ   r   r   r   Útest_parse_bitcode_errorM  s   ÿ
ÿz&TestModuleRef.test_parse_bitcode_errorc                 C   sT   t  ¡ }| j|d ¡ }t  ¡ }t  ||¡}|  | ¡ |¡ | d¡ | d¡ d S )N)r3   r1  r6   )r!   Úcreate_contextr5   rf  rm  r,   r2  r7   )r*   Úcontext1rg  Úcontext2r4   r   r   r   Útest_bitcode_roundtripY  s   
z$TestModuleRef.test_bitcode_roundtripc                 C   s4   |   ¡ }| ¡ }|  ||¡ |  | ¡ | ¡ ¡ d S r    )r5   ÚcloneÚassertIsNotr,   rf  )r*   rz   Úclonedr   r   r   Útest_cloningd  s   zTestModuleRef.test_cloningN)r@   rA   rB   r   r%  r&  r(  r*  r,  r-  r/  r6  r;  r=  rL  rQ  rU  r`  rc  re  rj  rn  rr  rv  r   r   r   r   r  ¤  s,    	
	
r  c                   @   s‚   e 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dd„ Zdd„ Zdd„ ZdS )!ÚJITTestMixinz*
    Mixin for ExecutionEngine tests.
    r1  c                 C   s,   |  ¡  | |¡}|  |¡ ttttƒ|ƒS r    )Úfinalize_objectÚget_function_addressrâ   r   r   )r*   ÚeeÚ	func_nameÚcfptrr   r   r   Úget_sump  s   

zJITTestMixin.get_sumc                 C   sX   |   ¡ }|  |¡}|  |¡}|ddƒ}|  d|¡ W d   ƒ d S 1 s%w   Y  d S )NrN   éûÿÿÿéýÿÿÿ)r5   r:   r}  r,   )r*   r4   rz  ÚcfuncÚresr   r   r   Útest_run_codev  s   

"ýzJITTestMixin.test_run_codec                 C   sX   |   |  ¡ ¡}| ¡  | ¡  |  tj¡ | ¡  W d   ƒ d S 1 s%w   Y  d S r    )r:   r5   r!  rÅ   r"  r#  rx  ©r*   rz  r   r   r   r%  }  s   
"ÿzJITTestMixin.test_closec              	   C   sº   |   |  ¡ ¡}| W d   ƒ n1 sw   Y  |  t¡ | W d   ƒ n1 s,w   Y  W d   ƒ n1 s;w   Y  |  tj¡ | ¡  W d   ƒ d S 1 sVw   Y  d S r    )r:   r5   rÅ   r‰   r"  r#  rx  rƒ  r   r   r   r&  „  s   ÿÿ€ÿ
"ÿzJITTestMixin.test_withc                 C   s&   |   ¡ }|  |¡}| ¡  | ¡  d S r    ©r5   r:   r!  ©r*   r4   rz  r   r   r   Útest_module_lifetimeŽ  ó   
z!JITTestMixin.test_module_lifetimec                 C   s&   |   ¡ }|  |¡}| ¡  | ¡  d S r    r„  r…  r   r   r   Útest_module_lifetime2”  r‡  z"JITTestMixin.test_module_lifetime2c                 C   sz   |   |  ¡ ¡}|  t¡}| |¡ |  t¡ | |¡ W d   ƒ n1 s&w   Y  |  |j¡ | ¡  |  	|j¡ d S r    )
r:   r5   r\  Ú
add_modulerÅ   ÚKeyErrorÚassertFalseÚclosedr!  râ   ©r*   rz  r4   r   r   r   Útest_add_moduleš  s   

ÿzJITTestMixin.test_add_modulec                 C   s6   |   |  ¡ ¡}|  t¡}| |¡ | ¡  | ¡  d S r    ©r:   r5   r\  r‰  r!  r  r   r   r   Útest_add_module_lifetime¤  ó
   

z%JITTestMixin.test_add_module_lifetimec                 C   s6   |   |  ¡ ¡}|  t¡}| |¡ | ¡  | ¡  d S r    r  r  r   r   r   Útest_add_module_lifetime2«  r‘  z&JITTestMixin.test_add_module_lifetime2c                 C   s„   |   |  ¡ ¡}|  t¡}| |¡ | |¡ |  t¡ | |¡ W d   ƒ n1 s+w   Y  |  |j¡ | 	¡  |  |j¡ d S r    )
r:   r5   r\  r‰  Úremove_modulerÅ   rŠ  r‹  rŒ  r!  r  r   r   r   Útest_remove_module²  s   


ÿzJITTestMixin.test_remove_modulec                 C   s>   |   ¡ }|  |¡}|j}|  |j|¡ t|ƒ ~~t|ƒ d S r    )r5   r:   Útarget_datarÝ   rŠ   )r*   r4   rz  Útdr   r   r   Útest_target_data½  s   
zJITTestMixin.test_target_datac           	      C   sè   |   ¡ }|  |¡}|j}| d¡}| d¡}| d¡}tjdk r"dnd}|||fD ]}|  | |j¡|¡ q)|  | 	|j¡d¡ |  | 
|j¡d¡ |  | 	|j¡d¡ |  | 
|j¡d¡ |  | 	|j¡d	¡ |  | 
|j¡d
¡ d S )Nr6   rE  rG  ì        rA  é   rM   )rM   rN   rA  é   )rA  r™  )r5   r:   r•  r7   r€   Úmaxsizer,   Úget_abi_sizeÚtypeÚget_pointee_abi_sizeÚget_pointee_abi_alignmentrÈ   )	r*   r4   rz  r–  Úgv_i32Úgv_i8Ú	gv_structÚpointer_sizerC  r   r   r   Útest_target_data_abi_enquiriesÇ  s   



z+JITTestMixin.test_target_data_abi_enquiriesc                    sð   g ‰ ‡ fdd„}|   ¡ }|  |¡}| |¡ |  tˆ ƒd¡ |  |¡}|ddƒ |  tˆ ƒd¡ |  ˆ d d |¡ |  ˆ d d t¡ g ˆ d d …< |   t	¡}| 
|¡ |  |d¡}|  tˆ ƒd¡ |  ˆ d d |¡ |  ˆ d d t¡ d S )Nc                    ó   ˆ   | |f¡ d S r    ©r­   ©r4   Úbuf©Únotifiesr   r   Únotifyß  ó   z5JITTestMixin.test_object_cache_notify.<locals>.notifyr   rN   r~  rM   r[  )r5   r:   Úset_object_cacher,   rj   r}  rÝ   rá   Úbytesr\  r‰  )r*   r«  r4   rz  r€  Úmod2r   r©  r   Útest_object_cache_notifyÜ  s$   





z%JITTestMixin.test_object_cache_notifyc                    sJ  g ‰g ‰ ‡fdd„}‡ fdd„}|   ¡ }|  |¡}| ||¡ |  tˆƒd¡ |  tˆ ƒd¡ |  |¡}|  tˆƒd¡ |  tˆ ƒd¡ |  ˆ d |¡ ˆd d ‰‡ ‡fdd„}g ˆd d …< g ˆ d d …< |   t¡}|  |¡}| ||¡ |  tˆƒd¡ |  tˆ ƒd¡ |  |¡}|  |d	d
ƒd¡ |  tˆƒd¡ |  tˆ ƒd¡ d S )Nc                    r¥  r    r¦  r§  r©  r   r   r«  û  r¬  z8JITTestMixin.test_object_cache_getbuffer.<locals>.notifyc                    s   ˆ   | ¡ d S r    r¦  ©r4   )Ú
getbuffersr   r   Ú	getbufferþ  rÄ   z;JITTestMixin.test_object_cache_getbuffer.<locals>.getbufferr   rM   c                    s   ˆ   | ¡ ˆS r    r¦  r±  )r²  Ú
sum_bufferr   r   Úgetbuffer_successful  s   
zFJITTestMixin.test_object_cache_getbuffer.<locals>.getbuffer_successfulrN   r~  r  )r5   r:   r­  r,   rj   r}  rÝ   r\  )r*   r«  r³  r4   rz  r€  rµ  r   )r²  rª  r´  r   Útest_object_cache_getbuffer÷  s4   




z(JITTestMixin.test_object_cache_getbufferN)r1  )r@   rA   rB   r}   r}  r‚  r%  r&  r†  rˆ  rŽ  r  r’  r”  r—  r¤  r°  r¶  r   r   r   r   rw  k  s     



rw  c                   @   ó   e Zd Zdd„ Zdd„ ZdS )ÚJITWithTMTestMixinc                 C   sf   | j dd}|  ¡ }|  ||¡}| |¡}|  d|¡ | d¡ | |¡}|  d|¡ |  ||¡ dS )z%Test TargetMachineRef.emit_assembly()Tr9   r1  N)r?   r5   r:   r³   rÈ   Úset_asm_verbosityÚassertNotEqual)r*   r?   r4   rz  Úraw_asmÚraw_asm_verboser   r   r   Útest_emit_assembly&  s   


z%JITWithTMTestMixin.test_emit_assemblyc                 C   s^   | j dd}|  ¡ }|  ||¡}| |¡}|  |t¡ tj d¡r-|  	d|dd… ¡ dS dS )z#Test TargetMachineRef.emit_object()Tr9   rE   s   ELFNr  )
r?   r5   r:   Úemit_objectrá   r®  r€   rn   rp   rÈ   )r*   r?   r4   rz  Úcode_objectr   r   r   Útest_emit_object2  s   
þz#JITWithTMTestMixin.test_emit_objectN)r@   rA   rB   r½  rÀ  r   r   r   r   r¸  $  s    r¸  c                   @   s   e Zd ZdZddd„ZdS )Ú	TestMCJitz@
    Test JIT engines created with create_mcjit_compiler().
    Nc                 C   s    |d u r
| j dd}t ||¡S )NTr9   )r?   r!   Úcreate_mcjit_compiler)r*   r4   r?   r   r   r   r:   C  s   zTestMCJit.jitr    )r@   rA   rB   r}   r:   r   r   r   r   rÁ  >  s    rÁ  c                   @   r  ),ÚTestValueRefc                 C   s&   |   ¡ }| d¡}|  t|ƒd¡ d S )Nr6   z@glob = global i32 0)r5   r7   r,   rŠ   ©r*   r4   r6   r   r   r   r   K  s   
zTestValueRef.test_strc                 C   s8   |   ¡ }| d¡}|  |jd¡ d|_|  |jd¡ d S )Nr6   Úfoobar)r5   r7   r,   r8   rÄ  r   r   r   r(  P  s
   
zTestValueRef.test_namec                 C   óp   |   ¡ }| d¡}|j}|  |jtj¡ ||_|  |j|¡ dD ]}||_|  |jtj¡ |  |jj|¡ q d S )Nr6   )ÚinternalÚexternal)r5   r7   Úlinkagerá   r!   ÚLinkager,   r8   )r*   r4   r6   rÉ  r   r   r   Útest_linkageW  ó   
ýzTestValueRef.test_linkagec                 C   rÆ  )Nr6   )ÚhiddenÚ	protectedrë   )r5   r7   Ú
visibilityrá   r!   Ú
Visibilityr,   r8   )r*   r4   r6   rÏ  r   r   r   Útest_visibilityc  rÌ  zTestValueRef.test_visibilityc                 C   rÆ  )Nr6   )Ú	dllimportÚ	dllexportrë   )r5   r7   Ústorage_classrá   r!   ÚStorageClassr,   r8   )r*   r4   r6   rÔ  r   r   r   Útest_storage_classo  rÌ  zTestValueRef.test_storage_classc                 C   sf   |   ¡ }| d¡}| d¡ |  t¡}| d¡ W d   ƒ n1 s#w   Y  |  t|jƒd¡ d S )Nr1  Ú	nocaptureÚzextzno such attribute 'zext')r5   r2  Úadd_function_attributerÅ   Ú
ValueErrorr,   rŠ   rÇ   )r*   r4   rÒ   Úraisesr   r   r   Útest_add_function_attribute{  s   

ÿz(TestValueRef.test_add_function_attributec                 C   s$   |   ¡ }| d¡}|  |j |¡ d S ©Nr6   )r5   r7   rÝ   rÄ  r   r   r   Útest_moduleƒ  s   
zTestValueRef.test_modulec                 C   s*   |   ¡ }| d¡}|j}|  |tj¡ d S rÝ  )r5   r7   r  rá   r!   ÚTypeRef©r*   r4   r6   Útpr   r   r   Ú	test_typeˆ  s   
zTestValueRef.test_typec                 C   sL   |   ¡ }| d¡}|j}|  |jd¡ | d¡}|  t d|jjj¡¡ d S )Nr6   r«   rG  rR  )	r5   r7   r  r,   r8   rõ   rc   ri   Úelement_type)r*   r4   r6   rá  Ústr   r   r   Útest_type_nameŽ  s   



ÿzTestValueRef.test_type_namec                 C   s,   |   ¡ }| d¡}|j}|  t|ƒd¡ d S )Nr6   zi32*)r5   r7   r  r,   rŠ   rà  r   r   r   Útest_type_printing_variable—  s   
z(TestValueRef.test_type_printing_variablec                 C   s(   |   ¡ }| d¡}|  t|jƒd¡ d S )Nr1  zi32 (i32, i32)*)r5   r2  r,   rŠ   r  r5  r   r   r   Útest_type_printing_function  s   
z(TestValueRef.test_type_printing_functionc                 C   sV   |   ¡ }| d¡}|  |jj¡ |  t dt|jƒ¡¡ |  t dt|jj	ƒ¡¡ d S )NrG  z%struct\.glob_type(\.[\d]+)?\*r8  )
r5   r7   râ   r  Ú
is_pointerrõ   rc   ri   rŠ   rã  )r*   r4   rä  r   r   r   Útest_type_printing_struct¢  s   

ÿ

þz&TestValueRef.test_type_printing_structc                 C   ó   |   ¡ }| ¡  | ¡  d S r    )r6   r!  )r*   r6   r   r   r   r%  ¬  ó   zTestValueRef.test_closec                 C   s:   |   ¡  d¡}|   t¡ d¡}|  |j¡ |  |j¡ d S )Nr1  )r5   r2  Úasm_sum_declarer‹  Úis_declarationrâ   )r*   ÚdefinedÚdeclaredr   r   r   Útest_is_declaration±  s   z TestValueRef.test_is_declarationc                 C   s>   |   t¡}t|jƒ}|  t|ƒd¡ |D ]}|  |j¡ qd S ©NrA  )r5   rC   rO  rH  r,   rj   râ   Ú	is_global)r*   r4   Úgvarsr÷   r   r   r   Útest_module_global_variables·  s   

ÿz)TestValueRef.test_module_global_variablesc                 C   sÚ   |   ¡ }t|jƒ}|  t|ƒd¡ |d }|  |j¡ |  |jd¡ |  t	¡ |j
 W d   ƒ n1 s5w   Y  |  t	¡ |j W d   ƒ n1 sMw   Y  |  t	¡ |j W d   ƒ d S 1 sfw   Y  d S rM  )r5   rO  rN  r,   rj   râ   Úis_functionr8   rÅ   rÚ  ÚinstructionsÚoperandsÚopcode)r*   r4   rP  r¡   r   r   r   Útest_module_functions¾  s   
ÿÿ"ÿz"TestValueRef.test_module_functionsc                 C   s  |   ¡ }| d¡}|  |j¡ t|jƒ}|  t|ƒd¡ |  |d j¡ |  |d j¡ |  |d j	d¡ |  t
|d jƒd¡ |  |d j	d¡ |  t
|d jƒd¡ |  t¡ |d j W d   ƒ n1 siw   Y  |  t¡ |d j W d   ƒ d S 1 s„w   Y  d S )Nr1  rN   r   rM   ú.1Úi32ú.2)r5   r2  râ   rõ  rO  Ú	argumentsr,   rj   Úis_argumentr8   rŠ   r  rÅ   rÚ  Úblocks)r*   r4   r¡   rš   r   r   r   Útest_function_argumentsÍ  s"   

ÿ"ÿz$TestValueRef.test_function_argumentsc                 C   s@   |   ¡  d¡}t|jƒ}|  t|ƒd¡ |d }|  |j¡ d S )Nr1  rM   r   )r5   r2  rO  rÿ  r,   rj   râ   Úis_block)r*   r¡   rÿ  r¢   r   r   r   Útest_function_blocksß  s
   
z!TestValueRef.test_function_blocksc                 C   sœ   |   ¡  d¡}tt|jƒd jƒ}|  t|ƒd¡ |  |d j¡ |  |d j¡ |  |d j¡ |  |d j	d¡ |  |d j	d¡ |  |d j	d¡ d S )Nr1  r   é   rM   rN   rl   r   )
r5   r2  rO  rÿ  rö  r,   rj   râ   Úis_instructionrø  )r*   r¡   Úinstsr   r   r   Útest_block_instructionsæ  s   z$TestValueRef.test_block_instructionsc                 C   sÂ   |   ¡  d¡}tt|jƒd jƒd }|  |jd¡ t|jƒ}|  t|ƒd¡ |  	|d j
¡ |  	|d j
¡ |  |d jd¡ |  t|d jƒd¡ |  |d jd¡ |  t|d jƒd¡ d S )	Nr1  r   rl   rN   rM   rú  rû  rü  )r5   r2  rO  rÿ  rö  r,   rø  r÷  rj   râ   Ú
is_operandr8   rŠ   r  )r*   r¡   rl   r÷  r   r   r   Útest_instruction_operandsñ  s   
z&TestValueRef.test_instruction_operandsc                 C   sŒ   |   t¡}|jD ];}t|jƒ}|jdkr|  |dg¡ q|jdkrC|  |g ¡ t|jƒ}|  t|d jƒdg¡ |  t|d jƒg ¡ qd S )NÚa_readonly_funcs   readonlyÚa_arg0_return_funcr   s   returnedrM   )r5   Úasm_attributesrN  rO  Ú
attributesr8   r,   rý  )r*   r4   r¡   Úattrsrš   r   r   r   Útest_function_attributesþ  s   





€øz%TestValueRef.test_function_attributesN)r@   rA   rB   r   r(  rË  rÑ  rÖ  rÜ  rÞ  râ  rå  ræ  rç  ré  r%  rð  rô  rù  r   r  r  r  r  r   r   r   r   rÃ  I  s,    	
rÃ  c                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )Ú
TestTargetc                 C   sv   t jj}|  t¡}|dƒ W d   ƒ n1 sw   Y  |  dt|jƒ¡ t  ¡ }||ƒ}|  	|j
|¡ | ¡  d S )NrÅ  z(No available targets are compatible with)r!   r;   rˆ   rÅ   r‰   rÈ   rŠ   rÇ   r0   r,   r.   r!  )r*   rX  rÉ   r.   r>   r   r   r   Útest_from_triple  s   
ÿÿzTestTarget.test_from_triplec                 C   s@   t j t  ¡ ¡}| ddddd¡ t  ¡ }| |dddd¡ d S )Nr«   rM   rë   )r!   r;   rˆ   r0   r=   rû   )r*   r>   rü   r   r   r   Útest_create_target_machine  s   z%TestTarget.test_create_target_machinec                 C   ó<   t j t  ¡ ¡}t j ¡ }|  |jt¡ |  |j|j¡ d S r    )	r!   r;   rˆ   r0   r<   rá   r8   rŠ   r,   ©r*   ÚtÚur   r   r   r(     ó   
zTestTarget.test_namec                 C   r  r    )	r!   r;   rˆ   r0   r<   rá   ÚdescriptionrŠ   r,   r  r   r   r   Útest_description&  r  zTestTarget.test_descriptionc                 C   s8   t j t  ¡ ¡}t|ƒ}|  |j|¡ |  |j|¡ d S r    )r!   r;   rˆ   r0   rŠ   rÈ   r8   r  )r*   r>   rÊ   r   r   r   r   ,  s   zTestTarget.test_strN)r@   rA   rB   r  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d„ Zd	S )
ÚTestTargetDatac                 C   s
   t  d¡S )Nz%e-m:e-i64:64-f80:128-n8:16:32:64-S128)r!   Úcreate_target_datar)   r   r   r   r•  5  s   
zTestTargetData.target_datac                 C   s(   |   ¡ }|  ¡ }|  | |j¡d¡ d S )Nr™  )r•  r6   r,   rœ  r  ©r*   r–  r6   r   r   r   Útest_get_abi_size8  s   z TestTargetData.test_get_abi_sizec                 C   sF   |   ¡ }|  ¡ }|  | |j¡d¡ |  d¡}|  | |j¡d¡ d S )NrA  rG  rš  )r•  r6   r,   rž  r  r  r   r   r   Útest_get_pointee_abi_size=  s
   
z(TestTargetData.test_get_pointee_abi_sizec                 C   s~   |   ¡ }|  d¡}|  t¡ | |jd¡ W d   ƒ n1 s w   Y  |jj}|  | |d¡d¡ |  | |d¡d¡ d S )NrG  r   rM   r™  )r•  r6   rÅ   rÚ  Úget_element_offsetr  rã  r,   )r*   r–  r6   Ústruct_typer   r   r   Útest_get_struct_element_offsetF  s   
ÿz-TestTargetData.test_get_struct_element_offsetN)r@   rA   rB   r•  r  r  r   r   r   r   r   r  3  s
    	r  c                   @   r·  )ÚTestTargetMachinec                 C   s"   | j dd}t ¡ }| |¡ d S )NFr9   )r?   r!   Úcreate_module_pass_managerÚadd_analysis_passes)r*   ÚtmÚpmr   r   r   Útest_add_analysis_passesT  s   z*TestTargetMachine.test_add_analysis_passesc                 C   sN   | j dd}|j}|  ¡ }| d¡}tjdk rdnd}|  | |j¡|¡ d S )NFr9   r6   r˜  rA  r™  )	r?   r•  r5   r7   r€   r›  r,   rœ  r  )r*   r$  r–  r4   r   r£  r   r   r   Útest_target_data_from_tmY  s   
z*TestTargetMachine.test_target_data_from_tmN)r@   rA   rB   r&  r'  r   r   r   r   r!  R  s    r!  c                   @   sd   e Z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dd„ ZdS )ÚTestPassManagerBuilderc                 C   ó   t  ¡ S r    )r!   ÚPassManagerBuilderr)   r   r   r   Úpmbe  ó   zTestPassManagerBuilder.pmbc                 C   s   t  ¡ }d|_d|_d S )NrN   r  )r!   Úcreate_pass_manager_builderÚinlining_thresholdÚ	opt_level©r*   r+  r   r   r   Útest_old_apih  s   
z#TestPassManagerBuilder.test_old_apic                 C   rê  r    )r+  r!  r0  r   r   r   r%  n  rë  z!TestPassManagerBuilder.test_closec                 C   ó<   |   ¡ }|  |jt¡ tdƒD ]}||_|  |j|¡ qd S rñ  )r+  rá   r/  Úintr  r,   ©r*   r+  Úir   r   r   Útest_opt_levels  ó   þz%TestPassManagerBuilder.test_opt_levelc                 C   r2  rñ  )r+  rá   Ú
size_levelr3  r  r,   r4  r   r   r   Útest_size_levelz  r7  z&TestPassManagerBuilder.test_size_levelc                 C   sL   |   ¡ }|  t¡ |j W d   ƒ n1 sw   Y  dD ]}||_qd S )N)é   éP   i^  )r+  rÅ   ÚNotImplementedErrorr.  r4  r   r   r   Útest_inlining_threshold  s   ÿÿz.TestPassManagerBuilder.test_inlining_thresholdc                 C   ó8   |   ¡ }|  |jt¡ dD ]}||_|  |j|¡ qd S ©N)TF)r+  rá   Údisable_unroll_loopsró   r,   ©r*   r+  r¥   r   r   r   Útest_disable_unroll_loopsˆ  ó   þz0TestPassManagerBuilder.test_disable_unroll_loopsc                 C   r>  r?  )r+  rá   Úloop_vectorizeró   r,   rA  r   r   r   Útest_loop_vectorize  rC  z*TestPassManagerBuilder.test_loop_vectorizec                 C   r>  r?  )r+  rá   Úslp_vectorizeró   r,   rA  r   r   r   Útest_slp_vectorize–  rC  z)TestPassManagerBuilder.test_slp_vectorizec                 C   s.   |   ¡ }t ¡ }| |¡ | ¡  | ¡  d S r    )r+  r!   r"  Úpopulater!  )r*   r+  r%  r   r   r   Ú!test_populate_module_pass_manager  s
   
z8TestPassManagerBuilder.test_populate_module_pass_managerc                 C   s8   |   ¡ }|  ¡ }t |¡}| |¡ | ¡  | ¡  d S r    )r5   r+  r!   Úcreate_function_pass_managerrH  r!  )r*   r4   r+  r%  r   r   r   Ú#test_populate_function_pass_manager¤  s   

z:TestPassManagerBuilder.test_populate_function_pass_managerN)r@   rA   rB   r+  r1  r%  r6  r9  r=  rB  rE  rG  rI  rK  r   r   r   r   r(  c  s    r(  c                   @   r·  )ÚPassManagerTestMixinc                 C   s   t  ¡ }d|_d|_|S )NrN   i,  )r!   r-  r/  r.  r0  r   r   r   r+  ¯  s   zPassManagerTestMixin.pmbc                 C   rê  r    )r%  r!  ©r*   r%  r   r   r   r%  µ  rë  zPassManagerTestMixin.test_closeN)r@   rA   rB   r+  r%  r   r   r   r   rL  ­  s    rL  c                   @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )ÚTestModulePassManagerc                 C   r)  r    ©r!   r"  r)   r   r   r   r%  ½  r,  zTestModulePassManager.pmc                 C   sº   |   ¡ }|  ¡  |¡ |  ¡ }t|ƒ}| |¡ t|ƒ}| ¡ }t|ƒD ]4\}}| ¡  	d¡rXddh}|D ]}	|	|v r= nq5t
dƒ‚||	hA  ¡ }
|  d|¡ |  |
|¡  d S q$t
dƒ‚)Nzret i32z%.3ú%.4zexpected tokens not foundzexpected IR not found)r%  r+  rH  r5   rŠ   Úrunrg   Ú	enumerater¬   rp   r‰   ÚpoprÈ   ÚassertNotIn)r*   r%  r4   Úorig_asmÚopt_asmÚopt_asm_splitÚidxÚlÚtoksr  Ú
othertokenr   r   r   Útest_runÀ  s*   
ÿõzTestModulePassManager.test_runc                 C   s^   |   ¡ }| d¡ |  ¡  |¡ |  t¡}| |¡\}}|  |¡ |  d|¡ |  d|¡ d S )NéF   ÚPassedÚinlineme©	r%  Úadd_function_inlining_passr+  rH  r5   Úasm_inlineasm2Úrun_with_remarksrâ   rÈ   ©r*   r%  r4   ÚstatusÚremarksr   r   r   Ú'test_run_with_remarks_successful_inlineÞ  s   


z=TestModulePassManager.test_run_with_remarks_successful_inlinec                 C   sj   |   ¡ }| d¡ |  ¡  |¡ |  t¡}| |¡\}}|  |¡ |  d|¡ |  d|¡ |  d|¡ d S )Nr   ÚMissedr_  znoinline function attribute)	r%  ra  r+  rH  r5   Úasm_inlineasm3rc  râ   rÈ   rd  r   r   r   Ú#test_run_with_remarks_failed_inlineé  s   


z9TestModulePassManager.test_run_with_remarks_failed_inlinec                 C   sV   |   ¡ }| d¡ |  ¡  |¡ |  t¡}|j|dd\}}|  |¡ |  d|¡ d S )Nr]  Únothing©Úremarks_filterr«   )	r%  ra  r+  rH  r5   rb  rc  râ   r,   rd  r   r   r   Ú'test_run_with_remarks_inline_filter_outö  s   


z=TestModulePassManager.test_run_with_remarks_inline_filter_outc                 C   sb   |   ¡ }| d¡ |  ¡  |¡ |  t¡}|j|dd\}}|  |¡ |  d|¡ |  d|¡ d S )Nr]  zinlin.*rl  r^  r_  r`  rd  r   r   r   Ú&test_run_with_remarks_inline_filter_inÿ  s   


z<TestModulePassManager.test_run_with_remarks_inline_filter_inN)	r@   rA   rB   r%  r\  rg  rj  rn  ro  r   r   r   r   rN  »  s    	rN  c                   @   s>   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ ZdS )ÚTestFunctionPassManagerNc                 C   s   |p|   ¡ }t |¡S r    )r5   r!   rJ  r$  r   r   r   r%    s   
zTestFunctionPassManager.pmc                 C   s   |   ¡ }| ¡  | ¡  d S r    )r%  r"   ÚfinalizerM  r   r   r   r    rë  z%TestFunctionPassManager.test_initfinic                 C   sx   |   ¡ }| d¡}|  |¡}|  ¡  |¡ | ¡  t|ƒ}| ¡  | |¡ | 	¡  t|ƒ}|  
d|¡ |  d|¡ d S )Nr1  rP  )r5   r2  r%  r+  rH  r!  rŠ   r"   rQ  rq  rÈ   rT  )r*   r4   rÒ   r%  rU  rV  r   r   r   r\    s   


z TestFunctionPassManager.test_runc                 C   s€   |   t¡}| d¡}|  |¡}| ¡  |  ¡  |¡ | ¡  | ¡  | 	|¡\}}| 
¡  |  |¡ |  d|¡ |  d|¡ d S )NÚlicmr^  ©r5   Úlicm_asmr2  r%  Úadd_licm_passr+  rH  r!  r"   rc  rq  râ   rÈ   ©r*   r4   rÒ   r%  Úokrf  r   r   r   Útest_run_with_remarks$  s   



z-TestFunctionPassManager.test_run_with_remarksc                 C   sx   |   t¡}| d¡}|  |¡}| ¡  |  ¡  |¡ | ¡  | ¡  |j	|dd\}}| 
¡  |  |¡ |  d|¡ d S )Nrr  rk  rl  r«   )r5   rt  r2  r%  ru  r+  rH  r!  r"   rc  rq  râ   r,   rv  r   r   r   Ú test_run_with_remarks_filter_out3  s   



z8TestFunctionPassManager.test_run_with_remarks_filter_outc                 C   s„   |   t¡}| d¡}|  |¡}| ¡  |  ¡  |¡ | ¡  | ¡  |j	|dd\}}| 
¡  |  |¡ |  d|¡ |  d|¡ d S )Nrr  rl  r^  rs  rv  r   r   r   Útest_run_with_remarks_filter_inA  s   



z7TestFunctionPassManager.test_run_with_remarks_filter_inr    )	r@   rA   rB   r%  r  r\  rx  ry  rz  r   r   r   r   rp  
  s    
rp  c                   @   r·  )Ú
TestPassesc                 C   r)  r    rO  r)   r   r   r   r%  S  r,  zTestPasses.pmc                 C   s*  |   ¡ }| ¡  | ¡  | ¡  | d¡ | ¡  | ¡  | ¡  | ¡  | 	¡  | 
¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | d¡ | ¡  | ¡  | ¡  | ¡  | ¡  | d¡ | ¡  | ¡  |  ¡  | !¡  | "¡  | #¡  | $¡  | %¡  | &¡  | '¡  | (¡  | )¡  | *¡  | +¡  | ,¡  | -¡  | .¡  | /¡  | 0¡  | 1¡  | 2¡  | 3¡  | 4¡  | 5¡  | 6¡  | 7¡  | 8¡  | 9¡  | :¡  | ;¡  | <¡  | =¡  | >¡  | ?¡  | @¡  | A¡  | B¡  | C¡  d S )Néá   é*   é   )Dr%  Úadd_constant_merge_passÚadd_dead_arg_elimination_passÚadd_function_attrs_passra  Úadd_global_dce_passÚadd_global_optimizer_passÚadd_ipsccp_passÚadd_dead_code_elimination_passÚadd_cfg_simplification_passÚadd_gvn_passÚadd_instruction_combining_passru  Úadd_sccp_passÚadd_sroa_passÚ"add_type_based_alias_analysis_passÚadd_basic_alias_analysis_passÚadd_loop_rotate_passÚadd_region_info_passÚadd_scalar_evolution_aa_passÚ)add_aggressive_dead_code_elimination_passÚadd_aa_eval_passÚadd_always_inliner_passÚadd_arg_promotion_passÚadd_break_critical_edges_passÚadd_dead_store_elimination_passÚ*add_reverse_post_order_function_attrs_passÚ)add_aggressive_instruction_combining_passÚadd_internalize_passÚadd_jump_threading_passÚadd_lcssa_passÚadd_loop_deletion_passÚadd_loop_extractor_passÚadd_single_loop_extractor_passÚadd_loop_strength_reduce_passÚadd_loop_simplification_passÚadd_loop_unroll_passÚadd_loop_unroll_and_jam_passÚadd_loop_unswitch_passÚadd_lower_atomic_passÚadd_lower_invoke_passÚadd_lower_switch_passÚadd_memcpy_optimization_passÚadd_merge_functions_passÚadd_merge_returns_passÚadd_partial_inlining_passÚ!add_prune_exception_handling_passÚ add_reassociate_expressions_passÚ"add_demote_register_to_memory_passÚadd_sink_passÚadd_strip_symbols_passÚadd_strip_dead_debug_info_passÚadd_strip_dead_prototypes_passÚadd_strip_debug_declare_passÚadd_strip_nondebug_symbols_passÚadd_tail_call_elimination_passÚadd_basic_aa_passÚadd_dependence_analysis_passÚadd_dot_call_graph_passÚadd_dot_cfg_printer_passÚadd_dot_dom_printer_passÚadd_dot_postdom_printer_passÚadd_globals_mod_ref_aa_passÚadd_iv_users_passÚadd_lazy_value_info_passÚadd_lint_passÚadd_module_debug_info_passÚadd_refprune_passrM  r   r   r   Útest_populateV  sˆ   


zTestPasses.test_populateN)r@   rA   rB   r%  rÀ  r   r   r   r   r{  Q  s    r{  c                   @   s0   e Zd Zdd„ Ze e ¡ dv d¡dd„ ƒZdS )Ú	TestDylibc                 C   s:   |   t¡ t d¡ W d   ƒ d S 1 sw   Y  d S )Nzzzzasdkf;jasd;l)rÅ   r‰   r!   Úload_library_permanentlyr)   r   r   r   Útest_bad_libraryŸ  s   "ÿzTestDylib.test_bad_library)ÚLinuxztest only works on Linuxc                 C   s   t dƒ}t |¡ d S )Nrz   )r   r!   rÂ  )r*   rT   r   r   r   Ú	test_libm£  s   zTestDylib.test_libmN)	r@   rA   rB   rÃ  r~   r   rn   ÚsystemrÅ  r   r   r   r   rÁ    s    ÿrÁ  c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚTestAnalysisc                 C   sj   t  ¡ }t  t  d¡t  d¡t  d¡g¡}t  ||d¡}t  | ¡ ¡}|j\}}| ||¡}| 	|¡ |S )NrÌ   rÍ   )
r   r–   r•   rÎ   r—   r™   r˜   rš   rl   r   )r*   rz   rÑ   rÒ   rÓ   ÚxÚyÚzr   r   r   Úbuild_ir_module«  s   "

zTestAnalysis.build_ir_modulec                 C   sJ   |   ¡ }| d¡}t |¡}tj|dd}d}|  ||¡ |  ||¡ d S )NrÍ   F©Ú	show_instz%.5 = add i32 %.1, %.2)rË  Ú
get_globalr!   Úget_function_cfgrÈ   rT  )r*   r4   rÍ   Údot_showing_instÚdot_without_instÚinstr   r   r   Útest_get_function_cfg_on_irµ  s   

z(TestAnalysis.test_get_function_cfg_on_irc                 C   s‚   |   ¡  d¡}tj|dd}tj|dd}d}|  ||¡ |  ||¡ d}|  ||¡ |  ||¡ d}|  ||¡ |  ||¡ d S )Nr1  TrÌ  FÚdigraphzCFG for 'sum' functionz%.3 = add i32 %.1, %.2)r5   r2  r!   rÏ  rÈ   rT  )r*   rî  rÐ  rÑ  ÚprefixÚfnamerÒ  r   r   r   Útest_function_cfg_on_llvm_value¾  s   z,TestAnalysis.test_function_cfg_on_llvm_valueN)r@   rA   rB   rË  rÓ  r×  r   r   r   r   rÇ  ª  s    
	rÇ  c                   @   s    e Zd Zedd„ ƒZdd„ ZdS )ÚTestTypeParsingc                 c   s&    t  ¡ }|V  t|ƒ}t |¡ d S r    )r   r–   rŠ   r!   r1   )r*   r4   r2   r   r   r   Úcheck_parsingÑ  s
   €zTestTypeParsing.check_parsingc                 C   sº   |   ¡  }t t d¡g¡}t ||d¡}t |dg¡|_W d   ƒ n1 s'w   Y  |   ¡ #}tjt d¡gdd}t ||d¡}t |dg¡|_W d   ƒ d S 1 sVw   Y  d S )NrÌ   rÍ   rM   T)Úpacked)rÙ  r   ÚLiteralStructTyperÎ   ÚGlobalVariablerÏ   Úinitializer)r*   r4   Útypr<  r   r   r   Útest_literal_structÛ  s   
ü
ÿ"ûz#TestTypeParsing.test_literal_structN)r@   rA   rB   r   rÙ  rß  r   r   r   r   rØ  Ð  s    
	rØ  c                   @   ó   e Zd Zdd„ ZdS )ÚTestGlobalConstructorsc                 C   sš   |   t¡}|  |¡}| ¡  | ¡  | d¡}t tj¡}t 	||¡}|  
|jjd¡ | d¡}t tj¡|ƒ}|  
|ƒ d¡ | ¡  |  
|jjd¡ d S )NÚAr  rÍ   r  é   )r5   Úasm_global_ctorsr:   rx  Úrun_static_constructorsÚget_global_value_addressr"  ÚPOINTERÚc_int32Úcastr,   Úcontentsr>  ry  r   Úrun_static_destructors)r*   r4   rz  Úptr_addrÚptr_tÚptrÚfoo_addrrÍ   r   r   r   Útest_global_ctors_dtorsí  s   



z.TestGlobalConstructors.test_global_ctors_dtorsN)r@   rA   rB   rð  r   r   r   r   rá  ì  ó    rá  c                   @   sn   e 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dd„ ZdS )ÚTestGlobalVariablesTc                 C   sZ   t  ¡ }t  d¡}t  ||d¡}||_t|ƒ}|r |  d|¡ n|  d|¡ |  |¡ d S )NrÌ   rÍ   Úundef)	r   r–   rÎ   rÜ  rÉ  rŠ   rÈ   rT  r5   )r*   rÉ  Ú	has_undefr4   rÞ  r<  r2   r   r   r   Úcheck_global_variable_linkage  s   
z1TestGlobalVariables.check_global_variable_linkagec                 C   ó   |   d¡ d S )NrÇ  ©rõ  r)   r   r   r   Útest_internal_linkage  rÄ   z)TestGlobalVariables.test_internal_linkagec                 C   rö  )NÚcommonr÷  r)   r   r   r   Útest_common_linkage  rÄ   z'TestGlobalVariables.test_common_linkagec                 C   ó   | j ddd d S )NrÈ  F©rô  r÷  r)   r   r   r   Útest_external_linkage!  r¬  z)TestGlobalVariables.test_external_linkagec                 C   rö  )NÚavailable_externallyr÷  r)   r   r   r   Ú!test_available_externally_linkage$  rÄ   z5TestGlobalVariables.test_available_externally_linkagec                 C   rö  )NÚprivater÷  r)   r   r   r   Útest_private_linkage'  rÄ   z(TestGlobalVariables.test_private_linkagec                 C   rö  )NÚlinkoncer÷  r)   r   r   r   Útest_linkonce_linkage*  rÄ   z)TestGlobalVariables.test_linkonce_linkagec                 C   rö  )NÚweakr÷  r)   r   r   r   Útest_weak_linkage-  rÄ   z%TestGlobalVariables.test_weak_linkagec                 C   rö  )NÚ	appendingr÷  r)   r   r   r   Útest_appending_linkage0  rÄ   z*TestGlobalVariables.test_appending_linkagec                 C   rû  )NÚextern_weakFrü  r÷  r)   r   r   r   Útest_extern_weak_linkage3  r¬  z,TestGlobalVariables.test_extern_weak_linkagec                 C   rö  )NÚlinkonce_odrr÷  r)   r   r   r   Útest_linkonce_odr_linkage6  rÄ   z-TestGlobalVariables.test_linkonce_odr_linkagec                 C   rö  )NÚweak_odrr÷  r)   r   r   r   Útest_weak_odr_linkage9  rÄ   z)TestGlobalVariables.test_weak_odr_linkageN)T)r@   rA   rB   rõ  rø  rú  rý  rÿ  r  r  r  r  r	  r  r  r   r   r   r   rò    s    
rò  Úx86zonly on x86c                   @   rà  )ÚTestInlineAsmc                 C   s:   t  ¡  | jtd}| jdd}| |¡}|  d|¡ d S )N)r2   Fr9   Únop)r!   Úinitialize_native_asmparserr5   Úasm_inlineasmr?   r³   rÈ   )r*   rz   r$  r2   r   r   r   Útest_inlineasm?  s
   
zTestInlineAsm.test_inlineasmN)r@   rA   rB   r  r   r   r   r   r  =  s    r  c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚTestObjectFilea,  
        ;ModuleID = <string>
        target triple = "{triple}"

        declare i32 @sum(i32 %.1, i32 %.2)

        define i32 @sum_twice(i32 %.1, i32 %.2) {{
            %.3 = call i32 @sum(i32 %.1, i32 %.2)
            %.4 = call i32 @sum(i32 %.3, i32 %.3)
            ret i32 %.4
        }}
    c                 C   s¼   | j dd}|  ¡ }| |¡}tj |¡}d}d}| ¡ D ]9}| ¡ rVd}|  | 	¡ ¡ |  
| ¡ dk¡ |  
t| ¡ ƒdk¡ |  | ¡ ¡ |  
|| ¡ k ¡ | ¡ } nq|  
|¡ d S )NFr9   éÿÿÿÿTr   )r?   r5   r¾  r!   ÚObjectFileRefÚ	from_dataÚsectionsÚis_textrõ   r8   râ   Úsizerj   ÚdataÚaddress)r*   r?   r4   Úobj_binÚobjÚhas_textÚlast_addressrÊ   r   r   r   Útest_object_fileV  s$   
ø	zTestObjectFile.test_object_filec                 C   st   | j dd}|  ¡ }| |¡}tj |¡}t |  | j¡|¡}| |¡ t	t
t
t
ƒ| d¡ƒ}|  |ddƒd¡ d S )NFr9   Ú	sum_twicerN   r  r  )r?   r5   r¾  r!   r  r  rÂ  Úmod_asmÚadd_object_filer   r   ry  r,   )r*   r?   r4   r  r  r:   r"  r   r   r   Útest_add_object_filej  s   
ÿ

ÿz#TestObjectFile.test_add_object_filec           	   	   C   sÄ   | j dd}|  ¡ }| |¡}tƒ \}}z1zt |d¡}| |¡ | ¡  W | ¡  n| ¡  w t	 
|  | j¡|¡}| |¡ W t |¡ nt |¡ w ttttƒ| d¡ƒ}|  |ddƒd¡ d S )NFr9   Úwbr"  rN   r  r  )r?   r5   r¾  r   r[   ÚfdopenÚwriteÚflushr!  r!   rÂ  r#  r$  Úunlinkr   r   ry  r,   )	r*   r?   r4   r  Ú	temp_descÚ	temp_pathrX  r:   r"  r   r   r   Ú$test_add_object_file_from_filesystemz  s&   



ÿ
ÿz3TestObjectFile.test_add_object_file_from_filesystemc                 C   sX   t  t¡}tj |¡}| ¡ D ]}| ¡ r)|  t	| 
¡ ƒd¡ |  | 
¡  ¡ t¡ qd S )Né   )r®  ÚfromhexÚissue_632_elfr!   r  r  r  r  r,   rj   r  ÚhexÚissue_632_text)r*   Úelfr  rÊ   r   r   r   Útest_get_section_content”  s   
€ýz'TestObjectFile.test_get_section_contentN)r@   rA   rB   r#  r!  r%  r-  r4  r   r   r   r   r  G  s    r  c                   @   r·  )ÚTestTimePassesc              	   C   s¢   t  ¡ }t  ¡ }d|_| |¡ z%t  d¡ | |  ¡ ¡ | |  ¡ ¡ | |  ¡ ¡ W t  ¡ }t  d¡ n
t  ¡ }t  d¡ w |  	|t
¡ |  | d¡d¡ d S )Nr  TFzPass execution timing reportrM   )r!   r"  r-  r/  rH  Úset_time_passesrQ  r5   Úreport_and_reset_timingsrá   rŠ   r,   Úcount)r*   Úmpr+  Úreportr   r   r   Útest_reporting   s   

ÿzTestTimePasses.test_reportingc                 C   s   |   t ¡ ¡ d S r    )r‹  r!   r7  r)   r   r   r   Útest_empty_report³  s   z TestTimePasses.test_empty_reportN)r@   rA   rB   r;  r<  r   r   r   r   r5  Ÿ  s    r5  c                   @   rà  )ÚTestLLVMLockCallbacksc                    s    g ‰ ‡ fdd„}‡ fdd„}t j ||¡ |  ˆ ¡ t  ¡  |  dˆ ¡ |  dˆ ¡ t j ||¡ |  t¡ t j ||¡ W d   ƒ d S 1 sIw   Y  d S )Nc                      ó   ˆ   d¡ d S )NÚacqr¦  r   ©Úeventsr   r   r?  ¼  rÄ   z6TestLLVMLockCallbacks.test_lock_callbacks.<locals>.acqc                      r>  )NÚrelr¦  r   r@  r   r   rB  ¿  rÄ   z6TestLLVMLockCallbacks.test_lock_callbacks.<locals>.relr?  rB  )	r!   r	   Úregister_lock_callbackr‹  r"  rÈ   Úunregister_lock_callbackrÅ   rÚ  )r*   r?  rB  r   r@  r   Útest_lock_callbacks¹  s   
"ÿz)TestLLVMLockCallbacks.test_lock_callbacksN)r@   rA   rB   rE  r   r   r   r   r=  ¸  rñ  r=  Ú__main__)Nr"  r   r   Úctypes.utilr   r%   r   r[   rn   rc   r^   r€   r~   Ú
contextlibr   Útempfiler   Úllvmliter   r   r!   Úllvmlite.bindingr	   Úllvmlite.testsr
   ÚmachinerÂ  r   rC   rd  r\  rÆ   r.  rì  r  r  rb  ri  rt  rä  rÐ   r´   r»   r¿   r  r0  r2  r   rD   r‚   rÂ   r  Úobjectrw  r¸  rÁ  rÃ  r  r  r!  r(  rL  rN  rp  r{  rÁ  rÇ  rØ  rá  rò  r   rp   r  r  r5  r=  r@   Úmainr   r   r   r   Ú<module>   s–    



D(ÿÿ"*I  H : C(JOGL&7	X
ÿ