o
    "ѹg                    @   s  d dl Z d dlZd dl mZ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 d d
lmZ e
 dkrmed dd ZdZdZ dZ!dZ"dZ#dZ$dZ%e
& dkre%'ddZ%dZ(dZ)dZ*dZ+dZ,dZ-dZ.d Z/d!Z0d"Z1d#Z2d$Z3d%Z4d&Z5g d'Z6g d(Z7g d)Z8d*Z9d+Z:d,Z;d-Z<d.Z=d/Z>d0Z?d1Z@d2ZAG d3d4 d4eZBG d5d6 d6eBZCG d7d8 d8eBZDG d9d: d:eBZEG d;d< d<eBZFG d=d> d>eGZHG d?d@ d@eHZIG dAdB dBeBeIZJeKe
 LdCdDG dEdF dFeBZMG dGdH dHeBZNG dIdJ dJeBZOG dKdL dLeBZPG dMdN dNeBZQG dOdP dPeBZRG dQdR dReBZSG dSdT dTeGZTG dUdV dVeBeTZUG dWdX dXeBeTZVG dYdZ dZeBeTZWG d[d\ d\eBZXG d]d^ d^eBZYG d_d` d`eBZZG dadb dbeJZ[G dcdd ddeBZ\eKe
 LdCdeG dfdg dgeBZ]G dhdi dieBZ^G djdk dkeBZ_G dldm dmeBZ`G dndo doeBZaG dpdq dqeGZbG drds dseBebZcG dtdu dueBebZdG dvdw dweBebZeefdxkreg  dS dS )y    N)	CFUNCTYPEc_intc_int32)find_library)contextmanager)mkstemp)ir)binding)ffi)TestCase)opaque_pointers_enabled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   _/Users/admin/.pyenv/versions/3.10.0/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]}}
    %struct.glob_type_vec = 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}"

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

    define i32 @sum(i32 %.1, i32 %.2) {{
        %.3 = add i32 %.1, %.2
        ret i32 0
    }}
    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
    }}
    a  
    ; ModuleID = '<string>'
    target triple = "{triple}"
    @mul_glob = global i32 0

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

    declare i8* @Py_GetVersion()

    define void @getversion(i32 %.1, i32 %.2) {{
      %1 = call i8* @Py_GetVersion()
      ret void
    }}
    PyPyZPy_GetVersionZPyPy_GetVersionz
    ; 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)
    zg
    ; ModuleID = '<string>'
    target triple = "{triple}"

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

    define void @foo() {{
      %const = fadd fp128 0xLF3CB1CCF26FBC178452FB4EC7F91DEAD, 0xL00000000000000000000000000000001
      ret void
    }}
    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}}]
    a  
    ; ModuleID = "<string>"
    target triple = "{triple}"

    @A = external global i32

    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
}
z
    ; ModuleID = '<string>'
    target triple = "{triple}"

    define void @foo(i64* %.1) {{
      ret void
    }}

    define void @bar() {{
      call void @foo(i64* null)
      ret void
    }}
)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*)
a*  
define double @foo(i32 %i, double %j) optnone noinline {
    %I = alloca i32		; <i32*> [#uses=4]
    %J = alloca double		; <double*> [#uses=2]
    store i32 %i, i32* %I
    store double %j, double* %J
    %t1 = load i32, i32* %I		; <i32> [#uses=1]
    %t2 = add i32 %t1, 1		; <i32> [#uses=1]
    store i32 %t2, i32* %I
    %t3 = load i32, i32* %I		; <i32> [#uses=1]
    %t4 = sitofp i32 %t3 to double		; <double> [#uses=1]
    %t5 = load double, double* %J		; <double> [#uses=1]
    %t6 = fmul double %t4, %t5		; <double> [#uses=1]
    ret double %t6
}
z#
declare void @test_declare(i32* )
A@  7f454c4602010100000000000000000001003e000100000000000000000000000000000000000000e0000000000000000000000040000000000040000500010048c1e2204809c24889d048c1c03d4831d048b90120000480001070480fafc8000000000000000000000000000000000000000000000000002f0000000400f1ff00000000000000000000000000000000070000001200020000000000000000001f00000000000000002e74657874005f5f617279626f002e6e6f74652e474e552d737461636b002e737472746162002e73796d746162003c737472696e673e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f0000000300000000000000000000000000000000000000a800000000000000380000000000000000000000000000000100000000000000000000000000000001000000010000000600000000000000000000000000000040000000000000001f000000000000000000000000000000100000000000000000000000000000000f00000001000000000000000000000000000000000000005f00000000000000000000000000000000000000000000000100000000000000000000000000000027000000020000000000000000000000000000000000000060000000000000004800000000000000010000000200000008000000000000001800000000000000Z>48c1e2204809c24889d048c1c03d4831d048b90120000480001070480fafc8ay  
; ModuleID = '<lambda>'
source_filename = "<string>"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-windows-msvc"

declare float @llvm.exp2.f32(float %casted)

define float @foo(i16 %arg) {
entry:
  %casted = sitofp i16 %arg to float
  %ret = call float @llvm.exp2.f32(float %casted)
  ret float %ret
}
a  
; ModuleID = '<string>'
target triple = "{triple}"

define void @foo(i32 %N) {{
  ; unnamed block for testing
  %cmp4 = icmp sgt i32 %N, 0
  br i1 %cmp4, label %for.body, label %for.cond.cleanup

for.cond.cleanup:
  ret void

for.body:
  %i.05 = phi i32 [ %inc, %for.body ], [ 0, %0 ]
  %inc = add nuw nsw i32 %i.05, 1
  %exitcond.not = icmp eq i32 %inc, %N
  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
}}
aw  
; Source C++
;-----------------------------------------
; class MyClass;
;
; class MyClassDefined{
;     MyClass *member;
;     MyClass *m2;
;     MyClass *m3;
; };
;
; void foo(MyClass *c, MyClassDefined){ }
;-----------------------------------------
; LLVM-IR by: clang -arch arm64 -S -emit-llvm file.cpp
; ModuleID = 'file.cpp'
source_filename = "class.cpp"
target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
target triple = "arm64-apple-macosx13.3.0"

%class.MyClass = type opaque
%class.MyClassDefined = type { %class.MyClass*, %class.MyClass*, %class.MyClass* }

; Function Attrs: noinline nounwind optnone ssp uwtable(sync)
define void @_Z3fooP7MyClass14MyClassDefined(%class.MyClass* noundef %0, %class.MyClassDefined* noundef %1) {
  %3 = alloca %class.MyClass*, align 8
  store %class.MyClass* %0, %class.MyClass** %3, align 8
  ret void
}

!llvm.module.flags = !{!0, !1, !2, !3, !4, !5, !6, !7, !8}
!llvm.ident = !{!9}

!0 = !{i32 2, !"SDK Version", [2 x i32] [i32 13, i32 3]}
!1 = !{i32 1, !"wchar_size", i32 4}
!2 = !{i32 8, !"branch-target-enforcement", i32 0}
!3 = !{i32 8, !"sign-return-address", i32 0}
!4 = !{i32 8, !"sign-return-address-all", i32 0}
!5 = !{i32 8, !"sign-return-address-with-bkey", i32 0}
!6 = !{i32 7, !"PIC Level", i32 2}
!7 = !{i32 7, !"uwtable", i32 1}
!8 = !{i32 7, !"frame-pointer", i32 1}
!9 = !{!"Apple clang version 14.0.3 (clang-1403.0.22.14.1)"}

a  ; Source C++
;-----------------------------------------

; struct Vector2D{
;     float x, y;
; };
;
; void foo(Vector2D vec, Vector2D *out) {
;     *out = vec;
; }
;-----------------------------------------
; LLVM-IR by: clang -arch x86_64 -S -emit-llvm file.cpp
; ModuleID = 'file.cpp'
source_filename = "class.cpp"
target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-apple-macosx13.3.0"

%struct.Vector2D = type { float, float }

; Function Attrs: noinline nounwind optnone ssp uwtable
define void @_Z3foo8Vector2DPS_(<2 x float> %0, %struct.Vector2D* noundef %1) #0 {
  %3 = alloca %struct.Vector2D, align 4
  %4 = alloca %struct.Vector2D*, align 8
  %5 = bitcast %struct.Vector2D* %3 to <2 x float>*
  store <2 x float> %0, <2 x float>* %5, align 4
  store %struct.Vector2D* %1, %struct.Vector2D** %4, align 8
  %6 = load %struct.Vector2D*, %struct.Vector2D** %4, align 8
  %7 = bitcast %struct.Vector2D* %6 to i8*
  %8 = bitcast %struct.Vector2D* %3 to i8*
  call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %7, i8* align 4 %8, i64 8, i1 false)
  ret void
}

; Function Attrs: argmemonly nofree nounwind willreturn
declare void @llvm.memcpy.p0i8.p0i8.i64(i8* noalias nocapture writeonly, i8* noalias nocapture readonly, i64, i1 immarg) #1

attributes #0 = { noinline nounwind optnone ssp uwtable "darwin-stkchk-strong-link" "frame-pointer"="all" "min-legal-vector-width"="64" "no-trapping-math"="true" "probe-stack"="___chkstk_darwin" "stack-protector-buffer-size"="8" "target-cpu"="penryn" "target-features"="+cx16,+cx8,+fxsr,+mmx,+sahf,+sse,+sse2,+sse3,+sse4.1,+ssse3,+x87" "tune-cpu"="generic" }
attributes #1 = { argmemonly nofree nounwind willreturn }

!llvm.module.flags = !{!0, !1, !2, !3, !4}
!llvm.ident = !{!5}

!0 = !{i32 2, !"SDK Version", [2 x i32] [i32 13, i32 3]}
!1 = !{i32 1, !"wchar_size", i32 4}
!2 = !{i32 7, !"PIC Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{i32 7, !"frame-pointer", i32 2}
!5 = !{!"Apple clang version 14.0.3 (clang-1403.0.22.14.1)"}

c                   @   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
initializeZinitialize_native_targetZ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 testZ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LANGZobjdumpz-p)stdoutenvr   z%^([+-_a-zA-Z0-9]+)\.so(?:\.\d+){0,3}$ZNEEDED      zinvalid NEEDED line: %rlibc
libpthreadz#failed parsing dependencies? got %r)	ZlibrtZlibdlrM   ZlibzlibmZlibgcc_srL   zld-linuxZld64r   Z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lenZfailaddgroupplatformpython_implementation
startswith)r)   Zlib_pathrI   pout_Zlib_patdepslinepartsdepmallowedr   r   r   
test_linux  s:   



zTestDependencies.test_linuxN)r@   rA   rB   __doc__unittest
skipUnlesssysrc   re   rQ   rR   getro   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"   Zinitialize_all_targetsZ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strZ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;   ry   r.   r=   )r)   kwargZ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argsZfpextfaddr   r"   r1   r{   verify)r)   Zf64Zf32fntyr5   funcblockbuilderabZ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    )r]   stripre   append)r)   r2   Zasm_listrj   Zs_liner   r   r   break_up_asm  s   
zTestRISCVABI.break_up_asmc                 C   :   |    |  }| jddd}| | ||t d S )N+f,+dZilp32featuresZabiname)r}   r   r   r+   r   emit_assemblyriscv_asm_ilp32r)   r   r>   r   r   r   test_rv32d_ilp32     zTestRISCVABI.test_rv32d_ilp32c                 C   r   )Nr   Zilp32fr   )r}   r   r   r+   r   r   riscv_asm_ilp32fr   r   r   r   test_rv32d_ilp32f  r   zTestRISCVABI.test_rv32d_ilp32fc                 C   r   )Nr   Z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   rp   r.   r*   r}   r   r   r   r   r   r   __classcell__r   r   rw   r   ru     s    		ru   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)assertRaisesrz   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_name2  s   z$TestMisc.test_nonalphanum_block_namec                 C   s$   t j }t j }||ksJ d S r!   )r"   r3   Zget_global_context)r)   Z	gcontext1Z	gcontext2r   r   r   test_global_context;  s   

zTestMisc.test_global_contextc                 C   sH   t dd t dd t d}| |d t d}| |d  d S )N__xyzzy  i.  __foobar)r"   Z
add_symbolZaddress_of_symbolr+   assertIs)r)   addrr   r   r   test_dylib_symbols@  s   

zTestMisc.test_dylib_symbolsc                 C   "   t  }| |t | | d S r!   )r"   r0   assertIsInstancer{   
assertTrue)r)   r.   r   r   r   test_get_default_tripleH     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 )NZpowerpc64leppc64ler   )archr   r   r   normalize_ppcO  s   z7TestMisc.test_get_process_triple.<locals>.normalize_ppc-r   )r"   Zget_process_tripler0   r   r{   r   r^   r+   )r)   r   r.   defaultZdefault_archZtriple_archr   r   r   test_get_process_tripleM  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"   Zget_host_cpu_featuresr   dictZ
FeatureMapitemsr{   r   boolflattenr/   assertIsNotNonerY   r_   r`   r+   )r)   r   kvZre_termregexr   r   r   test_get_host_cpu_features_  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_namev  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rT   
check_callrs   
executabler)   coder   r   r   test_initfini{  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_option  s   zTestMisc.test_set_optionc                 C   s0   t j\}}}d}| || | |td d S )N)         )r"   llvm_version_infor   range)r)   majorminorpatchZvalidr   r   r   test_version  s   zTestMisc.test_versionc                 C   s   t   d S r!   )r"   Z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)   rm   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   )rs   r   rT   r   )r)   r   flagsZcmdargsr   r   r   test_no_accidental_warnings  s   z$TestMisc.test_no_accidental_warningsN)r@   rA   rB   rp   r   r   r   r   r   r   r   r   r   r   r   r   r   rq   ZskipIfr   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	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   re   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   rz   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+   Zsource_filer   r   r   r   test_source_file  s   zTestModuleRef.test_source_filec                 C   s2   |   }|j}| |t ||_| ||j d S r!   )r5   Z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   rz   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 )Nstruct.glob_type8%struct\.glob_type(\.[\d]+)? = type { i64, \[2 x i64\] }zstruct.doesnt_exist)
r5   get_struct_typer+   r8   r   rY   r_   r{   r   r  )r)   r4   Z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>      z7TestModuleRef.test_global_variables.<locals>.<listcomp>)r6   glob_bZglob_fglob_struct)r5   global_variablessortedr+   r`   )r)   r4   itZglobsr   r   r   test_global_variables  s   z#TestModuleRef.test_global_variablesc                 C   s>   |   }|j}~t|}| t|d | |d jd d S NrJ   r   r  )r5   	functionslistr+   r`   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 )NrJ   struct\.glob_type(\.[\d]+)?r   r  )
r5   Zstruct_typesr   r+   r`   r   rY   r_   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   r  fr   r   r   	<genexpr>5      z-TestModuleRef.test_link_in.<locals>.<genexpr>mulr  )r5   asm_mullink_inr+   r  r  r  r   r   r   r   )r)   destsrcr   r   r   test_link_in0  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   r&  r!   r   r'  r   r   r   r)  @  r*  z6TestModuleRef.test_link_in_preserve.<locals>.<genexpr>r+  r  c                 s   r&  r!   r   r'  r   r   r   r)  B  r*  )r5   r,  r-  r+   r  r  r   r  )r)   r.  Z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   rz   r-  r   r{   r   )r)   r.  r/  r   r   r   r   test_link_in_errorE  s   
z TestModuleRef.test_link_in_errorc                 C   s6   |   }| }d}d}| ||p|| d S )Ns   s   BC)r5   
as_bitcoder   re   )r)   r4   bcZbitcode_wrapper_magicZbitcode_magicr   r   r   test_as_bitcodeN  s   zTestModuleRef.test_as_bitcodec                 C   s\   |  t}td W d    n1 sw   Y  | dt|j | dt|j d S )N    zLLVM bitcode parsing errorz(file too small to contain bitcode header)r   rz   r"   parse_bitcoder   r{   r   )r)   r   r   r   r   test_parse_bitcode_errorX  s   
z&TestModuleRef.test_parse_bitcode_errorc                 C   sT   t  }| j|d }t  }t ||}| | | |d |d d S )Nr3   r  r6   )r"   Zcreate_contextr5   r6  r:  r+   r  r7   )r)   Zcontext1r7  Zcontext2r4   r   r   r   test_bitcode_roundtrip`  s   
z$TestModuleRef.test_bitcode_roundtripc                 C   s4   |   }| }| || | | |  d S r!   )r5   cloneZassertIsNotr+   r6  )r)   rm   Zclonedr   r   r   test_cloningk  s   zTestModuleRef.test_cloningN)r@   rA   rB   r   r   r   r   r   r   r   r  r  r  r  r  r"  r%  r0  r3  r5  r8  r;  r=  r?  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_sumw  s   

