o
    4ήc                     @   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   B/tmp/pip-target-vg8gfxp4/lib/python/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  qd 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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   sR   t  }t  }| |t | | |d}|d}| |d |d  d S )N-r   )r!   get_process_tripler0   r   r   r   rh   r,   )r*   r.   defaultdefault_partstriple_partsr   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_featuresM  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_named  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_initfinii  s   
zTestMisc.test_initfinic                 C   r   )Nzif 1:
            from llvmlite import binding as llvm

            llvm.set_option("progname", "-debug-pass=Disabled")
            r   r   r   r   r   r   test_set_optionv  s   zTestMisc.test_set_optionc                 C   s4   t j\}}}dg}| |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_localeN)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     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_type8%struct\.glob_type(\.[\d]+)? = type { i64, \[2 x i64\] }zstruct.doesnt_exist)
r5   get_struct_typer,   r8   r   rc   ri   r   r   r*  )r*   r4   st_tyr   r   r   test_get_struct_type  s   
"z"TestModuleRef.test_get_struct_typec                 C   r&  )Nr6   r  )
r5   r7   r   r!   r)  r,   r8   r   r*  r   )r*   r4   gvr   r   r   test_get_global_variable  r-  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   r'  )r5   	functionslistr,   rj   r8   )r*   r4   r@  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   r.  )
r5   struct_typesrE  r,   rj   r   rc   ri   r8   r   )r*   r4   r@  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   r8  fr   r   r   	<genexpr>      z-TestModuleRef.test_link_in.<locals>.<genexpr>mulr'  )r5   asm_mullink_inr,   r?  rD  r(  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   rL  r    r   rM  r   r   r   rO  (  rP  z6TestModuleRef.test_link_in_preserve.<locals>.<genexpr>rQ  r'  c                 s   rL  r    r   rM  r   r   r   rO  *  rP  )r5   rR  rS  r,   r?  rD  r  r(  )r*   rT  src2r   r   r   test_link_in_preserve#  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   rS  r   r   r   )r*   rT  rU  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_bitcode6  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_error@  s   
z&TestModuleRef.test_parse_bitcode_errorc                 C   sT   t  }| j|d }t  }t ||}| | | |d |d d S )N)r3   r'  r6   )r!   create_contextr5   r\  rc  r,   r(  r7   )r*   context1r]  context2r4   r   r   r   test_bitcode_roundtripL  s   
z$TestModuleRef.test_bitcode_roundtripc                 C   s4   |   }| }| || | | |  d S r    )r5   cloneassertIsNotr,   r\  )r*   rz   clonedr   r   r   test_cloningW  s   zTestModuleRef.test_cloningN)r@   rA   rB   r  r  r  r  r   r"  r#  r%  r,  r1  r3  rB  rG  rK  rV  rY  r[  r`  rd  rh  rl  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.
    r'  c                 C   s,   |   ||}| | tttt|S r    )finalize_objectget_function_addressr   r   r   )r*   ee	func_namecfptrr   r   r   get_sumc  s   

zJITTestMixin.get_sumc                 C   sX   |   }| |}| |}|dd}| d| W d    d S 1 s%w   Y  d S )NrN   )r5   r:   rs  r,   )r*   r4   rp  cfuncresr   r   r   test_run_codei  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  rn  r*   rp  r   r   r   r  p  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  rn  ry  r   r   r   r  w  s   
"zJITTestMixin.test_withc                 C   s&   |   }| |}|  |  d S r    r5   r:   r  r*   r4   rp  r   r   r   test_module_lifetime     
z!JITTestMixin.test_module_lifetimec                 C   s&   |   }| |}|  |  d S r    rz  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   rR  
add_moduler   KeyErrorassertFalseclosedr  r   r*   rp  r4   r   r   r   test_add_module  s   

zJITTestMixin.test_add_modulec                 C   s6   |  |  }| t}|| |  |  d S r    r:   r5   rR  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   rR  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   rp  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   r;  r=          r7     rM   )rM   rN   r7     )r7  r  )r5   r:   r  r7   r   maxsizer,   get_abi_sizetypeget_pointee_abi_sizeget_pointee_abi_alignmentr   )	r*   r4   rp  r  gv_i32gv_i8	gv_structpointer_sizer9  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   rt  rM   rQ  )r5   r:   set_object_cacher,   rj   rs  r   r   bytesrR  r  )r*   r  r4   rp  rv  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   rt  ru  )r5   r:   r  r,   rj   rs  r   rR  )r*   r  r  r4   rp  rv  r  r   )r  r  r  r   test_object_cache_getbuffer  s4   




z(JITTestMixin.test_object_cache_getbufferN)r'  )r@   rA   rB   r}   rs  rx  r  r  r|  r~  r  r  r  r  r  r  r  r  r   r   r   r   rm  ^  s     



