1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2015 The Android Open Source Project 3*795d594fSAndroid Build Coastguard Worker * 4*795d594fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*795d594fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*795d594fSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*795d594fSAndroid Build Coastguard Worker * 8*795d594fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*795d594fSAndroid Build Coastguard Worker * 10*795d594fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*795d594fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*795d594fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*795d594fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*795d594fSAndroid Build Coastguard Worker * limitations under the License. 15*795d594fSAndroid Build Coastguard Worker */ 16*795d594fSAndroid Build Coastguard Worker 17*795d594fSAndroid Build Coastguard Worker public class Main extends UnresolvedSuperClass { 18*795d594fSAndroid Build Coastguard Worker 19*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.callInvokeUnresolvedStatic() register (before) 20*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokeUnresolved invoke_type:static callInvokeUnresolvedStatic()21*795d594fSAndroid Build Coastguard Worker static public void callInvokeUnresolvedStatic() { 22*795d594fSAndroid Build Coastguard Worker UnresolvedClass.staticMethod(); 23*795d594fSAndroid Build Coastguard Worker } 24*795d594fSAndroid Build Coastguard Worker 25*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.callInvokeUnresolvedVirtual(UnresolvedClass) register (before) 26*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokeUnresolved invoke_type:virtual callInvokeUnresolvedVirtual(UnresolvedClass c)27*795d594fSAndroid Build Coastguard Worker static public void callInvokeUnresolvedVirtual(UnresolvedClass c) { 28*795d594fSAndroid Build Coastguard Worker c.virtualMethod(); 29*795d594fSAndroid Build Coastguard Worker } 30*795d594fSAndroid Build Coastguard Worker 31*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.callInvokeUnresolvedInterface(UnresolvedInterface) register (before) 32*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokeUnresolved invoke_type:interface callInvokeUnresolvedInterface(UnresolvedInterface c)33*795d594fSAndroid Build Coastguard Worker static public void callInvokeUnresolvedInterface(UnresolvedInterface c) { 34*795d594fSAndroid Build Coastguard Worker c.interfaceMethod(); 35*795d594fSAndroid Build Coastguard Worker } 36*795d594fSAndroid Build Coastguard Worker callInvokeUnresolvedSuper(Main c)37*795d594fSAndroid Build Coastguard Worker static public void callInvokeUnresolvedSuper(Main c) { 38*795d594fSAndroid Build Coastguard Worker c.superMethod(); 39*795d594fSAndroid Build Coastguard Worker } 40*795d594fSAndroid Build Coastguard Worker 41*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.superMethod() register (before) 42*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokeUnresolved invoke_type:super superMethod()43*795d594fSAndroid Build Coastguard Worker public void superMethod() { 44*795d594fSAndroid Build Coastguard Worker super.superMethod(); 45*795d594fSAndroid Build Coastguard Worker } 46*795d594fSAndroid Build Coastguard Worker 47*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.callUnresolvedStaticFieldAccess() register (before) 48*795d594fSAndroid Build Coastguard Worker /// CHECK: UnresolvedStaticFieldSet field_type:Int8 49*795d594fSAndroid Build Coastguard Worker /// CHECK: UnresolvedStaticFieldSet field_type:Uint16 50*795d594fSAndroid Build Coastguard Worker /// CHECK: UnresolvedStaticFieldSet field_type:Int32 51*795d594fSAndroid Build Coastguard Worker /// CHECK: UnresolvedStaticFieldSet field_type:Int64 52*795d594fSAndroid Build Coastguard Worker /// CHECK: UnresolvedStaticFieldSet field_type:Float32 53*795d594fSAndroid Build Coastguard Worker /// CHECK: UnresolvedStaticFieldSet field_type:Float64 54*795d594fSAndroid Build Coastguard Worker /// CHECK: UnresolvedStaticFieldSet field_type:Reference 55*795d594fSAndroid Build Coastguard Worker 56*795d594fSAndroid Build Coastguard Worker /// CHECK: UnresolvedStaticFieldGet field_type:Int8 57*795d594fSAndroid Build Coastguard Worker /// CHECK: UnresolvedStaticFieldGet field_type:Uint16 58*795d594fSAndroid Build Coastguard Worker /// CHECK: UnresolvedStaticFieldGet field_type:Int32 59*795d594fSAndroid Build Coastguard Worker /// CHECK: UnresolvedStaticFieldGet field_type:Int64 60*795d594fSAndroid Build Coastguard Worker /// CHECK: UnresolvedStaticFieldGet field_type:Float32 61*795d594fSAndroid Build Coastguard Worker /// CHECK: UnresolvedStaticFieldGet field_type:Float64 62*795d594fSAndroid Build Coastguard Worker /// CHECK: UnresolvedStaticFieldGet field_type:Reference callUnresolvedStaticFieldAccess()63*795d594fSAndroid Build Coastguard Worker static public void callUnresolvedStaticFieldAccess() { 64*795d594fSAndroid Build Coastguard Worker Object o = new Object(); 65*795d594fSAndroid Build Coastguard Worker UnresolvedClass.staticByte = (byte)1; 66*795d594fSAndroid Build Coastguard Worker UnresolvedClass.staticChar = '1'; 67*795d594fSAndroid Build Coastguard Worker UnresolvedClass.staticInt = 123456789; 68*795d594fSAndroid Build Coastguard Worker UnresolvedClass.staticLong = 123456789123456789l; 69*795d594fSAndroid Build Coastguard Worker UnresolvedClass.staticFloat = 123456789123456789f; 70*795d594fSAndroid Build Coastguard Worker UnresolvedClass.staticDouble = 123456789123456789d; 71*795d594fSAndroid Build Coastguard Worker UnresolvedClass.staticObject = o; 72*795d594fSAndroid Build Coastguard Worker 73*795d594fSAndroid Build Coastguard Worker expectEquals((byte)1, UnresolvedClass.staticByte); 74*795d594fSAndroid Build Coastguard Worker expectEquals('1', UnresolvedClass.staticChar); 75*795d594fSAndroid Build Coastguard Worker expectEquals(123456789, UnresolvedClass.staticInt); 76*795d594fSAndroid Build Coastguard Worker expectEquals(123456789123456789l, UnresolvedClass.staticLong); 77*795d594fSAndroid Build Coastguard Worker expectEquals(123456789123456789f, UnresolvedClass.staticFloat); 78*795d594fSAndroid Build Coastguard Worker expectEquals(123456789123456789d, UnresolvedClass.staticDouble); 79*795d594fSAndroid Build Coastguard Worker expectEquals(o, UnresolvedClass.staticObject); 80*795d594fSAndroid Build Coastguard Worker 81*795d594fSAndroid Build Coastguard Worker // Check "large" values. 82*795d594fSAndroid Build Coastguard Worker 83*795d594fSAndroid Build Coastguard Worker UnresolvedClass.staticByte = (byte)-1; 84*795d594fSAndroid Build Coastguard Worker UnresolvedClass.staticChar = (char)32768; 85*795d594fSAndroid Build Coastguard Worker UnresolvedClass.staticInt = -1; 86*795d594fSAndroid Build Coastguard Worker 87*795d594fSAndroid Build Coastguard Worker expectEquals((byte)-1, UnresolvedClass.staticByte); 88*795d594fSAndroid Build Coastguard Worker expectEquals((char)32768, UnresolvedClass.staticChar); 89*795d594fSAndroid Build Coastguard Worker expectEquals(-1, UnresolvedClass.staticInt); 90*795d594fSAndroid Build Coastguard Worker } 91*795d594fSAndroid Build Coastguard Worker 92*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.callUnresolvedInstanceFieldAccess(UnresolvedClass) register (before) 93*795d594fSAndroid Build Coastguard Worker /// CHECK: UnresolvedInstanceFieldSet field_type:Int8 94*795d594fSAndroid Build Coastguard Worker /// CHECK: UnresolvedInstanceFieldSet field_type:Uint16 95*795d594fSAndroid Build Coastguard Worker /// CHECK: UnresolvedInstanceFieldSet field_type:Int32 96*795d594fSAndroid Build Coastguard Worker /// CHECK: UnresolvedInstanceFieldSet field_type:Int64 97*795d594fSAndroid Build Coastguard Worker /// CHECK: UnresolvedInstanceFieldSet field_type:Float32 98*795d594fSAndroid Build Coastguard Worker /// CHECK: UnresolvedInstanceFieldSet field_type:Float64 99*795d594fSAndroid Build Coastguard Worker /// CHECK: UnresolvedInstanceFieldSet field_type:Reference 100*795d594fSAndroid Build Coastguard Worker 101*795d594fSAndroid Build Coastguard Worker /// CHECK: UnresolvedInstanceFieldGet field_type:Int8 102*795d594fSAndroid Build Coastguard Worker /// CHECK: UnresolvedInstanceFieldGet field_type:Uint16 103*795d594fSAndroid Build Coastguard Worker /// CHECK: UnresolvedInstanceFieldGet field_type:Int32 104*795d594fSAndroid Build Coastguard Worker /// CHECK: UnresolvedInstanceFieldGet field_type:Int64 105*795d594fSAndroid Build Coastguard Worker /// CHECK: UnresolvedInstanceFieldGet field_type:Float32 106*795d594fSAndroid Build Coastguard Worker /// CHECK: UnresolvedInstanceFieldGet field_type:Float64 107*795d594fSAndroid Build Coastguard Worker /// CHECK: UnresolvedInstanceFieldGet field_type:Reference callUnresolvedInstanceFieldAccess(UnresolvedClass c)108*795d594fSAndroid Build Coastguard Worker static public void callUnresolvedInstanceFieldAccess(UnresolvedClass c) { 109*795d594fSAndroid Build Coastguard Worker Object o = new Object(); 110*795d594fSAndroid Build Coastguard Worker c.instanceByte = (byte)1; 111*795d594fSAndroid Build Coastguard Worker c.instanceChar = '1'; 112*795d594fSAndroid Build Coastguard Worker c.instanceInt = 123456789; 113*795d594fSAndroid Build Coastguard Worker c.instanceLong = 123456789123456789l; 114*795d594fSAndroid Build Coastguard Worker c.instanceFloat = 123456789123456789f; 115*795d594fSAndroid Build Coastguard Worker c.instanceDouble = 123456789123456789d; 116*795d594fSAndroid Build Coastguard Worker c.instanceObject = o; 117*795d594fSAndroid Build Coastguard Worker 118*795d594fSAndroid Build Coastguard Worker expectEquals((byte)1, c.instanceByte); 119*795d594fSAndroid Build Coastguard Worker expectEquals('1', c.instanceChar); 120*795d594fSAndroid Build Coastguard Worker expectEquals(123456789, c.instanceInt); 121*795d594fSAndroid Build Coastguard Worker expectEquals(123456789123456789l, c.instanceLong); 122*795d594fSAndroid Build Coastguard Worker expectEquals(123456789123456789f, c.instanceFloat); 123*795d594fSAndroid Build Coastguard Worker expectEquals(123456789123456789d, c.instanceDouble); 124*795d594fSAndroid Build Coastguard Worker expectEquals(o, c.instanceObject); 125*795d594fSAndroid Build Coastguard Worker 126*795d594fSAndroid Build Coastguard Worker // Check "large" values. 127*795d594fSAndroid Build Coastguard Worker 128*795d594fSAndroid Build Coastguard Worker c.instanceByte = (byte)-1; 129*795d594fSAndroid Build Coastguard Worker c.instanceChar = (char)32768; 130*795d594fSAndroid Build Coastguard Worker c.instanceInt = -1; 131*795d594fSAndroid Build Coastguard Worker 132*795d594fSAndroid Build Coastguard Worker expectEquals((byte)-1, c.instanceByte); 133*795d594fSAndroid Build Coastguard Worker expectEquals((char)32768, c.instanceChar); 134*795d594fSAndroid Build Coastguard Worker expectEquals(-1, c.instanceInt); 135*795d594fSAndroid Build Coastguard Worker } 136*795d594fSAndroid Build Coastguard Worker 137*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.callUnresolvedNull(UnresolvedClass) register (before) 138*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: NullCheck callUnresolvedNull(UnresolvedClass c)139*795d594fSAndroid Build Coastguard Worker static public void callUnresolvedNull(UnresolvedClass c) { 140*795d594fSAndroid Build Coastguard Worker int x = 0; 141*795d594fSAndroid Build Coastguard Worker try { 142*795d594fSAndroid Build Coastguard Worker x = c.instanceInt; 143*795d594fSAndroid Build Coastguard Worker throw new Error("Expected NPE"); 144*795d594fSAndroid Build Coastguard Worker } catch (NullPointerException e) { 145*795d594fSAndroid Build Coastguard Worker x -= 1; 146*795d594fSAndroid Build Coastguard Worker } 147*795d594fSAndroid Build Coastguard Worker expectEquals(-1, x); 148*795d594fSAndroid Build Coastguard Worker try { 149*795d594fSAndroid Build Coastguard Worker c.instanceInt = -1; 150*795d594fSAndroid Build Coastguard Worker throw new Error("Expected NPE"); 151*795d594fSAndroid Build Coastguard Worker } catch (NullPointerException e) { 152*795d594fSAndroid Build Coastguard Worker x -= 1; 153*795d594fSAndroid Build Coastguard Worker } 154*795d594fSAndroid Build Coastguard Worker expectEquals(-2, x); 155*795d594fSAndroid Build Coastguard Worker try { 156*795d594fSAndroid Build Coastguard Worker c.virtualMethod(); 157*795d594fSAndroid Build Coastguard Worker throw new Error("Expected NPE"); 158*795d594fSAndroid Build Coastguard Worker } catch (NullPointerException e) { 159*795d594fSAndroid Build Coastguard Worker x -= 1; 160*795d594fSAndroid Build Coastguard Worker } 161*795d594fSAndroid Build Coastguard Worker expectEquals(-3, x); 162*795d594fSAndroid Build Coastguard Worker } 163*795d594fSAndroid Build Coastguard Worker testInstanceOf(Object o)164*795d594fSAndroid Build Coastguard Worker static public void testInstanceOf(Object o) { 165*795d594fSAndroid Build Coastguard Worker if (o instanceof UnresolvedSuperClass) { 166*795d594fSAndroid Build Coastguard Worker System.out.println("instanceof ok"); 167*795d594fSAndroid Build Coastguard Worker } 168*795d594fSAndroid Build Coastguard Worker } 169*795d594fSAndroid Build Coastguard Worker testCheckCast(Object o)170*795d594fSAndroid Build Coastguard Worker static public UnresolvedSuperClass testCheckCast(Object o) { 171*795d594fSAndroid Build Coastguard Worker UnresolvedSuperClass c = (UnresolvedSuperClass) o; 172*795d594fSAndroid Build Coastguard Worker System.out.println("checkcast ok"); 173*795d594fSAndroid Build Coastguard Worker return c; 174*795d594fSAndroid Build Coastguard Worker } 175*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.main(java.lang.String[]) register (before) 176*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokeUnresolved invoke_type:direct main(String[] args)177*795d594fSAndroid Build Coastguard Worker static public void main(String[] args) { 178*795d594fSAndroid Build Coastguard Worker UnresolvedClass c = new UnresolvedClass(); 179*795d594fSAndroid Build Coastguard Worker Main m = new Main(); 180*795d594fSAndroid Build Coastguard Worker callInvokeUnresolvedStatic(); 181*795d594fSAndroid Build Coastguard Worker callInvokeUnresolvedVirtual(c); 182*795d594fSAndroid Build Coastguard Worker callInvokeUnresolvedInterface(c); 183*795d594fSAndroid Build Coastguard Worker callInvokeUnresolvedSuper(m); 184*795d594fSAndroid Build Coastguard Worker callUnresolvedStaticFieldAccess(); 185*795d594fSAndroid Build Coastguard Worker callUnresolvedInstanceFieldAccess(c); 186*795d594fSAndroid Build Coastguard Worker callUnresolvedNull(null); 187*795d594fSAndroid Build Coastguard Worker testInstanceOf(m); 188*795d594fSAndroid Build Coastguard Worker testCheckCast(m); 189*795d594fSAndroid Build Coastguard Worker testLicm(2); 190*795d594fSAndroid Build Coastguard Worker } 191*795d594fSAndroid Build Coastguard Worker 192*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.testLicm(int) licm (before) 193*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Class:l\d+>> LoadClass loop:<<LoopLabel:B\d+>> 194*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: <<Clinit:l\d+>> ClinitCheck [<<Class>>] loop:<<LoopLabel>> 195*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: <<New:l\d+>> NewInstance [<<Clinit>>] loop:<<LoopLabel>> 196*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ConstructorFence [<<New>>] loop:<<LoopLabel>> 197*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: InvokeUnresolved [<<New>>] loop:<<LoopLabel>> 198*795d594fSAndroid Build Coastguard Worker 199*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.testLicm(int) licm (after) 200*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Class:l\d+>> LoadClass loop:none 201*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: <<Clinit:l\d+>> ClinitCheck [<<Class>>] loop:none 202*795d594fSAndroid Build Coastguard Worker /// CHECK: <<New:l\d+>> NewInstance [<<Clinit>>] loop:<<LoopLabel:B\d+>> 203*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ConstructorFence [<<New>>] loop:<<LoopLabel>> 204*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: InvokeUnresolved [<<New>>] loop:<<LoopLabel>> testLicm(int count)205*795d594fSAndroid Build Coastguard Worker static public void testLicm(int count) { 206*795d594fSAndroid Build Coastguard Worker // Test to make sure we keep the initialization check after loading an unresolved class. 207*795d594fSAndroid Build Coastguard Worker UnresolvedClass c; 208*795d594fSAndroid Build Coastguard Worker int i = 0; 209*795d594fSAndroid Build Coastguard Worker do { 210*795d594fSAndroid Build Coastguard Worker c = new UnresolvedClass(); 211*795d594fSAndroid Build Coastguard Worker } while (i++ != count); 212*795d594fSAndroid Build Coastguard Worker } 213*795d594fSAndroid Build Coastguard Worker expectEquals(byte expected, byte result)214*795d594fSAndroid Build Coastguard Worker public static void expectEquals(byte expected, byte result) { 215*795d594fSAndroid Build Coastguard Worker if (expected != result) { 216*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + result); 217*795d594fSAndroid Build Coastguard Worker } 218*795d594fSAndroid Build Coastguard Worker } 219*795d594fSAndroid Build Coastguard Worker expectEquals(char expected, char result)220*795d594fSAndroid Build Coastguard Worker public static void expectEquals(char expected, char result) { 221*795d594fSAndroid Build Coastguard Worker if (expected != result) { 222*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + result); 223*795d594fSAndroid Build Coastguard Worker } 224*795d594fSAndroid Build Coastguard Worker } 225*795d594fSAndroid Build Coastguard Worker expectEquals(int expected, int result)226*795d594fSAndroid Build Coastguard Worker public static void expectEquals(int expected, int result) { 227*795d594fSAndroid Build Coastguard Worker if (expected != result) { 228*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + result); 229*795d594fSAndroid Build Coastguard Worker } 230*795d594fSAndroid Build Coastguard Worker } 231*795d594fSAndroid Build Coastguard Worker expectEquals(long expected, long result)232*795d594fSAndroid Build Coastguard Worker public static void expectEquals(long expected, long result) { 233*795d594fSAndroid Build Coastguard Worker if (expected != result) { 234*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + result); 235*795d594fSAndroid Build Coastguard Worker } 236*795d594fSAndroid Build Coastguard Worker } 237*795d594fSAndroid Build Coastguard Worker expectEquals(float expected, float result)238*795d594fSAndroid Build Coastguard Worker public static void expectEquals(float expected, float result) { 239*795d594fSAndroid Build Coastguard Worker if (expected != result) { 240*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + result); 241*795d594fSAndroid Build Coastguard Worker } 242*795d594fSAndroid Build Coastguard Worker } 243*795d594fSAndroid Build Coastguard Worker expectEquals(double expected, double result)244*795d594fSAndroid Build Coastguard Worker public static void expectEquals(double expected, double result) { 245*795d594fSAndroid Build Coastguard Worker if (expected != result) { 246*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + result); 247*795d594fSAndroid Build Coastguard Worker } 248*795d594fSAndroid Build Coastguard Worker } 249*795d594fSAndroid Build Coastguard Worker expectEquals(Object expected, Object result)250*795d594fSAndroid Build Coastguard Worker public static void expectEquals(Object expected, Object result) { 251*795d594fSAndroid Build Coastguard Worker if (expected != result) { 252*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + result); 253*795d594fSAndroid Build Coastguard Worker } 254*795d594fSAndroid Build Coastguard Worker } 255*795d594fSAndroid Build Coastguard Worker } 256