zJITTestMixin.get_sumc                 C   sX   |   }| |}| |}|dd}| d| W d    d S 1 s%w   Y  d S NrK   )r5   r:   rF  r+   )r)   r4   rC  cfuncresr   r   r   test_run_code}  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   rA  r)   rC  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   rz   r   r   rA  rM  r   r   r   r     s   
"zJITTestMixin.test_withc                 C   s&   |   }| |}|  |  d S r!   r5   r:   r   r)   r4   rC  r   r   r   test_module_lifetime     
z!JITTestMixin.test_module_lifetimec                 C   s&   |   }| |}|  |  d S r!   rN  rO  r   r   r   test_module_lifetime2  rQ  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)   rC  r4   r   r   r   test_add_module  s   

zJITTestMixin.test_add_modulec                 C   s6   |  |  }| t}|| |  |  d S r!   r:   r5   r,  rS  r   rW  r   r   r   test_add_module_lifetime  
   

z%JITTestMixin.test_add_module_lifetimec                 C   s6   |  |  }| t}|| |  |  d S r!   rY  rW  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,  rS  Zremove_moduler   rT  rU  rV  r   rW  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   rC  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          r  r   rJ   )rJ   rK   r     )r  r   )r5   r:   r^  r7   rs   maxsizer+   get_abi_sizetypeglobal_value_typeZget_abi_alignmentr   )	r)   r4   rC  r_  gv_i32Zgv_i8Z	gv_structpointer_sizer  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   rK   rH  rJ   r+  )r5   r:   set_object_cacher+   r`   rF  r   r   bytesr,  rS  )r)   rp  r4   rC  rJ  Zmod2r   rn  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                    rj  r!   rk  rl  rn  r   r   rp    rq  z8JITTestMixin.test_object_cache_getbuffer.<locals>.notifyc                    s     |  d S r!   rk  r4   )
getbuffersr   r   	getbuffer  r   z;JITTestMixin.test_object_cache_getbuffer.<locals>.getbufferr   rJ   c                    s     |  S r!   rk  ru  )rv  
sum_bufferr   r   getbuffer_successful  s   
zFJITTestMixin.test_object_cache_getbuffer.<locals>.getbuffer_successfulrK   rH  rI  )r5   r:   rr  r+   r`   rF  r   r,  )r)   rp  rw  r4   rC  rJ  ry  r   )rv  ro  rx  r   test_object_cache_getbuffer  s4   




