diff options
36 files changed, 423 insertions, 644 deletions
diff --git a/build/art.go b/build/art.go index f2efbfefd6..f5547ccf02 100644 --- a/build/art.go +++ b/build/art.go @@ -204,6 +204,7 @@ func init() { soong.RegisterModuleType("art_cc_library", artLibrary) soong.RegisterModuleType("art_cc_binary", artBinary) soong.RegisterModuleType("art_cc_test", artTest) + soong.RegisterModuleType("art_cc_test_library", artTestLibrary) soong.RegisterModuleType("art_cc_defaults", artDefaultsFactory) soong.RegisterModuleType("art_global_defaults", artGlobalDefaultsFactory) } @@ -253,6 +254,17 @@ func artTest() (blueprint.Module, []interface{}) { return module, props } +func artTestLibrary() (blueprint.Module, []interface{}) { + test := cc.NewTestLibrary(android.HostAndDeviceSupported) + module, props := test.Init() + + props = installCodegenCustomizer(module, props, false) + + android.AddLoadHook(module, prefer32Bit) + android.AddInstallHook(module, testInstall) + return module, props +} + func envDefault(ctx android.BaseContext, key string, defaultValue string) string { ret := ctx.AConfig().Getenv(key) if ret == "" { diff --git a/cmdline/Android.bp b/cmdline/Android.bp index c9cd9dcfb8..c811cbdd33 100644 --- a/cmdline/Android.bp +++ b/cmdline/Android.bp @@ -17,7 +17,7 @@ art_cc_test { name: "art_cmdline_tests", defaults: [ - "art_test_defaults", + "art_gtest_defaults", ], srcs: ["cmdline_parser_test.cc"], } diff --git a/compiler/Android.bp b/compiler/Android.bp index 4af43ccdc1..8a2c94a90a 100644 --- a/compiler/Android.bp +++ b/compiler/Android.bp @@ -293,7 +293,7 @@ art_cc_library { art_cc_test { name: "art_compiler_tests", defaults: [ - "art_test_defaults", + "art_gtest_defaults", ], srcs: [ "compiled_method_test.cc", @@ -392,7 +392,7 @@ art_cc_test { name: "art_compiler_host_tests", device_supported: false, defaults: [ - "art_test_defaults", + "art_gtest_defaults", ], codegen: { arm: { diff --git a/compiler/optimizing/code_generator.cc b/compiler/optimizing/code_generator.cc index 6732670ffc..51ba187c1b 100644 --- a/compiler/optimizing/code_generator.cc +++ b/compiler/optimizing/code_generator.cc @@ -1179,37 +1179,51 @@ void CodeGenerator::EmitParallelMoves(Location from1, GetMoveResolver()->EmitNativeCode(¶llel_move); } -void CodeGenerator::ValidateInvokeRuntime(HInstruction* instruction, SlowPathCode* slow_path) { +void CodeGenerator::ValidateInvokeRuntime(QuickEntrypointEnum entrypoint, + HInstruction* instruction, + SlowPathCode* slow_path) { // Ensure that the call kind indication given to the register allocator is - // coherent with the runtime call generated, and that the GC side effect is - // set when required. + // coherent with the runtime call generated. if (slow_path == nullptr) { DCHECK(instruction->GetLocations()->WillCall()) << "instruction->DebugName()=" << instruction->DebugName(); - DCHECK(instruction->GetSideEffects().Includes(SideEffects::CanTriggerGC())) - << "instruction->DebugName()=" << instruction->DebugName() - << " instruction->GetSideEffects().ToString()=" << instruction->GetSideEffects().ToString(); } else { DCHECK(instruction->GetLocations()->CallsOnSlowPath() || slow_path->IsFatal()) << "instruction->DebugName()=" << instruction->DebugName() << " slow_path->GetDescription()=" << slow_path->GetDescription(); - DCHECK(instruction->GetSideEffects().Includes(SideEffects::CanTriggerGC()) || - // When (non-Baker) read barriers are enabled, some instructions - // use a slow path to emit a read barrier, which does not trigger - // GC. - (kEmitCompilerReadBarrier && - !kUseBakerReadBarrier && - (instruction->IsInstanceFieldGet() || - instruction->IsStaticFieldGet() || - instruction->IsArrayGet() || - instruction->IsLoadClass() || - instruction->IsLoadString() || - instruction->IsInstanceOf() || - instruction->IsCheckCast() || - (instruction->IsInvokeVirtual() && instruction->GetLocations()->Intrinsified())))) - << "instruction->DebugName()=" << instruction->DebugName() - << " instruction->GetSideEffects().ToString()=" << instruction->GetSideEffects().ToString() - << " slow_path->GetDescription()=" << slow_path->GetDescription(); + } + + // Check that the GC side effect is set when required. + // TODO: Reverse EntrypointCanTriggerGC + if (EntrypointCanTriggerGC(entrypoint)) { + if (slow_path == nullptr) { + DCHECK(instruction->GetSideEffects().Includes(SideEffects::CanTriggerGC())) + << "instruction->DebugName()=" << instruction->DebugName() + << " instruction->GetSideEffects().ToString()=" + << instruction->GetSideEffects().ToString(); + } else { + DCHECK(instruction->GetSideEffects().Includes(SideEffects::CanTriggerGC()) || + // When (non-Baker) read barriers are enabled, some instructions + // use a slow path to emit a read barrier, which does not trigger + // GC. + (kEmitCompilerReadBarrier && + !kUseBakerReadBarrier && + (instruction->IsInstanceFieldGet() || + instruction->IsStaticFieldGet() || + instruction->IsArrayGet() || + instruction->IsLoadClass() || + instruction->IsLoadString() || + instruction->IsInstanceOf() || + instruction->IsCheckCast() || + (instruction->IsInvokeVirtual() && instruction->GetLocations()->Intrinsified())))) + << "instruction->DebugName()=" << instruction->DebugName() + << " instruction->GetSideEffects().ToString()=" + << instruction->GetSideEffects().ToString() + << " slow_path->GetDescription()=" << slow_path->GetDescription(); + } + } else { + // The GC side effect is not required for the instruction. But the instruction might still have + // it, for example if it calls other entrypoints requiring it. } // Check the coherency of leaf information. diff --git a/compiler/optimizing/code_generator.h b/compiler/optimizing/code_generator.h index b4d4b9b760..22b5c9cff4 100644 --- a/compiler/optimizing/code_generator.h +++ b/compiler/optimizing/code_generator.h @@ -404,7 +404,9 @@ class CodeGenerator : public DeletableArenaObject<kArenaAllocCodeGenerator> { // Perfoms checks pertaining to an InvokeRuntime call. - void ValidateInvokeRuntime(HInstruction* instruction, SlowPathCode* slow_path); + void ValidateInvokeRuntime(QuickEntrypointEnum entrypoint, + HInstruction* instruction, + SlowPathCode* slow_path); // Perfoms checks pertaining to an InvokeRuntimeWithoutRecordingPcInfo call. static void ValidateInvokeRuntimeWithoutRecordingPcInfo(HInstruction* instruction, diff --git a/compiler/optimizing/code_generator_arm.cc b/compiler/optimizing/code_generator_arm.cc index 40c2b9c1ec..8b2d6fd838 100644 --- a/compiler/optimizing/code_generator_arm.cc +++ b/compiler/optimizing/code_generator_arm.cc @@ -1177,7 +1177,7 @@ void CodeGeneratorARM::InvokeRuntime(QuickEntrypointEnum entrypoint, HInstruction* instruction, uint32_t dex_pc, SlowPathCode* slow_path) { - ValidateInvokeRuntime(instruction, slow_path); + ValidateInvokeRuntime(entrypoint, instruction, slow_path); GenerateInvokeRuntime(GetThreadOffset<kArmPointerSize>(entrypoint).Int32Value()); if (EntrypointRequiresStackMap(entrypoint)) { RecordPcInfo(instruction, dex_pc, slow_path); diff --git a/compiler/optimizing/code_generator_arm64.cc b/compiler/optimizing/code_generator_arm64.cc index 599185acd3..7f542da047 100644 --- a/compiler/optimizing/code_generator_arm64.cc +++ b/compiler/optimizing/code_generator_arm64.cc @@ -1452,7 +1452,7 @@ void CodeGeneratorARM64::InvokeRuntime(QuickEntrypointEnum entrypoint, HInstruction* instruction, uint32_t dex_pc, SlowPathCode* slow_path) { - ValidateInvokeRuntime(instruction, slow_path); + ValidateInvokeRuntime(entrypoint, instruction, slow_path); GenerateInvokeRuntime(GetThreadOffset<kArm64PointerSize>(entrypoint).Int32Value()); if (EntrypointRequiresStackMap(entrypoint)) { RecordPcInfo(instruction, dex_pc, slow_path); diff --git a/compiler/optimizing/code_generator_mips.cc b/compiler/optimizing/code_generator_mips.cc index aa81bad3de..b2e75952a0 100644 --- a/compiler/optimizing/code_generator_mips.cc +++ b/compiler/optimizing/code_generator_mips.cc @@ -1224,7 +1224,7 @@ void CodeGeneratorMIPS::InvokeRuntime(QuickEntrypointEnum entrypoint, HInstruction* instruction, uint32_t dex_pc, SlowPathCode* slow_path) { - ValidateInvokeRuntime(instruction, slow_path); + ValidateInvokeRuntime(entrypoint, instruction, slow_path); bool reordering = __ SetReorder(false); __ LoadFromOffset(kLoadWord, T9, TR, GetThreadOffset<kMipsPointerSize>(entrypoint).Int32Value()); __ Jalr(T9); diff --git a/compiler/optimizing/code_generator_mips64.cc b/compiler/optimizing/code_generator_mips64.cc index 4d87523206..557e5da916 100644 --- a/compiler/optimizing/code_generator_mips64.cc +++ b/compiler/optimizing/code_generator_mips64.cc @@ -946,7 +946,7 @@ void CodeGeneratorMIPS64::InvokeRuntime(QuickEntrypointEnum entrypoint, HInstruction* instruction, uint32_t dex_pc, SlowPathCode* slow_path) { - ValidateInvokeRuntime(instruction, slow_path); + ValidateInvokeRuntime(entrypoint, instruction, slow_path); // TODO: anything related to T9/GP/GOT/PIC/.so's? __ LoadFromOffset(kLoadDoubleword, T9, diff --git a/compiler/optimizing/code_generator_x86.cc b/compiler/optimizing/code_generator_x86.cc index 05182139bb..172ce4ab12 100644 --- a/compiler/optimizing/code_generator_x86.cc +++ b/compiler/optimizing/code_generator_x86.cc @@ -754,7 +754,7 @@ void CodeGeneratorX86::InvokeRuntime(QuickEntrypointEnum entrypoint, HInstruction* instruction, uint32_t dex_pc, SlowPathCode* slow_path) { - ValidateInvokeRuntime(instruction, slow_path); + ValidateInvokeRuntime(entrypoint, instruction, slow_path); GenerateInvokeRuntime(GetThreadOffset<kX86PointerSize>(entrypoint).Int32Value()); if (EntrypointRequiresStackMap(entrypoint)) { RecordPcInfo(instruction, dex_pc, slow_path); diff --git a/compiler/optimizing/code_generator_x86_64.cc b/compiler/optimizing/code_generator_x86_64.cc index 506a7b1630..1943ddc6f7 100644 --- a/compiler/optimizing/code_generator_x86_64.cc +++ b/compiler/optimizing/code_generator_x86_64.cc @@ -981,7 +981,7 @@ void CodeGeneratorX86_64::InvokeRuntime(QuickEntrypointEnum entrypoint, HInstruction* instruction, uint32_t dex_pc, SlowPathCode* slow_path) { - ValidateInvokeRuntime(instruction, slow_path); + ValidateInvokeRuntime(entrypoint, instruction, slow_path); GenerateInvokeRuntime(GetThreadOffset<kX86_64PointerSize>(entrypoint).Int32Value()); if (EntrypointRequiresStackMap(entrypoint)) { RecordPcInfo(instruction, dex_pc, slow_path); diff --git a/compiler/optimizing/instruction_simplifier_shared.cc b/compiler/optimizing/instruction_simplifier_shared.cc index 8f7778fe68..04e063c92e 100644 --- a/compiler/optimizing/instruction_simplifier_shared.cc +++ b/compiler/optimizing/instruction_simplifier_shared.cc @@ -259,7 +259,8 @@ bool TryExtractArrayAccessAddress(HInstruction* access, HIntConstant* offset = graph->GetIntConstant(data_offset); HIntermediateAddress* address = new (arena) HIntermediateAddress(array, offset, kNoDexPc); - address->SetReferenceTypeInfo(array->GetReferenceTypeInfo()); + // TODO: Is it ok to not have this on the intermediate address? + // address->SetReferenceTypeInfo(array->GetReferenceTypeInfo()); access->GetBlock()->InsertInstructionBefore(address, access); access->ReplaceInput(address, 0); // Both instructions must depend on GC to prevent any instruction that can diff --git a/compiler/optimizing/nodes.h b/compiler/optimizing/nodes.h index caecc578c6..6d207765e3 100644 --- a/compiler/optimizing/nodes.h +++ b/compiler/optimizing/nodes.h @@ -4374,7 +4374,7 @@ class HDiv FINAL : public HBinaryOperation { HInstruction* left, HInstruction* right, uint32_t dex_pc) - : HBinaryOperation(result_type, left, right, SideEffectsForArchRuntimeCalls(), dex_pc) {} + : HBinaryOperation(result_type, left, right, SideEffects::None(), dex_pc) {} template <typename T> T ComputeIntegral(T x, T y) const { @@ -4409,11 +4409,6 @@ class HDiv FINAL : public HBinaryOperation { ComputeFP(x->GetValue(), y->GetValue()), GetDexPc()); } - static SideEffects SideEffectsForArchRuntimeCalls() { - // The generated code can use a runtime call. - return SideEffects::CanTriggerGC(); - } - DECLARE_INSTRUCTION(Div); private: @@ -4426,7 +4421,7 @@ class HRem FINAL : public HBinaryOperation { HInstruction* left, HInstruction* right, uint32_t dex_pc) - : HBinaryOperation(result_type, left, right, SideEffectsForArchRuntimeCalls(), dex_pc) {} + : HBinaryOperation(result_type, left, right, SideEffects::None(), dex_pc) {} template <typename T> T ComputeIntegral(T x, T y) const { @@ -4461,10 +4456,6 @@ class HRem FINAL : public HBinaryOperation { ComputeFP(x->GetValue(), y->GetValue()), GetDexPc()); } - static SideEffects SideEffectsForArchRuntimeCalls() { - return SideEffects::CanTriggerGC(); - } - DECLARE_INSTRUCTION(Rem); private: @@ -4917,9 +4908,7 @@ class HTypeConversion FINAL : public HExpression<1> { public: // Instantiate a type conversion of `input` to `result_type`. HTypeConversion(Primitive::Type result_type, HInstruction* input, uint32_t dex_pc) - : HExpression(result_type, - SideEffectsForArchRuntimeCalls(input->GetType(), result_type), - dex_pc) { + : HExpression(result_type, SideEffects::None(), dex_pc) { SetRawInputAt(0, input); // Invariant: We should never generate a conversion to a Boolean value. DCHECK_NE(Primitive::kPrimBoolean, result_type); @@ -4938,18 +4927,6 @@ class HTypeConversion FINAL : public HExpression<1> { // containing the result. If the input cannot be converted, return nullptr. HConstant* TryStaticEvaluation() const; - static SideEffects SideEffectsForArchRuntimeCalls(Primitive::Type input_type, - Primitive::Type result_type) { - // Some architectures may not require the 'GC' side effects, but at this point - // in the compilation process we do not know what architecture we will - // generate code for, so we must be conservative. - if ((Primitive::IsFloatingPointType(input_type) && Primitive::IsIntegralType(result_type)) - || (input_type == Primitive::kPrimLong && Primitive::IsFloatingPointType(result_type))) { - return SideEffects::CanTriggerGC(); - } - return SideEffects::None(); - } - DECLARE_INSTRUCTION(TypeConversion); private: @@ -5031,9 +5008,7 @@ class HInstanceFieldGet FINAL : public HExpression<1> { const DexFile& dex_file, Handle<mirror::DexCache> dex_cache, uint32_t dex_pc) - : HExpression(field_type, - SideEffectsForArchRuntimeCalls(field_type, is_volatile), - dex_pc), + : HExpression(field_type, SideEffects::FieldReadOfType(field_type, is_volatile), dex_pc), field_info_(field_offset, field_type, is_volatile, @@ -5064,16 +5039,6 @@ class HInstanceFieldGet FINAL : public HExpression<1> { Primitive::Type GetFieldType() const { return field_info_.GetFieldType(); } bool IsVolatile() const { return field_info_.IsVolatile(); } - static SideEffects SideEffectsForArchRuntimeCalls(Primitive::Type field_type, bool is_volatile) { - SideEffects side_effects = SideEffects::FieldReadOfType(field_type, is_volatile); - - // MIPS delegates volatile kPrimLong and kPrimDouble loads to a runtime helper. - if (Primitive::Is64BitType(field_type)) { - side_effects.Add(SideEffects::CanTriggerGC()); - } - return side_effects; - } - DECLARE_INSTRUCTION(InstanceFieldGet); private: @@ -5094,8 +5059,7 @@ class HInstanceFieldSet FINAL : public HTemplateInstruction<2> { const DexFile& dex_file, Handle<mirror::DexCache> dex_cache, uint32_t dex_pc) - : HTemplateInstruction(SideEffectsForArchRuntimeCalls(field_type, is_volatile), - dex_pc), + : HTemplateInstruction(SideEffects::FieldWriteOfType(field_type, is_volatile), dex_pc), field_info_(field_offset, field_type, is_volatile, @@ -5120,16 +5084,6 @@ class HInstanceFieldSet FINAL : public HTemplateInstruction<2> { bool GetValueCanBeNull() const { return GetPackedFlag<kFlagValueCanBeNull>(); } void ClearValueCanBeNull() { SetPackedFlag<kFlagValueCanBeNull>(false); } - static SideEffects SideEffectsForArchRuntimeCalls(Primitive::Type field_type, bool is_volatile) { - SideEffects side_effects = SideEffects::FieldWriteOfType(field_type, is_volatile); - - // MIPS delegates volatile kPrimLong and kPrimDouble stores to a runtime helper. - if (Primitive::Is64BitType(field_type)) { - side_effects.Add(SideEffects::CanTriggerGC()); - } - return side_effects; - } - DECLARE_INSTRUCTION(InstanceFieldSet); private: @@ -5934,9 +5888,7 @@ class HStaticFieldGet FINAL : public HExpression<1> { const DexFile& dex_file, Handle<mirror::DexCache> dex_cache, uint32_t dex_pc) - : HExpression(field_type, - SideEffectsForArchRuntimeCalls(field_type, is_volatile), - dex_pc), + : HExpression(field_type, SideEffects::FieldReadOfType(field_type, is_volatile), dex_pc), field_info_(field_offset, field_type, is_volatile, @@ -5964,16 +5916,6 @@ class HStaticFieldGet FINAL : public HExpression<1> { Primitive::Type GetFieldType() const { return field_info_.GetFieldType(); } bool IsVolatile() const { return field_info_.IsVolatile(); } - static SideEffects SideEffectsForArchRuntimeCalls(Primitive::Type field_type, bool is_volatile) { - SideEffects side_effects = SideEffects::FieldReadOfType(field_type, is_volatile); - - // MIPS delegates volatile kPrimLong and kPrimDouble loads to a runtime helper. - if (Primitive::Is64BitType(field_type)) { - side_effects.Add(SideEffects::CanTriggerGC()); - } - return side_effects; - } - DECLARE_INSTRUCTION(StaticFieldGet); private: @@ -5994,8 +5936,7 @@ class HStaticFieldSet FINAL : public HTemplateInstruction<2> { const DexFile& dex_file, Handle<mirror::DexCache> dex_cache, uint32_t dex_pc) - : HTemplateInstruction(SideEffectsForArchRuntimeCalls(field_type, is_volatile), - dex_pc), + : HTemplateInstruction(SideEffects::FieldWriteOfType(field_type, is_volatile), dex_pc), field_info_(field_offset, field_type, is_volatile, @@ -6017,16 +5958,6 @@ class HStaticFieldSet FINAL : public HTemplateInstruction<2> { bool GetValueCanBeNull() const { return GetPackedFlag<kFlagValueCanBeNull>(); } void ClearValueCanBeNull() { SetPackedFlag<kFlagValueCanBeNull>(false); } - static SideEffects SideEffectsForArchRuntimeCalls(Primitive::Type field_type, bool is_volatile) { - SideEffects side_effects = SideEffects::FieldWriteOfType(field_type, is_volatile); - - // MIPS delegates volatile kPrimLong and kPrimDouble stores to a runtime helper. - if (Primitive::Is64BitType(field_type)) { - side_effects.Add(SideEffects::CanTriggerGC()); - } - return side_effects; - } - DECLARE_INSTRUCTION(StaticFieldSet); private: diff --git a/compiler/optimizing/nodes_shared.h b/compiler/optimizing/nodes_shared.h index ff9b5e9cfd..814202e97b 100644 --- a/compiler/optimizing/nodes_shared.h +++ b/compiler/optimizing/nodes_shared.h @@ -122,10 +122,15 @@ class HBitwiseNegatedRight FINAL : public HBinaryOperation { // This instruction computes an intermediate address pointing in the 'middle' of an object. The // result pointer cannot be handled by GC, so extra care is taken to make sure that this value is // never used across anything that can trigger GC. +// The result of this instruction is not a pointer in the sense of `Primitive::kPrimNot`. So we +// represent it by the type `Primitive::kPrimInt`. class HIntermediateAddress FINAL : public HExpression<2> { public: HIntermediateAddress(HInstruction* base_address, HInstruction* offset, uint32_t dex_pc) - : HExpression(Primitive::kPrimNot, SideEffects::DependsOnGC(), dex_pc) { + : HExpression(Primitive::kPrimInt, SideEffects::DependsOnGC(), dex_pc) { + DCHECK_EQ(Primitive::ComponentSize(Primitive::kPrimInt), + Primitive::ComponentSize(Primitive::kPrimNot)) + << "kPrimInt and kPrimNot have different sizes."; SetRawInputAt(0, base_address); SetRawInputAt(1, offset); } diff --git a/dex2oat/Android.bp b/dex2oat/Android.bp index d4227345f0..11c18b0924 100644 --- a/dex2oat/Android.bp +++ b/dex2oat/Android.bp @@ -124,7 +124,7 @@ art_cc_binary { art_cc_test { name: "art_dex2oat_tests", defaults: [ - "art_test_defaults", + "art_gtest_defaults", ], srcs: ["dex2oat_test.cc"], } diff --git a/dexdump/Android.bp b/dexdump/Android.bp index 74f75780fa..64f2299fa5 100644 --- a/dexdump/Android.bp +++ b/dexdump/Android.bp @@ -28,7 +28,7 @@ art_cc_binary { art_cc_test { name: "art_dexdump_tests", defaults: [ - "art_test_defaults", + "art_gtest_defaults", ], srcs: ["dexdump_test.cc"], } diff --git a/dexlayout/Android.bp b/dexlayout/Android.bp index 9c4499f8a7..163cb01120 100644 --- a/dexlayout/Android.bp +++ b/dexlayout/Android.bp @@ -27,7 +27,7 @@ art_cc_binary { art_cc_test { name: "art_dexlayout_tests", defaults: [ - "art_test_defaults", + "art_gtest_defaults", ], srcs: ["dexlayout_test.cc"], } diff --git a/dexlist/Android.bp b/dexlist/Android.bp index ddf01db38d..52b1ee97d2 100644 --- a/dexlist/Android.bp +++ b/dexlist/Android.bp @@ -23,7 +23,7 @@ art_cc_binary { art_cc_test { name: "art_dexlist_tests", defaults: [ - "art_test_defaults", + "art_gtest_defaults", ], srcs: ["dexlist_test.cc"], } diff --git a/imgdiag/Android.bp b/imgdiag/Android.bp index 639b8e8709..7837d66913 100644 --- a/imgdiag/Android.bp +++ b/imgdiag/Android.bp @@ -73,7 +73,7 @@ art_cc_binary { art_cc_test { name: "art_imgdiag_tests", defaults: [ - "art_test_defaults", + "art_gtest_defaults", ], srcs: ["imgdiag_test.cc"], } diff --git a/oatdump/Android.bp b/oatdump/Android.bp index 02a51a667f..ff56ea548d 100644 --- a/oatdump/Android.bp +++ b/oatdump/Android.bp @@ -90,7 +90,7 @@ art_cc_binary { art_cc_test { name: "art_oatdump_tests", defaults: [ - "art_test_defaults", + "art_gtest_defaults", ], srcs: ["oatdump_test.cc"], } diff --git a/profman/Android.bp b/profman/Android.bp index cd1aaabda7..322dda2211 100644 --- a/profman/Android.bp +++ b/profman/Android.bp @@ -56,7 +56,7 @@ art_cc_binary { art_cc_test { name: "art_profman_tests", defaults: [ - "art_test_defaults", + "art_gtest_defaults", ], srcs: ["profile_assistant_test.cc"], } diff --git a/runtime/Android.bp b/runtime/Android.bp index c00689b68c..8c17653c79 100644 --- a/runtime/Android.bp +++ b/runtime/Android.bp @@ -475,7 +475,7 @@ art_cc_library { art_cc_test { name: "art_runtime_tests", defaults: [ - "art_test_defaults", + "art_gtest_defaults", ], srcs: [ "arch/arch_test.cc", @@ -570,7 +570,7 @@ art_cc_test { art_cc_test { name: "art_runtime_compiler_tests", defaults: [ - "art_test_defaults", + "art_gtest_defaults", ], srcs: [ "jni_internal_test.cc", diff --git a/runtime/debugger.cc b/runtime/debugger.cc index b49c01cfb1..6ed44fc5c4 100644 --- a/runtime/debugger.cc +++ b/runtime/debugger.cc @@ -1761,22 +1761,32 @@ static JDWP::JdwpError GetFieldValueImpl(JDWP::RefTypeId ref_type_id, JDWP::Obje return error; } - mirror::Object* o = Dbg::GetObjectRegistry()->Get<mirror::Object*>(object_id, &error); - if ((!is_static && o == nullptr) || error != JDWP::ERR_NONE) { + Thread* self = Thread::Current(); + StackHandleScope<2> hs(self); + MutableHandle<mirror::Object> + o(hs.NewHandle(Dbg::GetObjectRegistry()->Get<mirror::Object*>(object_id, &error))); + if ((!is_static && o.Get() == nullptr) || error != JDWP::ERR_NONE) { return JDWP::ERR_INVALID_OBJECT; } ArtField* f = FromFieldId(field_id); mirror::Class* receiver_class = c; - if (receiver_class == nullptr && o != nullptr) { + if (receiver_class == nullptr && o.Get() != nullptr) { receiver_class = o->GetClass(); } + // TODO: should we give up now if receiver_class is null? if (receiver_class != nullptr && !f->GetDeclaringClass()->IsAssignableFrom(receiver_class)) { LOG(INFO) << "ERR_INVALID_FIELDID: " << PrettyField(f) << " " << PrettyClass(receiver_class); return JDWP::ERR_INVALID_FIELDID; } + // Ensure the field's class is initialized. + Handle<mirror::Class> klass(hs.NewHandle(f->GetDeclaringClass())); + if (!Runtime::Current()->GetClassLinker()->EnsureInitialized(self, klass, true, false)) { + LOG(WARNING) << "Not able to initialize class for SetValues: " << PrettyClass(klass.Get()); + } + // The RI only enforces the static/non-static mismatch in one direction. // TODO: should we change the tests and check both? if (is_static) { @@ -1790,10 +1800,10 @@ static JDWP::JdwpError GetFieldValueImpl(JDWP::RefTypeId ref_type_id, JDWP::Obje } } if (f->IsStatic()) { - o = f->GetDeclaringClass(); + o.Assign(f->GetDeclaringClass()); } - JValue field_value(GetArtFieldValue(f, o)); + JValue field_value(GetArtFieldValue(f, o.Get())); JDWP::JdwpTag tag = BasicTagFromDescriptor(f->GetTypeDescriptor()); Dbg::OutputJValue(tag, &field_value, pReply); return JDWP::ERR_NONE; @@ -1883,12 +1893,21 @@ static JDWP::JdwpError SetFieldValueImpl(JDWP::ObjectId object_id, JDWP::FieldId uint64_t value, int width, bool is_static) REQUIRES_SHARED(Locks::mutator_lock_) { JDWP::JdwpError error; - mirror::Object* o = Dbg::GetObjectRegistry()->Get<mirror::Object*>(object_id, &error); - if ((!is_static && o == nullptr) || error != JDWP::ERR_NONE) { + Thread* self = Thread::Current(); + StackHandleScope<2> hs(self); + MutableHandle<mirror::Object> + o(hs.NewHandle(Dbg::GetObjectRegistry()->Get<mirror::Object*>(object_id, &error))); + if ((!is_static && o.Get() == nullptr) || error != JDWP::ERR_NONE) { return JDWP::ERR_INVALID_OBJECT; } ArtField* f = FromFieldId(field_id); + // Ensure the field's class is initialized. + Handle<mirror::Class> klass(hs.NewHandle(f->GetDeclaringClass())); + if (!Runtime::Current()->GetClassLinker()->EnsureInitialized(self, klass, true, false)) { + LOG(WARNING) << "Not able to initialize class for SetValues: " << PrettyClass(klass.Get()); + } + // The RI only enforces the static/non-static mismatch in one direction. // TODO: should we change the tests and check both? if (is_static) { @@ -1902,9 +1921,9 @@ static JDWP::JdwpError SetFieldValueImpl(JDWP::ObjectId object_id, JDWP::FieldId } } if (f->IsStatic()) { - o = f->GetDeclaringClass(); + o.Assign(f->GetDeclaringClass()); } - return SetArtFieldValue(f, o, value, width); + return SetArtFieldValue(f, o.Get(), value, width); } JDWP::JdwpError Dbg::SetFieldValue(JDWP::ObjectId object_id, JDWP::FieldId field_id, uint64_t value, diff --git a/runtime/entrypoints/quick/quick_entrypoints_enum.cc b/runtime/entrypoints/quick/quick_entrypoints_enum.cc index 7b80af6477..81f152b6fd 100644 --- a/runtime/entrypoints/quick/quick_entrypoints_enum.cc +++ b/runtime/entrypoints/quick/quick_entrypoints_enum.cc @@ -71,4 +71,55 @@ bool EntrypointRequiresStackMap(QuickEntrypointEnum trampoline) { } } +bool EntrypointCanTriggerGC(QuickEntrypointEnum entrypoint) { + switch (entrypoint) { + // Listed in the same order as in quick_entrypoints_list.h. + case kQuickCmpgDouble: + case kQuickCmpgFloat: + case kQuickCmplDouble: + case kQuickCmplFloat: + case kQuickCos: + case kQuickSin: + case kQuickAcos: + case kQuickAsin: + case kQuickAtan: + case kQuickAtan2: + case kQuickCbrt: + case kQuickCosh: + case kQuickExp: + case kQuickExpm1: + case kQuickHypot: + case kQuickLog: + case kQuickLog10: + case kQuickNextAfter: + case kQuickSinh: + case kQuickTan: + case kQuickTanh: + case kQuickFmod: + case kQuickL2d: + case kQuickFmodf: + case kQuickL2f: + case kQuickD2iz: + case kQuickF2iz: + case kQuickIdivmod: + case kQuickD2l: + case kQuickF2l: + case kQuickLdiv: + case kQuickLmod: + case kQuickLmul: + case kQuickShlLong: + case kQuickShrLong: + case kQuickUshrLong: + return false; + + /* Used by mips for 64bit volatile load/stores. */ + case kQuickA64Load: + case kQuickA64Store: + return false; + + default: + return true; + } +} + } // namespace art diff --git a/runtime/entrypoints/quick/quick_entrypoints_enum.h b/runtime/entrypoints/quick/quick_entrypoints_enum.h index 7674873731..abf2c34744 100644 --- a/runtime/entrypoints/quick/quick_entrypoints_enum.h +++ b/runtime/entrypoints/quick/quick_entrypoints_enum.h @@ -63,6 +63,7 @@ template <> inline void CheckEntrypointTypes<kQuick ## name, __VA_ARGS__>() {}; #undef ENTRYPOINT_ENUM bool EntrypointRequiresStackMap(QuickEntrypointEnum trampoline); +bool EntrypointCanTriggerGC(QuickEntrypointEnum entrypoint); } // namespace art diff --git a/test/115-native-bridge/run b/test/115-native-bridge/run index fb0b967a2e..9290dd3cf4 100644 --- a/test/115-native-bridge/run +++ b/test/115-native-bridge/run @@ -18,6 +18,8 @@ ARGS=${@} # Use libnativebridgetest as a native bridge, start NativeBridgeMain (Main is JniTest main file). LIBPATH=$(echo ${ARGS} | sed -r 's/.*Djava.library.path=([^ ]*) .*/\1/') +# Trim all but the last entry in LIBPATH, which will be nativetest[64] +LIBPATH=${LIBPATH##*:} ln -sf ${LIBPATH}/libnativebridgetest.so . touch libarttest.so touch libarttestd.so diff --git a/test/130-hprof/src/Main.java b/test/130-hprof/src/Main.java index c145f27103..57be3a7d2f 100644 --- a/test/130-hprof/src/Main.java +++ b/test/130-hprof/src/Main.java @@ -125,7 +125,7 @@ public class Main { private static File getHprofConf() { // Use the java.library.path. It points to the lib directory. - File libDir = new File(System.getProperty("java.library.path")); + File libDir = new File(System.getProperty("java.library.path").split(":")[0]); return new File(new File(libDir.getParentFile(), "bin"), "hprof-conv"); } diff --git a/test/527-checker-array-access-split/src/Main.java b/test/527-checker-array-access-split/src/Main.java index 9435ef1def..3de900a3a9 100644 --- a/test/527-checker-array-access-split/src/Main.java +++ b/test/527-checker-array-access-split/src/Main.java @@ -101,7 +101,7 @@ public class Main { /// CHECK: <<DataOffset:i\d+>> IntConstant /// CHECK: <<Array:l\d+>> NullCheck /// CHECK: <<Index:i\d+>> BoundsCheck - /// CHECK: <<Address:l\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] + /// CHECK: <<Address:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] /// CHECK-NEXT: ArrayGet [<<Address>>,<<Index>>] @@ -114,7 +114,7 @@ public class Main { /// CHECK: <<DataOffset:i\d+>> IntConstant /// CHECK: <<Array:l\d+>> NullCheck /// CHECK: <<Index:i\d+>> BoundsCheck - /// CHECK: <<Address:l\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] + /// CHECK: <<Address:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] /// CHECK-NEXT: ArrayGet [<<Address>>,<<Index>>] public static int get(int array[], int index) { @@ -140,7 +140,7 @@ public class Main { /// CHECK: <<DataOffset:i\d+>> IntConstant /// CHECK: <<Array:l\d+>> NullCheck /// CHECK: <<Index:i\d+>> BoundsCheck - /// CHECK: <<Address:l\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] + /// CHECK: <<Address:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] /// CHECK-NEXT: ArraySet [<<Address>>,<<Index>>,<<Arg>>] @@ -159,7 +159,7 @@ public class Main { /// CHECK: <<DataOffset:i\d+>> IntConstant /// CHECK: <<Array:l\d+>> NullCheck /// CHECK: <<Index:i\d+>> BoundsCheck - /// CHECK: <<Address:l\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] + /// CHECK: <<Address:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] /// CHECK-NEXT: ArraySet [<<Address>>,<<Index>>,<<Arg>>] public static void set(int array[], int index, int value) { @@ -183,10 +183,10 @@ public class Main { /// CHECK-DAG: <<DataOffset:i\d+>> IntConstant /// CHECK: <<Array:l\d+>> NullCheck /// CHECK: <<Index:i\d+>> BoundsCheck - /// CHECK: <<Address1:l\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] + /// CHECK: <<Address1:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] /// CHECK-NEXT: <<ArrayGet:i\d+>> ArrayGet [<<Address1>>,<<Index>>] /// CHECK: <<Add:i\d+>> Add [<<ArrayGet>>,<<Const1>>] - /// CHECK: <<Address2:l\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] + /// CHECK: <<Address2:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] /// CHECK-NEXT: ArraySet [<<Address2>>,<<Index>>,<<Add>>] /// CHECK-START-ARM64: void Main.getSet(int[], int) GVN$after_arch (after) @@ -194,7 +194,7 @@ public class Main { /// CHECK-DAG: <<DataOffset:i\d+>> IntConstant /// CHECK: <<Array:l\d+>> NullCheck /// CHECK: <<Index:i\d+>> BoundsCheck - /// CHECK: <<Address:l\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] + /// CHECK: <<Address:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] /// CHECK: <<ArrayGet:i\d+>> ArrayGet [<<Address>>,<<Index>>] /// CHECK: <<Add:i\d+>> Add [<<ArrayGet>>,<<Const1>>] /// CHECK-NOT: IntermediateAddress @@ -214,10 +214,10 @@ public class Main { /// CHECK-DAG: <<DataOffset:i\d+>> IntConstant /// CHECK: <<Array:l\d+>> NullCheck /// CHECK: <<Index:i\d+>> BoundsCheck - /// CHECK: <<Address1:l\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] + /// CHECK: <<Address1:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] /// CHECK-NEXT: <<ArrayGet:i\d+>> ArrayGet [<<Address1>>,<<Index>>] /// CHECK: <<Add:i\d+>> Add [<<ArrayGet>>,<<Const1>>] - /// CHECK: <<Address2:l\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] + /// CHECK: <<Address2:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] /// CHECK-NEXT: ArraySet [<<Address2>>,<<Index>>,<<Add>>] /// CHECK-START-ARM: void Main.getSet(int[], int) GVN$after_arch (after) @@ -225,7 +225,7 @@ public class Main { /// CHECK-DAG: <<DataOffset:i\d+>> IntConstant /// CHECK: <<Array:l\d+>> NullCheck /// CHECK: <<Index:i\d+>> BoundsCheck - /// CHECK: <<Address:l\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] + /// CHECK: <<Address:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] /// CHECK: <<ArrayGet:i\d+>> ArrayGet [<<Address>>,<<Index>>] /// CHECK: <<Add:i\d+>> Add [<<ArrayGet>>,<<Const1>>] /// CHECK-NOT: IntermediateAddress @@ -253,11 +253,11 @@ public class Main { /// CHECK-DAG: <<DataOffset:i\d+>> IntConstant /// CHECK: <<Array:l\d+>> NullCheck /// CHECK: <<Index:i\d+>> BoundsCheck - /// CHECK: <<Address1:l\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] + /// CHECK: <<Address1:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] /// CHECK-NEXT: <<ArrayGet:i\d+>> ArrayGet [<<Address1>>,<<Index>>] /// CHECK: <<Add:i\d+>> Add [<<ArrayGet>>,<<Const1>>] /// CHECK: NewArray - /// CHECK: <<Address2:l\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] + /// CHECK: <<Address2:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] /// CHECK-NEXT: ArraySet [<<Address2>>,<<Index>>,<<Add>>] /// CHECK-START-ARM64: int[] Main.accrossGC(int[], int) GVN$after_arch (after) @@ -265,11 +265,11 @@ public class Main { /// CHECK-DAG: <<DataOffset:i\d+>> IntConstant /// CHECK: <<Array:l\d+>> NullCheck /// CHECK: <<Index:i\d+>> BoundsCheck - /// CHECK: <<Address1:l\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] + /// CHECK: <<Address1:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] /// CHECK: <<ArrayGet:i\d+>> ArrayGet [<<Address1>>,<<Index>>] /// CHECK: <<Add:i\d+>> Add [<<ArrayGet>>,<<Const1>>] /// CHECK: NewArray - /// CHECK: <<Address2:l\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] + /// CHECK: <<Address2:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] /// CHECK: ArraySet [<<Address2>>,<<Index>>,<<Add>>] @@ -287,11 +287,11 @@ public class Main { /// CHECK-DAG: <<DataOffset:i\d+>> IntConstant /// CHECK: <<Array:l\d+>> NullCheck /// CHECK: <<Index:i\d+>> BoundsCheck - /// CHECK: <<Address1:l\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] + /// CHECK: <<Address1:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] /// CHECK-NEXT: <<ArrayGet:i\d+>> ArrayGet [<<Address1>>,<<Index>>] /// CHECK: <<Add:i\d+>> Add [<<ArrayGet>>,<<Const1>>] /// CHECK: NewArray - /// CHECK: <<Address2:l\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] + /// CHECK: <<Address2:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] /// CHECK-NEXT: ArraySet [<<Address2>>,<<Index>>,<<Add>>] /// CHECK-START-ARM: int[] Main.accrossGC(int[], int) GVN$after_arch (after) @@ -299,11 +299,11 @@ public class Main { /// CHECK-DAG: <<DataOffset:i\d+>> IntConstant /// CHECK: <<Array:l\d+>> NullCheck /// CHECK: <<Index:i\d+>> BoundsCheck - /// CHECK: <<Address1:l\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] + /// CHECK: <<Address1:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] /// CHECK: <<ArrayGet:i\d+>> ArrayGet [<<Address1>>,<<Index>>] /// CHECK: <<Add:i\d+>> Add [<<ArrayGet>>,<<Const1>>] /// CHECK: NewArray - /// CHECK: <<Address2:l\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] + /// CHECK: <<Address2:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] /// CHECK: ArraySet [<<Address2>>,<<Index>>,<<Add>>] public static int[] accrossGC(int array[], int index) { @@ -343,10 +343,10 @@ public class Main { /// CHECK: <<Index:i\d+>> Phi /// CHECK: If // -------------- Loop - /// CHECK: <<Address1:l\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] + /// CHECK: <<Address1:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] /// CHECK-NEXT: <<ArrayGet:i\d+>> ArrayGet [<<Address1>>,<<Index>>] /// CHECK: <<Add:i\d+>> Add [<<ArrayGet>>,<<Const1>>] - /// CHECK: <<Address2:l\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] + /// CHECK: <<Address2:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] /// CHECK-NEXT: ArraySet [<<Address2>>,<<Index>>,<<Add>>] /// CHECK-START-ARM64: int Main.canMergeAfterBCE1() GVN$after_arch (after) @@ -356,7 +356,7 @@ public class Main { /// CHECK: <<Index:i\d+>> Phi /// CHECK: If // -------------- Loop - /// CHECK: <<Address:l\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] + /// CHECK: <<Address:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] /// CHECK: <<ArrayGet:i\d+>> ArrayGet [<<Address>>,<<Index>>] /// CHECK: <<Add:i\d+>> Add [<<ArrayGet>>,<<Const1>>] /// CHECK-NOT: IntermediateAddress @@ -380,10 +380,10 @@ public class Main { /// CHECK: <<Index:i\d+>> Phi /// CHECK: If // -------------- Loop - /// CHECK: <<Address1:l\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] + /// CHECK: <<Address1:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] /// CHECK-NEXT: <<ArrayGet:i\d+>> ArrayGet [<<Address1>>,<<Index>>] /// CHECK: <<Add:i\d+>> Add [<<ArrayGet>>,<<Const1>>] - /// CHECK: <<Address2:l\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] + /// CHECK: <<Address2:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] /// CHECK-NEXT: ArraySet [<<Address2>>,<<Index>>,<<Add>>] /// CHECK-START-ARM: int Main.canMergeAfterBCE1() GVN$after_arch (after) @@ -393,7 +393,7 @@ public class Main { /// CHECK: <<Index:i\d+>> Phi /// CHECK: If // -------------- Loop - /// CHECK: <<Address:l\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] + /// CHECK: <<Address:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] /// CHECK: <<ArrayGet:i\d+>> ArrayGet [<<Address>>,<<Index>>] /// CHECK: <<Add:i\d+>> Add [<<ArrayGet>>,<<Const1>>] /// CHECK-NOT: IntermediateAddress @@ -437,12 +437,12 @@ public class Main { /// CHECK: If // -------------- Loop /// CHECK-DAG: <<Index1:i\d+>> Add [<<Index>>,<<Const1>>] - /// CHECK-DAG: <<Address1:l\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] + /// CHECK-DAG: <<Address1:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] /// CHECK-DAG: <<ArrayGetI:i\d+>> ArrayGet [<<Address1>>,<<Index>>] - /// CHECK-DAG: <<Address2:l\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] + /// CHECK-DAG: <<Address2:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] /// CHECK-DAG: <<ArrayGetI1:i\d+>> ArrayGet [<<Address2>>,<<Index1>>] /// CHECK: <<Add:i\d+>> Add [<<ArrayGetI>>,<<ArrayGetI1>>] - /// CHECK: <<Address3:l\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] + /// CHECK: <<Address3:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] /// CHECK: ArraySet [<<Address3>>,<<Index1>>,<<Add>>] /// CHECK-START-ARM64: int Main.canMergeAfterBCE2() GVN$after_arch (after) @@ -453,7 +453,7 @@ public class Main { /// CHECK: If // -------------- Loop /// CHECK-DAG: <<Index1:i\d+>> Add [<<Index>>,<<Const1>>] - /// CHECK-DAG: <<Address:l\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] + /// CHECK-DAG: <<Address:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] /// CHECK-DAG: <<ArrayGetI:i\d+>> ArrayGet [<<Address>>,<<Index>>] /// CHECK-DAG: <<ArrayGetI1:i\d+>> ArrayGet [<<Address>>,<<Index1>>] /// CHECK: <<Add:i\d+>> Add [<<ArrayGetI>>,<<ArrayGetI1>>] @@ -486,12 +486,12 @@ public class Main { /// CHECK: If // -------------- Loop /// CHECK-DAG: <<Index1:i\d+>> Add [<<Index>>,<<Const1>>] - /// CHECK-DAG: <<Address1:l\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] + /// CHECK-DAG: <<Address1:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] /// CHECK-DAG: <<ArrayGetI:i\d+>> ArrayGet [<<Address1>>,<<Index>>] - /// CHECK-DAG: <<Address2:l\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] + /// CHECK-DAG: <<Address2:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] /// CHECK-DAG: <<ArrayGetI1:i\d+>> ArrayGet [<<Address2>>,<<Index1>>] /// CHECK: <<Add:i\d+>> Add [<<ArrayGetI>>,<<ArrayGetI1>>] - /// CHECK: <<Address3:l\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] + /// CHECK: <<Address3:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] /// CHECK: ArraySet [<<Address3>>,<<Index1>>,<<Add>>] /// CHECK-START-ARM: int Main.canMergeAfterBCE2() GVN$after_arch (after) @@ -502,7 +502,7 @@ public class Main { /// CHECK: If // -------------- Loop /// CHECK-DAG: <<Index1:i\d+>> Add [<<Index>>,<<Const1>>] - /// CHECK-DAG: <<Address:l\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] + /// CHECK-DAG: <<Address:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] /// CHECK-DAG: <<ArrayGetI:i\d+>> ArrayGet [<<Address>>,<<Index>>] /// CHECK-DAG: <<ArrayGetI1:i\d+>> ArrayGet [<<Address>>,<<Index1>>] /// CHECK: <<Add:i\d+>> Add [<<ArrayGetI>>,<<ArrayGetI1>>] diff --git a/test/Android.bp b/test/Android.bp index 54c85eb838..1256960104 100644 --- a/test/Android.bp +++ b/test/Android.bp @@ -17,12 +17,37 @@ art_cc_defaults { name: "art_test_defaults", host_supported: true, + target: { + android_arm: { + relative_install_path: "art/arm", + }, + android_arm64: { + relative_install_path: "art/arm64", + }, + android_mips: { + relative_install_path: "art/mips", + }, + android_mips64: { + relative_install_path: "art/mips64", + }, + android_x86: { + relative_install_path: "art/x86", + }, + android_x86_64: { + relative_install_path: "art/x86_64", + }, + }, +} + +art_cc_defaults { + name: "art_gtest_defaults", test_per_src: true, // These really are gtests, but the gtest library comes from libart-gtest.so gtest: false, defaults: [ "art_defaults", "art_debug_defaults", + "art_test_defaults", ], shared_libs: [ @@ -92,25 +117,6 @@ art_cc_defaults { "-Wno-missing-noreturn", ], }, - - android_arm: { - relative_install_path: "art/arm", - }, - android_arm64: { - relative_install_path: "art/arm64", - }, - android_mips: { - relative_install_path: "art/mips", - }, - android_mips64: { - relative_install_path: "art/mips64", - }, - android_x86: { - relative_install_path: "art/x86", - }, - android_x86_64: { - relative_install_path: "art/x86_64", - }, }, } @@ -186,3 +192,166 @@ art_cc_library { }, }, } + +cc_defaults { + name: "libartagent-defaults", + defaults: [ + "art_defaults", + "art_test_defaults", + ], + shared_libs: [ + "libbacktrace", + "libnativehelper", + ], + target: { + android: { + shared_libs: ["libdl"], + }, + host: { + host_ldlibs: [ + "-ldl", + "-lpthread", + ], + }, + }, +} + +art_cc_test_library { + name: "libartagent", + srcs: ["900-hello-plugin/load_unload.cc"], + defaults: ["libartagent-defaults"], + shared_libs: ["libart"], +} + +art_cc_test_library { + name: "libartagentd", + srcs: ["900-hello-plugin/load_unload.cc"], + defaults: [ + "libartagent-defaults", + "art_debug_defaults", + ], + shared_libs: ["libartd"], +} + +art_cc_test_library { + name: "libtiagent", + defaults: ["libartagent-defaults"], + srcs: [ + "ti-agent/common_load.cc", + "901-hello-ti-agent/basics.cc", + ], + shared_libs: [ + "libart", + "libopenjdkjvmti", + ], +} + +art_cc_test_library { + name: "libtiagentd", + defaults: [ + "libartagent-defaults", + "art_debug_defaults", + ], + srcs: [ + "ti-agent/common_load.cc", + "901-hello-ti-agent/basics.cc", + ], + shared_libs: [ + "libartd", + "libopenjdkjvmtid", + ], +} + +cc_defaults { + name: "libarttest-defaults", + defaults: [ + "art_defaults", + "art_test_defaults", + ], + srcs: [ + "common/runtime_state.cc", + "common/stack_inspect.cc", + "004-JniTest/jni_test.cc", + "004-SignalTest/signaltest.cc", + "004-ReferenceMap/stack_walk_refmap_jni.cc", + "004-StackWalk/stack_walk_jni.cc", + "004-ThreadStress/thread_stress.cc", + "004-UnsafeTest/unsafe_test.cc", + "044-proxy/native_proxy.cc", + "051-thread/thread_test.cc", + "117-nopatchoat/nopatchoat.cc", + "1337-gc-coverage/gc_coverage.cc", + "136-daemon-jni-shutdown/daemon_jni_shutdown.cc", + "137-cfi/cfi.cc", + "139-register-natives/regnative.cc", + "141-class-unload/jni_unload.cc", + "148-multithread-gc-annotations/gc_coverage.cc", + "149-suspend-all-stress/suspend_all.cc", + "454-get-vreg/get_vreg_jni.cc", + "457-regs/regs_jni.cc", + "461-get-reference-vreg/get_reference_vreg_jni.cc", + "466-get-live-vreg/get_live_vreg_jni.cc", + "497-inlining-and-class-loader/clear_dex_cache.cc", + "543-env-long-ref/env_long_ref.cc", + "566-polymorphic-inlining/polymorphic_inline.cc", + "570-checker-osr/osr.cc", + "595-profile-saving/profile-saving.cc", + "596-app-images/app_images.cc", + "597-deopt-new-string/deopt.cc", + ], + shared_libs: [ + "libbacktrace", + "libnativehelper", + ], + target: { + android: { + shared_libs: ["libdl"], + }, + host: { + host_ldlibs: [ + "-ldl", + "-lpthread", + ], + }, + }, +} + +art_cc_test_library { + name: "libarttest", + defaults: ["libarttest-defaults"], + shared_libs: ["libart"], +} + +art_cc_test_library { + name: "libarttestd", + defaults: [ + "libarttest-defaults", + "art_debug_defaults", + ], + shared_libs: ["libartd"], +} + +art_cc_test_library { + name: "libnativebridgetest", + shared_libs: ["libart"], + defaults: [ + "art_defaults", + "art_debug_defaults", + "art_test_defaults", + ], + srcs: ["115-native-bridge/nativebridge.cc"], + target: { + android: { + shared_libs: ["libdl"], + }, + host: { + host_ldlibs: [ + "-ldl", + "-lpthread", + ], + }, + linux: { + host_ldlibs: ["-lrt"], + }, + }, +} diff --git a/test/Android.libartagent.mk b/test/Android.libartagent.mk deleted file mode 100644 index 729de3f7ae..0000000000 --- a/test/Android.libartagent.mk +++ /dev/null @@ -1,101 +0,0 @@ -# -# 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. -# - - -LOCAL_PATH := $(call my-dir) - -include art/build/Android.common_build.mk - -LIBARTAGENT_COMMON_SRC_FILES := \ - 900-hello-plugin/load_unload.cc - -# $(1): target or host -# $(2): debug or <empty> -define build-libartagent - ifneq ($(1),target) - ifneq ($(1),host) - $$(error expected target or host for argument 1, received $(1)) - endif - endif - ifneq ($(2),debug) - ifneq ($(2),) - $$(error d or empty for argument 2, received $(2)) - endif - suffix := d - else - suffix := - endif - - art_target_or_host := $(1) - - include $(CLEAR_VARS) - LOCAL_CPP_EXTENSION := $(ART_CPP_EXTENSION) - LOCAL_MODULE := libartagent$$(suffix) - ifeq ($$(art_target_or_host),target) - LOCAL_MODULE_TAGS := tests - endif - LOCAL_SRC_FILES := $(LIBARTAGENT_COMMON_SRC_FILES) - LOCAL_SHARED_LIBRARIES += libart$$(suffix) libbacktrace libnativehelper - LOCAL_C_INCLUDES += $(ART_C_INCLUDES) art/runtime - LOCAL_ADDITIONAL_DEPENDENCIES := art/build/Android.common_build.mk - LOCAL_ADDITIONAL_DEPENDENCIES += $(LOCAL_PATH)/Android.libartagent.mk - ifeq ($$(art_target_or_host),target) - $(call set-target-local-clang-vars) - ifeq ($$(suffix),d) - $(call set-target-local-cflags-vars,debug) - else - $(call set-target-local-cflags-vars,ndebug) - endif - LOCAL_SHARED_LIBRARIES += libdl - LOCAL_MULTILIB := both - LOCAL_MODULE_PATH_32 := $(ART_TARGET_TEST_OUT)/$(ART_TARGET_ARCH_32) - LOCAL_MODULE_PATH_64 := $(ART_TARGET_TEST_OUT)/$(ART_TARGET_ARCH_64) - LOCAL_MODULE_TARGET_ARCH := $(ART_SUPPORTED_ARCH) - include $(BUILD_SHARED_LIBRARY) - else # host - LOCAL_CLANG := $(ART_HOST_CLANG) - LOCAL_CFLAGS := $(ART_HOST_CFLAGS) - LOCAL_ASFLAGS := $(ART_HOST_ASFLAGS) - ifeq ($$(suffix),d) - LOCAL_CFLAGS += $(ART_HOST_DEBUG_CFLAGS) - LOCAL_ASFLAGS += $(ART_HOST_DEBUG_ASFLAGS) - else - LOCAL_CFLAGS += $(ART_HOST_NON_DEBUG_CFLAGS) - LOCAL_ASFLAGS += $(ART_HOST_NON_DEBUG_ASFLAGS) - endif - LOCAL_LDLIBS := $(ART_HOST_LDLIBS) -ldl -lpthread - LOCAL_IS_HOST_MODULE := true - LOCAL_MULTILIB := both - include $(BUILD_HOST_SHARED_LIBRARY) - endif - - # Clear locally used variables. - art_target_or_host := - suffix := -endef - -ifeq ($(ART_BUILD_TARGET),true) - $(eval $(call build-libartagent,target,)) - $(eval $(call build-libartagent,target,debug)) -endif -ifeq ($(ART_BUILD_HOST),true) - $(eval $(call build-libartagent,host,)) - $(eval $(call build-libartagent,host,debug)) -endif - -# Clear locally used variables. -LOCAL_PATH := -LIBARTAGENT_COMMON_SRC_FILES := diff --git a/test/Android.libarttest.mk b/test/Android.libarttest.mk deleted file mode 100644 index ec5b7d23c0..0000000000 --- a/test/Android.libarttest.mk +++ /dev/null @@ -1,134 +0,0 @@ -# -# Copyright (C) 2011 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. -# - -LOCAL_PATH := $(call my-dir) - -include art/build/Android.common_build.mk - -LIBARTTEST_COMMON_SRC_FILES := \ - common/runtime_state.cc \ - common/stack_inspect.cc \ - 004-JniTest/jni_test.cc \ - 004-SignalTest/signaltest.cc \ - 004-ReferenceMap/stack_walk_refmap_jni.cc \ - 004-StackWalk/stack_walk_jni.cc \ - 004-ThreadStress/thread_stress.cc \ - 004-UnsafeTest/unsafe_test.cc \ - 044-proxy/native_proxy.cc \ - 051-thread/thread_test.cc \ - 117-nopatchoat/nopatchoat.cc \ - 1337-gc-coverage/gc_coverage.cc \ - 136-daemon-jni-shutdown/daemon_jni_shutdown.cc \ - 137-cfi/cfi.cc \ - 139-register-natives/regnative.cc \ - 141-class-unload/jni_unload.cc \ - 148-multithread-gc-annotations/gc_coverage.cc \ - 149-suspend-all-stress/suspend_all.cc \ - 454-get-vreg/get_vreg_jni.cc \ - 457-regs/regs_jni.cc \ - 461-get-reference-vreg/get_reference_vreg_jni.cc \ - 466-get-live-vreg/get_live_vreg_jni.cc \ - 497-inlining-and-class-loader/clear_dex_cache.cc \ - 543-env-long-ref/env_long_ref.cc \ - 566-polymorphic-inlining/polymorphic_inline.cc \ - 570-checker-osr/osr.cc \ - 595-profile-saving/profile-saving.cc \ - 596-app-images/app_images.cc \ - 597-deopt-new-string/deopt.cc - -ART_TARGET_LIBARTTEST_$(ART_PHONY_TEST_TARGET_SUFFIX) += $(ART_TARGET_TEST_OUT)/$(TARGET_ARCH)/libarttest.so -ART_TARGET_LIBARTTEST_$(ART_PHONY_TEST_TARGET_SUFFIX) += $(ART_TARGET_TEST_OUT)/$(TARGET_ARCH)/libarttestd.so -ifdef TARGET_2ND_ARCH - ART_TARGET_LIBARTTEST_$(2ND_ART_PHONY_TEST_TARGET_SUFFIX) += $(ART_TARGET_TEST_OUT)/$(TARGET_2ND_ARCH)/libarttest.so - ART_TARGET_LIBARTTEST_$(2ND_ART_PHONY_TEST_TARGET_SUFFIX) += $(ART_TARGET_TEST_OUT)/$(TARGET_2ND_ARCH)/libarttestd.so -endif - -# $(1): target or host -define build-libarttest - ifneq ($(1),target) - ifneq ($(1),host) - $$(error expected target or host for argument 1, received $(1)) - endif - endif - ifneq ($(2),debug) - ifneq ($(2),) - $$(error d or empty for argument 2, received $(2)) - endif - suffix := d - else - suffix := - endif - - art_target_or_host := $(1) - - include $(CLEAR_VARS) - LOCAL_CPP_EXTENSION := $(ART_CPP_EXTENSION) - LOCAL_MODULE := libarttest$$(suffix) - ifeq ($$(art_target_or_host),target) - LOCAL_MODULE_TAGS := tests - endif - LOCAL_SRC_FILES := $(LIBARTTEST_COMMON_SRC_FILES) - LOCAL_SHARED_LIBRARIES += libart$$(suffix) libbacktrace libnativehelper - LOCAL_C_INCLUDES += $(ART_C_INCLUDES) art/runtime - LOCAL_ADDITIONAL_DEPENDENCIES := art/build/Android.common_build.mk - LOCAL_ADDITIONAL_DEPENDENCIES += $(LOCAL_PATH)/Android.libarttest.mk - ifeq ($$(art_target_or_host),target) - LOCAL_CLANG := $(ART_TARGET_CLANG) - ifeq ($$(suffix),d) - $(call set-target-local-cflags-vars,debug) - else - $(call set-target-local-cflags-vars,ndebug) - endif - LOCAL_SHARED_LIBRARIES += libdl - LOCAL_MULTILIB := both - LOCAL_MODULE_PATH_32 := $(ART_TARGET_TEST_OUT)/$(ART_TARGET_ARCH_32) - LOCAL_MODULE_PATH_64 := $(ART_TARGET_TEST_OUT)/$(ART_TARGET_ARCH_64) - LOCAL_MODULE_TARGET_ARCH := $(ART_SUPPORTED_ARCH) - include $(BUILD_SHARED_LIBRARY) - else # host - LOCAL_CLANG := $(ART_HOST_CLANG) - LOCAL_CFLAGS := $(ART_HOST_CFLAGS) - LOCAL_ASFLAGS := $(ART_HOST_ASFLAGS) - ifeq ($$(suffix),d) - LOCAL_CFLAGS += $(ART_HOST_DEBUG_CFLAGS) - LOCAL_ASFLAGS += $(ART_HOST_DEBUG_ASFLAGS) - else - LOCAL_CFLAGS += $(ART_HOST_NON_DEBUG_CFLAGS) - LOCAL_ASFLAGS += $(ART_HOST_NON_DEBUG_ASFLAGS) - endif - LOCAL_LDLIBS := -ldl -lpthread - LOCAL_IS_HOST_MODULE := true - LOCAL_MULTILIB := both - include $(BUILD_HOST_SHARED_LIBRARY) - endif - - # Clear locally used variables. - art_target_or_host := - suffix := -endef - -ifeq ($(ART_BUILD_TARGET),true) - $(eval $(call build-libarttest,target,)) - $(eval $(call build-libarttest,target,debug)) -endif -ifeq ($(ART_BUILD_HOST),true) - $(eval $(call build-libarttest,host,)) - $(eval $(call build-libarttest,host,debug)) -endif - -# Clear locally used variables. -LOCAL_PATH := -LIBARTTEST_COMMON_SRC_FILES := diff --git a/test/Android.libnativebridgetest.mk b/test/Android.libnativebridgetest.mk deleted file mode 100644 index aa83016d7b..0000000000 --- a/test/Android.libnativebridgetest.mk +++ /dev/null @@ -1,87 +0,0 @@ -# -# Copyright (C) 2014 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. -# - -LOCAL_PATH := $(call my-dir) - -include art/build/Android.common_build.mk - -LIBNATIVEBRIDGETEST_COMMON_SRC_FILES := \ - 115-native-bridge/nativebridge.cc - -ART_TARGET_LIBNATIVEBRIDGETEST_$(ART_PHONY_TEST_TARGET_SUFFIX) += $(ART_TARGET_TEST_OUT)/$(TARGET_ARCH)/libnativebridgetest.so -ifdef TARGET_2ND_ARCH - ART_TARGET_LIBNATIVEBRIDGETEST_$(2ND_ART_PHONY_TEST_TARGET_SUFFIX) += $(ART_TARGET_TEST_OUT)/$(TARGET_2ND_ARCH)/libnativebridgetest.so -endif - -# $(1): target or host -define build-libnativebridgetest - ifneq ($(1),target) - ifneq ($(1),host) - $$(error expected target or host for argument 1, received $(1)) - endif - endif - - art_target_or_host := $(1) - - include $(CLEAR_VARS) - LOCAL_CPP_EXTENSION := $(ART_CPP_EXTENSION) - LOCAL_MODULE := libnativebridgetest - ifeq ($$(art_target_or_host),target) - LOCAL_MODULE_TAGS := tests - endif - LOCAL_SRC_FILES := $(LIBNATIVEBRIDGETEST_COMMON_SRC_FILES) - LOCAL_SHARED_LIBRARIES += libartd - LOCAL_C_INCLUDES += $(ART_C_INCLUDES) art/runtime - LOCAL_ADDITIONAL_DEPENDENCIES := art/build/Android.common_build.mk - LOCAL_ADDITIONAL_DEPENDENCIES += $(LOCAL_PATH)/Android.libnativebridgetest.mk - ifeq ($$(art_target_or_host),target) - LOCAL_CLANG := $(ART_TARGET_CLANG) - $(call set-target-local-cflags-vars,debug) - LOCAL_SHARED_LIBRARIES += libdl - LOCAL_STATIC_LIBRARIES := libgtest - LOCAL_MULTILIB := both - LOCAL_MODULE_PATH_32 := $(ART_TARGET_TEST_OUT)/$(ART_TARGET_ARCH_32) - LOCAL_MODULE_PATH_64 := $(ART_TARGET_TEST_OUT)/$(ART_TARGET_ARCH_64) - LOCAL_MODULE_TARGET_ARCH := $(ART_SUPPORTED_ARCH) - include $(BUILD_SHARED_LIBRARY) - else # host - LOCAL_CLANG := $(ART_HOST_CLANG) - LOCAL_CFLAGS := $(ART_HOST_CFLAGS) $(ART_HOST_DEBUG_CFLAGS) - LOCAL_ASFLAGS := $(ART_HOST_ASFLAGS) $(ART_HOST_DEBUG_ASFLAGS) - LOCAL_SHARED_LIBRARIES += libcutils - LOCAL_LDLIBS := -ldl -lpthread - ifeq ($(HOST_OS),linux) - LOCAL_LDLIBS += -lrt - endif - LOCAL_IS_HOST_MODULE := true - LOCAL_MULTILIB := both - include $(BUILD_HOST_SHARED_LIBRARY) - endif - - # Clear locally used variables. - art_target_or_host := -endef - -ifeq ($(ART_BUILD_TARGET),true) - $(eval $(call build-libnativebridgetest,target)) -endif -ifeq ($(ART_BUILD_HOST),true) - $(eval $(call build-libnativebridgetest,host)) -endif - -# Clear locally used variables. -LOCAL_PATH := -LIBNATIVEBRIDGETEST_COMMON_SRC_FILES := diff --git a/test/Android.libtiagent.mk b/test/Android.libtiagent.mk deleted file mode 100644 index 626dc3b8b3..0000000000 --- a/test/Android.libtiagent.mk +++ /dev/null @@ -1,102 +0,0 @@ -# -# 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. -# - - -LOCAL_PATH := $(call my-dir) - -include art/build/Android.common_build.mk - -LIBARTAGENT_COMMON_SRC_FILES := \ - ti-agent/common_load.cc \ - 901-hello-ti-agent/basics.cc - -# $(1): target or host -# $(2): debug or <empty> -define build-libtiagent - ifneq ($(1),target) - ifneq ($(1),host) - $$(error expected target or host for argument 1, received $(1)) - endif - endif - ifneq ($(2),debug) - ifneq ($(2),) - $$(error d or empty for argument 2, received $(2)) - endif - suffix := d - else - suffix := - endif - - art_target_or_host := $(1) - - include $(CLEAR_VARS) - LOCAL_CPP_EXTENSION := $(ART_CPP_EXTENSION) - LOCAL_MODULE := libtiagent$$(suffix) - ifeq ($$(art_target_or_host),target) - LOCAL_MODULE_TAGS := tests - endif - LOCAL_SRC_FILES := $(LIBARTAGENT_COMMON_SRC_FILES) - LOCAL_SHARED_LIBRARIES += libart$$(suffix) libbacktrace libnativehelper libopenjdkjvmti$$(suffix) - LOCAL_C_INCLUDES += $(ART_C_INCLUDES) art/runtime art/test - LOCAL_ADDITIONAL_DEPENDENCIES := art/build/Android.common_build.mk - LOCAL_ADDITIONAL_DEPENDENCIES += $(LOCAL_PATH)/Android.libtiagent.mk - ifeq ($$(art_target_or_host),target) - $(call set-target-local-clang-vars) - ifeq ($$(suffix),d) - $(call set-target-local-cflags-vars,debug) - else - $(call set-target-local-cflags-vars,ndebug) - endif - LOCAL_SHARED_LIBRARIES += libdl - LOCAL_MULTILIB := both - LOCAL_MODULE_PATH_32 := $(ART_TARGET_TEST_OUT)/$(ART_TARGET_ARCH_32) - LOCAL_MODULE_PATH_64 := $(ART_TARGET_TEST_OUT)/$(ART_TARGET_ARCH_64) - LOCAL_MODULE_TARGET_ARCH := $(ART_SUPPORTED_ARCH) - include $(BUILD_SHARED_LIBRARY) - else # host - LOCAL_CLANG := $(ART_HOST_CLANG) - LOCAL_CFLAGS := $(ART_HOST_CFLAGS) - LOCAL_ASFLAGS := $(ART_HOST_ASFLAGS) - ifeq ($$(suffix),d) - LOCAL_CFLAGS += $(ART_HOST_DEBUG_CFLAGS) - LOCAL_ASFLAGS += $(ART_HOST_DEBUG_ASFLAGS) - else - LOCAL_CFLAGS += $(ART_HOST_NON_DEBUG_CFLAGS) - LOCAL_ASFLAGS += $(ART_HOST_NON_DEBUG_ASFLAGS) - endif - LOCAL_LDLIBS := $(ART_HOST_LDLIBS) -ldl -lpthread - LOCAL_IS_HOST_MODULE := true - LOCAL_MULTILIB := both - include $(BUILD_HOST_SHARED_LIBRARY) - endif - - # Clear locally used variables. - art_target_or_host := - suffix := -endef - -ifeq ($(ART_BUILD_TARGET),true) - $(eval $(call build-libtiagent,target,)) - $(eval $(call build-libtiagent,target,debug)) -endif -ifeq ($(ART_BUILD_HOST),true) - $(eval $(call build-libtiagent,host,)) - $(eval $(call build-libtiagent,host,debug)) -endif - -# Clear locally used variables. -LOCAL_PATH := -LIBARTAGENT_COMMON_SRC_FILES := diff --git a/test/Android.run-test.mk b/test/Android.run-test.mk index e12fd285d4..5301a03e4a 100644 --- a/test/Android.run-test.mk +++ b/test/Android.run-test.mk @@ -685,59 +685,59 @@ $(foreach target, $(TARGET_TYPES), \ TEST_ART_TARGET_SYNC_DEPS += $(ART_TARGET_EXECUTABLES) $(TARGET_CORE_IMG_OUTS) # Also need libartagent. -TEST_ART_TARGET_SYNC_DEPS += $(ART_TARGET_TEST_OUT)/$(TARGET_ARCH)/libartagent.so -TEST_ART_TARGET_SYNC_DEPS += $(ART_TARGET_TEST_OUT)/$(TARGET_ARCH)/libartagentd.so +TEST_ART_TARGET_SYNC_DEPS += $(OUT_DIR)/$(ART_TEST_LIST_device_$(TARGET_ARCH)_libartagent) +TEST_ART_TARGET_SYNC_DEPS += $(OUT_DIR)/$(ART_TEST_LIST_device_$(TARGET_ARCH)_libartagentd) ifdef TARGET_2ND_ARCH -TEST_ART_TARGET_SYNC_DEPS += $(ART_TARGET_TEST_OUT)/$(TARGET_2ND_ARCH)/libartagent.so -TEST_ART_TARGET_SYNC_DEPS += $(ART_TARGET_TEST_OUT)/$(TARGET_2ND_ARCH)/libartagentd.so +TEST_ART_TARGET_SYNC_DEPS += $(OUT_DIR)/$(ART_TEST_LIST_device_$(TARGET_2ND_ARCH)_libartagent) +TEST_ART_TARGET_SYNC_DEPS += $(OUT_DIR)/$(ART_TEST_LIST_device_$(TARGET_2ND_ARCH)_libartagentd) endif # Also need libtiagent. -TEST_ART_TARGET_SYNC_DEPS += $(ART_TARGET_TEST_OUT)/$(TARGET_ARCH)/libtiagent.so -TEST_ART_TARGET_SYNC_DEPS += $(ART_TARGET_TEST_OUT)/$(TARGET_ARCH)/libtiagentd.so +TEST_ART_TARGET_SYNC_DEPS += $(OUT_DIR)/$(ART_TEST_LIST_device_$(TARGET_ARCH)_libtiagent) +TEST_ART_TARGET_SYNC_DEPS += $(OUT_DIR)/$(ART_TEST_LIST_device_$(TARGET_ARCH)_libtiagentd) ifdef TARGET_2ND_ARCH -TEST_ART_TARGET_SYNC_DEPS += $(ART_TARGET_TEST_OUT)/$(TARGET_2ND_ARCH)/libtiagent.so -TEST_ART_TARGET_SYNC_DEPS += $(ART_TARGET_TEST_OUT)/$(TARGET_2ND_ARCH)/libtiagentd.so +TEST_ART_TARGET_SYNC_DEPS += $(OUT_DIR)/$(ART_TEST_LIST_device_$(TARGET_2ND_ARCH)_libtiagent) +TEST_ART_TARGET_SYNC_DEPS += $(OUT_DIR)/$(ART_TEST_LIST_device_$(TARGET_2ND_ARCH)_libtiagentd) endif # Also need libarttest. -TEST_ART_TARGET_SYNC_DEPS += $(ART_TARGET_TEST_OUT)/$(TARGET_ARCH)/libarttest.so -TEST_ART_TARGET_SYNC_DEPS += $(ART_TARGET_TEST_OUT)/$(TARGET_ARCH)/libarttestd.so +TEST_ART_TARGET_SYNC_DEPS += $(OUT_DIR)/$(ART_TEST_LIST_device_$(TARGET_ARCH)_libarttest) +TEST_ART_TARGET_SYNC_DEPS += $(OUT_DIR)/$(ART_TEST_LIST_device_$(TARGET_ARCH)_libarttestd) ifdef TARGET_2ND_ARCH -TEST_ART_TARGET_SYNC_DEPS += $(ART_TARGET_TEST_OUT)/$(TARGET_2ND_ARCH)/libarttest.so -TEST_ART_TARGET_SYNC_DEPS += $(ART_TARGET_TEST_OUT)/$(TARGET_2ND_ARCH)/libarttestd.so +TEST_ART_TARGET_SYNC_DEPS += $(OUT_DIR)/$(ART_TEST_LIST_device_$(TARGET_2ND_ARCH)_libarttest) +TEST_ART_TARGET_SYNC_DEPS += $(OUT_DIR)/$(ART_TEST_LIST_device_$(TARGET_2ND_ARCH)_libarttestd) endif # Also need libnativebridgetest. -TEST_ART_TARGET_SYNC_DEPS += $(ART_TARGET_TEST_OUT)/$(TARGET_ARCH)/libnativebridgetest.so +TEST_ART_TARGET_SYNC_DEPS += $(OUT_DIR)/$(ART_TEST_LIST_device_$(TARGET_ARCH)_libnativebridgetest) ifdef TARGET_2ND_ARCH -TEST_ART_TARGET_SYNC_DEPS += $(ART_TARGET_TEST_OUT)/$(TARGET_2ND_ARCH)/libnativebridgetest.so +TEST_ART_TARGET_SYNC_DEPS += $(OUT_DIR)/$(ART_TEST_LIST_device_$(TARGET_2ND_ARCH)_libnativebridgetest) endif # All tests require the host executables. The tests also depend on the core images, but on # specific version depending on the compiler. ART_TEST_HOST_RUN_TEST_DEPENDENCIES := \ $(ART_HOST_EXECUTABLES) \ - $(ART_HOST_OUT_SHARED_LIBRARIES)/libtiagent$(ART_HOST_SHLIB_EXTENSION) \ - $(ART_HOST_OUT_SHARED_LIBRARIES)/libtiagentd$(ART_HOST_SHLIB_EXTENSION) \ - $(ART_HOST_OUT_SHARED_LIBRARIES)/libartagent$(ART_HOST_SHLIB_EXTENSION) \ - $(ART_HOST_OUT_SHARED_LIBRARIES)/libartagentd$(ART_HOST_SHLIB_EXTENSION) \ - $(ART_HOST_OUT_SHARED_LIBRARIES)/libarttest$(ART_HOST_SHLIB_EXTENSION) \ - $(ART_HOST_OUT_SHARED_LIBRARIES)/libarttestd$(ART_HOST_SHLIB_EXTENSION) \ - $(ART_HOST_OUT_SHARED_LIBRARIES)/libnativebridgetest$(ART_HOST_SHLIB_EXTENSION) \ + $(OUT_DIR)/$(ART_TEST_LIST_host_$(ART_HOST_ARCH)_libtiagent) \ + $(OUT_DIR)/$(ART_TEST_LIST_host_$(ART_HOST_ARCH)_libtiagentd) \ + $(OUT_DIR)/$(ART_TEST_LIST_host_$(ART_HOST_ARCH)_libartagent) \ + $(OUT_DIR)/$(ART_TEST_LIST_host_$(ART_HOST_ARCH)_libartagentd) \ + $(OUT_DIR)/$(ART_TEST_LIST_host_$(ART_HOST_ARCH)_libarttest) \ + $(OUT_DIR)/$(ART_TEST_LIST_host_$(ART_HOST_ARCH)_libarttestd) \ + $(OUT_DIR)/$(ART_TEST_LIST_host_$(ART_HOST_ARCH)_libnativebridgetest) \ $(ART_HOST_OUT_SHARED_LIBRARIES)/libjavacore$(ART_HOST_SHLIB_EXTENSION) \ $(ART_HOST_OUT_SHARED_LIBRARIES)/libopenjdk$(ART_HOST_SHLIB_EXTENSION) \ $(ART_HOST_OUT_SHARED_LIBRARIES)/libopenjdkd$(ART_HOST_SHLIB_EXTENSION) ifneq ($(HOST_PREFER_32_BIT),true) ART_TEST_HOST_RUN_TEST_DEPENDENCIES += \ - $(2ND_ART_HOST_OUT_SHARED_LIBRARIES)/libtiagent$(ART_HOST_SHLIB_EXTENSION) \ - $(2ND_ART_HOST_OUT_SHARED_LIBRARIES)/libtiagentd$(ART_HOST_SHLIB_EXTENSION) \ - $(2ND_ART_HOST_OUT_SHARED_LIBRARIES)/libartagent$(ART_HOST_SHLIB_EXTENSION) \ - $(2ND_ART_HOST_OUT_SHARED_LIBRARIES)/libartagentd$(ART_HOST_SHLIB_EXTENSION) \ - $(2ND_ART_HOST_OUT_SHARED_LIBRARIES)/libarttest$(ART_HOST_SHLIB_EXTENSION) \ - $(2ND_ART_HOST_OUT_SHARED_LIBRARIES)/libarttestd$(ART_HOST_SHLIB_EXTENSION) \ - $(2ND_ART_HOST_OUT_SHARED_LIBRARIES)/libnativebridgetest$(ART_HOST_SHLIB_EXTENSION) \ + $(OUT_DIR)/$(ART_TEST_LIST_host_$(2ND_ART_HOST_ARCH)_libtiagent) \ + $(OUT_DIR)/$(ART_TEST_LIST_host_$(2ND_ART_HOST_ARCH)_libtiagentd) \ + $(OUT_DIR)/$(ART_TEST_LIST_host_$(2ND_ART_HOST_ARCH)_libartagent) \ + $(OUT_DIR)/$(ART_TEST_LIST_host_$(2ND_ART_HOST_ARCH)_libartagentd) \ + $(OUT_DIR)/$(ART_TEST_LIST_host_$(2ND_ART_HOST_ARCH)_libarttest) \ + $(OUT_DIR)/$(ART_TEST_LIST_host_$(2ND_ART_HOST_ARCH)_libarttestd) \ + $(OUT_DIR)/$(ART_TEST_LIST_host_$(2ND_ART_HOST_ARCH)_libnativebridgetest) \ $(2ND_ART_HOST_OUT_SHARED_LIBRARIES)/libjavacore$(ART_HOST_SHLIB_EXTENSION) \ $(2ND_ART_HOST_OUT_SHARED_LIBRARIES)/libopenjdk$(ART_HOST_SHLIB_EXTENSION) \ $(2ND_ART_HOST_OUT_SHARED_LIBRARIES)/libopenjdkd$(ART_HOST_SHLIB_EXTENSION) @@ -1152,10 +1152,4 @@ ALL_ADDRESS_SIZES := RUN_TYPES := DEBUGGABLE_TYPES := -MY_LOCAL_PATH := $(LOCAL_PATH) -include $(MY_LOCAL_PATH)/Android.libartagent.mk -include $(MY_LOCAL_PATH)/Android.libtiagent.mk -include $(MY_LOCAL_PATH)/Android.libarttest.mk -include $(MY_LOCAL_PATH)/Android.libnativebridgetest.mk -MY_LOCAL_PATH := LOCAL_PATH := diff --git a/test/etc/run-test-jar b/test/etc/run-test-jar index d12bd79b3a..a0e99d8125 100755 --- a/test/etc/run-test-jar +++ b/test/etc/run-test-jar @@ -32,6 +32,7 @@ JIT="n" INVOKE_WITH="" ISA=x86 LIBRARY_DIRECTORY="lib" +TEST_DIRECTORY="nativetest" MAIN="" OPTIMIZE="y" PATCHOAT="" @@ -220,6 +221,7 @@ while true; do GDB_SERVER="gdbserver64" DALVIKVM="dalvikvm64" LIBRARY_DIRECTORY="lib64" + TEST_DIRECTORY="nativetest64" ARCHITECTURES_PATTERN="${ARCHITECTURES_64}" shift elif [ "x$1" = "x--pic-test" ]; then @@ -479,7 +481,7 @@ if [ "$HOST" = "n" ]; then adb push $TEST_NAME-ex.jar $DEX_LOCATION >/dev/null 2>&1 fi - LD_LIBRARY_PATH=/data/art-test/$ISA + LD_LIBRARY_PATH=/data/$TEST_DIRECTORY/art/$ISA if [ "$ANDROID_ROOT" != "/system" ]; then # Current default installation is dalvikvm 64bits and dex2oat 32bits, # so we can only use LD_LIBRARY_PATH when testing on a local @@ -533,8 +535,8 @@ else export ANDROID_DATA="$DEX_LOCATION" export ANDROID_ROOT="${ANDROID_ROOT}" - export LD_LIBRARY_PATH="${ANDROID_ROOT}/lib" - export DYLD_LIBRARY_PATH="${ANDROID_ROOT}/lib" + export LD_LIBRARY_PATH="${ANDROID_ROOT}/${LIBRARY_DIRECTORY}:${ANDROID_ROOT}/${TEST_DIRECTORY}" + export DYLD_LIBRARY_PATH="${ANDROID_ROOT}/${LIBRARY_DIRECTORY}:${ANDROID_ROOT}/${TEST_DIRECTORY}" export PATH="$PATH:${ANDROID_ROOT}/bin" # Temporarily disable address space layout randomization (ASLR). diff --git a/test/run-test b/test/run-test index 8fb2adf445..aea64351f5 100755 --- a/test/run-test +++ b/test/run-test @@ -469,10 +469,10 @@ elif [ "$runtime" = "art" ]; then if [ "$target_mode" = "no" ]; then guess_host_arch_name run_args="${run_args} --boot ${ANDROID_HOST_OUT}/framework/core${image_suffix}${pic_image_suffix}${multi_image_suffix}.art" - run_args="${run_args} --runtime-option -Djava.library.path=${ANDROID_HOST_OUT}/lib${suffix64}" + run_args="${run_args} --runtime-option -Djava.library.path=${ANDROID_HOST_OUT}/lib${suffix64}:${ANDROID_HOST_OUT}/nativetest${suffix64}" else guess_target_arch_name - run_args="${run_args} --runtime-option -Djava.library.path=/data/art-test/${target_arch_name}:/system/lib${suffix64}" + run_args="${run_args} --runtime-option -Djava.library.path=/data/nativetest${suffix64}/art/${target_arch_name}:/system/lib${suffix64}" run_args="${run_args} --boot /data/art-test/core${image_suffix}${pic_image_suffix}${multi_image_suffix}.art" fi if [ "$relocate" = "yes" ]; then |