2
2
#
3
3
# SPDX-License-Identifier: LicenseRef-NVIDIA-SOFTWARE-LICENSE
4
4
5
- import base64
5
+ import binascii
6
6
import re
7
+ import textwrap
7
8
from contextlib import contextmanager
8
9
9
10
import pytest
10
11
11
12
from cuda .bindings import nvvm
12
13
14
+ MINIMAL_NVVMIR_FIXTURE_PARAMS = ["txt" , "bitcode_static" ]
15
+ try :
16
+ import llvmlite .binding as llvmlite_binding # Optional test dependency.
17
+ except ImportError :
18
+ llvmlite_binding = None
19
+ else :
20
+ MINIMAL_NVVMIR_FIXTURE_PARAMS .append ("bitcode_dynamic" )
21
+
13
22
MINIMAL_NVVMIR_TXT = b"""\
14
23
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-i128:128:128-f32:32:32-f64:64:64-v16:16:16-v32:32:32-v64:64:64-v128:128:128-n16:32:64"
15
24
24
33
!0 = !{void ()* @kernel, !"kernel", i32 1}
25
34
26
35
!nvvmir.version = !{!1}
27
- !1 = !{i32 2 , i32 0, i32 3 , i32 1 }
36
+ !1 = !{i32 %d , i32 0, i32 %d , i32 0 }
28
37
""" # noqa: E501
29
38
30
- # Equivalent to MINIMAL_NVVMIR_TXT
31
- MINIMAL_NVVMIR_BITCODE = base64 .b64decode ("""
32
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- AEBig0BRlAAAgCwQBgAAADIemAwZEUyQjAkmR8YEQ2IJFMEIQBkAALEYAABtAAAAMwiAHMThHGYU
41
- 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
- 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
- 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
- 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
- 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
- 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
- YId3eAd4mFFM9JAP8FAOMx5qHsphHOghHd7BHX4BHuShHMwhHfBhBlSFgzjMwzuwQz3QQzn8wjzk
48
- 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
- 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
- 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
- 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
- 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
- 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
- AAABAAAAaAAAAAAAAAALAAAAEwAAAB4AAAARAAAALwAAAAAAAAAAAAAAAQAAAAAAAAAAAAAABgAA
55
- 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
- dmlkaWEtY3VkYW1pbmltYWxfbnZ2bWlyLmxsAAAAAAA=
57
- """ )
58
- # To regenerate, pull and start a docker container:
59
- # docker pull centos/llvm-toolset-7-centos7
60
- # docker run -it centos/llvm-toolset-7-centos7 /bin/bash
61
- # In the docker container, copy MINIMAL_NVVMIR_TXT to a file with name minimal_nvvmir.ll
62
- # Then run:
63
- # llvm-as minimal_nvvmir.ll -o minimal_nvvmir.bc
64
- # Save this to encode.py:
65
- # import base64, sys, textwrap
66
- # bitcode = open(sys.argv[1], "rb").read()
67
- # encoded_bitcode = base64.b64encode(bitcode).decode("ascii")
68
- # wrapped_base64 = "\n".join(textwrap.wrap(encoded_bitcode, width=76))
69
- # print(wrapped_base64)
70
- # Then run:
71
- # python encode.py minimal_nvvmir.bc
72
-
73
-
74
- @pytest .fixture (params = ["txt" , "bitcode" ])
39
+ MINIMAL_NVVMIR_BITCODE_STATIC = {
40
+ (1 , 3 ): # (major, debug_major)
41
+ "4243c0de3514000005000000620c30244a59be669dfbb4bf0b51804c01000000210c00007f010000"
42
+ "0b02210002000000160000000781239141c80449061032399201840c250508191e048b62800c4502"
43
+ "42920b42641032143808184b0a3232884870c421234412878c1041920264c808b1142043468820c9"
44
+ "01323284182a282a90317cb05c9120c3c8000000892000000b0000003222c80820624600212b2498"
45
+ "0c212524980c19270c85a4906032645c20246382a01801300128030173046000132677b00778a007"
46
+ "7cb0033a680377b0877420877408873618877a208770d8e012e5d006f0a0077640077a600774a007"
47
+ "7640076d900e71a00778a00778d006e980077a80077a80076d900e7160077a100776a0077160076d"
48
+ "900e7320077a300772a0077320076d900e7640077a600774a0077640076d900e71200778a0077120"
49
+ "0778a00771200778d006e6300772a0077320077a300772d006e6600774a0077640077a600774d006"
50
+ "f6100776a0077160077a100776d006f6300772a0077320077a300772d006f6600774a0077640077a"
51
+ "600774d006f610077280077a10077280077a10077280076de00e7160077a300772a0077640071a21"
52
+ "4c0e11de9c2e4fbbcfbe211560040000000000000000000000000620b141a0e86000004016080000"
53
+ "06000000321e980c19114c908c092647c6044362098c009401000000b1180000ac0000003308801c"
54
+ "c4e11c6614013d88433884c38c4280077978077398710ce6000fed100ef4800e330c421ec2c11dce"
55
+ "a11c6630053d88433884831bcc033dc8433d8c033dcc788c7470077b08077948877070077a700376"
56
+ "788770208719cc110eec900ee1300f6e300fe3f00ef0500e3310c41dde211cd8211dc2611e663089"
57
+ "3bbc833bd04339b4033cbc833c84033bccf0147660077b6807376887726807378087709087706007"
58
+ "76280776f8057678877780875f08877118877298877998812ceef00eeee00ef5c00eec300362c8a1"
59
+ "1ce4a11ccca11ce4a11cdc611cca211cc4811dca6106d6904339c84339984339c84339b8c3389443"
60
+ "3888033b94c32fbc833cfc823bd4033bb0c30cc7698770588772708374680778608774188774a087"
61
+ "19ce530fee000ff2500ee4900ee3400fe1200eec500e3320281ddcc11ec2411ed2211cdc811edce0"
62
+ "1ce4e11dea011e66185138b0433a9c833bcc50247660077b68073760877778077898514cf4900ff0"
63
+ "500e331e6a1eca611ce8211ddec11d7e011ee4a11ccc211df0610654858338ccc33bb0433dd04339"
64
+ "fcc23ce4433b88c33bb0c38cc50a877998877718877408077a28077298815ce3100eecc00ee5500e"
65
+ "f33023c1d2411ee4e117d8e11dde011e6648193bb0833db4831b84c3388c4339ccc33cb8c139c8c3"
66
+ "3bd4033ccc48b471080776600771088771588719dbc60eec600fede006f0200fe5300fe5200ff650"
67
+ "0e6e100ee3300ee5300ff3e006e9e00ee4500ef83023e2ec611cc2811dd8e117ec211de6211dc421"
68
+ "1dd8211de8211f66209d3bbc433db80339948339cc58bc7070077778077a08077a488777708719cb"
69
+ "e70eef300fe1e00ee9400fe9a00fe530c3010373a8077718875f988770708774a08774d087729881"
70
+ "844139e0c338b0433d904339cc40c4a01dcaa11de0411edec11c662463300ee1c00eec300fe9400f"
71
+ "e5000000792000001d000000721e482043880c19097232482023818c9191d144a01028643c313242"
72
+ "8e9021a318100a00060000006b65726e656c0000230802308240042308843082400c330c4230cc40"
73
+ "0c4441c84860821272b3b36b730973737ba30ba34b7b739b1b2528d271b3b36b4b9373b12b939b4b"
74
+ "7b731b2530000000a9180000250000000b0a7228877780077a587098433db8c338b04339d0c382e6"
75
+ "1cc6a10de8411ec2c11de6211de8211ddec11d1634e3600ee7500fe1200fe4400fe1200fe7500ef4"
76
+ "b08081077928877060077678877108077a28077258709cc338b4013ba4833d94c3026b1cd8211cdc"
77
+ "e11cdc201ce4611cdc201ce8811ec2611cd0a11cc8611cc2811dd861c1010ff4200fe1500ff4800e"
78
+ "00000000d11000000600000007cc3ca4833b9c033b94033da0833c94433890c30100000061200000"
79
+ "06000000130481860301000002000000075010cd14610000000000007120000003000000320e1022"
80
+ "8400fb020000000000000000650c00001f000000120394f000000000030000000600000006000000"
81
+ "4c000000010000005800000000000000580000000100000070000000000000000c00000013000000"
82
+ "1f000000080000000600000000000000700000000000000000000000010000000000000000000000"
83
+ "060000000000000006000000ffffffff00240000000000005d0c00000d0000001203946700000000"
84
+ "6b65726e656c31352e302e376e7670747836342d6e76696469612d637564613c737472696e673e00"
85
+ "00000000" ,
86
+ (2 , 3 ): # (major, debug_major)
87
+ "4243c0de3514000005000000620c30244a59be669dfbb4bf0b51804c01000000210c000080010000"
88
+ "0b02210002000000160000000781239141c80449061032399201840c250508191e048b62800c4502"
89
+ "42920b42641032143808184b0a3232884870c421234412878c1041920264c808b1142043468820c9"
90
+ "01323284182a282a90317cb05c9120c3c8000000892000000b0000003222c80820624600212b2498"
91
+ "0c212524980c19270c85a4906032645c20246382a01801300128030173046000132677b00778a007"
92
+ "7cb0033a680377b0877420877408873618877a208770d8e012e5d006f0a0077640077a600774a007"
93
+ "7640076d900e71a00778a00778d006e980077a80077a80076d900e7160077a100776a0077160076d"
94
+ "900e7320077a300772a0077320076d900e7640077a600774a0077640076d900e71200778a0077120"
95
+ "0778a00771200778d006e6300772a0077320077a300772d006e6600774a0077640077a600774d006"
96
+ "f6100776a0077160077a100776d006f6300772a0077320077a300772d006f6600774a0077640077a"
97
+ "600774d006f610077280077a10077280077a10077280076de00e7160077a300772a0077640071a21"
98
+ "4c0e11de9c2e4fbbcfbe211560040000000000000000000000000620b141a0286100004016080000"
99
+ "06000000321e980c19114c908c092647c60443620914c10840190000b1180000ac0000003308801c"
100
+ "c4e11c6614013d88433884c38c4280077978077398710ce6000fed100ef4800e330c421ec2c11dce"
101
+ "a11c6630053d88433884831bcc033dc8433d8c033dcc788c7470077b08077948877070077a700376"
102
+ "788770208719cc110eec900ee1300f6e300fe3f00ef0500e3310c41dde211cd8211dc2611e663089"
103
+ "3bbc833bd04339b4033cbc833c84033bccf0147660077b6807376887726807378087709087706007"
104
+ "76280776f8057678877780875f08877118877298877998812ceef00eeee00ef5c00eec300362c8a1"
105
+ "1ce4a11ccca11ce4a11cdc611cca211cc4811dca6106d6904339c84339984339c84339b8c3389443"
106
+ "3888033b94c32fbc833cfc823bd4033bb0c30cc7698770588772708374680778608774188774a087"
107
+ "19ce530fee000ff2500ee4900ee3400fe1200eec500e3320281ddcc11ec2411ed2211cdc811edce0"
108
+ "1ce4e11dea011e66185138b0433a9c833bcc50247660077b68073760877778077898514cf4900ff0"
109
+ "500e331e6a1eca611ce8211ddec11d7e011ee4a11ccc211df0610654858338ccc33bb0433dd04339"
110
+ "fcc23ce4433b88c33bb0c38cc50a877998877718877408077a28077298815ce3100eecc00ee5500e"
111
+ "f33023c1d2411ee4e117d8e11dde011e6648193bb0833db4831b84c3388c4339ccc33cb8c139c8c3"
112
+ "3bd4033ccc48b471080776600771088771588719dbc60eec600fede006f0200fe5300fe5200ff650"
113
+ "0e6e100ee3300ee5300ff3e006e9e00ee4500ef83023e2ec611cc2811dd8e117ec211de6211dc421"
114
+ "1dd8211de8211f66209d3bbc433db80339948339cc58bc7070077778077a08077a488777708719cb"
115
+ "e70eef300fe1e00ee9400fe9a00fe530c3010373a8077718875f988770708774a08774d087729881"
116
+ "844139e0c338b0433d904339cc40c4a01dcaa11de0411edec11c662463300ee1c00eec300fe9400f"
117
+ "e5000000792000001e000000721e482043880c19097232482023818c9191d144a01028643c313242"
118
+ "8e9021a318100a00060000006b65726e656c0000230802308240042308843082400c23080431c320"
119
+ "04c30c045118858c04262821373bbb36973037b737ba30bab437b7b95102231d373bbbb6343917bb"
120
+ "32b9b9b437b7518203000000a9180000250000000b0a7228877780077a587098433db8c338b04339"
121
+ "d0c382e61cc6a10de8411ec2c11de6211de8211ddec11d1634e3600ee7500fe1200fe4400fe1200f"
122
+ "e7500ef4b08081077928877060077678877108077a28077258709cc338b4013ba4833d94c3026b1c"
123
+ "d8211cdce11cdc201ce4611cdc201ce8811ec2611cd0a11cc8611cc2811dd861c1010ff4200fe150"
124
+ "0ff4800e00000000d11000000600000007cc3ca4833b9c033b94033da0833c94433890c301000000"
125
+ "6120000006000000130481860301000002000000075010cd14610000000000007120000003000000"
126
+ "320e10228400fc020000000000000000650c00001f000000120394f0000000000300000006000000"
127
+ "060000004c000000010000005800000000000000580000000100000070000000000000000c000000"
128
+ "130000001f0000000800000006000000000000007000000000000000000000000100000000000000"
129
+ "00000000060000000000000006000000ffffffff00240000000000005d0c00000d00000012039467"
130
+ "000000006b65726e656c31352e302e376e7670747836342d6e76696469612d637564613c73747269"
131
+ "6e673e0000000000" ,
132
+ }
133
+
134
+ MINIMAL_NVVMIR_CACHE = {}
135
+
136
+
137
+ @pytest .fixture (params = MINIMAL_NVVMIR_FIXTURE_PARAMS )
75
138
def minimal_nvvmir (request ):
76
- return MINIMAL_NVVMIR_TXT if request .param == "txt" else MINIMAL_NVVMIR_BITCODE
139
+ for pass_counter in range (2 ):
140
+ nvvmir = MINIMAL_NVVMIR_CACHE .get (request .param , - 1 )
141
+ if nvvmir != - 1 :
142
+ if nvvmir is None :
143
+ pytest .skip (f"UNAVAILABLE: { request .param } " )
144
+ return nvvmir
145
+ if pass_counter :
146
+ raise AssertionError ("This code path is meant to be unreachable." )
147
+ # Build cache entries, then try again (above).
148
+ major , minor , debug_major , debug_minor = nvvm .ir_version ()
149
+ txt = MINIMAL_NVVMIR_TXT % (major , debug_major )
150
+ if llvmlite_binding is None :
151
+ bitcode_dynamic = None
152
+ else :
153
+ bitcode_dynamic = llvmlite_binding .parse_assembly (txt .decode ()).as_bitcode ()
154
+ bitcode_static = MINIMAL_NVVMIR_BITCODE_STATIC .get ((major , debug_major ))
155
+ if bitcode_static is not None :
156
+ bitcode_static = binascii .unhexlify (bitcode_static )
157
+ MINIMAL_NVVMIR_CACHE ["txt" ] = txt
158
+ MINIMAL_NVVMIR_CACHE ["bitcode_dynamic" ] = bitcode_dynamic
159
+ MINIMAL_NVVMIR_CACHE ["bitcode_static" ] = bitcode_static
160
+ if bitcode_static is None :
161
+ if bitcode_dynamic is None :
162
+ raise RuntimeError ("Please `pip install llvmlite` to generate `bitcode_static` (see PR #443)" )
163
+ bitcode_hex = binascii .hexlify (bitcode_dynamic ).decode ("ascii" )
164
+ print ("\n \n MINIMAL_NVVMIR_BITCODE_STATIC = { # PLEASE ADD TO test_nvvm.py" )
165
+ print (f" ({ major } , { debug_major } ): # (major, debug_major)" )
166
+ lines = textwrap .wrap (bitcode_hex , width = 80 )
167
+ for line in lines [:- 1 ]:
168
+ print (f' "{ line } "' )
169
+ print (f' "{ lines [- 1 ]} ",' )
170
+ print ("}\n " , flush = True )
77
171
78
172
79
173
@pytest .fixture (params = [nvvm .compile_program , nvvm .verify_program ])
@@ -103,13 +197,13 @@ def get_program_log(prog):
103
197
def test_nvvm_version ():
104
198
ver = nvvm .version ()
105
199
assert len (ver ) == 2
106
- assert ver >= (2 , 0 )
200
+ assert ver >= (1 , 0 )
107
201
108
202
109
203
def test_nvvm_ir_version ():
110
204
ver = nvvm .ir_version ()
111
205
assert len (ver ) == 4
112
- assert ver >= (2 , 0 , 3 , 1 )
206
+ assert ver >= (1 , 0 , 0 , 0 )
113
207
114
208
115
209
def test_create_and_destroy ():
@@ -167,7 +261,7 @@ def test_get_buffer_empty(get_size, get_buffer):
167
261
168
262
169
263
@pytest .mark .parametrize ("options" , [[], ["-opt=0" ], ["-opt=3" , "-g" ]])
170
- def test_compile_program_with_minimal_nnvm_ir (minimal_nvvmir , options ):
264
+ def test_compile_program_with_minimal_nvvm_ir (minimal_nvvmir , options ):
171
265
with nvvm_program () as prog :
172
266
nvvm .add_module_to_program (prog , minimal_nvvmir , len (minimal_nvvmir ), "FileNameHere.ll" )
173
267
try :
@@ -187,7 +281,7 @@ def test_compile_program_with_minimal_nnvm_ir(minimal_nvvmir, options):
187
281
188
282
189
283
@pytest .mark .parametrize ("options" , [[], ["-opt=0" ], ["-opt=3" , "-g" ]])
190
- def test_verify_program_with_minimal_nnvm_ir (minimal_nvvmir , options ):
284
+ def test_verify_program_with_minimal_nvvm_ir (minimal_nvvmir , options ):
191
285
with nvvm_program () as prog :
192
286
nvvm .add_module_to_program (prog , minimal_nvvmir , len (minimal_nvvmir ), "FileNameHere.ll" )
193
287
nvvm .verify_program (prog , len (options ), options )
0 commit comments