z(JITTestMixin.test_object_cache_getbufferN)r  )r@   rA   rB   rp   rF  rL  r   r   rP  rR  rX  rZ  r\  r]  r`  ri  rt  rz  r   r   r   r   r@  r  s     



r@  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   Zset_asm_verbosityassertNotEqual)r)   r?   r4   rC  Zraw_asmZ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   ELFN
   )
r?   r5   r:   emit_objectr   rs  rs   rc   re   r   )r)   r?   r4   rC  code_objectr   r   r   test_emit_object9  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:   J  s   zTestMCJit.jitr!   )r@   rA   rB   rp   r:   r   r   r   r   r  E  s    r  x86x86 onlyc                   @   s   e Zd Zedddeeeed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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 )&TestOrcLLJITr  NFc                 C   sv   t j|d|d}t  }|r|  ||jt  d|||}	|	| }
| 	|
 | 
||	j ||	||
fS )NF)use_jit_linksuppress_errorsr-   )r"   create_lljit_compilerJITLibraryBuilderZadd_current_processadd_irr/   r0   export_symbollinkr   r+   r8   )r)   r2   rD  r?   Zadd_process	func_typer  lljitr   rtrE  r   r   r   r:   W  s    
zTestOrcLLJIT.jitc                 C   s:   t  }t  ddd|d}| |d d d S )Nr   r   r   )r"   r  r  import_symbolr  r  r+   r)   r  r  r   r   r   test_define_symbolj  s
   zTestOrcLLJIT.test_define_symbolc                 C   s   t  }| td |dd W d    n1 sw   Y  t  ddd|d}| 	|d d | td |dd W d    d S 1 sOw   Y  d S )NzNo such libraryr   r   r   r   r   zSymbols not found.*__foobar)
r"   r  assertRaisesRegexrz   lookupr  r  r  r  r}  r  r   r   r   "test_lookup_undefined_symbol_failsp  s   "z/TestOrcLLJIT.test_lookup_undefined_symbol_failsc                 C   s^   t jdkr$| td tjdd W d    d S 1 sw   Y  d S | tjdd d S )Nwin32zJITLink .* WindowsT)r  )rs   rc   r  rz   r"   r  r   r(   r   r   r   test_jit_link{  s   
"zTestOrcLLJIT.test_jit_linkc                 C   sN   |   \}}}| |dd}| d| W d    d S 1 s w   Y  d S rG  )r:   r+   )r)   r  r  rJ  rK  r   r   r   rL    s
   
"zTestOrcLLJIT.test_run_codec                 C   sZ   |   \}}}|  |  | t |dd W d    d S 1 s&w   Y  d S Nr   r   )r:   r   r   AssertionErrorr  r)   r  r  rJ  r   r   r   r     s   "zTestOrcLLJIT.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 |dd W d    d S 1 sWw   Y  d S r  )r:   r   rz   r  r  r  r   r   r   r     s   "zTestOrcLLJIT.test_withc                 C   s   |   \}}}t tjt dd|d}t	t
t
t
|d dd}| d| | |ddd d | |ddd d | t |dd W d    n1 s\w   Y  | t |dd W d    d S 1 sxw   Y  d S )Nr-   r+  rK   rH  ir  r   )r:   r"   r  r  r,  r/   r0   r  r  r   r   r+   r}  r  r   rz   r)   r  rt_sumZ	cfunc_sumZrt_mulrK  r   r   r   test_add_ir_module  s    "zTestOrcLLJIT.test_add_ir_modulec                 C   sZ   |   \}}}~t  | t |dd W d    n1 s"w   Y  |  d S Nr  )r:   r$   r%   r   rz   r  r   )r)   r  r  rh   r   r   r   r]    s   zTestOrcLLJIT.test_remove_modulec                 C   sf   |   \}}}t tjt ddd	|d}t
ttt|d dd}| d| d S )Nr-   Z
square_sumr  rK   rH  	   )r:   r"   r  r  asm_square_sumr/   r0   r  Zadd_jit_libraryr  r   r   r+   r  r   r   r   test_lib_depends  s   zTestOrcLLJIT.test_lib_dependsc                 C   s8   |   \}}}|j}| |j| t| ~t| d S r!   )r:   r^  r   r{   )r)   r  r  rh   r_  r   r   r   r`    s   zTestOrcLLJIT.test_target_datac                 C   s   t d}t }t }|tjt ddt	
|d|d}|d }| | | tt| d ~| |jd d S )Nr   r-   Ar         )r   r"   r  r  r  asm_ext_ctorsr/   r0   r  r   	addressofr  r  r   r+   r   r   r}  r  )r)   Zshared_valuer  r   r  r   r   r   r   test_global_ctors_dtors  s   
z$TestOrcLLJIT.test_global_ctors_dtorsc                 C   sF   d}|  t| | jtddd W d    d S 1 sw   Y  d S )Nz*Failed to materialize symbols:.*getversion
getversionT)r  )r  rz   r:   asm_getversion)r)   msgr   r   r   (test_lookup_current_process_symbol_fails  s   "z5TestOrcLLJIT.test_lookup_current_process_symbol_failsc                 C   s   |  tdd d d S )Nr  T)r:   r  r(   r   r   r   "test_lookup_current_process_symbol  s   z/TestOrcLLJIT.test_lookup_current_process_symbolc                    sh   t  tjt  dfdd  fddtt D }|D ]}|  q"|D ]}|	  q+d S )Nr-   c                    s    fdd}|S )Nc               
      sD   g } t dD ]}| t dd  d|  qd S )N2   r  Zsum_rh   )r   r   r"   r  r  r  r  )Ztrackingc)ir  llvm_irr   r   do_work  s   
zDTestOrcLLJIT.test_thread_safe.<locals>.compile_many.<locals>.do_workr   )r  r  )r  r  )r  r   compile_many  s   z3TestOrcLLJIT.test_thread_safe.<locals>.compile_manyc                    s   g | ]
}t j |d qS ))r>   )	threadingThread)r  r  )r  r   r   r    s    z1TestOrcLLJIT.test_thread_safe.<locals>.<listcomp>)
r"   r  rC   r/   r0   r   rQ   	cpu_countstartjoin)r)   Zthsthr   )r  r  r  r   test_thread_safe  s   