rm  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   r'  N)r?   r5   r:   r   r   set_asm_verbosityassertNotEqual)r*   r?   r4   rp  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   rp  code_objectr   r   r   test_emit_object%  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:   6  s   zTestMCJit.jitr    )r@   rA   rB   r}   r:   r   r   r   r   r  1  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  >  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  C  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_linkageJ     
zTestValueRef.test_linkagec                 C   r  )Nr6   )hidden	protectedr   )r5   r7   
visibilityr   r!   
Visibilityr,   r8   )r*   r4   r6   r  r   r   r   test_visibilityV  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_classb  r  zTestValueRef.test_storage_classc                 C   sf   |   }|d}|d | t}|d W d    n1 s#w   Y  | t|jd d S )Nr'  	nocapturezextzno such attribute 'zext')r5   r(  add_function_attributer   
ValueErrorr,   r   r   )r*   r4   r   raisesr   r   r   test_add_function_attributen  s   

z(TestValueRef.test_add_function_attributec                 C   s$   |   }|d}| |j | d S Nr6   )r5   r7   r   r  r   r   r   test_modulev  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   r=  rH  )	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 )Nr'  zi32 (i32, i32)*)r5   r(  r,   r   r  r+  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 )Nr=  z%struct\.glob_type(\.[\d]+)?\*r.  )
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 )Nr'  )r5   r(  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 Nr7  )r5   rC   rE  r>  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 rC  )r5   rE  rD  r,   rj   r   is_functionr8   r   r  instructionsoperandsopcode)r*   r4   rF  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 sw   Y  d S )Nr'  rN   r   rM   .1i32.2)r5   r(  r   r  rE  	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 )Nr'  rM   r   )r5   r(  rE  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 )Nr'  r      rM   rN   rl   r   )
r5   r(  rE  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 )	Nr'  r   rl   rN   rM   r  r  r  )r5   r(  rE  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_attributesrD  rE  
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  <  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*   rN  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  (  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_size+  s   z TestTargetData.test_get_abi_sizec                 C   sF   |   }|  }| ||jd | d}| ||jd d S )Nr7  r=  r  )r  r6   r,   r  r  r  r   r   r   test_get_pointee_abi_size0  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 )Nr=  r   rM   r  )r  r6   r   r  get_element_offsetr  r  r,   )r*   r  r6   struct_typer   r   r   test_get_struct_element_offset9  s   
z-TestTargetData.test_get_struct_element_offsetN)r@   rA   rB   r  r  r  r  r   r   r   r   r  &  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_passesG  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  r7  r  )	r?   r  r5   r7   r   r  r,   r  r  )r*   r  r  r4   r  r  r   r   r   test_target_data_from_tmL  s   
z*TestTargetMachine.test_target_data_from_tmN)r@   rA   rB   r  r  r   r   r   r   r  E  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   pmbX     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_api[  s   
z#TestPassManagerBuilder.test_old_apic                 C   r  r    )r!  r  r&  r   r   r   r  a  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_levelf     z%TestPassManagerBuilder.test_opt_levelc                 C   r(  r  )r!  r   
size_levelr)  r  r,   r*  r   r   r   test_size_levelm  r-  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$  r*  r   r   r   test_inlining_thresholdt  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   r4  r5  )r!  r   loop_vectorizer   r,   r7  r   r   r   test_loop_vectorize  r9  z*TestPassManagerBuilder.test_loop_vectorizec                 C   r4  r5  )r!  r   slp_vectorizer   r,   r7  r   r   r   test_slp_vectorize  r9  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_managerr>  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!  r'  r  r,  r/  r3  r8  r;  r=  r?  rA  r   r   r   r   r  V  s    r  c                   @   r  )PassManagerTestMixinc                 C   s   t  }d|_d|_|S )NrN   i,  )r!   r#  r%  r$  r&  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   rB    s    rB  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!  r>  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 )NF   Passedinlineme	r  add_function_inlining_passr!  r>  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   MissedrU  znoinline function attribute)	r  rW  r!  r>  r5   asm_inlineasm3rY  r   r   rZ  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 )NrS  nothingremarks_filterr   )	r  rW  r!  r>  r5   rX  rY  r   r,   rZ  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 )NrS  zinlin.*rb  rT  rU  rV  rZ  r   r   r   &test_run_with_remarks_inline_filter_in  s   


