upload android base code part3

This commit is contained in:
August 2018-08-08 16:48:17 +08:00
parent 71b83c22f1
commit b9e30e05b1
15122 changed files with 2089659 additions and 0 deletions

View file

@ -0,0 +1,23 @@
#!/bin/bash
#
# Copyright 2017 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# This checker test is incompatible with jack bytecode output,
# so force it to use javac/dx.
export USE_JACK=false
# Also disable desugar because it is missing in jack platform builds.
export DESUGAR=false
./default-build "$@"

View file

@ -0,0 +1,3 @@
Regression test for the load store elimination of optimizing
that used to merge two array gets that have the same inputs but
not the same type. Note that this only happens if the array is null.

View file

@ -0,0 +1,96 @@
# Copyright (C) 2017 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
.class public LSmaliTests;
.super Ljava/lang/Object;
## CHECK-START: void SmaliTests.bar() load_store_elimination (after)
## CHECK-DAG: <<Null:l\d+>> NullConstant
## CHECK-DAG: <<BoundType:l\d+>> BoundType [<<Null>>]
## CHECK-DAG: <<CheckL:l\d+>> NullCheck [<<BoundType>>]
## CHECK-DAG: <<GetL0:l\d+>> ArrayGet [<<CheckL>>,{{i\d+}}]
## CHECK-DAG: <<GetL1:l\d+>> ArrayGet [<<CheckL>>,{{i\d+}}]
## CHECK-DAG: <<GetL2:l\d+>> ArrayGet [<<CheckL>>,{{i\d+}}]
## CHECK-DAG: <<GetL3:l\d+>> ArrayGet [<<CheckL>>,{{i\d+}}]
## CHECK-DAG: <<CheckJ:l\d+>> NullCheck [<<Null>>]
## CHECK-DAG: <<GetJ0:j\d+>> ArrayGet [<<CheckJ>>,{{i\d+}}]
## CHECK-DAG: <<GetJ1:j\d+>> ArrayGet [<<CheckJ>>,{{i\d+}}]
## CHECK-DAG: <<GetJ2:j\d+>> ArrayGet [<<CheckJ>>,{{i\d+}}]
## CHECK-DAG: <<GetJ3:j\d+>> ArrayGet [<<CheckJ>>,{{i\d+}}]
.method public static bar()V
.registers 7
.prologue
const/4 v6, 0x3
const/4 v5, 0x2
const/4 v4, 0x1
const/4 v3, 0x0
# We create multiple accesses that will lead the bounds check
# elimination pass to add a HDeoptimize. Not having the bounds check helped
# the load store elimination think it could merge two ArrayGet with different
# types.
# String[] array = (String[])getNull();
invoke-static {}, LMain;->getNull()Ljava/lang/Object;
move-result-object v0
check-cast v0, [Ljava/lang/String;
# objectField = array[0];
aget-object v2, v0, v3
sput-object v2, LMain;->objectField:Ljava/lang/Object;
# objectField = array[1];
aget-object v2, v0, v4
sput-object v2, LMain;->objectField:Ljava/lang/Object;
# objectField = array[2];
aget-object v2, v0, v5
sput-object v2, LMain;->objectField:Ljava/lang/Object;
# objectField = array[3];
aget-object v2, v0, v6
sput-object v2, LMain;->objectField:Ljava/lang/Object;
# long[] longArray = getLongArray();
invoke-static {}, LMain;->getLongArray()[J
move-result-object v1
# longField = longArray[0];
aget-wide v2, v1, v3
sput-wide v2, LMain;->longField:J
# longField = longArray[1];
aget-wide v2, v1, v4
sput-wide v2, LMain;->longField:J
# longField = longArray[2];
aget-wide v2, v1, v5
sput-wide v2, LMain;->longField:J
# longField = longArray[3];
aget-wide v2, v1, v6
sput-wide v2, LMain;->longField:J
return-void
.end method
# static fields
.field static doThrow:Z # boolean
# direct methods
.method static constructor <clinit>()V
.registers 1
.prologue
# doThrow = false
const/4 v0, 0x0
sput-boolean v0, LSmaliTests;->doThrow:Z
return-void
.end method

View file

@ -0,0 +1,137 @@
/*
* Copyright (C) 2016 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;
class Test1 {
int[] iarr;
}
class Test2 {
float[] farr;
}
public class Main {
public static Object[] getObjectArray() { return null; }
public static long[] getLongArray() { return null; }
public static Object getNull() { return null; }
public static Test1 getNullTest1() { return null; }
public static Test2 getNullTest2() { return null; }
public static void $noinline$runSmaliTest(String name) throws Throwable {
try {
Class<?> c = Class.forName("SmaliTests");
Method m = c.getMethod(name);
m.invoke(null);
} catch (InvocationTargetException ex) {
throw ex.getCause(); // re-raise expected exception.
} catch (Exception ex) {
throw new Error(ex);
}
}
public static void main(String[] args) {
try {
foo();
throw new Error("Expected NullPointerException");
} catch (NullPointerException e) {
// Expected.
}
try {
bar();
throw new Error("Expected NullPointerException");
} catch (NullPointerException e) {
// Expected.
}
try {
$noinline$runSmaliTest("bar");
throw new Error("Expected NullPointerException");
} catch (NullPointerException e) {
// Expected.
} catch (Throwable t) {
throw new Error("Unexpected Throwable", t);
}
try {
test1();
throw new Error("Expected NullPointerException");
} catch (NullPointerException e) {
// Expected.
}
}
/// CHECK-START: void Main.foo() load_store_elimination (after)
/// CHECK-DAG: <<Null:l\d+>> NullConstant
/// CHECK-DAG: <<Check:l\d+>> NullCheck [<<Null>>]
/// CHECK-DAG: <<Get1:j\d+>> ArrayGet [<<Check>>,{{i\d+}}]
/// CHECK-DAG: <<Get2:l\d+>> ArrayGet [<<Check>>,{{i\d+}}]
public static void foo() {
longField = getLongArray()[0];
objectField = getObjectArray()[0];
}
/// CHECK-START: void Main.bar() load_store_elimination (after)
/// CHECK-DAG: <<Null:l\d+>> NullConstant
/// CHECK-DAG: <<BoundFirst:l\d+>> BoundType [<<Null>>]
/// CHECK-DAG: <<BoundType:l\d+>> BoundType [<<BoundFirst>>]
/// CHECK-DAG: <<CheckL:l\d+>> NullCheck [<<BoundType>>]
/// CHECK-DAG: <<GetL0:l\d+>> ArrayGet [<<CheckL>>,{{i\d+}}]
/// CHECK-DAG: <<GetL1:l\d+>> ArrayGet [<<CheckL>>,{{i\d+}}]
/// CHECK-DAG: <<GetL2:l\d+>> ArrayGet [<<CheckL>>,{{i\d+}}]
/// CHECK-DAG: <<GetL3:l\d+>> ArrayGet [<<CheckL>>,{{i\d+}}]
/// CHECK-DAG: <<CheckJ:l\d+>> NullCheck [<<Null>>]
/// CHECK-DAG: <<GetJ0:j\d+>> ArrayGet [<<CheckJ>>,{{i\d+}}]
/// CHECK-DAG: <<GetJ1:j\d+>> ArrayGet [<<CheckJ>>,{{i\d+}}]
/// CHECK-DAG: <<GetJ2:j\d+>> ArrayGet [<<CheckJ>>,{{i\d+}}]
/// CHECK-DAG: <<GetJ3:j\d+>> ArrayGet [<<CheckJ>>,{{i\d+}}]
public static void bar() {
// We create multiple accesses that will lead the bounds check
// elimination pass to add a HDeoptimize. Not having the bounds check helped
// the load store elimination think it could merge two ArrayGet with different
// types.
String[] array = (String[])getNull();
objectField = array[0];
objectField = array[1];
objectField = array[2];
objectField = array[3];
long[] longArray = getLongArray();
longField = longArray[0];
longField = longArray[1];
longField = longArray[2];
longField = longArray[3];
}
/// CHECK-START: float Main.test1() load_store_elimination (after)
/// CHECK-DAG: <<Null:l\d+>> NullConstant
/// CHECK-DAG: <<Check1:l\d+>> NullCheck [<<Null>>]
/// CHECK-DAG: <<FieldGet1:l\d+>> InstanceFieldGet [<<Check1>>] field_name:Test1.iarr
/// CHECK-DAG: <<Check2:l\d+>> NullCheck [<<FieldGet1>>]
/// CHECK-DAG: <<ArrayGet1:i\d+>> ArrayGet [<<Check2>>,{{i\d+}}]
/// CHECK-DAG: <<ArrayGet2:f\d+>> ArrayGet [<<Check2>>,{{i\d+}}]
/// CHECK-DAG: Return [<<ArrayGet2>>]
public static float test1() {
Test1 test1 = getNullTest1();
Test2 test2 = getNullTest2();
int[] iarr = test1.iarr;
float[] farr = test2.farr;
iarr[0] = iarr[1];
return farr[0];
}
public static long longField;
public static Object objectField;
}