zTestOrcLLJIT.test_thread_safec                 C   sj   | j dd}|  }t|}t ||d|d}t	t
t
t
|d }| |ddd d S )NFr9   r  rK         )r?   r5   r"   r  r  Zadd_object_imgr  r  r  r   r   r+   )r)   r?   r4   r  r  r  r   r   r   test_add_object_file  s   
z!TestOrcLLJIT.test_add_object_filec           
   	   C   s   | j dd}|  }||}t \}}zIt|d}|| W d    n1 s+w   Y  t|}t	 
|d|d}tttt|d }	| |	ddd W t| d S t| w )NFr9   wbr  rK   r  r  )r?   r5   r  r   rQ   fdopenwriter"   r  r  add_object_filer  r  r   r   r+   unlink)
r)   r?   r4   obj_bin	temp_desc	temp_pathr(  r  r  r  r   r   r   $test_add_object_file_from_filesystem  s"   


z1TestOrcLLJIT.test_add_object_file_from_filesystem)r@   rA   rB   rC   r   r   r:   r  r  r  rL  r   r   r  r]  r  r`  r  r  r  r  r  r  r   r   r   r   r  T  s*    


	r  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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/d0 Zd1d2 Zd3d4 Zd5d6 Zd7S )8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     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"   ZLinkager+   r8   )r)   r4   r6   r  r   r   r   test_linkage#     
zTestValueRef.test_linkagec                 C   r  )Nr6   )hiddenZ	protectedr   )r5   r7   
visibilityr   r"   Z
Visibilityr+   r8   )r)   r4   r6   r  r   r   r   test_visibility/  r  zTestValueRef.test_visibilityc                 C   r  )Nr6   )Z	dllimportZ	dllexportr   )r5   r7   storage_classr   r"   ZStorageClassr+   r8   )r)   r4   r6   r  r   r   r   test_storage_class;  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  Z	nocaptureZzextzno such attribute 'zext')r5   r  Zadd_function_attributer   
ValueErrorr+   r{   r   )r)   r4   r   raisesr   r   r   test_add_function_attributeG  s   

z(TestValueRef.test_add_function_attributec                 C   s$   |   }|d}| |j | d S Nr6   )r5   r7   r   r  r   r   r   test_moduleO  s   
zTestValueRef.test_modulec                 C   s*   |   }|d}|j}| |tj d S r  )r5   r7   re  r   r"   ZTypeRefr)   r4   r6   tpr   r   r   	test_typeT  s   
zTestValueRef.test_typec                 C   sJ   |   }|d}|j}| |jd |d}| td|jj d S )Nr6   r   r  r#  )	r5   r7   re  r+   r8   r   rY   r_   rf  )r)   r4   r6   r  str   r   r   test_type_nameZ  s   



zTestValueRef.test_type_namec                 C   s,   |   }|d}|j}| t|d d S )Nr6   i32)r5   r7   rf  r+   r{   r  r   r   r   test_type_printing_variablec  s   
z(TestValueRef.test_type_printing_variablec                 C   s(   |   }|d}| t|jd d S )Nr  zi32 (i32, i32))r5   r  r+   r{   rf  r  r   r   r   test_type_printing_functioni  s   
z(TestValueRef.test_type_printing_functionc                 C   sr   |   }|d}| |jj tr| tdt	|j n| tdt	|j | tdt	|j
 d S )Nr  ptrz%struct\.glob_type(\.[\d]+)?\*r  )r5   r7   r   re  
is_pointerr   r   rY   r_   r{   rf  )r)   r4   r  r   r   r   test_type_printing_structn  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 r  )r5   r  asm_sum_declarerU  is_declarationr   )r)   definedZdeclaredr   r   r   test_is_declaration  s   z TestValueRef.test_is_declarationc                 C   s>   |  t}t|j}| t|d |D ]}| |j qd S Nr  )r5   rC   r   r  r+   r`   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 r  )r5   r   r  r+   r`   r   is_functionr8   r   r  instructionsoperandsopcode)r)   r4   r!  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  rK   r   rJ   .1r  .2)r5   r  r   r  r   	argumentsr+   r`   is_argumentr8   r{   re  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  rJ   r   )r5   r  r   r  r+   r`   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   r  rJ   rK   ra   r   )
r5   r  r   r  r  r+   r`   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   ra   rK   rJ   r  r  r  )r5   r  r   r  r  r+   r  r  r`   r   Z
is_operandr8   r{   re  )r)   r   ra   r  r   r   r   test_instruction_operands  s   
z&TestValueRef.test_instruction_operandsc                 C   s   t jd }|dkrdndg}| t}|jD ]:}t|j}|jdkr)| || q|jdkrP| |g  t|j	}| t|d jdg | t|d jg  qd S )	Nr   r   s   memory(read)s   readonlyZa_readonly_funcZa_arg0_return_funcs   returnedrJ   )
r"   r   r5   asm_attributesr  r   
attributesr8   r+   r  )r)   verZreadonly_attrsr4   r   attrsr   r   r   r   test_function_attributes  s   






z%TestValueRef.test_function_attributesc                 C   s   |   }| |djtjj |d}| |jtjj t	|j
d }| |jtjj t	|jd }| |jtjj | t	|jd jtjj | t	|jd jtjj |  td}t	t	|j
d jd }| t	|jd jtjj d S )Nr6   r  r   rJ   r   )r5   r+   r7   Z
value_kindr"   Z	ValueKindZglobal_variabler  functionr   r  Zbasic_blockr  Zinstructionr  Zconstant_intasm_inlineasmZ
inline_asm)r)   r4   r   r   instZ	iasm_funcZ	iasm_instr   r   r   test_value_kind  s*   
zTestValueRef.test_value_kindc                 C   s   |   }| |dj d}|jD ]-}| |j |jD ]!}| |j |jD ]}| |j |jD ]	}|jr<|d7 }q3q(qq| 	|d d S )Nr6   r   rJ   )
r5   r   r7   is_constantr  r  rU  r  r  r+   )r)   r4   Zconstant_operandsr   r   r  opr   r   r   test_is_constant  s"   



zTestValueRef.test_is_constantc           	      C   sT  |   }|d}tt|jd j}| |d jd t|d j}| |d j	 | 
|d j	 | |d  d | t |d   W d    n1 sSw   Y  |  t}|d}tt|jd j}t|d jd }t|d jd }| | d | |jddd	 |jd
d}tj|ddddd}| |d	 d S )Nr  r   rJ   ra   rK   r  T)Z
signed_intrH  Fr   little)signed)r5   r  r   r  r  r+   r  r  r   r
  rU  get_constant_valuer   r  asm_sum3int
from_bytesto_bytes)	r)   r4   r   r  r  Zposint64Znegint64Zas_u64Zas_i64r   r   r   test_constant_int   s.   


zTestValueRef.test_constant_intc                 C   s(  |  t}|d}tt|jd j}| t|d | |d jd t|d j	}| 
|d j | |d  d | 
|d j | |d  d |  t}|d}tt|jd jd }t|j	}| t |d   W d    n1 sw   Y  | |d jdd	d d S )
Nr   r   rK   r   g        rJ   gQ	@T)Zround_fp)r5   r   r  r   r  r  r+   r`   r  r  r   r
  ZassertAlmostEqualr  asm_double_inaccurater   r  )r)   r4   r   r  r  r  r   r   r   test_constant_fp  s$   




zTestValueRef.test_constant_fpc                 C   sr   |  t}|d}tt|jd jd }t|jd }| |j t	r/| 
| d d S | 
| d d S )Nr   r   zptr nullz	i64* null)r5   asm_null_constantr  r   r  r  r  r   r
  r   r+   r  )r)   r4   r   r  argr   r   r   test_constant_as_string.  s   

