Home | History | Annotate | Download | only in smali
      1 # Copyright (C) 2015 The Android Open Source Project
      2 #
      3 # Licensed under the Apache License, Version 2.0 (the "License");
      4 # you may not use this file except in compliance with the License.
      5 # You may obtain a copy of the License at
      6 #
      7 #      http://www.apache.org/licenses/LICENSE-2.0
      8 #
      9 # Unless required by applicable law or agreed to in writing, software
     10 # distributed under the License is distributed on an "AS IS" BASIS,
     11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     12 # See the License for the specific language governing permissions and
     13 # limitations under the License.
     14 
     15 .class public LTestCase;
     16 .super Ljava/lang/Object;
     17 
     18 # Test simplification of an empty, dead catch block. Compiler used to segfault
     19 # because it did expect at least a control-flow instruction (b/25494450).
     20 
     21 .method public static testCase_EmptyCatch()I
     22     .registers 3
     23 
     24     const v0, 0x0
     25     return v0
     26 
     27     :try_start
     28     nop
     29     :try_end
     30     .catchall {:try_start .. :try_end} :catch
     31 
     32     nop
     33 
     34     :catch
     35     nop
     36 
     37 .end method
     38 
     39 # Test simplification of a dead catch block with some code but no control-flow
     40 # instruction.
     41 
     42 .method public static testCase_NoConrolFlowCatch()I
     43     .registers 3
     44 
     45     const v0, 0x0
     46     return v0
     47 
     48     :try_start
     49     nop
     50     :try_end
     51     .catchall {:try_start .. :try_end} :catch
     52 
     53     nop
     54 
     55     :catch
     56     const v1, 0x3
     57     add-int v0, v0, v1
     58 
     59 .end method
     60 
     61 # Test simplification of a dead catch block with normal-predecessors but
     62 # starting with a move-exception. Verifier does not check trivially dead code
     63 # and this used to trip a DCHECK (b/25492628).
     64 
     65 .method public static testCase_InvalidLoadException()I
     66     .registers 3
     67 
     68     const v0, 0x0
     69     return v0
     70 
     71     :try_start
     72     nop
     73     :try_end
     74     .catchall {:try_start .. :try_end} :catch
     75 
     76     :catch
     77     move-exception v0
     78 
     79 .end method
     80 
     81 # Test simplification of a live catch block with dead normal-predecessors and
     82 # starting with a move-exception. Verifier does not check trivially dead code
     83 # and this used to trip a DCHECK (b/25492628).
     84 
     85 .method public static testCase_TriviallyDeadPredecessor(II)I
     86     .registers 3
     87 
     88     :try_start
     89     div-int v0, p0, p1
     90     return v0
     91     :try_end
     92     .catchall {:try_start .. :try_end} :catch
     93 
     94     # Trivially dead predecessor block.
     95     add-int p0, p0, p1
     96 
     97     :catch
     98     # This verifies because only exceptional predecessors are live.
     99     move-exception v0
    100     const v0, 0x0
    101     return v0
    102 
    103 .end method
    104 
    105