• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright (c) 2021 Huawei Device Co., Ltd.
2# Licensed under the Apache License, Version 2.0 (the "License");
3# you may not use this file except in compliance with the License.
4# You may obtain a copy of the License at
5#
6# http://www.apache.org/licenses/LICENSE-2.0
7#
8# Unless required by applicable law or agreed to in writing, software
9# distributed under the License is distributed on an "AS IS" BASIS,
10# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11# See the License for the specific language governing permissions and
12# limitations under the License.
13
14definitions:
15  - name: pandasm_header
16    template: |
17      .language PandaAssembly
18
19      .record panda.Object <external>
20
21      .record Q {}
22      .function void Q.ctor(Q a0) <ctor> {
23        return.void
24      }
25
26      .record R {
27        u1             fu1        <static>
28        u8             fu8        <static>
29        i8             fi8        <static>
30        u16            fu16       <static>
31        i16            fi16       <static>
32        u32            fu32       <static>
33        i32            fi32       <static>
34        u64            fu64       <static>
35        i64            fi64       <static>
36        f32            ff32       <static>
37        f64            ff64       <static>
38        # objects:
39        i32[]          fi32Array  <static>
40        Q              fQ         <static>
41        Q[]            fQArray    <static>
42        panda.Object   fObj       <static>
43        panda.Object[] fObjArray  <static>
44      }
45
46tests:
47  - file-name: "ststatic"
48    isa:
49      title: Store to static field
50      description: >
51        Store accumulator content into static field by field_id. For non-object variant the size of actually stored
52        value is determined by field_id, other accumulator bits are discarded.
53      instructions:
54        - sig: ststatic field_id
55          acc: in:i32
56          format: [op_id_16]
57    commands:
58
59      - file-name: "check_if_acc_initialized"
60        description: Check that verifier reports an error if accumulator is not initialized
61        isa:
62          description: Store accumulator content into static field by field_id.
63        header-template: ['pandasm_header']
64        check-type: exit-positive
65        tags: ['verifier']
66        bugid: ['1324']
67        runner-options: ['verifier-failure', 'verifier-debug-config']
68        code-template: |
69
70          .function i32 main() {
71            # acc (value) not initialized, verifier error expected
72            ststatic R.fi32
73
74
75      - file-name: "with_non_static_field_id"
76        description: Check that verifier reports an error if the field_id doesn't resolve to a static valid field
77        isa:
78          verification:
79            - field_id_static
80        header-template: []
81        check-type: exit-positive
82        code-template: |
83          .record W {
84            u1    fu1
85            i8    fi8
86            u16   fu16
87            i16   fi16
88            i32   fi32
89            i64   fi64
90            f32   ff32
91            f64   ff64
92            W     fW
93            i32[] fi32Array
94            W[]   fWArray
95          }
96          .function void W.object_function(W a0) {
97            return.void
98          }
99          .function void static_function() {
100            return.void
101          }
102
103          .function i32 main() {
104            ldai 1
105            ststatic %s
106        cases:
107          - values:
108            - W.fu1
109            tags: [verifier]
110            runner-options: ['verifier-failure', 'verifier-debug-config']
111            bugid: ['1324', '1828']
112          - values:
113            - W.fi8
114            tags: [verifier]
115            runner-options: ['verifier-failure', 'verifier-debug-config']
116            bugid: ['1324', '1828']
117          - values:
118            - W.fu16
119            tags: [verifier]
120            runner-options: ['verifier-failure', 'verifier-debug-config']
121            bugid: ['1324', '1828']
122          - values:
123            - W.fi16
124            tags: [verifier]
125            runner-options: ['verifier-failure', 'verifier-debug-config']
126            bugid: ['1324', '1828']
127          - values:
128            - W.fi32
129            tags: [verifier]
130            runner-options: ['verifier-failure', 'verifier-debug-config']
131            bugid: ['1324', '1828']
132          - values:
133            - W.fi64
134            tags: [verifier]
135            runner-options: ['verifier-failure', 'verifier-debug-config']
136            bugid: ['1324', '1828']
137          - values:
138            - W.ff32
139            tags: [verifier]
140            runner-options: ['verifier-failure', 'verifier-debug-config']
141            bugid: ['1324', '1828']
142          - values:
143            - W.ff64
144            tags: [verifier]
145            runner-options: ['verifier-failure', 'verifier-debug-config']
146            bugid: ['1324', '1828']
147          - values:
148            - W.fW
149            tags: [verifier]
150            runner-options: ['verifier-failure', 'verifier-debug-config']
151            bugid: ['1324', '1828']
152          - values:
153            - W.fi32Array
154            tags: [verifier]
155            runner-options: ['verifier-failure', 'verifier-debug-config']
156            bugid: ['1324', '1828']
157          - values:
158            - W.fWArray
159            tags: [verifier]
160            runner-options: ['verifier-failure', 'verifier-debug-config']
161            bugid: ['1324', '1828']
162          - values:
163            - W
164            runner-options: ['compile-failure']
165          - values:
166            - W.object_function
167            runner-options: ['compile-failure']
168          - values:
169            - static_function
170            runner-options: ['compile-failure']
171          - values:
172            - unknown_function
173            runner-options: ['compile-failure']
174          - values:
175            - 0
176            runner-options: ['compile-failure']
177          - values:
178            - -1.1
179            runner-options: ['compile-failure']
180          - values:
181            - "null"
182            runner-options: ['compile-failure']
183          - values:
184            - "\"abc\""
185            runner-options: ['compile-failure']
186
187
188      - file-name: "with_wrong_field_size"
189        description: Check that verifier reports an error when the field_id resolves to a field with size that is not corresponding to bytecode
190        isa:
191          verification:
192            - field_id_size
193        header-template: ['pandasm_header']
194        check-type: exit-positive
195        tags: ['verifier']
196        runner-options: ['verifier-failure', 'verifier-debug-config']
197        bugid: ['1834']
198        code-template: |
199
200          .function i32 main() {
201            ldai 0x5a5a5a5a
202            ststatic %s
203        cases:
204          - values:
205            - R.fi64
206          - values:
207            - R.fu64
208          - values:
209            - R.ff64
210          - values:
211            - R.fObj
212          - values:
213            - R.fObjArray
214          - values:
215            - R.fi32Array
216
217
218      - file-name: "with_wrong_acc_type"
219        description: Check that verifier reports an error when the accumulator contains a value of type not corresponding to the bytecode
220        isa:
221          verification:
222            - acc_type
223        header-template: ['pandasm_header']
224        check-type: exit-positive
225        tags: ['verifier']
226        runner-options: ['verifier-failure', 'verifier-debug-config']
227        code-template: |
228
229          .function i32 main() {
230            %s
231            ststatic %s
232        cases:
233          - values:
234            - ldai.64 0xF000F000F000F000
235            - R.fu1
236            ignore: true
237            bugid: ['4166']
238          - values:
239            - ldai.64 0
240            - R.fi8
241            ignore: true
242            bugid: ['4166']
243          - values:
244            - ldai.64 0xCAFECAFECAFECAFE
245            - R.fu8
246            ignore: true
247            bugid: ['4166']
248          - values:
249            - ldai.64 0
250            - R.fi16
251            ignore: true
252            bugid: ['4166']
253          - values:
254            - ldai.64 0x5A5A5A5A5A5A5A5A
255            - R.fi32
256            ignore: true
257          - values:
258            - ldai.64 1234567890
259            - R.fu32
260            ignore: true
261          - values:
262            - fldai.64 0x7FFFFFFFFFFFFFFF
263            - R.fu1
264          - values:
265            - fldai.64 0.0
266            - R.fu8
267          - values:
268            - fldai.64 -0.0
269            - R.fi8
270          - values:
271            - fldai.64 1.0
272            - R.fu16
273          - values:
274            - fldai.64 3.0
275            - R.fi16
276          - values:
277            - fldai.64 0.123456
278            - R.fu32
279          - values:
280            - fldai.64 123456.0
281            - R.fi32
282          - values:
283            - lda.null
284            - R.fu32
285          - values:
286            - initobj Q.ctor
287            - R.fi32
288          - values:
289            - lda.str "abc"
290            - R.fu16
291          - values:
292            - |
293              movi v1, 10
294                newarr v1, v1, i32[]
295                lda.obj v1
296            - R.fi32
297          # f32
298          - values:
299            - ldai 0
300            - R.ff32
301          - values:
302            - ldai 0xCAFECAFE
303            - R.ff32
304          - values:
305            - ldai 1
306            - R.ff32
307          - values:
308            - lda.null
309            - R.ff32
310          - values:
311            - initobj Q.ctor
312            - R.ff32
313          - values:
314            - |
315              movi v1, 10
316                newarr v1, v1, i32[]
317                lda.obj v1
318            - R.ff32
319
320
321      - file-name: "into_all_field_types"
322        description: Check that accumulator value is properly stored in field
323        isa:
324          description: If field type size is less than 32, then accumulator content will be trunctated to field size before storing.
325        header-template: ['pandasm_header']
326        check-type: exit-positive
327        tags: ['tsan']
328        code-template: |
329
330          .function i32 main() {
331            %s
332            ststatic R.%s
333            lda.null
334            ldstatic R.%s
335            %s v1, %s
336            %s v1
337            %s
338            jeqz success
339            ldai 1
340            return
341          success:
342        cases:
343          # u1
344          - values: ['ldai 0x00000000', 'fu1', 'fu1', 'movi', 0, 'ucmp', '']
345          - values: ['ldai 0xffffffff', 'fu1', 'fu1', 'movi', 1, 'ucmp', '']
346            bugid: ['1848']
347            ignore: true
348          - values: ['ldai 0x00000001', 'fu1', 'fu1', 'movi', 1, 'ucmp', '']
349          - values: ['ldai 0xfffffffe', 'fu1', 'fu1', 'movi', 0, 'ucmp', '']
350            bugid: ['1848']
351            ignore: true
352          - values: ['ldai 0x11111111', 'fu1', 'fu1', 'movi', 1, 'ucmp', '']
353            bugid: ['1848']
354            ignore: true
355          - values: ['ldai 0x88888888', 'fu1', 'fu1', 'movi', 0, 'ucmp', '']
356            bugid: ['1848']
357            ignore: true
358          # u8
359          - values: ['ldai 0x00000000', 'fu8', 'fu8', 'movi', 0, 'ucmp', '']
360          - values: ['ldai 0xffffffff', 'fu8', 'fu8', 'movi', 255, 'ucmp', '']
361          - values: ['ldai 0x000000ff', 'fu8', 'fu8', 'movi', 255, 'ucmp', '']
362          - values: ['ldai 0xffffff00', 'fu8', 'fu8', 'movi', 0, 'ucmp', '']
363          - values: ['ldai 0x11111111', 'fu8', 'fu8', 'movi', 17, 'ucmp', '']
364          - values: ['ldai 0x88888888', 'fu8', 'fu8', 'movi', 136, 'ucmp', '']
365          # u16
366          - values: ['ldai 0x00000000', 'fu16', 'fu16', 'movi', 0, 'ucmp', '']
367          - values: ['ldai 0xffffffff', 'fu16', 'fu16', 'movi', 65535, 'ucmp', '']
368          - values: ['ldai 0x0000ffff', 'fu16', 'fu16', 'movi', 65535, 'ucmp', '']
369          - values: ['ldai 0xffff0000', 'fu16', 'fu16', 'movi', 0, 'ucmp', '']
370          - values: ['ldai 0x11111111', 'fu16', 'fu16', 'movi', 4369, 'ucmp', '']
371          - values: ['ldai 0x88888888', 'fu16', 'fu16', 'movi', 34952, 'ucmp', '']
372          # u32
373          - values: ['ldai 0x00000000', 'fu32', 'fu32', 'movi', 0, 'ucmp', '']
374          - values: ['ldai 0xffffffff', 'fu32', 'fu32', 'movi', 4294967295, 'ucmp', '']
375          - values: ['ldai 0x11111111', 'fu32', 'fu32', 'movi', 286331153, 'ucmp', '']
376          - values: ['ldai 0x88888888', 'fu32', 'fu32', 'movi', 2290649224, 'ucmp', '']
377          # f32
378          - values: ['fldai 0.0', 'ff32', 'ff32', 'fmovi', 0.0, 'fcmpg', '']
379          - values: ['fldai -6510615.0', 'ff32', 'ff32', 'fmovi', -6510615.0, 'fcmpg', '']
380          - values: ['fldai 0x7fffffff', 'ff32', 'ff32', 'fmovi', 0, 'fcmpg', 'subi 1']
381          - values: ['fldai 0x7f800000', 'ff32', 'ff32', 'fmovi', '0x7f800000', 'fcmpg', '']
382          - values: ['fldai 0xff800000', 'ff32', 'ff32', 'fmovi', '0xff800000', 'fcmpg', '']
383
384      - file-name: "into_all_field_types_int"
385        description: Version for signed integer types
386        isa:
387          description: If field type size is less than 32, then accumulator content will be trunctated to field size before storing.
388        header-template: ['pandasm_header']
389        check-type: exit-positive
390        tags: ['tsan']
391        code-template: |
392
393          .function i32 main() {
394            %s
395            ststatic R.%s
396            lda.null
397            ldstatic R.%s
398            movi v1, %s
399            jeq v1, success
400            ldai 1
401            return
402          success:
403        cases:
404          # i8
405          - values: ['ldai 0x00000000', 'fi8', 'fi8', 0]
406          - values: ['ldai 0xffffffff', 'fi8', 'fi8', -1]
407          - values: ['ldai 0x000000ff', 'fi8', 'fi8', -1]
408          - values: ['ldai 0xffffff00', 'fi8', 'fi8', 0]
409          - values: ['ldai 0x11111111', 'fi8', 'fi8', 17]
410          - values: ['ldai 0x88888888', 'fi8', 'fi8', -120]
411          # i16
412          - values: ['ldai 0x00000000', 'fi16', 'fi16', 0]
413          - values: ['ldai 0xffffffff', 'fi16', 'fi16', -1]
414          - values: ['ldai 0x0000ffff', 'fi16', 'fi16', -1]
415          - values: ['ldai 0xffff0000', 'fi16', 'fi16', 0]
416          - values: ['ldai 0x11111111', 'fi16', 'fi16', 4369]
417          - values: ['ldai 0x88888888', 'fi16', 'fi16', -30584]
418          # i32
419          - values: ['ldai 0x00000000', 'fi32', 'fi32', 0]
420          - values: ['ldai 0xffffffff', 'fi32', 'fi32', -1]
421          - values: ['ldai 0x11111111', 'fi32', 'fi32', 286331153]
422          - values: ['ldai 0x88888888', 'fi32', 'fi32', -2004318072]
423
424      - file-name: "x_init_p"
425        description: Check that ExceptionInInitializerError is thrown if an unexpected exception occurs in static initializer.
426        isa:
427          exceptions:
428            - x_init
429        header-template: []
430        check-type: empty
431        tags: ['tsan']
432        bugid: ['5330']
433        ignore: true
434        code-template: |
435
436          .language PandaAssembly
437
438          .record panda.ExceptionInInitializerError <external>
439          .record panda.NullPointerException <external>
440          .record E1 {}
441          .record R {
442              i32     fi32    <static>
443          }
444
445          .function void R.func() <cctor> {
446              %s
447              return.void
448          }
449
450          .function i32 main() {
451          begin:
452              ldai 123
453              ststatic R.fi32
454              ldai 2
455              return
456          end:
457          catch:
458              ldai 0
459              return
460          catch_all:
461              ldai 1
462              return
463          .catch panda.ExceptionInInitializerError, begin, end, catch
464          .catchall begin, end, catch_all
465          }
466        cases:
467          - values:
468            - |
469              #
470                  newobj v0, E1
471                  throw v0
472          - values:
473            - |
474              #
475                  newobj v0, panda.NullPointerException
476                  throw v0
477          - values:
478            - |
479              #
480                  movi v1, 0
481                  ldai 1
482                  div2 v1     # divide by zero
483          - values:
484            - |
485              #
486                  movi v1, 10
487                  newarr v1, v1, i32[]
488                  ldai 10
489                  ldarr v1    # get ArrayIndexOutOfBoundsException
490
491