z$TestValueRef.test_constant_as_stringc                 C   s   |  t}|d}t|j}t|d j}| |d j | |d j	d t|d j
}| t|d | |d j | |d j | |d |d  | |d |d  | |d j	d | t |d j
 W d    d S 1 syw   Y  d S )Nr   r   phirK   rJ   )r5   asm_phi_blocksr  r   r  r  r   r  r+   r  incoming_blocksr`   r  r}  r   r  )r)   r4   r   r  r  r  r   r   r   test_incoming_phi_blocks:  s    


"z%TestValueRef.test_incoming_phi_blocksN)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  r  r   r   r   r   r    s8    	r  c                   @   d   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 )TestTypeRefc                 C   s   |   }|d}| t|jd |d}| t|d t|j}| t|d | t|d d | t|d d	 d S )
Nr6   r  r
  z+%struct.glob_type = type { i64, [2 x i64] }rK   r   Zi64rJ   z	[2 x i64])	r5   r7   r+   r{   rf  r  r   elementsr`   )r)   r4   r6   glob_struct_typer!  r   r   r   r   R  s   



zTestTypeRef.test_strc                 C   s0  |   }|d}| |jjtjj | |jj	 |d}| |jjtjj | |jj	 |j
}| |jtjj | |j |j\}}| |jtjj | |jtjj | |j |d}|j\}}	| |	jtjj | |	j |dj}
| |
jtjj |dj
}| |jtjj d S )Nr6   r  struct.glob_type_vecr  )r5   r7   r+   re  	type_kindr"   TypeKindpointerr   r  rf  structZ	is_structr!  integerarrayZis_arrayr  vectorZ	is_vectorr  r  )r)   r4   r6   r  stypeZstype_aZstype_bglob_vec_struct_typerh   vector_typeZfuncptrZfunctyper   r   r   test_type_kind_  s,   




zTestTypeRef.test_type_kindc                 C   s`   |   }|d}|j\}}| |jd | t |j W d    d S 1 s)w   Y  d S )Nr
  rK   )r5   r  r!  r+   Zelement_countr   r  )r)   r4   r"  rh   
array_typer   r   r   test_element_count|  s   

"zTestTypeRef.test_element_countc                 C   sl   |   }|d}|d}|j\}}|j\}}| |jd | |jd | |jd | |jd d S )Nr
  r#  @      r   )r5   r  r!  r+   Z
type_width)r)   r4   r"  r,  Zinteger_typer/  rh   r-  r   r   r   test_type_width  s   



zTestTypeRef.test_type_widthc                 C   s   |  t}|d}|j}| |j |  t}|d}|j}| |j | |jj	 | 
t}|jj W d    n1 sAw   Y  trS| dt|j d S | dt|j d S )Nvarargr  zType ptr is not a functionz&Type i32 (i32, i32)* is not a function)r5   asm_vararg_declarer  rf  r   Zis_function_varargr  rU  re  r  r   r  r   r   r{   r   )r)   r4   r   decltyper  r   r   r   test_vararg_function  s"   




z TestTypeRef.test_vararg_functionc                 C   s   |   }t|j\}| |jjtjj | 	|jj
 |j}| |jtjj | |j
 |tj}| |tj | |jtdtdf | |jtd d S Nr   )r5   r   r  r+   re  r$  r"   r%  r&  rU  r  rf  r  r   as_irr   global_contextr   r   r   r   return_type)r)   r4   r   r   Ztyirr   r   r   test_function_typeref_as_ir  s   z'TestTypeRef.test_function_typeref_as_irc                 C   s`   t t  d}t  }t ||d}| t|}|d}|j}| 	|j
|t jj
 d S )Nr   r   )r   r   ZVoidTyper   r   r5   r{   r  rf  r+   r;  r9  r:  )r)   r   irmodr   r4   gvtyr   r   r   test_void_typeref_as_ir  s   
z#TestTypeRef.test_void_typeref_as_irc              
      s  ddl m} t  ddh}i }dd }||d< dd	 }||d
< dd }||d< dd }||d<  fdd}||d< dd }	|	|d< dd }
|
|d< dd }||d< | dd | D t| t|B  | D ]_\}}|j|v ruqk||j  D ]N}| 	|d| : tj
 d }tj||d!d" t|}t|}|d!}|j}|t }| || | || W d    q{1 sw   Y  q{qkd S )#Nr   )_TypeKindToIRTyper  voidc                   s       t  V  d S r!   )r   ZHalfTyper   r   r   r   
maker_half     z9TestTypeRef.test_global_typeref_as_ir.<locals>.maker_halfZhalfc                   s   rB  r!   )r   r   r   r   r   r   maker_float  rD  z:TestTypeRef.test_global_typeref_as_ir.<locals>.maker_floatfloatc                   s   rB  r!   )r   r   r   r   r   r   maker_double  rD  z;TestTypeRef.test_global_typeref_as_ir.<locals>.maker_doubledoublec                   s   s    t dV  d S r8  )r   r   r   r   r   r   maker_integer  s   z<TestTypeRef.test_global_typeref_as_ir.<locals>.maker_integerr(  c                  3   sL    t t dV   d V   d} | t d |  V  d S )Nr   Zmyclassmyclass2)r   ZPointerTyper   Zget_identified_typeZ
as_pointerZset_body)rJ  ctxr   r   maker_pointer  s   
z<TestTypeRef.test_global_typeref_as_ir.<locals>.maker_pointerr&  c                   s   s    t t ddV  d S )Nr   {   )r   	ArrayTyper   r   r   r   r   maker_array  s   z:TestTypeRef.test_global_typeref_as_ir.<locals>.maker_arrayr)  c                   s   s    t t  dV  d S )NrK   )r   Z
VectorTyper   r   r   r   r   maker_vector  s   z;TestTypeRef.test_global_typeref_as_ir.<locals>.maker_vectorr*  c                   s   s>    t t  t dgV  t jt  t dgddV  d S )Nr1  Tpacked)r   LiteralStructTyper   r   r   r   r   r   maker_struct  s
   z;TestTypeRef.test_global_typeref_as_ir.<locals>.maker_structr'  c                 S   s   h | ]}|j qS r   r   )r  xr   r   r   	<setcomp>   r  z8TestTypeRef.test_global_typeref_as_ir.<locals>.<setcomp>z -> r<  r  r   )Zllvmlite.binding.typerefr@  r   Contextr+   keysr[   r   r8   ZsubTestr   GlobalVariabler{   r"   r1   r7   rf  r9  r   )r)   r@  skippedZmakersrC  rE  rG  rI  rM  rP  rQ  rU  r$  Zirtypetyr=  r2   r4   r  r>  r   r   rK  r   test_global_typeref_as_ir  sT   	


z%TestTypeRef.test_global_typeref_as_irc                 C   s  t |}||}|j}t }|j|d}tj|d}tj|||j	d}	tj||dd}
t
|
 }||	|
j |  t t|}| j||	j	jdd |j|dd | jtt|jtt|jd	 d
d | j||	j	jdd | j||	j	j||
j	jdd d S )N)Zir_ctxr<  r   wrapperzdeclfn must not have a body)r  Tr1  rJ   z$the only new function is the wrapperzdeclfn must have a body nowz.declfn and wrapfn must have the same llvm Type)r"   r1   r  rf  r   rX  r9  r   r   r8   r   r   callr   Zret_voidr{   r   r  r-  r+   r`   r   r  rU  )r)   r2   Ztarget_symbolr4   ZcppfnZ	cppfntypeZ
my_contextr\  Zwrapper_modZdeclfnZwrapfnr   new_modr   r   r   !_check_typeref_as_ir_for_wrappers  s6   


z-TestTypeRef._check_typeref_as_ir_for_wrappersc                 C      |  td dS )ztExercise extracting C++ defined class types.
        Contains both opaque and non-opaque class definitions.
        Z_Z3fooP7MyClass14MyClassDefinedN)ra  asm_cpp_classr(   r   r   r   ,test_typeref_as_ir_for_wrappers_of_cpp_class6  s   z8TestTypeRef.test_typeref_as_ir_for_wrappers_of_cpp_classc                 C   rb  )zExercise extracting C++ struct types that are passed as vectors.

        IA64 ABI on x86_64 will put struct with two floats as
        a vector of two floats.
        Z_Z3foo8Vector2DPS_N)ra  asm_cpp_vectorr(   r   r   r   4test_typeref_as_ir_for_wrappers_of_cpp_vector_struct?  s   z@TestTypeRef.test_typeref_as_ir_for_wrappers_of_cpp_vector_structN)r@   rA   rB   r   r.  r0  r3  r7  r<  r?  r]  ra  rd  rf  r   r   r   r   r   P  s    O#	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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;   ry   r   rz   r   r{   r   r0   r+   r.   r   )r)   r(  r   r.   r>   r   r   r   test_from_tripleM  s   