z<TestModulePassManager.test_run_with_remarks_inline_filter_inN)	r@   rA   rB   r  rR  r]  r`  rd  re  r   r   r   r   rD    s    	rD  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!   r@  r  r   r   r   r    s   
zTestFunctionPassManager.pmc                 C   s   |   }|  |  d S r    )r  r"   finalizerC  r   r   r   r    r  z%TestFunctionPassManager.test_initfinic                 C   sx   |   }|d}| |}|  | |  t|}|  || |	  t|}| 
d| | d| d S )Nr'  rF  )r5   r(  r  r!  r>  r  r   r"   rG  rg  r   rJ  )r*   r4   r   r  rK  rL  r   r   r   rR    s   


z TestFunctionPassManager.test_runc                 C   s   |  t}|d}| |}|  |  | |  |  |	|\}}|
  | | | d| | d| d S )NlicmrT  r5   licm_asmr(  r  add_licm_passr!  r>  r  r"   rY  rg  r   r   r*   r4   r   r  okr\  r   r   r   test_run_with_remarks  s   



z-TestFunctionPassManager.test_run_with_remarksc                 C   sx   |  t}|d}| |}|  |  | |  |  |j	|dd\}}|
  | | | d| d S )Nrh  ra  rb  r   )r5   rj  r(  r  rk  r!  r>  r  r"   rY  rg  r   r,   rl  r   r   r    test_run_with_remarks_filter_out&  s   



z8TestFunctionPassManager.test_run_with_remarks_filter_outc                 C   s   |  t}|d}| |}|  |  | |  |  |j	|dd\}}|
  | | | d| | d| d S )Nrh  rb  rT  ri  rl  r   r   r   test_run_with_remarks_filter_in4  s   



z7TestFunctionPassManager.test_run_with_remarks_filter_inr    )	r@   rA   rB   r  r  rR  rn  ro  rp  r   r   r   r   rf    s    
rf  c                   @   r  )
TestPassesc                 C   r  r    rE  r)   r   r   r   r  F  r"  zTestPasses.pmc                 C   s   |   }|  |  |  |d |  |  |  |  |	  |
  |  |  |  |  |  |  |  d S )N   )r  add_constant_merge_passadd_dead_arg_elimination_passadd_function_attrs_passrW  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_passrk  add_sccp_passadd_sroa_pass"add_type_based_alias_analysis_passadd_basic_alias_analysis_passadd_loop_rotate_passrC  r   r   r   test_populateI  s$   
zTestPasses.test_populateN)r@   rA   rB   r  r  r   r   r   r   rq  D  s    rq  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_libmd  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_modulel  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   rJ  )r*   r4   r   dot_showing_instdot_without_instinstr   r   r   test_get_function_cfg_on_irv  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 )Nr'  Tr  FdigraphzCFG for 'sum' functionz%.3 = add i32 %.1, %.2)r5   r(  r!   r  r   rJ  )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  k  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   typr2  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         )r5   asm_global_ctorsr:   rn  run_static_constructorsget_global_value_addressr  POINTERc_int32castr,   contentsr4  ro  r   run_static_destructors)r*   r4   rp  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   rJ  r5   )r*   r  	has_undefr4   r  r2  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_linkage  r   z*TestGlobalVariables.test_appending_linkagec                 C   r  )Nextern_weakFr  r  r)   r   r   r   test_extern_weak_linkage  r  z,TestGlobalVariables.test_extern_weak_linkagec                 C   r  )Nlinkonce_odrr  r)   r   r   r   test_linkonce_odr_linkage  r   z-TestGlobalVariables.test_linkonce_odr_linkagec                 C   r  )Nweak_odrr  r)   r   r   r   test_weak_odr_linkage  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_file  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   ro  r,   )r*   r?   r4   r  r  r:   r  r   r   r   test_add_object_file+  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   ro  r,   )	r*   r?   r4   r  	temp_desc	temp_pathrN  r:   r  r   r   r   $test_add_object_file_from_filesystem;  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_contentU  s   
z'TestObjectFile.test_get_section_contentN)r@   rA   rB   r  r  r  r  r  r   r   r   r   r    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%  r>  set_time_passesrG  r5   report_and_reset_timingsr   r   r,   count)r*   mpr!  reportr   r   r   test_reportinga  s   

zTestTimePasses.test_reportingc                 C   s   |  t  d S r    )r  r!   r  r)   r   r   r   test_empty_reportt  s   z TestTimePasses.test_empty_reportN)r@   rA   rB   r  r  r   r   r   r   r  `  s    r  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   r    r   z6TestLLVMLockCallbacks.test_lock_callbacks.<locals>.relr  r  )	r!   r	   register_lock_callbackr  r  r   unregister_lock_callbackr   r  )r*   r  r  r   r  r   test_lock_callbacksz  s   
"z)TestLLVMLockCallbacks.test_lock_callbacksN)r@   rA   rB   r  r   r   r   r   r   y  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   rZ  rR  r   r$  r  r  r  rX  r_  rj  r  r   r   r   r   r  r  r  r   rD   r   r   r  objectrm  r  r  r  r  r  r  r  rB  rD  rf  rq  r  r  r  r  r  r   rp   r  r  r  r   r@   mainr   r   r   r   <module>   s    



D("*I H : C(JOG&7	X