zTestTarget.test_from_triplec                 C   s@   t jt  }|ddddd t  }||dddd d S )Nr   rJ   r   )r"   r;   ry   r0   r=   r   )r)   r>   r   r   r   r   test_create_target_machineX  s   z%TestTarget.test_create_target_machinec                 C   <   t jt  }t j }| |jt | |j|j d S r!   )	r"   r;   ry   r0   r<   r   r8   r{   r+   r)   tur   r   r   r   `     
zTestTarget.test_namec                 C   rk  r!   )	r"   r;   ry   r0   r<   r   descriptionr{   r+   rl  r   r   r   test_descriptionf  ro  zTestTarget.test_descriptionc                 C   s8   t jt  }t|}| |j| | |j| d S r!   )r"   r;   ry   r0   r{   r   r8   rp  )r)   r>   r   r   r   r   r   l  s   zTestTarget.test_strc                 C   s4  dt jjdddddddfd	t jjdddddddfd
t jjdddddddfdt jjdddddddfdt jjdddddddfdt jjdddddddfdt jjdddddddfdt jjdddddddfdt jjd dd!d"dd#dfd$t jjd%ddd&dd'dfg
}|D ]}|\}}t |}| || qd S )(Nzx86_64-scei-ps4x86_64r   ZsceiZps4unknownELF)ZArchZSubArchZVendorZOSZEnvZObjectFormatzx86_64-sie-ps4zpowerpc-dunno-notsureZpowerpczpowerpcspe-unknown-freebsdZspeZfreebsdzarmv6hl-none-linux-gnueabiarmZv6hlrE   Zgnueabizi686-unknown-linux-gnui386Zgnuzi686-apple-macosxZapplemacosxZMachOzi686-dunno-win32ZwindowsZmsvcCOFFzs390x-ibm-zoss390xZibmZzosZGOFFzwasm64-wasiZwasm64ZwasiZWasm)r"   targetsTripleZget_triple_partsr+   )r)   casescaseZ
triple_strZ
triple_objrK  r   r   r   test_get_parts_from_tripler  s   









+
z%TestTarget.test_get_parts_from_tripleN)	r@   rA   rB   ri  rj  r   rq  r   r~  r   r   r   r   rh  K  s    rh  c                   @   ,   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"   Zcreate_target_datar(   r   r   r   r^    s   
zTestTargetData.target_datac                 C   s(   |   }|  }| ||jd d S )Nr   )r^  r6   r+   rd  re  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 )Nr  r  rb  )r^  r6   r+   rd  rf  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}| ||dd | ||dd d S )Nr  r   rJ   r   )r^  r6   r   r  Zget_element_offsetre  rf  r+   )r)   r_  r6   Zstruct_typer   r   r   test_get_struct_element_offset  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_passes  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   ra  r  r   )	r?   r^  r5   r7   rs   rc  r+   rd  re  )r)   r  r_  r4   rg  rh  r   r   r   test_target_data_from_tm  s   
z*TestTargetMachine.test_target_data_from_tmN)r@   rA   rB   r  r  r   r   r   r   r    s    r  c                   @   r  )TestPassManagerBuilderc                 C      t  S r!   )r"   ZPassManagerBuilderr(   r   r   r   pmb     zTestPassManagerBuilder.pmbc                 C   s   t  }d|_d|_d S )NrK   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     r  z!TestPassManagerBuilder.test_closec                 C   <   |   }| |jt tdD ]}||_| |j| qd S r  )r  r   r  r  r   r+   r)   r  r  r   r   r   test_opt_level     z%TestPassManagerBuilder.test_opt_levelc                 C   r  r  )r  r   
size_levelr  r   r+   r  r   r   r   test_size_level  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_threshold  s   z.TestPassManagerBuilder.test_inlining_thresholdc                 C   8   |   }| |jt dD ]}||_| |j| qd S N)TF)r  r   Zdisable_unroll_loopsr   r+   r)   r  r   r   r   r   test_disable_unroll_loops     z0TestPassManagerBuilder.test_disable_unroll_loopsc                 C   r  r  )r  r   Zloop_vectorizer   r+   r  r   r   r   test_loop_vectorize	  r  z*TestPassManagerBuilder.test_loop_vectorizec                 C   r  r  )r  r   Zslp_vectorizer   r+   r  r   r   r   test_slp_vectorize		  r  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  r  r  r  r  r  r  r   r   r   r   r    s    r  c                   @   r{  )PassManagerTestMixinc                 C   s   t  }d|_d|_|S )NrK   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   r   	  s    r  c                   @   rg  )TestModulePassManagerc                 C   r  r!   r"   r  r(   r   r   r   r  0	  r  zTestModulePassManager.pmc                 C   s   |   }|  | |  }t|}|| t|}| }t|D ]4\}}| 	drXddh}|D ]}	|	|v r= qBq5t
d||	hA  }
| d| | |
|  d S q$t
d)Nzret i32%.3%.4zexpected tokens not foundzexpected IR not found)r  r  r  r5   r{   runr]   	enumerater   re   rz   popr   assertNotIn)r)   r  r4   orig_asmopt_asmZopt_asm_splitidxltoksrm  Z
othertokenr   r   r   test_run3	  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_inlineQ	  s   


z=TestModulePassManager.test_run_with_remarks_successful_inlinec                 C   sj   |   }|d |  | | t}||\}}| | | d| | d| | d| d S )Nr   ZMissedr  znoinline function attribute)	r  r  r  r  r5   asm_inlineasm3r  r   r   r  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Zremarks_filterr   )	r  r  r  r  r5   r  r  r   r+   r  r   r   r   'test_run_with_remarks_inline_filter_outi	  s   


z=TestModulePassManager.test_run_with_remarks_inline_filter_outc                 C   sb   |   }|d |  | | t}|j|dd\}}| | | d| | d| d S )Nr  zinlin.*r  r  r  r  r  r   r   r   &test_run_with_remarks_inline_filter_inr	  s   


z<TestModulePassManager.test_run_with_remarks_inline_filter_inN)	r@   rA   rB   r  r  r  r  r  r  r   r   r   r   r  .	  s    	r  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#   finalizer  r   r   r   r   	  r  z%TestFunctionPassManager.test_initfinic                 C   sx   |   }|d}| |}|  | |  t|}|  || |	  t|}| 
d| | d| d S )Nr  r  )r5   r  r  r  r  r   r{   r#   r  r  r   r  )r)   r4   r   r  r  r  r   r   r   r  	  s   


z TestFunctionPassManager.test_runc                 C   s   |  t}|d}| |}|  |  | |  |  |	|\}}|
  | | | d| | d| d S )Nlicmr  r5   licm_asmr  r  add_licm_passr  r  r   r#   r  r  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 )Nr  r  r  r   )r5   r  r  r  r  r  r  r   r#   r  r  r   r+   r  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 )Nr  r  r  r  r  r   r   r   test_run_with_remarks_filter_in	  s   



z7TestFunctionPassManager.test_run_with_remarks_filter_inr!   )	r@   rA   rB   r  r   r  r  r  r  r   r   r   r   r  }	  s    
r  c                   @   sB   e Zd Zdd Zdd Zee 	dddd Z
d	d
 ZdS )
TestPassesc                 C   r  r!   r  r(   r   r   r   r  	  r  zTestPasses.pmc                 C   sD  t jd }|  }|d |  |  |  |d |  |	  |
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |dk r{|  |  |d |   |!  |"  |#  |$  |%  |&  |'  |(  |)  |*  |+  |,  |-  |.  |dk r|/  |0  |1  |2  |3  |4  |5  |6  |7  |8  |9  |:  |;  |<  |=  |>  |?  |@  |A  |B  |C  |D  |E  d S )Nr   r      r      )Fr"   r   r  add_target_library_infoZadd_constant_merge_passZadd_dead_arg_elimination_passZadd_function_attrs_passr  Zadd_global_dce_passZadd_global_optimizer_passZadd_ipsccp_passZadd_dead_code_elimination_passZadd_cfg_simplification_passZadd_gvn_passadd_instruction_combining_passr  Zadd_sccp_passZadd_sroa_passZ"add_type_based_alias_analysis_passZadd_basic_alias_analysis_passadd_loop_rotate_passZadd_region_info_passZadd_scalar_evolution_aa_passZ)add_aggressive_dead_code_elimination_passadd_aa_eval_passZadd_always_inliner_passZadd_break_critical_edges_passZadd_dead_store_elimination_passZ*add_reverse_post_order_function_attrs_passZ)add_aggressive_instruction_combining_passZadd_internalize_passadd_jump_threading_passZadd_lcssa_passZadd_loop_deletion_passZadd_loop_extractor_passZadd_single_loop_extractor_passZadd_loop_strength_reduce_passZadd_loop_simplification_passadd_loop_unroll_passZadd_loop_unroll_and_jam_passZadd_lower_atomic_passZadd_lower_invoke_passZadd_lower_switch_passZadd_memcpy_optimization_passZadd_merge_functions_passZadd_merge_returns_passZadd_partial_inlining_passZ!add_prune_exception_handling_passZ add_reassociate_expressions_passZ"add_demote_register_to_memory_passZadd_sink_passZadd_strip_symbols_passZadd_strip_dead_debug_info_passZadd_strip_dead_prototypes_passZadd_strip_debug_declare_passZadd_strip_nondebug_symbols_passZadd_tail_call_elimination_passZadd_basic_aa_passZadd_dependence_analysis_passZadd_dot_call_graph_passZadd_dot_cfg_printer_passZadd_dot_dom_printer_passZadd_dot_postdom_printer_passZadd_globals_mod_ref_aa_passZadd_iv_users_passZadd_lazy_value_info_passZadd_lint_passZadd_module_debug_info_passadd_refprune_passadd_instruction_namer_pass)r)   Zllvm_verr  r   r   r   test_populate	  s   



zTestPasses.test_populater  r  c                 C   sP   dd }|dd}|  dt| |dd}| dt| |  dt| dS )	zTest a specific situation that demonstrate TLI is affecting
        optimization. See https://github.com/numba/numba/issues/8898.
        c                 S   sX   t t}t j|j}| }t  }|| | r!|	|j |
  || |S r!   )r"   r1   asm_tli_exp2r;   ry   r.   r=   ModulePassManagerr  r  r  r  )use_tlir4   r>   r  r  r   r   r   r  
  s   


z9TestPasses.test_target_library_info_behavior.<locals>.runT)r  zcall float @llvm.exp2.f32Fzcall float @ldexpfN)r   r{   r  )r)   r  r4   r   r   r   !test_target_library_info_behavior
  s   

z,TestPasses.test_target_library_info_behaviorc                 C   sz   t jt d}t|}t }|  || |d}t	|j
}t|j}| |d jd | |d jd d S )Nr-   r   r   r  rJ   i2)r  r/   r"   r0   r1   r  r  r  r  nextr  r   r  r+   r8   )r)   r2   r4   r  r   Zfirst_blockr  r   r   r   test_instruction_namer_pass1
  s   




z&TestPasses.test_instruction_namer_passN)r@   rA   rB   r  r  rq   rr   rc   machinere   r  r  r   r   r   r   r  	  s    N
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   rz   r"   load_library_permanentlyr(   r   r   r   test_bad_libraryD
  s   "zTestDylib.test_bad_library)Linuxztest only works on Linuxc                 C   s   t d}t| d S )Nrm   )r   r"   r  )r)   rN   r   r   r   	test_libmH
  s   zTestDylib.test_libmN)	r@   rA   rB   r  rq   rr   rc   systemr  r   r   r   r   r  B
  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   ra   r   )r)   rm   r   r   r   rV  yzr   r   r   build_ir_moduleP
  s   "

zTestAnalysis.build_ir_modulec                 C   sJ   |   }|d}t|}tj|dd}d}| || | || d S )Nr   FZ	show_instz%.5 = add i32 %.1, %.2)r  Z
get_globalr"   get_function_cfgr   r  )r)   r4   r   dot_showing_instdot_without_instr  r   r   r   test_get_function_cfg_on_irZ
  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  FZdigraphzCFG for 'sum' functionz%.3 = add i32 %.1, %.2)r5   r  r"   r  r   r  )r)   r  r  r  prefixfnamer  r   r   r   test_function_cfg_on_llvm_valuec
  s   z,TestAnalysis.test_function_cfg_on_llvm_valueN)r@   rA   rB   r  r  r  r   r   r   r   r  O
  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_parsingv
  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    n1 sUw   Y  |   (}tjjtddtddgdd}t||jd}||_W d    d S 1 sw   Y  d S )Nr   r   rJ   TrR  rK   )	r  r   rT  r   rZ  r   ZinitializerZliteral_structre  )r)   r4   typr  constr   r   r   test_literal_struct
  s*   


"z#TestTypeParsing.test_literal_structN)r@   rA   rB   r   r  r  r   r   r   r   r  u
  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 )Nr  r  r   r  r  )r5   asm_global_ctorsr:   rA  Zrun_static_constructorsZget_global_value_addressr   POINTERr   castr+   contentsr  rB  r   Zrun_static_destructors)r)   r4   rC  Zptr_addrZptr_tr  Zfoo_addrr   r   r   r   r  
  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   Zundef)	r   r   r   rZ  r  r{   r   r  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
  rq  z)TestGlobalVariables.test_external_linkagec                 C   r  )NZ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  )NZlinkoncer  r(   r   r   r   test_linkonce_linkage
  r   z)TestGlobalVariables.test_linkonce_linkagec                 C   r  )NZweakr  r(   r   r   r   test_weak_linkage
  r   z%TestGlobalVariables.test_weak_linkagec                 C   r  )NZ	appendingr  r(   r   r   r   test_appending_linkage
  r   z*TestGlobalVariables.test_appending_linkagec                 C   r  )NZextern_weakFr  r  r(   r   r   r   test_extern_weak_linkage
  rq  z,TestGlobalVariables.test_extern_weak_linkagec                 C   r  )NZlinkonce_odrr  r(   r   r   r   test_linkonce_odr_linkage
  r   z-TestGlobalVariables.test_linkonce_odr_linkagec                 C   r  )NZ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
  zonly on x86c                   @   r  )TestInlineAsmc                 C   s:   t   | jtd}| jdd}||}| d| d S )N)r2   Fr9   Znop)r"   Zinitialize_native_asmparserr5   r  r?   r   r   )r)   rm   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  | } qWq| 
| d S )NFr9   r  Tr   )r?   r5   r  r"   ObjectFileRef	from_datasectionsis_textr   r8   r   sizer`   dataaddress)r)   r?   r4   r  objZhas_textZ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_twicerK   r  r  )r?   r5   r  r"   r!  r"  r  mod_asmr  r   r   rB  r+   )r)   r?   r4   r  r(  r:   r*  r   r   r   r    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   r  r*  rK   r  r  )r?   r5   r  r   rQ   r  r  flushr   r"   r  r+  r  r  r   r   rB  r+   )	r)   r?   r4   r  r  r  r(  r:   r*  r   r   r   r  '  s&   




z3TestObjectFile.test_add_object_file_from_filesystemc                 C   sX   t t}tj|}| D ]}| r)| t	|
 d | |
  t qd S )N   )rs  fromhexissue_632_elfr"   r!  r"  r#  r$  r+   r`   r&  hexissue_632_text)r)   Zelfr(  r   r   r   r   test_get_section_contentA  s   
z'TestObjectFile.test_get_section_contentN)r@   rA   rB   r+  r)  r  r  r2  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 reportrJ   )r"   r  r  r  r  Zset_time_passesr  r5   report_and_reset_timingsr   r{   r+   count)r)   mpr  reportr   r   r   test_reportingM  s   

zTestTimePasses.test_reportingc                 C   s   |  t  d S r!   )rU  r"   r4  r(   r   r   r   test_empty_report`  s   z TestTimePasses.test_empty_reportN)r@   rA   rB   r8  r9  r   r   r   r   r3  L  s    r3  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acqrk  r   eventsr   r   r<  i  r   z6TestLLVMLockCallbacks.test_lock_callbacks.<locals>.acqc                      r;  )Nrelrk  r   r=  r   r   r?  l  r   z6TestLLVMLockCallbacks.test_lock_callbacks.<locals>.relr<  r?  )	r"   r
   Zregister_lock_callbackrU  r  r   Zunregister_lock_callbackr   r  )r)   r<  r?  r   r=  r   test_lock_callbacksf  s   
"z)TestLLVMLockCallbacks.test_lock_callbacksN)r@   rA   rB   r@  r   r   r   r   r:  e  r	  r:  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d Z	dd Z
dd Zdd ZdS )TestPipelineTuningOptionsc                 C   r  r!   )r"   create_pipeline_tuning_optionsr(   r   r   r   pto  r  zTestPipelineTuningOptions.ptoc                 C      |   }|  d S r!   )rC  r   r)   rC  r   r   r   r        z$TestPipelineTuningOptions.test_closec                 C   r  r  )rC  r   speed_levelr  r   r+   r)   rC  r  r   r   r   test_speed_level  r  z*TestPipelineTuningOptions.test_speed_levelc                 C   r  Nr  )rC  r   r  r  r   r+   rH  r   r   r   r    r  z)TestPipelineTuningOptions.test_size_levelc                 C   r  r  )rC  r   loop_interleavingr   r+   r)   rC  r   r   r   r   test_loop_interleaving  r  z0TestPipelineTuningOptions.test_loop_interleavingc                 C   r  r  )rC  r   loop_vectorizationr   r+   rL  r   r   r   test_loop_vectorization  r  z1TestPipelineTuningOptions.test_loop_vectorizationc                 C   r  r  )rC  r   slp_vectorizationr   r+   rL  r   r   r   test_slp_vectorization  r  z0TestPipelineTuningOptions.test_slp_vectorizationc                 C   r  r  )rC  r   loop_unrollingr   r+   rL  r   r   r   test_loop_unrolling  r  z-TestPipelineTuningOptions.test_loop_unrollingc                 C   sn   |   }| t d|_W d    n1 sw   Y  | t d|_W d    d S 1 s0w   Y  d S )Nr  r  )rC  r   r  rG  rE  r   r   r   test_speed_level_constraints  s   "z6TestPipelineTuningOptions.test_speed_level_constraintsc                 C   s   |   }| t d|_W d    n1 sw   Y  | t d|_W d    n1 s/w   Y  | t d|_d|_W d    d S 1 sKw   Y  d S )Nr  r  rK   )rC  r   r  r  rG  rE  r   r   r   test_size_level_constraints  s   "z5TestPipelineTuningOptions.test_size_level_constraintsN)r@   rA   rB   rC  r   rI  r  rM  rO  rQ  rS  rT  rU  r   r   r   r   rA    s    rA  c                   @   s   e Zd ZdddZdS )NewPassManagerMixinr   c                 C   s(   | j dd}t||}t||}|S r  )r?   r"   rB  create_pass_builder)r)   rG  r  r  rC  pbr   r   r   rX    s   zNewPassManagerMixin.pbN)r   r   )r@   rA   rB   rX  r   r   r   r   rV    s    rV  c                   @   r  )
TestPassBuilderc                 C   rD  r!   )rX  r   )r)   rX  r   r   r   r     rF  zTestPassBuilder.test_closec                 C   sN   | j dd}tdd}d|_d|_d|_d|_d|_t||}|	  d S )NFr9   r  r   rK   T)
r?   r"   rB  r  rK  rN  rP  rR  rW  r   )r)   r  rC  rX  r   r   r   test_pto  s   zTestPassBuilder.test_ptoc                 C   s,   |   }| }||  | |  d S r!   )rX  getModulePassManagerr  r5   r   )r)   rX  mpmr   r   r   test_get_module_pass_manager  s   z,TestPassBuilder.test_get_module_pass_managerc                 C   s2   |   }| }||  d| |  d S r  )rX  getFunctionPassManagerr  r5   r  r   )r)   rX  fpmr   r   r   test_get_function_pass_manager  s   z.TestPassBuilder.test_get_function_pass_managerN)r@   rA   rB   r   rZ  r]  r`  r   r   r   r   rY    s
    rY  c                   @   sL   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S )TestNewModulePassManagerc                 C   r  r!   )r"   Zcreate_new_module_pass_managerr(   r   r   r   r    r  zTestNewModulePassManager.pmc                 C   sB   |   }t|}| j|dd}| }||| t|}||fS )Nr   rG  r  )r5   r{   rX  r[  r  )r)   levelr4   r  rX  r\  optimized_asmr   r   r   run_o_n  s   z TestNewModulePassManager.run_o_nc                 C   rD  r!   r  r)   r\  r   r   r   r     rF  z#TestNewModulePassManager.test_closec                 C   *   |  d\}}| d| | d| d S Nr  r  re  r   r  r)   r  rd  r   r   r   test_run_o3     z$TestNewModulePassManager.test_run_o3c                 C   *   |  d\}}| d| | d| d S Nr   r  re  r   rj  r   r   r   test_run_o0  rl  z$TestNewModulePassManager.test_run_o0c                 C   sZ   |   }|  }|  | t}t|}||| t|}| d| | d| d S )Nr  )	rX  r  add_instruction_combine_passr5   asm_sum4r{   r  r   r  )r)   rX  r\  r4   r  rd  r   r   r   test_instcombine  s   
z)TestNewModulePassManager.test_instcombinec                 C   s   | j ddd}ttdd}t|}| }||| t|}| d| | 	d| tt}| }t|}||| t|}| d| | d| d S )Nr  r   rb  optnone r   alloca)
rX  r{   asm_alloca_optnonereplacer"   r1   r[  r  r   r  )r)   rX  r  r4   r\  rd  orig_asm_optnoneoptimized_asm_optnoner   r   r   test_optnone  s   

z%TestNewModulePassManager.test_optnonec                 C   sL   |   }|  |  |  |  |  |  |  |  d S r!   )	r  Zadd_verifierr  add_simplify_cfg_passr  r  rq  r  r  rf  r   r   r   test_add_passes/  s   z(TestNewModulePassManager.test_add_passesN)r@   rA   rB   r  re  r   rk  rp  rs  rz  r|  r   r   r   r   ra    s    	ra  c                   @   sT   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S )TestNewFunctionPassManagerc                 C   r  r!   )r"   Z create_new_function_pass_managerr(   r   r   r   r  <  r  zTestNewFunctionPassManager.pmc                 C   rD  r!   r  r)   r_  r   r   r   r   ?  rF  z%TestNewFunctionPassManager.test_closec                 C   sL   |   }|d}t|}| j|dd}| }||| t|}||fS )Nr  r   rb  )r5   r  r{   rX  r^  r  )r)   rc  r4   funr  rX  r_  rd  r   r   r   re  C  s   
z"TestNewFunctionPassManager.run_o_nc                 C   rg  rh  ri  rj  r   r   r   rk  M  rl  z&TestNewFunctionPassManager.test_run_o3c                 C   rm  rn  ro  rj  r   r   r   rp  R  rl  z&TestNewFunctionPassManager.test_run_o0c                 C   s   | j ddd}ttdd}t|d}| }||| t|}| 	d| | 
d| tt}t|d}| }||| t|}| 	d| | 	d| d S )Nr  r   rb  rt  r   r   ru  )rX  r{   rv  rw  r"   r1   r  r^  r  r   r  )r)   rX  r  r  r_  rd  rx  ry  r   r   r   rz  W  s   z'TestNewFunctionPassManager.test_optnonec                 C   s`   |   }|  }| td}|  t|}||| t|}| d| | 	d| d S )Nr  r  )
rX  r  r5   rr  r  rq  r{   r  r   r  )r)   rX  r_  r  r  rd  r   r   r   rs  j  s   z+TestNewFunctionPassManager.test_instcombinec                 C   s4   |  d}| }ttjD ]}||| qd S rJ  )rX  r^  r"   r1   asm_declarationr  r  )r)   rX  r_  r  r   r   r   test_declarationsv  s
   
z,TestNewFunctionPassManager.test_declarationsc                 C   sD   |   }|  |  |  |  |  |  |  d S r!   )r  r  r{  r  r  rq  r  r  r~  r   r   r   r|  |  s   z*TestNewFunctionPassManager.test_add_passesN)r@   rA   rB   r  r   re  rk  rp  rz  rs  r  r|  r   r   r   r   r}  ;  s    
r}  __main__)hr   r  r   r   r   Zctypes.utilr   r$   r   rQ   rc   rY   rT   rs   rq   
contextlibr   tempfiler   Zllvmliter   r	   r"   Zllvmlite.bindingr
   Zllvmlite.testsr   r   r  r  r   rC   r4  r  rr  r,  r  r  rd   rw  r   r   r  r5  r  r   r  r  r  r  r  r  r   r  r   r   r   r  rv  r  r/  r1  r  r  rc  re  r    rD   ru   r   r   objectr@  r|  r  rr   re   r  r  r   rh  r  r  r  r  r  r  r  r  r  r  r  r
  r  r   r3  r:  rA  rV  rY  ra  r}  r@   mainr   r   r   r   <module>   s    





D(-4"*I  D : A  = |[JOG~&$7	XM	E
L