diff options
133 files changed, 953 insertions, 390 deletions
diff --git a/Android.mk b/Android.mk index 514b316444..a2d8f640b2 100644 --- a/Android.mk +++ b/Android.mk @@ -31,13 +31,8 @@ clean-oat: clean-oat-host clean-oat-target .PHONY: clean-oat-host clean-oat-host: find $(OUT_DIR) -name "*.oat" -o -name "*.odex" -o -name "*.art" -o -name '*.vdex' | xargs rm -f -ifneq ($(TMPDIR),) - rm -rf $(TMPDIR)/$(USER)/test-*/dalvik-cache/* + rm -rf $(TMPDIR)/*/test-*/dalvik-cache/* rm -rf $(TMPDIR)/android-data/dalvik-cache/* -else - rm -rf /tmp/$(USER)/test-*/dalvik-cache/* - rm -rf /tmp/android-data/dalvik-cache/* -endif .PHONY: clean-oat-target clean-oat-target: diff --git a/CleanSpec.mk b/CleanSpec.mk index 341df78400..e28ce2b4e2 100644 --- a/CleanSpec.mk +++ b/CleanSpec.mk @@ -1,4 +1,4 @@ -# Copyright (C) 2007 The Android Open Source Project +# 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. @@ -50,6 +50,9 @@ $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/STATIC_LIBRARIES/libartd_*) $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/libart_*) $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/libartd_*) +# Old Android Runtime APEX package, before the introduction of "release" and "debug" packages. +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/apex/com.android.runtime.apex) + # ************************************************ # NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST # ************************************************ diff --git a/build/Android.common_path.mk b/build/Android.common_path.mk index c73b988b54..5208d64ff3 100644 --- a/build/Android.common_path.mk +++ b/build/Android.common_path.mk @@ -74,8 +74,7 @@ HOST_CORE_IMG_LOCATION := $(HOST_OUT_JAVA_LIBRARIES)/core.art TARGET_CORE_IMG_LOCATION := $(ART_TARGET_TEST_OUT)/core.art # Modules to compile for core.art. -# TODO: Move conscrypt from CORE_IMG_JARS to TEST_CORE_JARS and adjust scripts to fix Golem. -CORE_IMG_JARS := core-oj core-libart core-simple okhttp bouncycastle apache-xml conscrypt +CORE_IMG_JARS := core-oj core-libart core-simple okhttp bouncycastle apache-xml HOST_CORE_IMG_JARS := $(addsuffix -hostdex,$(CORE_IMG_JARS)) TARGET_CORE_IMG_JARS := $(addsuffix -testdex,$(CORE_IMG_JARS)) HOST_CORE_IMG_DEX_LOCATIONS := $(foreach jar,$(HOST_CORE_IMG_JARS), $(HOST_OUT_JAVA_LIBRARIES)/$(jar).jar) @@ -88,7 +87,7 @@ HOST_CORE_IMG_DEX_FILES := $(foreach jar,$(HOST_CORE_IMG_JARS), $(call interm TARGET_CORE_IMG_DEX_FILES := $(foreach jar,$(TARGET_CORE_IMG_JARS),$(call intermediates-dir-for,JAVA_LIBRARIES,$(jar), ,COMMON)/javalib.jar) # Jar files for the boot class path for testing. Must start with CORE_IMG_JARS. -TEST_CORE_JARS := $(CORE_IMG_JARS) +TEST_CORE_JARS := $(CORE_IMG_JARS) conscrypt HOST_TEST_CORE_JARS := $(addsuffix -hostdex,$(TEST_CORE_JARS)) TARGET_TEST_CORE_JARS := $(addsuffix -testdex,$(TEST_CORE_JARS)) HOST_CORE_DEX_LOCATIONS := $(foreach jar,$(HOST_TEST_CORE_JARS), $(HOST_OUT_JAVA_LIBRARIES)/$(jar).jar) diff --git a/build/Android.common_test.mk b/build/Android.common_test.mk index be1791b372..12eae899c2 100644 --- a/build/Android.common_test.mk +++ b/build/Android.common_test.mk @@ -20,12 +20,8 @@ ART_ANDROID_COMMON_TEST_MK = true include art/build/Android.common_path.mk # Directory used for temporary test files on the host. -# Use a hash calculated from CWD and USER as one of the path -# components for the test output. This should allow us to run tests from -# multiple repositories at the same time. -# We only take the first few characters to keep paths short. -ART_TMPDIR := $(if $(TMPDIR),$(TMPDIR),/tmp) -ART_HOST_TEST_DIR := $(ART_TMPDIR)/test-art-$(shell echo $$CWD-${USER} | $(MD5SUM) | cut -c-5) +# TMPDIR is always provided by the build system as $OUT_DIR-unique temporary directory. +ART_HOST_TEST_DIR := $(TMPDIR)/test-art # List of known broken tests that we won't attempt to execute. The test name must be the full # rule name such as test-art-host-oat-optimizing-HelloWorld64. diff --git a/build/apex/Android.bp b/build/apex/Android.bp index 193a3c17fe..79f67a2da7 100644 --- a/build/apex/Android.bp +++ b/build/apex/Android.bp @@ -28,21 +28,7 @@ bionic_native_shared_libs = [ bionic_binaries_both = [ "linker", ] -// - Fake library that avoids namespace issues and gives some warnings for nosy apps. -art_runtime_fake_native_shared_libs = [ - // FIXME: Does not work as-is, because `libart_fake` is defined in libart_fake/Android.mk, - // and because a module defined in a Blueprint file cannot depend on a module defined in a - // Makefile. To support `libart_fake` as a dependency of this APEX module, we can either - // (probably in that order of preference): - // a. translate that logic into Blueprint; or - // b. write the whole Android Runtime APEX generation logic in Android.mk; or - // c. introduce an `art_apex` module type extending the `apex` module type and write the - // corresponding Go logic to handle this extra dependency. - //"libart_fake", -] // - Debug variants (binaries for which a 32-bit version is preferred). -// FIXME: These modules are optional (the built product can decide to include them or not). -// Should they be moved to another APEX file? art_runtime_debug_binaries_prefer32 = [ "dex2oatd", "dexoptanalyzerd", @@ -55,7 +41,6 @@ art_runtime_debug_native_shared_libs = [ "libopenjdkjvmd", "libopenjdkjvmtid", "libadbconnectiond", - "libjavacrypto", ] // Files associated with bionic / managed core library time zone APIs. @@ -72,13 +57,15 @@ art_tools_common_binaries = [ "dexlist", ] -art_tools_device_binaries = [ +// Device-only modules listed in LOCAL_REQUIRED_MODULES for module art-tools in art/Android.mk. +art_tools_device_only_binaries = [ + // oatdump cannot link with host linux_bionic due to not using clang lld; + // TODO: Make it work with clang lld. "oatdump", ] // Host-only modules listed in LOCAL_REQUIRED_MODULES for module art-tools in art/Android.mk. -// TODO: Include these modules in the future "host APEX". -art_tools_host_binaries = [ +art_tools_host_only_binaries = [ // FIXME: Does not work as-is, because `ahat` is defined in tools/ahat/Android.mk // (same issue as for `libart_fake` above). //"ahat", @@ -86,7 +73,8 @@ art_tools_host_binaries = [ // ... ] -art_tools_binaries = art_tools_common_binaries + art_tools_device_binaries +art_tools_device_binaries = art_tools_common_binaries + art_tools_device_only_binaries +art_tools_host_binaries = art_tools_common_binaries + art_tools_host_only_binaries apex_key { name: "com.android.runtime.key", @@ -112,7 +100,6 @@ apex { compile_multilib: "both", manifest: "manifest.json", native_shared_libs: art_runtime_base_native_shared_libs - + art_runtime_fake_native_shared_libs + bionic_native_shared_libs, multilib: { both: { @@ -141,7 +128,6 @@ apex { compile_multilib: "both", manifest: "manifest.json", native_shared_libs: art_runtime_base_native_shared_libs - + art_runtime_fake_native_shared_libs + art_runtime_debug_native_shared_libs + bionic_native_shared_libs, multilib: { @@ -156,7 +142,7 @@ apex { + art_runtime_debug_binaries_prefer32, }, first: { - binaries: art_tools_binaries, + binaries: art_tools_device_binaries, } }, prebuilts: art_runtime_time_zone_prebuilts @@ -177,7 +163,6 @@ art_apex { device_supported: false, manifest: "manifest.json", native_shared_libs: art_runtime_base_native_shared_libs - + art_runtime_fake_native_shared_libs + art_runtime_debug_native_shared_libs, multilib: { both: { @@ -186,8 +171,7 @@ art_apex { binaries: art_runtime_base_binaries_both, }, first: { - // TODO: oatdump cannot link with host linux_bionic due to not using clang ld - binaries: art_tools_common_binaries + binaries: art_tools_host_binaries + art_runtime_base_binaries_prefer32 + art_runtime_debug_binaries_prefer32, } diff --git a/build/apex/runtests.sh b/build/apex/runtests.sh index b5e8d8b7eb..9db325a71d 100755 --- a/build/apex/runtests.sh +++ b/build/apex/runtests.sh @@ -146,18 +146,19 @@ function check_release_contents { # TODO: Check for it when it is also built for host. : check_binary oatdump - # Check that the mounted image contains ART libraries. + # Check that the mounted image contains Android Runtime libraries. check_library libart-compiler.so + check_library libart-dexlayout.so check_library libart.so - check_library libopenjdkjvm.so - check_library libopenjdkjvmti.so - check_library libadbconnection.so - # TODO: Should we check for these libraries too, even if they are not explicitly - # listed as dependencies in the Android Runtime APEX module rule? check_library libartbase.so - check_library libart-dexlayout.so check_library libdexfile.so + check_library libopenjdkjvm.so + check_library libopenjdkjvmti.so check_library libprofile.so + # Check that the mounted image contains Android Core libraries. + check_library libjavacrypto.so + # Check that the mounted image contains additional required libraries. + check_library libadbconnection.so # TODO: Should we check for other libraries, such as: # @@ -186,19 +187,18 @@ function check_debug_contents { check_binary dexoptanalyzerd check_binary profmand - # Check that the mounted image contains ART debug libraries. + # Check that the mounted image contains Android Runtime debug libraries. + check_library libartbased.so check_library libartd-compiler.so + check_library libartd-dexlayout.so check_library libartd.so + check_library libdexfiled.so check_library libopenjdkd.so check_library libopenjdkjvmd.so check_library libopenjdkjvmtid.so - check_library libadbconnectiond.so - # TODO: Should we check for these libraries too, even if they are not explicitly - # listed as dependencies in the Android Runtime APEX module rule? - check_library libdexfiled.so - check_library libartbased.so - check_library libartd-dexlayout.so check_library libprofiled.so + # Check that the mounted image contains additional required libraries. + check_library libadbconnectiond.so } # Testing target (device) APEX packages. diff --git a/compiler/jni/quick/arm/calling_convention_arm.cc b/compiler/jni/quick/arm/calling_convention_arm.cc index 8b4bab722f..42a4603571 100644 --- a/compiler/jni/quick/arm/calling_convention_arm.cc +++ b/compiler/jni/quick/arm/calling_convention_arm.cc @@ -18,6 +18,7 @@ #include <android-base/logging.h> +#include "arch/instruction_set.h" #include "base/macros.h" #include "handle_scope-inl.h" #include "utils/arm/managed_register_arm.h" diff --git a/compiler/jni/quick/arm64/calling_convention_arm64.cc b/compiler/jni/quick/arm64/calling_convention_arm64.cc index 4e6221ef6d..4a6a754b5f 100644 --- a/compiler/jni/quick/arm64/calling_convention_arm64.cc +++ b/compiler/jni/quick/arm64/calling_convention_arm64.cc @@ -18,6 +18,7 @@ #include <android-base/logging.h> +#include "arch/instruction_set.h" #include "handle_scope-inl.h" #include "utils/arm64/managed_register_arm64.h" diff --git a/compiler/jni/quick/calling_convention.cc b/compiler/jni/quick/calling_convention.cc index ff814c8a6b..f031b9be82 100644 --- a/compiler/jni/quick/calling_convention.cc +++ b/compiler/jni/quick/calling_convention.cc @@ -18,6 +18,8 @@ #include <android-base/logging.h> +#include "arch/instruction_set.h" + #ifdef ART_ENABLE_CODEGEN_arm #include "jni/quick/arm/calling_convention_arm.h" #endif diff --git a/compiler/jni/quick/calling_convention.h b/compiler/jni/quick/calling_convention.h index e256ce647d..77a5d595d7 100644 --- a/compiler/jni/quick/calling_convention.h +++ b/compiler/jni/quick/calling_convention.h @@ -27,6 +27,8 @@ namespace art { +enum class InstructionSet; + // Top-level abstraction for different calling conventions. class CallingConvention : public DeletableArenaObject<kArenaAllocCallingConvention> { public: diff --git a/compiler/jni/quick/mips/calling_convention_mips.cc b/compiler/jni/quick/mips/calling_convention_mips.cc index d3d489ee36..c69854d19a 100644 --- a/compiler/jni/quick/mips/calling_convention_mips.cc +++ b/compiler/jni/quick/mips/calling_convention_mips.cc @@ -18,6 +18,7 @@ #include <android-base/logging.h> +#include "arch/instruction_set.h" #include "handle_scope-inl.h" #include "utils/mips/managed_register_mips.h" diff --git a/compiler/jni/quick/mips64/calling_convention_mips64.cc b/compiler/jni/quick/mips64/calling_convention_mips64.cc index 3c7cee6306..2c297b3ce3 100644 --- a/compiler/jni/quick/mips64/calling_convention_mips64.cc +++ b/compiler/jni/quick/mips64/calling_convention_mips64.cc @@ -18,6 +18,7 @@ #include <android-base/logging.h> +#include "arch/instruction_set.h" #include "handle_scope-inl.h" #include "utils/mips64/managed_register_mips64.h" diff --git a/compiler/jni/quick/x86/calling_convention_x86.cc b/compiler/jni/quick/x86/calling_convention_x86.cc index 71e601926b..1f255e2bbd 100644 --- a/compiler/jni/quick/x86/calling_convention_x86.cc +++ b/compiler/jni/quick/x86/calling_convention_x86.cc @@ -18,6 +18,7 @@ #include <android-base/logging.h> +#include "arch/instruction_set.h" #include "handle_scope-inl.h" #include "utils/x86/managed_register_x86.h" diff --git a/compiler/jni/quick/x86_64/calling_convention_x86_64.cc b/compiler/jni/quick/x86_64/calling_convention_x86_64.cc index e5e96d01fc..9e77d6b36c 100644 --- a/compiler/jni/quick/x86_64/calling_convention_x86_64.cc +++ b/compiler/jni/quick/x86_64/calling_convention_x86_64.cc @@ -18,6 +18,7 @@ #include <android-base/logging.h> +#include "arch/instruction_set.h" #include "base/bit_utils.h" #include "handle_scope-inl.h" #include "utils/x86_64/managed_register_x86_64.h" diff --git a/compiler/optimizing/block_builder.cc b/compiler/optimizing/block_builder.cc index 3672cce4c5..a5f78cafe0 100644 --- a/compiler/optimizing/block_builder.cc +++ b/compiler/optimizing/block_builder.cc @@ -315,8 +315,16 @@ void HBasicBlockBuilder::InsertTryBoundaryBlocks() { CatchHandlerIterator iterator(handlers_ptr); for (; iterator.HasNext(); iterator.Next()) { uint32_t address = iterator.GetHandlerAddress(); - if (catch_blocks.find(address) != catch_blocks.end()) { + auto existing = catch_blocks.find(address); + if (existing != catch_blocks.end()) { // Catch block already processed. + TryCatchInformation* info = existing->second->GetTryCatchInformation(); + if (iterator.GetHandlerTypeIndex() != info->GetCatchTypeIndex()) { + // The handler is for multiple types. We could record all the types, but + // doing class resolution here isn't ideal, and it's unclear whether wasting + // the space in TryCatchInformation is worth it. + info->SetInvalidTypeIndex(); + } continue; } @@ -337,7 +345,7 @@ void HBasicBlockBuilder::InsertTryBoundaryBlocks() { catch_blocks.Put(address, catch_block); catch_block->SetTryCatchInformation( - new (allocator_) TryCatchInformation(iterator.GetHandlerTypeIndex(), *dex_file_)); + new (allocator_) TryCatchInformation(iterator.GetHandlerTypeIndex(), *dex_file_)); } handlers_ptr = iterator.EndDataPointer(); } diff --git a/compiler/optimizing/intrinsics_arm64.cc b/compiler/optimizing/intrinsics_arm64.cc index ae1650e607..ca790f655a 100644 --- a/compiler/optimizing/intrinsics_arm64.cc +++ b/compiler/optimizing/intrinsics_arm64.cc @@ -3086,10 +3086,10 @@ void IntrinsicLocationsBuilderARM64::VisitCRC32UpdateBytes(HInvoke* invoke) { void IntrinsicCodeGeneratorARM64::VisitCRC32UpdateBytes(HInvoke* invoke) { DCHECK(codegen_->GetInstructionSetFeatures().HasCRC()); - auto masm = GetVIXLAssembler(); - auto locations = invoke->GetLocations(); + MacroAssembler* masm = GetVIXLAssembler(); + LocationSummary* locations = invoke->GetLocations(); - auto slow_path = + SlowPathCodeARM64* slow_path = new (codegen_->GetScopedAllocator()) IntrinsicSlowPathARM64(invoke); codegen_->AddSlowPath(slow_path); @@ -3101,7 +3101,7 @@ void IntrinsicCodeGeneratorARM64::VisitCRC32UpdateBytes(HInvoke* invoke) { mirror::Array::DataOffset(Primitive::kPrimByte).Uint32Value(); Register ptr = XRegisterFrom(locations->GetTemp(0)); Register array = XRegisterFrom(locations->InAt(1)); - auto offset = locations->InAt(2); + Location offset = locations->InAt(2); if (offset.IsConstant()) { int32_t offset_value = offset.GetConstant()->AsIntConstant()->GetValue(); __ Add(ptr, array, array_data_offset + offset_value); @@ -3148,8 +3148,8 @@ void IntrinsicLocationsBuilderARM64::VisitCRC32UpdateByteBuffer(HInvoke* invoke) void IntrinsicCodeGeneratorARM64::VisitCRC32UpdateByteBuffer(HInvoke* invoke) { DCHECK(codegen_->GetInstructionSetFeatures().HasCRC()); - auto masm = GetVIXLAssembler(); - auto locations = invoke->GetLocations(); + MacroAssembler* masm = GetVIXLAssembler(); + LocationSummary* locations = invoke->GetLocations(); Register addr = XRegisterFrom(locations->InAt(1)); Register ptr = XRegisterFrom(locations->GetTemp(0)); diff --git a/compiler/optimizing/nodes.h b/compiler/optimizing/nodes.h index 686a2deb0b..48fb611da2 100644 --- a/compiler/optimizing/nodes.h +++ b/compiler/optimizing/nodes.h @@ -895,7 +895,7 @@ class TryCatchInformation : public ArenaObject<kArenaAllocTryCatchInfo> { explicit TryCatchInformation(const HTryBoundary& try_entry) : try_entry_(&try_entry), catch_dex_file_(nullptr), - catch_type_index_(DexFile::kDexNoIndex16) { + catch_type_index_(dex::TypeIndex::Invalid()) { DCHECK(try_entry_ != nullptr); } @@ -914,9 +914,9 @@ class TryCatchInformation : public ArenaObject<kArenaAllocTryCatchInfo> { bool IsCatchBlock() const { return catch_dex_file_ != nullptr; } - bool IsCatchAllTypeIndex() const { + bool IsValidTypeIndex() const { DCHECK(IsCatchBlock()); - return !catch_type_index_.IsValid(); + return catch_type_index_.IsValid(); } dex::TypeIndex GetCatchTypeIndex() const { @@ -929,6 +929,10 @@ class TryCatchInformation : public ArenaObject<kArenaAllocTryCatchInfo> { return *catch_dex_file_; } + void SetInvalidTypeIndex() { + catch_type_index_ = dex::TypeIndex::Invalid(); + } + private: // One of possibly several TryBoundary instructions entering the block's try. // Only set for try blocks. @@ -936,7 +940,7 @@ class TryCatchInformation : public ArenaObject<kArenaAllocTryCatchInfo> { // Exception type information. Only set for catch blocks. const DexFile* catch_dex_file_; - const dex::TypeIndex catch_type_index_; + dex::TypeIndex catch_type_index_; }; static constexpr size_t kNoLifetime = -1; diff --git a/compiler/optimizing/reference_type_propagation.cc b/compiler/optimizing/reference_type_propagation.cc index 61e7a60ea9..4929e0a3a1 100644 --- a/compiler/optimizing/reference_type_propagation.cc +++ b/compiler/optimizing/reference_type_propagation.cc @@ -699,14 +699,14 @@ void ReferenceTypePropagation::RTPVisitor::VisitLoadException(HLoadException* in DCHECK(instr->GetBlock()->IsCatchBlock()); TryCatchInformation* catch_info = instr->GetBlock()->GetTryCatchInformation(); - if (catch_info->IsCatchAllTypeIndex()) { - instr->SetReferenceTypeInfo( - ReferenceTypeInfo::Create(handle_cache_->GetThrowableClassHandle(), /* is_exact= */ false)); - } else { + if (catch_info->IsValidTypeIndex()) { UpdateReferenceTypeInfo(instr, catch_info->GetCatchTypeIndex(), catch_info->GetCatchDexFile(), /* is_exact= */ false); + } else { + instr->SetReferenceTypeInfo( + ReferenceTypeInfo::Create(handle_cache_->GetThrowableClassHandle(), /* is_exact= */ false)); } } diff --git a/dex2oat/dex2oat_test.cc b/dex2oat/dex2oat_test.cc index fd454f050b..524bce05b5 100644 --- a/dex2oat/dex2oat_test.cc +++ b/dex2oat/dex2oat_test.cc @@ -1011,6 +1011,10 @@ TEST_F(Dex2oatWatchdogTest, TestWatchdogOK) { } TEST_F(Dex2oatWatchdogTest, TestWatchdogTrigger) { + // This test is frequently interrupted by timeout_dumper on host (x86); + // disable it while we investigate (b/121352534). + TEST_DISABLED_FOR_X86(); + // The watchdog is independent of dex2oat and will not delete intermediates. It is possible // that the compilation succeeds and the file is completely written by the time the watchdog // kills dex2oat (but the dex2oat threads must have been scheduled pretty badly). diff --git a/dex2oat/linker/oat_writer.h b/dex2oat/linker/oat_writer.h index cc0e83a0e5..48215bbeef 100644 --- a/dex2oat/linker/oat_writer.h +++ b/dex2oat/linker/oat_writer.h @@ -19,6 +19,7 @@ #include <stdint.h> #include <cstddef> +#include <list> #include <memory> #include <vector> diff --git a/dexlayout/Android.bp b/dexlayout/Android.bp index 24ee5f8532..e9147380df 100644 --- a/dexlayout/Android.bp +++ b/dexlayout/Android.bp @@ -26,9 +26,33 @@ art_cc_defaults { "dex_writer.cc", ], export_include_dirs: ["."], - shared_libs: [ - "libbase", - ], + target: { + android: { + shared_libs: [ + "libdexfile", + "libartbase", + "libprofile", + "libbase", + ], + }, + not_windows: { + shared_libs: [ + "libdexfile", + "libartbase", + "libprofile", + "libbase", + ], + }, + windows: { + cflags: ["-Wno-thread-safety"], + static_libs: [ + "libdexfile", + "libartbase", + "libprofile", + "libbase", + ], + }, + }, static_libs: ["libz"], } @@ -46,18 +70,18 @@ art_cc_library { "libart-dexlayout-defaults", "dex2oat-pgo-defaults", ], - shared_libs: [ - "libdexfile", - "libartbase", - "libprofile", - ], - target: { android: { lto: { thin: true, }, }, + windows: { + enabled: true, + shared: { + enabled: false, + }, + }, }, } @@ -118,6 +142,29 @@ art_cc_binary { } art_cc_binary { + name: "dexlayouts", + defaults: [ + "dexlayout-defaults", + "libart-dexlayout_static_defaults", + "libprofile_static_defaults", + "libdexfile_static_defaults", + "libartbase_static_defaults", + ], + srcs: ["dexlayout_main.cc"], + host_supported: true, + device_supported: false, + target: { + darwin: { + enabled: false, + }, + windows: { + enabled: true, + cflags: ["-Wno-thread-safety"], + }, + }, +} + +art_cc_binary { name: "dexlayoutd", defaults: [ "art_debug_defaults", diff --git a/dexlayout/dexlayout.cc b/dexlayout/dexlayout.cc index 32122ebf93..ef2c9e4d61 100644 --- a/dexlayout/dexlayout.cc +++ b/dexlayout/dexlayout.cc @@ -24,7 +24,6 @@ #include <inttypes.h> #include <stdio.h> -#include <sys/mman.h> // For the PROT_* and MAP_* constants. #include <iostream> #include <memory> @@ -36,6 +35,7 @@ #include "base/logging.h" // For VLOG_IS_ON. #include "base/hiddenapi_flags.h" #include "base/mem_map.h" +#include "base/mman.h" // For the PROT_* and MAP_* constants. #include "base/os.h" #include "base/utils.h" #include "dex/art_dex_file_loader.h" diff --git a/dexlayout/dexlayout_main.cc b/dexlayout/dexlayout_main.cc index 41b60da133..2163f89bdf 100644 --- a/dexlayout/dexlayout_main.cc +++ b/dexlayout/dexlayout_main.cc @@ -190,7 +190,12 @@ int DexlayoutDriver(int argc, char** argv) { // Open profile file. std::unique_ptr<ProfileCompilationInfo> profile_info; if (options.profile_file_name_) { - int profile_fd = open(options.profile_file_name_, O_RDONLY | O_CLOEXEC); +#ifdef _WIN32 + int flags = O_RDONLY; +#else + int flags = O_RDONLY | O_CLOEXEC; +#endif + int profile_fd = open(options.profile_file_name_, flags); if (profile_fd < 0) { PLOG(ERROR) << "Can't open " << options.profile_file_name_; return 1; @@ -201,6 +206,7 @@ int DexlayoutDriver(int argc, char** argv) { return 1; } } + PLOG(INFO) << "After opening profile file"; // Create DexLayout instance. DexLayout dex_layout(options, profile_info.get(), out_file, /*header=*/ nullptr); diff --git a/dexlist/Android.bp b/dexlist/Android.bp index 217a024357..356791c8b2 100644 --- a/dexlist/Android.bp +++ b/dexlist/Android.bp @@ -24,6 +24,26 @@ art_cc_binary { ], } +art_cc_binary { + name: "dexlists", + defaults: [ + "art_defaults", + "libartbase_static_defaults", + "libdexfile_static_defaults", + ], + host_supported: true, + srcs: ["dexlist.cc"], + device_supported: false, + target: { + darwin: { + enabled: false, + }, + windows: { + enabled: true, + }, + }, +} + art_cc_test { name: "art_dexlist_tests", defaults: [ diff --git a/libartbase/Android.bp b/libartbase/Android.bp index 0fcd6a5d25..509b0728fa 100644 --- a/libartbase/Android.bp +++ b/libartbase/Android.bp @@ -24,6 +24,7 @@ cc_defaults { "base/arena_allocator.cc", "base/arena_bit_vector.cc", "base/bit_vector.cc", + "base/enums.cc", "base/file_magic.cc", "base/file_utils.cc", "base/hex_dump.cc", @@ -64,6 +65,7 @@ cc_defaults { // For common macros. "libbase", ], + export_shared_lib_headers: ["libbase"], // Exclude the version script from Darwin host since it's not // supported by the linker there. That means ASan checks on Darwin // might trigger ODR violations. @@ -82,12 +84,16 @@ cc_defaults { // For common macros. "libbase", ], + export_shared_lib_headers: ["libbase"], }, linux_glibc: { version_script: "libartbase.map", }, windows: { version_script: "libartbase.map", + srcs: [ + "base/mem_map_windows.cc", + ], static_libs: [ "libziparchive", "libz", @@ -97,6 +103,7 @@ cc_defaults { // For common macros. "libbase", ], + export_static_lib_headers: ["libbase"], cflags: ["-Wno-thread-safety"], }, }, @@ -115,7 +122,6 @@ cc_defaults { // ART's macros.h depends on libbase's macros.h. // Note: runtime_options.h depends on cmdline. But we don't really want to export this // generically. dex2oat takes care of it itself. - export_shared_lib_headers: ["libbase"], } cc_defaults { @@ -148,7 +154,6 @@ gensrcs { srcs: [ "arch/instruction_set.h", "base/allocator.h", - "base/callee_save_type.h", "base/unix_file/fd_file.h", ], output_extension: "operator_out.cc", diff --git a/libartbase/base/enums.cc b/libartbase/base/enums.cc new file mode 100644 index 0000000000..3f28232b41 --- /dev/null +++ b/libartbase/base/enums.cc @@ -0,0 +1,32 @@ +/* + * 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. + */ + +#include "enums.h" + +#include <ostream> + +namespace art { + +std::ostream& operator<<(std::ostream& os, const PointerSize& rhs) { + switch (rhs) { + case PointerSize::k32: os << "k32"; break; + case PointerSize::k64: os << "k64"; break; + default: os << "PointerSize[" << static_cast<int>(rhs) << "]"; break; + } + return os; +} + +} // namespace art diff --git a/libartbase/base/enums.h b/libartbase/base/enums.h index ad5578fc81..c5fb880ba5 100644 --- a/libartbase/base/enums.h +++ b/libartbase/base/enums.h @@ -18,7 +18,7 @@ #define ART_LIBARTBASE_BASE_ENUMS_H_ #include <cstddef> -#include <ostream> +#include <iosfwd> namespace art { @@ -27,14 +27,7 @@ enum class PointerSize : size_t { k64 = 8 }; -inline std::ostream& operator<<(std::ostream& os, const PointerSize& rhs) { - switch (rhs) { - case PointerSize::k32: os << "k32"; break; - case PointerSize::k64: os << "k64"; break; - default: os << "PointerSize[" << static_cast<int>(rhs) << "]"; break; - } - return os; -} +std::ostream& operator<<(std::ostream& os, const PointerSize& rhs); static constexpr PointerSize kRuntimePointerSize = sizeof(void*) == 8U ? PointerSize::k64 diff --git a/libartbase/base/globals.h b/libartbase/base/globals.h index 2a2a7374fe..97eae635d4 100644 --- a/libartbase/base/globals.h +++ b/libartbase/base/globals.h @@ -38,20 +38,6 @@ static constexpr size_t kStackAlignment = 16; // compile-time constant so the compiler can generate better code. static constexpr int kPageSize = 4096; -// Size of Dex virtual registers. -static constexpr size_t kVRegSize = 4; - -// Returns whether the given memory offset can be used for generating -// an implicit null check. -static inline bool CanDoImplicitNullCheckOn(uintptr_t offset) { - return offset < kPageSize; -} - -// Required object alignment -static constexpr size_t kObjectAlignmentShift = 3; -static constexpr size_t kObjectAlignment = 1u << kObjectAlignmentShift; -static constexpr size_t kLargeObjectAlignment = kPageSize; - // Clion, clang analyzer, etc can falsely believe that "if (kIsDebugBuild)" always // returns the same value. By wrapping into a call to another constexpr function, we force it // to realize that is not actually always evaluating to the same value. @@ -117,48 +103,6 @@ static constexpr bool kHostStaticBuildEnabled = true; static constexpr bool kHostStaticBuildEnabled = false; #endif -// Garbage collector constants. -static constexpr bool kMovingCollector = true; -static constexpr bool kMarkCompactSupport = false && kMovingCollector; -// True if we allow moving classes. -static constexpr bool kMovingClasses = !kMarkCompactSupport; -// If true, enable generational collection when using the Concurrent Copying -// (CC) collector, i.e. use sticky-bit CC for minor collections and (full) CC -// for major collections. -// -// Generational CC collection is currently only compatible with Baker read -// barriers. -#if defined(ART_USE_GENERATIONAL_CC) && defined(ART_READ_BARRIER_TYPE_IS_BAKER) -static constexpr bool kEnableGenerationalConcurrentCopyingCollection = true; -#else -static constexpr bool kEnableGenerationalConcurrentCopyingCollection = false; -#endif - -// If true, enable the tlab allocator by default. -#ifdef ART_USE_TLAB -static constexpr bool kUseTlab = true; -#else -static constexpr bool kUseTlab = false; -#endif - -// Kinds of tracing clocks. -enum class TraceClockSource { - kThreadCpu, - kWall, - kDual, // Both wall and thread CPU clocks. -}; - -#if defined(__linux__) -static constexpr TraceClockSource kDefaultTraceClockSource = TraceClockSource::kDual; -#else -static constexpr TraceClockSource kDefaultTraceClockSource = TraceClockSource::kWall; -#endif - -static constexpr bool kDefaultMustRelocate = true; - -// Size of a heap reference. -static constexpr size_t kHeapReferenceSize = sizeof(uint32_t); - } // namespace art #endif // ART_LIBARTBASE_BASE_GLOBALS_H_ diff --git a/libartbase/base/logging.h b/libartbase/base/logging.h index 9ded082130..484db87b9a 100644 --- a/libartbase/base/logging.h +++ b/libartbase/base/logging.h @@ -17,9 +17,6 @@ #ifndef ART_LIBARTBASE_BASE_LOGGING_H_ #define ART_LIBARTBASE_BASE_LOGGING_H_ -#include <ostream> -#include <sstream> - #include "android-base/logging.h" #include "macros.h" diff --git a/libartbase/base/mem_map_windows.cc b/libartbase/base/mem_map_windows.cc new file mode 100644 index 0000000000..84e14eaace --- /dev/null +++ b/libartbase/base/mem_map_windows.cc @@ -0,0 +1,140 @@ +/* + * Copyright (C) 2018 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. + */ + +#include "mem_map.h" + +#include <windows.h> + +#include "android-base/logging.h" +#include "android-base/stringprintf.h" +#include "android-base/mapped_file.h" +#ifdef PROT_READ +#undef PROT_READ +#endif +#ifdef PROT_WRITE +#undef PROT_WRITE +#endif +#include "mman.h" + +namespace art { + +using android::base::MappedFile; +using android::base::StringPrintf; + +static off_t allocation_granularity; + +void MemMap::TargetMMapInit() { + SYSTEM_INFO si; + GetSystemInfo(&si); + allocation_granularity = si.dwAllocationGranularity; +} + +void* MemMap::TargetMMap(void* start, size_t len, int prot, int flags, int fd, off_t fd_off) { + UNUSED(start); + size_t padding = fd_off % allocation_granularity; + off_t file_offset = fd_off - padding; + off_t map_length = len + padding; + + // Only read and write permissions are supported. + if ((prot != PROT_READ) && (prot != (PROT_READ | PROT_WRITE))) { + PLOG(ERROR) << "Protection or flag error was not supported."; + errno = EINVAL; + return MAP_FAILED; + } + // Fixed is not currently supported either. + // TODO(sehr): add MAP_FIXED support. + if ((flags & MAP_FIXED) != 0) { + PLOG(ERROR) << "MAP_FIXED not supported."; + errno = EINVAL; + return MAP_FAILED; + } + + // Compute the Windows access flags for the two APIs from the PROTs and MAPs. + DWORD map_access = 0; + DWORD view_access = 0; + if ((prot & PROT_WRITE) != 0) { + map_access = PAGE_READWRITE; + if (((flags & MAP_SHARED) != 0) && ((flags & MAP_PRIVATE) == 0)) { + view_access = FILE_MAP_ALL_ACCESS; + } else if (((flags & MAP_SHARED) == 0) && ((flags & MAP_PRIVATE) != 0)) { + view_access = FILE_MAP_COPY | FILE_MAP_READ; + } else { + PLOG(ERROR) << "MAP_PRIVATE and MAP_SHARED inconsistently set."; + errno = EINVAL; + return MAP_FAILED; + } + } else { + map_access = PAGE_READONLY; + view_access = FILE_MAP_READ; + } + + // MapViewOfFile does not like to see a size greater than the file size of the + // underlying file object, unless the underlying file object is writable. If + // the mapped region would go beyond the end of the underlying file, use zero, + // as this indicates the physical size. + HANDLE file_handle = reinterpret_cast<HANDLE>(_get_osfhandle(fd)); + LARGE_INTEGER file_length; + if (!::GetFileSizeEx(file_handle, &file_length)) { + PLOG(ERROR) << "Couldn't get file size."; + errno = EINVAL; + return MAP_FAILED; + } + if (((map_access & PAGE_READONLY) != 0) && + file_offset + map_length > file_length.QuadPart) { + map_length = 0; + } + + // Create a file mapping object that will be used to access the file. + HANDLE handle = ::CreateFileMapping(reinterpret_cast<HANDLE>(_get_osfhandle(fd)), + nullptr, + map_access, + 0, + 0, + nullptr); + if (handle == nullptr) { + DWORD error = ::GetLastError(); + PLOG(ERROR) << StringPrintf("Couldn't create file mapping %lx.", error); + errno = EINVAL; + return MAP_FAILED; + } + + // Map the file into the process address space. + DWORD offset_low = static_cast<DWORD>(file_offset & 0xffffffffU); +#ifdef _WIN64 + DWORD offset_high = static_cast<DWORD>(file_offset >> 32); +#else + DWORD offset_high = static_cast<DWORD>(0); +#endif + void* view_address = MapViewOfFile(handle, view_access, offset_high, offset_low, map_length); + if (view_address == nullptr) { + DWORD error = ::GetLastError(); + PLOG(ERROR) << StringPrintf("Couldn't create file view %lx.", error); + ::CloseHandle(handle); + errno = EINVAL; + return MAP_FAILED; + } + + return view_address; +} + +int MemMap::TargetMUnmap(void* start, size_t len) { + // TODO(sehr): implement unmap. + UNUSED(start); + UNUSED(len); + return 0; +} + +} // namespace art diff --git a/libartbase/base/mman.h b/libartbase/base/mman.h index bd63f6506f..b56edfc6e7 100644 --- a/libartbase/base/mman.h +++ b/libartbase/base/mman.h @@ -20,19 +20,18 @@ #ifdef _WIN32 // There is no sys/mman.h in mingw. -// As these are just placeholders for the APIs, all values are stubbed out. -#define PROT_READ 0 // 0x1 -#define PROT_WRITE 0 // 0x2 -#define PROT_EXEC 0 // 0x4 -#define PROT_NONE 0 // 0x0 +#define PROT_READ 0x1 +#define PROT_WRITE 0x2 +#define PROT_EXEC 0x4 +#define PROT_NONE 0x0 -#define MAP_SHARED 0 // 0x01 -#define MAP_PRIVATE 0 // 0x02 +#define MAP_SHARED 0x01 +#define MAP_PRIVATE 0x02 -#define MAP_FAILED nullptr // ((void*) -1) -#define MAP_FIXED 0 // 0x10 -#define MAP_ANONYMOUS 0 // 0x20 +#define MAP_FAILED ((void*) -1) +#define MAP_FIXED 0x10 +#define MAP_ANONYMOUS 0x20 #else diff --git a/libdexfile/dex/dex_file.cc b/libdexfile/dex/dex_file.cc index 5c100e6005..d3cdf13ec6 100644 --- a/libdexfile/dex/dex_file.cc +++ b/libdexfile/dex/dex_file.cc @@ -23,6 +23,7 @@ #include <zlib.h> #include <memory> +#include <ostream> #include <sstream> #include <type_traits> diff --git a/libdexfile/dex/dex_file_types.h b/libdexfile/dex/dex_file_types.h index d4fb3de504..ecc048219d 100644 --- a/libdexfile/dex/dex_file_types.h +++ b/libdexfile/dex/dex_file_types.h @@ -17,8 +17,9 @@ #ifndef ART_LIBDEXFILE_DEX_DEX_FILE_TYPES_H_ #define ART_LIBDEXFILE_DEX_DEX_FILE_TYPES_H_ +#include <iosfwd> #include <limits> -#include <ostream> +#include <utility> namespace art { namespace dex { diff --git a/libprofile/Android.bp b/libprofile/Android.bp index a8d8b2f0f5..fd32c5fc04 100644 --- a/libprofile/Android.bp +++ b/libprofile/Android.bp @@ -23,33 +23,55 @@ cc_defaults { ], target: { android: { + shared_libs: [ + "libartbase", + "libdexfile", + "libartbase", + // For atrace. + "libcutils", + "libbase", + ], static_libs: [ // ZipArchive support, the order matters here to get all symbols. "libziparchive", "libz", ], + export_shared_lib_headers: ["libbase"], }, - host: { + not_windows: { shared_libs: [ + "libartbase", + "libdexfile", + "libartbase", + // For atrace. + "libcutils", + "libziparchive", + "libz", + "libbase", + ], + export_shared_lib_headers: ["libbase"], + }, + windows: { + cflags: ["-Wno-thread-safety"], + static_libs: [ + "libartbase", + "libdexfile", + "libartbase", + // For atrace. + "libcutils", "libziparchive", "libz", + "libbase", ], + export_static_lib_headers: ["libbase"], }, }, //generated_sources: ["art_libartbase_operator_srcs"], cflags: ["-DBUILDING_LIBART=1"], - shared_libs: [ - "libartbase", - "libdexfile", - "libartbase", - // For atrace. - "libcutils", - ], export_include_dirs: ["."], // ART's macros.h depends on libbase's macros.h. // Note: runtime_options.h depends on cmdline. But we don't really want to export this // generically. dex2oat takes care of it itself. - export_shared_lib_headers: ["libbase"], } cc_defaults { @@ -95,6 +117,14 @@ art_cc_library { "libziparchive", ], export_shared_lib_headers: ["libbase"], + target: { + windows: { + enabled: true, + shared: { + enabled: false, + }, + }, + } } art_cc_library { diff --git a/libprofile/profile/profile_compilation_info.cc b/libprofile/profile/profile_compilation_info.cc index 8b8569d636..47b17aeca9 100644 --- a/libprofile/profile/profile_compilation_info.cc +++ b/libprofile/profile/profile_compilation_info.cc @@ -19,7 +19,6 @@ #include <sys/file.h> #include <sys/stat.h> #include <sys/types.h> -#include <sys/uio.h> #include <unistd.h> #include <zlib.h> @@ -208,7 +207,11 @@ bool ProfileCompilationInfo::AddClasses(const std::set<DexCacheResolvedClasses>& bool ProfileCompilationInfo::MergeWith(const std::string& filename) { std::string error; +#ifdef _WIN32 + int flags = O_RDONLY; +#else int flags = O_RDONLY | O_NOFOLLOW | O_CLOEXEC; +#endif ScopedFlock profile_file = LockedFile::Open(filename.c_str(), flags, /*block=*/false, &error); @@ -236,7 +239,11 @@ bool ProfileCompilationInfo::Load(const std::string& filename, bool clear_if_inv return kProfileLoadWouldOverwiteData; } +#ifdef _WIN32 + int flags = O_RDWR; +#else int flags = O_RDWR | O_NOFOLLOW | O_CLOEXEC; +#endif // There's no need to fsync profile data right away. We get many chances // to write it again in case something goes wrong. We can rely on a simple // close(), no sync, and let to the kernel decide when to write to disk. @@ -274,7 +281,11 @@ bool ProfileCompilationInfo::Load(const std::string& filename, bool clear_if_inv bool ProfileCompilationInfo::Save(const std::string& filename, uint64_t* bytes_written) { ScopedTrace trace(__PRETTY_FUNCTION__); std::string error; +#ifdef _WIN32 + int flags = O_WRONLY; +#else int flags = O_WRONLY | O_NOFOLLOW | O_CLOEXEC; +#endif // There's no need to fsync profile data right away. We get many chances // to write it again in case something goes wrong. We can rely on a simple // close(), no sync, and let to the kernel decide when to write to disk. diff --git a/oatdump/oatdump.cc b/oatdump/oatdump.cc index 4e1276ef72..89826c6863 100644 --- a/oatdump/oatdump.cc +++ b/oatdump/oatdump.cc @@ -114,7 +114,7 @@ const char* image_roots_descriptions_[] = { "kOomeWhenThrowingOome", "kOomeWhenHandlingStackOverflow", "kNoClassDefFoundError", - "kClassLoader", + "kSpecialRoots", }; // Map is so that we don't allocate multiple dex files for the same OatDexFile. diff --git a/profman/Android.bp b/profman/Android.bp index 89e1f7e123..33cca0292f 100644 --- a/profman/Android.bp +++ b/profman/Android.bp @@ -40,7 +40,6 @@ art_cc_binary { name: "profman", defaults: ["profman-defaults"], shared_libs: [ - "libart", "libprofile", "libdexfile", "libartbase", @@ -54,13 +53,33 @@ art_cc_binary { "profman-defaults", ], shared_libs: [ - "libartd", "libprofiled", "libdexfiled", "libartbased", ], } +art_cc_binary { + name: "profmans", + defaults: [ + "profman-defaults", + "libprofile_static_defaults", + "libdexfile_static_defaults", + "libartbase_static_defaults", + ], + host_supported: true, + device_supported: false, + target: { + darwin: { + enabled: false, + }, + windows: { + enabled: true, + cflags: ["-Wno-thread-safety"], + }, + }, +} + art_cc_test { name: "art_profman_tests", defaults: [ diff --git a/profman/profman.cc b/profman/profman.cc index 88c5c4e5ad..82d9df0a46 100644 --- a/profman/profman.cc +++ b/profman/profman.cc @@ -467,6 +467,10 @@ class ProfMan final { // The methods reads the links from /proc/self/fd/ to find the original apk paths // and puts them in the dex_locations_ vector. bool ComputeDexLocationsFromApkFds() { +#ifdef _WIN32 + PLOG(ERROR) << "ComputeDexLocationsFromApkFds is unsupported on Windows."; + return false; +#else // We can't use a char array of PATH_MAX size without exceeding the frame size. // So we use a vector as the buffer for the path. std::vector<char> buffer(PATH_MAX, 0); @@ -482,11 +486,17 @@ class ProfMan final { dex_locations_.push_back(buffer.data()); } return true; +#endif } std::unique_ptr<const ProfileCompilationInfo> LoadProfile(const std::string& filename, int fd) { if (!filename.empty()) { - fd = open(filename.c_str(), O_RDWR | O_CLOEXEC); +#ifdef _WIN32 + int flags = O_RDWR; +#else + int flags = O_RDWR | O_CLOEXEC; +#endif + fd = open(filename.c_str(), flags); if (fd < 0) { LOG(ERROR) << "Cannot open " << filename << strerror(errno); return nullptr; @@ -650,7 +660,12 @@ class ProfMan final { bool GetClassNamesAndMethods(const std::string& profile_file, std::vector<std::unique_ptr<const DexFile>>* dex_files, std::set<std::string>* out_lines) { - int fd = open(profile_file.c_str(), O_RDONLY | O_CLOEXEC); +#ifdef _WIN32 + int flags = O_RDONLY; +#else + int flags = O_RDONLY | O_CLOEXEC; +#endif + int fd = open(profile_file.c_str(), flags); if (!FdIsValid(fd)) { LOG(ERROR) << "Cannot open " << profile_file << strerror(errno); return false; @@ -1031,7 +1046,12 @@ class ProfMan final { int fd = reference_profile_file_fd_; if (!FdIsValid(fd)) { CHECK(!reference_profile_file_.empty()); - fd = open(reference_profile_file_.c_str(), O_CREAT | O_TRUNC | O_WRONLY | O_CLOEXEC, 0644); +#ifdef _WIN32 + int flags = O_CREAT | O_TRUNC | O_WRONLY; +#else + int flags = O_CREAT | O_TRUNC | O_WRONLY | O_CLOEXEC; +#endif + fd = open(reference_profile_file_.c_str(), flags, 0644); if (fd < 0) { LOG(ERROR) << "Cannot open " << reference_profile_file_ << strerror(errno); return kInvalidFd; @@ -1164,9 +1184,12 @@ class ProfMan final { } } // ShouldGenerateTestProfile confirms !test_profile_.empty(). - int profile_test_fd = open(test_profile_.c_str(), - O_CREAT | O_TRUNC | O_WRONLY | O_CLOEXEC, - 0644); +#ifdef _WIN32 + int flags = O_CREAT | O_TRUNC | O_WRONLY; +#else + int flags = O_CREAT | O_TRUNC | O_WRONLY | O_CLOEXEC; +#endif + int profile_test_fd = open(test_profile_.c_str(), flags, 0644); if (profile_test_fd < 0) { LOG(ERROR) << "Cannot open " << test_profile_ << strerror(errno); return -1; diff --git a/runtime/Android.bp b/runtime/Android.bp index 71c5b74363..b89eb02ff0 100644 --- a/runtime/Android.bp +++ b/runtime/Android.bp @@ -462,6 +462,7 @@ gensrcs { cmd: "$(location generate_operator_out) art/runtime $(in) > $(out)", tools: ["generate_operator_out"], srcs: [ + "base/callee_save_type.h", "base/locks.h", "class_loader_context.h", "class_status.h", diff --git a/runtime/arch/arm/callee_save_frame_arm.h b/runtime/arch/arm/callee_save_frame_arm.h index 11eefb9283..72ba3b7f66 100644 --- a/runtime/arch/arm/callee_save_frame_arm.h +++ b/runtime/arch/arm/callee_save_frame_arm.h @@ -21,9 +21,9 @@ #include "base/bit_utils.h" #include "base/callee_save_type.h" #include "base/enums.h" -#include "base/globals.h" #include "quick/quick_method_frame_info.h" #include "registers_arm.h" +#include "runtime_globals.h" namespace art { namespace arm { diff --git a/runtime/arch/arm/fault_handler_arm.cc b/runtime/arch/arm/fault_handler_arm.cc index bb33a273b8..e186cd3992 100644 --- a/runtime/arch/arm/fault_handler_arm.cc +++ b/runtime/arch/arm/fault_handler_arm.cc @@ -18,12 +18,13 @@ #include <sys/ucontext.h> +#include "arch/instruction_set.h" #include "art_method.h" #include "base/enums.h" -#include "base/globals.h" #include "base/hex_dump.h" #include "base/logging.h" // For VLOG. #include "base/macros.h" +#include "runtime_globals.h" #include "thread-current-inl.h" // diff --git a/runtime/arch/arm64/callee_save_frame_arm64.h b/runtime/arch/arm64/callee_save_frame_arm64.h index a5aea2a573..d3609f1d96 100644 --- a/runtime/arch/arm64/callee_save_frame_arm64.h +++ b/runtime/arch/arm64/callee_save_frame_arm64.h @@ -21,9 +21,9 @@ #include "base/bit_utils.h" #include "base/callee_save_type.h" #include "base/enums.h" -#include "base/globals.h" #include "quick/quick_method_frame_info.h" #include "registers_arm64.h" +#include "runtime_globals.h" namespace art { namespace arm64 { diff --git a/runtime/arch/arm64/fault_handler_arm64.cc b/runtime/arch/arm64/fault_handler_arm64.cc index e8b4627f86..751c05b7e9 100644 --- a/runtime/arch/arm64/fault_handler_arm64.cc +++ b/runtime/arch/arm64/fault_handler_arm64.cc @@ -18,13 +18,14 @@ #include <sys/ucontext.h> +#include "arch/instruction_set.h" #include "art_method.h" #include "base/enums.h" -#include "base/globals.h" #include "base/hex_dump.h" #include "base/logging.h" // For VLOG. #include "base/macros.h" #include "registers_arm64.h" +#include "runtime_globals.h" #include "thread-current-inl.h" extern "C" void art_quick_throw_stack_overflow(); diff --git a/runtime/arch/instruction_set_features.cc b/runtime/arch/instruction_set_features.cc index 0c45bc9197..886b40af30 100644 --- a/runtime/arch/instruction_set_features.cc +++ b/runtime/arch/instruction_set_features.cc @@ -16,6 +16,9 @@ #include "instruction_set_features.h" +#include <algorithm> +#include <ostream> + #include "android-base/strings.h" #include "base/casts.h" diff --git a/runtime/arch/instruction_set_features.h b/runtime/arch/instruction_set_features.h index c31c927668..f910a4183d 100644 --- a/runtime/arch/instruction_set_features.h +++ b/runtime/arch/instruction_set_features.h @@ -17,8 +17,8 @@ #ifndef ART_RUNTIME_ARCH_INSTRUCTION_SET_FEATURES_H_ #define ART_RUNTIME_ARCH_INSTRUCTION_SET_FEATURES_H_ +#include <iosfwd> #include <memory> -#include <ostream> #include <vector> #include "arch/instruction_set.h" diff --git a/runtime/arch/mips/callee_save_frame_mips.h b/runtime/arch/mips/callee_save_frame_mips.h index 6e88d08432..84ce2093b7 100644 --- a/runtime/arch/mips/callee_save_frame_mips.h +++ b/runtime/arch/mips/callee_save_frame_mips.h @@ -21,9 +21,9 @@ #include "base/bit_utils.h" #include "base/callee_save_type.h" #include "base/enums.h" -#include "base/globals.h" #include "quick/quick_method_frame_info.h" #include "registers_mips.h" +#include "runtime_globals.h" namespace art { namespace mips { diff --git a/runtime/arch/mips/fault_handler_mips.cc b/runtime/arch/mips/fault_handler_mips.cc index 7c8ac288c3..0354f0c7a6 100644 --- a/runtime/arch/mips/fault_handler_mips.cc +++ b/runtime/arch/mips/fault_handler_mips.cc @@ -17,14 +17,15 @@ #include <sys/ucontext.h> #include "fault_handler.h" +#include "arch/instruction_set.h" #include "arch/mips/callee_save_frame_mips.h" #include "art_method.h" #include "base/callee_save_type.h" -#include "base/globals.h" #include "base/hex_dump.h" #include "base/logging.h" // For VLOG. #include "base/macros.h" #include "registers_mips.h" +#include "runtime_globals.h" #include "thread-current-inl.h" extern "C" void art_quick_throw_stack_overflow(); diff --git a/runtime/arch/mips/registers_mips.h b/runtime/arch/mips/registers_mips.h index 34f2f9684d..4900e413e0 100644 --- a/runtime/arch/mips/registers_mips.h +++ b/runtime/arch/mips/registers_mips.h @@ -19,9 +19,6 @@ #include <iosfwd> -#include <android-base/logging.h> - -#include "base/globals.h" #include "base/macros.h" namespace art { diff --git a/runtime/arch/mips64/callee_save_frame_mips64.h b/runtime/arch/mips64/callee_save_frame_mips64.h index 59529a0c7b..64d6becdcd 100644 --- a/runtime/arch/mips64/callee_save_frame_mips64.h +++ b/runtime/arch/mips64/callee_save_frame_mips64.h @@ -21,9 +21,9 @@ #include "base/bit_utils.h" #include "base/callee_save_type.h" #include "base/enums.h" -#include "base/globals.h" #include "quick/quick_method_frame_info.h" #include "registers_mips64.h" +#include "runtime_globals.h" namespace art { namespace mips64 { diff --git a/runtime/arch/mips64/fault_handler_mips64.cc b/runtime/arch/mips64/fault_handler_mips64.cc index 85f3528ec4..6255235a21 100644 --- a/runtime/arch/mips64/fault_handler_mips64.cc +++ b/runtime/arch/mips64/fault_handler_mips64.cc @@ -18,14 +18,15 @@ #include <sys/ucontext.h> +#include "arch/instruction_set.h" #include "arch/mips64/callee_save_frame_mips64.h" #include "art_method.h" #include "base/callee_save_type.h" -#include "base/globals.h" #include "base/hex_dump.h" #include "base/logging.h" // For VLOG. #include "base/macros.h" #include "registers_mips64.h" +#include "runtime_globals.h" #include "thread-current-inl.h" extern "C" void art_quick_throw_stack_overflow(); diff --git a/runtime/arch/mips64/registers_mips64.h b/runtime/arch/mips64/registers_mips64.h index a3fa2ac426..1c22c0761b 100644 --- a/runtime/arch/mips64/registers_mips64.h +++ b/runtime/arch/mips64/registers_mips64.h @@ -19,9 +19,6 @@ #include <iosfwd> -#include <android-base/logging.h> - -#include "base/globals.h" #include "base/macros.h" namespace art { diff --git a/runtime/arch/x86/callee_save_frame_x86.h b/runtime/arch/x86/callee_save_frame_x86.h index f336f43aa3..2edcade6f0 100644 --- a/runtime/arch/x86/callee_save_frame_x86.h +++ b/runtime/arch/x86/callee_save_frame_x86.h @@ -21,9 +21,9 @@ #include "base/bit_utils.h" #include "base/callee_save_type.h" #include "base/enums.h" -#include "base/globals.h" #include "quick/quick_method_frame_info.h" #include "registers_x86.h" +#include "runtime_globals.h" namespace art { namespace x86 { diff --git a/runtime/arch/x86/fault_handler_x86.cc b/runtime/arch/x86/fault_handler_x86.cc index 8b243342f9..26312fb0ca 100644 --- a/runtime/arch/x86/fault_handler_x86.cc +++ b/runtime/arch/x86/fault_handler_x86.cc @@ -18,13 +18,14 @@ #include <sys/ucontext.h> +#include "arch/instruction_set.h" #include "art_method.h" #include "base/enums.h" -#include "base/globals.h" #include "base/hex_dump.h" #include "base/logging.h" // For VLOG. #include "base/macros.h" #include "base/safe_copy.h" +#include "runtime_globals.h" #include "thread-current-inl.h" #if defined(__APPLE__) diff --git a/runtime/arch/x86/registers_x86.h b/runtime/arch/x86/registers_x86.h index d3b959fc53..ff6c18f6b0 100644 --- a/runtime/arch/x86/registers_x86.h +++ b/runtime/arch/x86/registers_x86.h @@ -19,9 +19,6 @@ #include <iosfwd> -#include <android-base/logging.h> - -#include "base/globals.h" #include "base/macros.h" namespace art { diff --git a/runtime/arch/x86_64/callee_save_frame_x86_64.h b/runtime/arch/x86_64/callee_save_frame_x86_64.h index 228a902d38..d4f2da7978 100644 --- a/runtime/arch/x86_64/callee_save_frame_x86_64.h +++ b/runtime/arch/x86_64/callee_save_frame_x86_64.h @@ -21,9 +21,9 @@ #include "base/bit_utils.h" #include "base/callee_save_type.h" #include "base/enums.h" -#include "base/globals.h" #include "quick/quick_method_frame_info.h" #include "registers_x86_64.h" +#include "runtime_globals.h" namespace art { namespace x86_64 { diff --git a/runtime/arch/x86_64/registers_x86_64.h b/runtime/arch/x86_64/registers_x86_64.h index 66aea705d2..248c82b694 100644 --- a/runtime/arch/x86_64/registers_x86_64.h +++ b/runtime/arch/x86_64/registers_x86_64.h @@ -19,9 +19,6 @@ #include <iosfwd> -#include <android-base/logging.h> - -#include "base/globals.h" #include "base/macros.h" namespace art { diff --git a/libartbase/base/callee_save_type.h b/runtime/base/callee_save_type.h index 3e44a3a73f..e7cc7e6092 100644 --- a/libartbase/base/callee_save_type.h +++ b/runtime/base/callee_save_type.h @@ -14,11 +14,11 @@ * limitations under the License. */ -#ifndef ART_LIBARTBASE_BASE_CALLEE_SAVE_TYPE_H_ -#define ART_LIBARTBASE_BASE_CALLEE_SAVE_TYPE_H_ +#ifndef ART_RUNTIME_BASE_CALLEE_SAVE_TYPE_H_ +#define ART_RUNTIME_BASE_CALLEE_SAVE_TYPE_H_ -#include <cstddef> -#include <ostream> +#include <cstdint> +#include <iosfwd> namespace art { @@ -44,4 +44,4 @@ static inline constexpr CalleeSaveType GetCanonicalCalleeSaveType(CalleeSaveType } // namespace art -#endif // ART_LIBARTBASE_BASE_CALLEE_SAVE_TYPE_H_ +#endif // ART_RUNTIME_BASE_CALLEE_SAVE_TYPE_H_ diff --git a/runtime/base/mutex.h b/runtime/base/mutex.h index 41a47af500..aaa1ee6d6f 100644 --- a/runtime/base/mutex.h +++ b/runtime/base/mutex.h @@ -28,7 +28,7 @@ #include "base/aborting.h" #include "base/atomic.h" -#include "base/globals.h" +#include "runtime_globals.h" #include "base/macros.h" #include "locks.h" diff --git a/runtime/class_linker.cc b/runtime/class_linker.cc index 5d1f20c6cd..d29a6b7577 100644 --- a/runtime/class_linker.cc +++ b/runtime/class_linker.cc @@ -229,7 +229,9 @@ static void EnsureSkipAccessChecksMethods(Handle<mirror::Class> klass, PointerSi } } -void ClassLinker::ThrowEarlierClassFailure(ObjPtr<mirror::Class> c, bool wrap_in_no_class_def) { +void ClassLinker::ThrowEarlierClassFailure(ObjPtr<mirror::Class> c, + bool wrap_in_no_class_def, + bool log) { // The class failed to initialize on a previous attempt, so we want to throw // a NoClassDefFoundError (v2 2.17.5). The exception to this rule is if we // failed in verification, in which case v2 5.4.1 says we need to re-throw @@ -245,8 +247,10 @@ void ClassLinker::ThrowEarlierClassFailure(ObjPtr<mirror::Class> c, bool wrap_in extra = verify_error->AsThrowable()->Dump(); } } - LOG(INFO) << "Rejecting re-init on previously-failed class " << c->PrettyClass() - << ": " << extra; + if (log) { + LOG(INFO) << "Rejecting re-init on previously-failed class " << c->PrettyClass() + << ": " << extra; + } } CHECK(c->IsErroneous()) << c->PrettyClass() << " " << c->GetStatus(); @@ -5044,7 +5048,7 @@ bool ClassLinker::InitializeClass(Thread* self, Handle<mirror::Class> klass, // Was the class already found to be erroneous? Done under the lock to match the JLS. if (klass->IsErroneous()) { - ThrowEarlierClassFailure(klass.Get(), true); + ThrowEarlierClassFailure(klass.Get(), true, /* log= */ true); VlogClassInitializationFailure(klass); return false; } diff --git a/runtime/class_linker.h b/runtime/class_linker.h index b9ac9caf0c..4f4cb4b942 100644 --- a/runtime/class_linker.h +++ b/runtime/class_linker.h @@ -17,6 +17,7 @@ #ifndef ART_RUNTIME_CLASS_LINKER_H_ #define ART_RUNTIME_CLASS_LINKER_H_ +#include <list> #include <set> #include <string> #include <unordered_map> @@ -89,6 +90,7 @@ template<class T> class ObjectLock; class Runtime; class ScopedObjectAccessAlreadyRunnable; template<size_t kNumReferences> class PACKED(4) StackHandleScope; +class Thread; enum VisitRootFlags : uint8_t; @@ -685,7 +687,9 @@ class ClassLinker { // Throw the class initialization failure recorded when first trying to initialize the given // class. - void ThrowEarlierClassFailure(ObjPtr<mirror::Class> c, bool wrap_in_no_class_def = false) + void ThrowEarlierClassFailure(ObjPtr<mirror::Class> c, + bool wrap_in_no_class_def = false, + bool log = false) REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(!Locks::dex_lock_); diff --git a/runtime/common_runtime_test.h b/runtime/common_runtime_test.h index 29b7813881..d7f6127ccb 100644 --- a/runtime/common_runtime_test.h +++ b/runtime/common_runtime_test.h @@ -26,7 +26,6 @@ #include "arch/instruction_set.h" #include "base/common_art_test.h" -#include "base/globals.h" #include "base/locks.h" #include "base/os.h" #include "base/unix_file/fd_file.h" @@ -34,6 +33,7 @@ #include "dex/compact_dex_level.h" // TODO: Add inl file and avoid including inl. #include "obj_ptr-inl.h" +#include "runtime_globals.h" #include "scoped_thread_state_change-inl.h" namespace art { diff --git a/runtime/compiler_filter.cc b/runtime/compiler_filter.cc index bda64ebf25..c0864901cf 100644 --- a/runtime/compiler_filter.cc +++ b/runtime/compiler_filter.cc @@ -16,6 +16,8 @@ #include "compiler_filter.h" +#include <ostream> + #include "base/utils.h" namespace art { diff --git a/runtime/compiler_filter.h b/runtime/compiler_filter.h index 012ebcbe1c..c36e40fc0a 100644 --- a/runtime/compiler_filter.h +++ b/runtime/compiler_filter.h @@ -17,7 +17,7 @@ #ifndef ART_RUNTIME_COMPILER_FILTER_H_ #define ART_RUNTIME_COMPILER_FILTER_H_ -#include <ostream> +#include <iosfwd> #include <string> #include <vector> diff --git a/runtime/entrypoints/quick/quick_deoptimization_entrypoints.cc b/runtime/entrypoints/quick/quick_deoptimization_entrypoints.cc index 2431bce059..d06dbcb12a 100644 --- a/runtime/entrypoints/quick/quick_deoptimization_entrypoints.cc +++ b/runtime/entrypoints/quick/quick_deoptimization_entrypoints.cc @@ -16,7 +16,6 @@ #include "base/logging.h" // For VLOG_IS_ON. #include "base/mutex.h" -#include "base/systrace.h" #include "callee_save_frame.h" #include "interpreter/interpreter.h" #include "obj_ptr-inl.h" // TODO: Find the other include that isn't complete, and clean this up. @@ -41,13 +40,10 @@ NO_RETURN static void artDeoptimizeImpl(Thread* self, DeoptimizationKind kind, b self->AssertHasDeoptimizationContext(); QuickExceptionHandler exception_handler(self, true); - { - ScopedTrace trace(std::string("Deoptimization ") + GetDeoptimizationKindName(kind)); - if (single_frame) { - exception_handler.DeoptimizeSingleFrame(kind); - } else { - exception_handler.DeoptimizeStack(); - } + if (single_frame) { + exception_handler.DeoptimizeSingleFrame(kind); + } else { + exception_handler.DeoptimizeStack(); } uintptr_t return_pc = exception_handler.UpdateInstrumentationStack(); if (exception_handler.IsFullFragmentDone()) { diff --git a/runtime/fault_handler.h b/runtime/fault_handler.h index d3be51f509..f6cf2d77d7 100644 --- a/runtime/fault_handler.h +++ b/runtime/fault_handler.h @@ -23,8 +23,8 @@ #include <vector> -#include "base/globals.h" // For CanDoImplicitNullCheckOn. #include "base/locks.h" // For annotalysis. +#include "runtime_globals.h" // For CanDoImplicitNullCheckOn. namespace art { diff --git a/runtime/gc/accounting/bitmap.h b/runtime/gc/accounting/bitmap.h index bdc686e419..68f2d049d0 100644 --- a/runtime/gc/accounting/bitmap.h +++ b/runtime/gc/accounting/bitmap.h @@ -23,9 +23,9 @@ #include <set> #include <vector> -#include "base/globals.h" #include "base/locks.h" #include "base/mem_map.h" +#include "runtime_globals.h" namespace art { diff --git a/runtime/gc/accounting/card_table.h b/runtime/gc/accounting/card_table.h index c99ed4bcf5..30c438614b 100644 --- a/runtime/gc/accounting/card_table.h +++ b/runtime/gc/accounting/card_table.h @@ -19,9 +19,9 @@ #include <memory> -#include "base/globals.h" #include "base/locks.h" #include "base/mem_map.h" +#include "runtime_globals.h" namespace art { diff --git a/runtime/gc/accounting/mod_union_table.h b/runtime/gc/accounting/mod_union_table.h index 8c471bc6c2..011e95c442 100644 --- a/runtime/gc/accounting/mod_union_table.h +++ b/runtime/gc/accounting/mod_union_table.h @@ -18,12 +18,12 @@ #define ART_RUNTIME_GC_ACCOUNTING_MOD_UNION_TABLE_H_ #include "base/allocator.h" -#include "base/globals.h" #include "base/safe_map.h" #include "base/tracking_safe_map.h" #include "bitmap.h" #include "card_table.h" #include "mirror/object_reference.h" +#include "runtime_globals.h" #include <set> #include <vector> diff --git a/runtime/gc/accounting/read_barrier_table.h b/runtime/gc/accounting/read_barrier_table.h index 2e42f8da5b..44cdb5e02e 100644 --- a/runtime/gc/accounting/read_barrier_table.h +++ b/runtime/gc/accounting/read_barrier_table.h @@ -20,10 +20,10 @@ #include <sys/mman.h> // For the PROT_* and MAP_* constants. #include "base/bit_utils.h" -#include "base/globals.h" #include "base/locks.h" #include "base/mem_map.h" #include "gc/space/space.h" +#include "runtime_globals.h" namespace art { namespace gc { diff --git a/runtime/gc/accounting/remembered_set.h b/runtime/gc/accounting/remembered_set.h index 469074fe50..3525667534 100644 --- a/runtime/gc/accounting/remembered_set.h +++ b/runtime/gc/accounting/remembered_set.h @@ -18,9 +18,9 @@ #define ART_RUNTIME_GC_ACCOUNTING_REMEMBERED_SET_H_ #include "base/allocator.h" -#include "base/globals.h" #include "base/locks.h" #include "base/safe_map.h" +#include "runtime_globals.h" #include <set> #include <vector> diff --git a/runtime/gc/accounting/space_bitmap.h b/runtime/gc/accounting/space_bitmap.h index 8561f06f3a..6ca254a670 100644 --- a/runtime/gc/accounting/space_bitmap.h +++ b/runtime/gc/accounting/space_bitmap.h @@ -23,9 +23,9 @@ #include <set> #include <vector> -#include "base/globals.h" #include "base/locks.h" #include "base/mem_map.h" +#include "runtime_globals.h" namespace art { diff --git a/runtime/gc/accounting/space_bitmap_test.cc b/runtime/gc/accounting/space_bitmap_test.cc index 22529b83c2..9f355e3adb 100644 --- a/runtime/gc/accounting/space_bitmap_test.cc +++ b/runtime/gc/accounting/space_bitmap_test.cc @@ -19,9 +19,9 @@ #include <stdint.h> #include <memory> -#include "base/globals.h" #include "base/mutex.h" #include "common_runtime_test.h" +#include "runtime_globals.h" #include "space_bitmap-inl.h" namespace art { diff --git a/runtime/gc/allocator/dlmalloc.cc b/runtime/gc/allocator/dlmalloc.cc index 11ad8a84bf..79d4fbfb5a 100644 --- a/runtime/gc/allocator/dlmalloc.cc +++ b/runtime/gc/allocator/dlmalloc.cc @@ -60,8 +60,8 @@ static void art_heap_usage_error(const char* function, void* p) { #include <sys/mman.h> -#include "base/globals.h" #include "base/utils.h" +#include "runtime_globals.h" extern "C" void DlmallocMadviseCallback(void* start, void* end, size_t used_bytes, void* arg) { // Is this chunk in use? diff --git a/runtime/gc/allocator/rosalloc.h b/runtime/gc/allocator/rosalloc.h index bf26aea71a..090629583c 100644 --- a/runtime/gc/allocator/rosalloc.h +++ b/runtime/gc/allocator/rosalloc.h @@ -30,9 +30,9 @@ #include "base/allocator.h" #include "base/bit_utils.h" -#include "base/globals.h" #include "base/mem_map.h" #include "base/mutex.h" +#include "runtime_globals.h" #include "thread.h" namespace art { diff --git a/runtime/gc/gc_cause.cc b/runtime/gc/gc_cause.cc index ee7ac7dae0..8b4bac2f8d 100644 --- a/runtime/gc/gc_cause.cc +++ b/runtime/gc/gc_cause.cc @@ -18,8 +18,8 @@ #include <android-base/logging.h> -#include "base/globals.h" #include "base/macros.h" +#include "runtime_globals.h" #include <ostream> diff --git a/runtime/gc/heap.cc b/runtime/gc/heap.cc index 8d19cd0efe..d699da0d16 100644 --- a/runtime/gc/heap.cc +++ b/runtime/gc/heap.cc @@ -3798,7 +3798,7 @@ void Heap::ConcurrentGC(Thread* self, GcCause cause, bool force_full) { if (!Runtime::Current()->IsShuttingDown(self)) { // Wait for any GCs currently running to finish. if (WaitForGcToComplete(cause, self) == collector::kGcTypeNone) { - // If the we can't run the GC type we wanted to run, find the next appropriate one and try + // If we can't run the GC type we wanted to run, find the next appropriate one and try // that instead. E.g. can't do partial, so do full instead. collector::GcType next_gc_type = next_gc_type_; // If forcing full and next gc type is sticky, override with a non-sticky type. @@ -3977,8 +3977,13 @@ static constexpr size_t kNewNativeDiscountFactor = 2; // If weighted java + native memory use exceeds our target by kStopForNativeFactor, and // newly allocated memory exceeds kHugeNativeAlloc, we wait for GC to complete to avoid // running out of memory. -static constexpr float kStopForNativeFactor = 2.0; -static constexpr size_t kHugeNativeAllocs = 200*1024*1024; +static constexpr float kStopForNativeFactor = 4.0; +// TODO: Allow this to be tuned. We want this much smaller for some apps, like Calculator. +// But making it too small can cause jank in apps like launcher that intentionally allocate +// large amounts of memory in rapid succession. (b/122099093) +// For now, we punt, and use a value that should be easily large enough to disable this in all +// questionable setting, but that is clearly too large to be effective for small memory devices. +static constexpr size_t kHugeNativeAllocs = 1 * GB; // Return the ratio of the weighted native + java allocated bytes to its target value. // A return value > 1.0 means we should collect. Significantly larger values mean we're falling @@ -3998,8 +4003,9 @@ inline float Heap::NativeMemoryOverTarget(size_t current_native_bytes) { size_t new_native_bytes = UnsignedDifference(current_native_bytes, old_native_bytes); size_t weighted_native_bytes = new_native_bytes / kNewNativeDiscountFactor + old_native_bytes / kOldNativeDiscountFactor; - size_t adj_start_bytes = concurrent_start_bytes_ - + NativeAllocationGcWatermark() / kNewNativeDiscountFactor; + size_t add_bytes_allowed = static_cast<size_t>( + NativeAllocationGcWatermark() * HeapGrowthMultiplier()); + size_t adj_start_bytes = concurrent_start_bytes_ + add_bytes_allowed / kNewNativeDiscountFactor; return static_cast<float>(GetBytesAllocated() + weighted_native_bytes) / static_cast<float>(adj_start_bytes); } @@ -4017,7 +4023,7 @@ inline void Heap::CheckConcurrentGCForNative(Thread* self) { if (VLOG_IS_ON(heap) || VLOG_IS_ON(startup)) { LOG(INFO) << "Stopping for native allocation, urgency: " << gc_urgency; } - WaitForGcToComplete(kGcCauseForAlloc, self); + WaitForGcToComplete(kGcCauseForNativeAlloc, self); } } else { CollectGarbageInternal(NonStickyGcType(), kGcCauseForNativeAlloc, false); diff --git a/runtime/gc/heap.h b/runtime/gc/heap.h index 6696cc1f06..341f16ad20 100644 --- a/runtime/gc/heap.h +++ b/runtime/gc/heap.h @@ -25,9 +25,7 @@ #include <android-base/logging.h> #include "allocator_type.h" -#include "arch/instruction_set.h" #include "base/atomic.h" -#include "base/globals.h" #include "base/macros.h" #include "base/mutex.h" #include "base/runtime_debug.h" @@ -43,11 +41,13 @@ #include "offsets.h" #include "process_state.h" #include "read_barrier_config.h" +#include "runtime_globals.h" #include "verify_object.h" namespace art { class ConditionVariable; +enum class InstructionSet; class IsMarkedVisitor; class Mutex; class RootVisitor; @@ -157,7 +157,12 @@ class Heap { // Client should call NotifyNativeAllocation every kNotifyNativeInterval allocations. // Should be chosen so that time_to_call_mallinfo / kNotifyNativeInterval is on the same order // as object allocation time. time_to_call_mallinfo seems to be on the order of 1 usec. +#ifdef __ANDROID__ static constexpr uint32_t kNotifyNativeInterval = 32; +#else + // Some host mallinfo() implementations are slow. And memory is less scarce. + static constexpr uint32_t kNotifyNativeInterval = 128; +#endif // RegisterNativeAllocation checks immediately whether GC is needed if size exceeds the // following. kCheckImmediatelyThreshold * kNotifyNativeInterval should be small enough to @@ -1140,15 +1145,9 @@ class Heap { // collect. We collect when a weighted sum of Java memory plus native memory exceeds // the similarly weighted sum of the Java heap size target and this value. ALWAYS_INLINE size_t NativeAllocationGcWatermark() const { - // It probably makes most sense to use a constant multiple of target_footprint_ . - // This is a good indication of the live data size, together with the - // intended space-time trade-off, as expressed by SetTargetHeapUtilization. - // For a fixed target utilization, the amount of GC effort per native - // allocated byte remains roughly constant as the Java heap size changes. - // But we previously triggered on max_free_ native allocation which is often much - // smaller. To avoid unexpected growth, we partially keep that limit in place for now. - // TODO: Consider HeapGrowthMultiplier(). Maybe. - return std::min(target_footprint_.load(std::memory_order_relaxed), 2 * max_free_); + // We keep the traditional limit of max_free_ in place for small heaps, + // but allow it to be adjusted upward for large heaps to limit GC overhead. + return target_footprint_.load(std::memory_order_relaxed) / 8 + max_free_; } ALWAYS_INLINE void IncrementNumberOfBytesFreedRevoke(size_t freed_bytes_revoke); diff --git a/runtime/gc/reference_processor.h b/runtime/gc/reference_processor.h index 17b546ac5e..c1c9a3c833 100644 --- a/runtime/gc/reference_processor.h +++ b/runtime/gc/reference_processor.h @@ -17,10 +17,10 @@ #ifndef ART_RUNTIME_GC_REFERENCE_PROCESSOR_H_ #define ART_RUNTIME_GC_REFERENCE_PROCESSOR_H_ -#include "base/globals.h" #include "base/locks.h" #include "jni.h" #include "reference_queue.h" +#include "runtime_globals.h" namespace art { diff --git a/runtime/gc/reference_queue.h b/runtime/gc/reference_queue.h index 53518cc1c1..90f0be773f 100644 --- a/runtime/gc/reference_queue.h +++ b/runtime/gc/reference_queue.h @@ -22,12 +22,12 @@ #include <vector> #include "base/atomic.h" -#include "base/globals.h" #include "base/locks.h" #include "base/timing_logger.h" #include "jni.h" #include "obj_ptr.h" #include "offsets.h" +#include "runtime_globals.h" #include "thread_pool.h" namespace art { diff --git a/runtime/gc/space/image_space.cc b/runtime/gc/space/image_space.cc index 64fd3cd0c8..5ad5f522ec 100644 --- a/runtime/gc/space/image_space.cc +++ b/runtime/gc/space/image_space.cc @@ -25,6 +25,7 @@ #include "android-base/stringprintf.h" #include "android-base/strings.h" +#include "arch/instruction_set.h" #include "art_field-inl.h" #include "art_method-inl.h" #include "base/array_ref.h" diff --git a/runtime/gc/space/image_space.h b/runtime/gc/space/image_space.h index 14e364a44c..42ac3e2790 100644 --- a/runtime/gc/space/image_space.h +++ b/runtime/gc/space/image_space.h @@ -17,7 +17,6 @@ #ifndef ART_RUNTIME_GC_SPACE_IMAGE_SPACE_H_ #define ART_RUNTIME_GC_SPACE_IMAGE_SPACE_H_ -#include "arch/instruction_set.h" #include "gc/accounting/space_bitmap.h" #include "image.h" #include "space.h" @@ -26,6 +25,7 @@ namespace art { template <typename T> class ArrayRef; class DexFile; +enum class InstructionSet; class OatFile; namespace gc { diff --git a/runtime/gc/space/image_space_fs.h b/runtime/gc/space/image_space_fs.h index 14deb6f001..262c6e01e3 100644 --- a/runtime/gc/space/image_space_fs.h +++ b/runtime/gc/space/image_space_fs.h @@ -23,13 +23,13 @@ #include "android-base/stringprintf.h" #include "base/file_utils.h" -#include "base/globals.h" #include "base/logging.h" // For VLOG. #include "base/macros.h" #include "base/os.h" #include "base/unix_file/fd_file.h" #include "base/utils.h" #include "runtime.h" +#include "runtime_globals.h" namespace art { namespace gc { diff --git a/runtime/gc/space/malloc_space.cc b/runtime/gc/space/malloc_space.cc index b5e6b62bcd..474231bb40 100644 --- a/runtime/gc/space/malloc_space.cc +++ b/runtime/gc/space/malloc_space.cc @@ -16,6 +16,8 @@ #include "malloc_space.h" +#include <ostream> + #include "android-base/stringprintf.h" #include "base/logging.h" // For VLOG diff --git a/runtime/gc/space/malloc_space.h b/runtime/gc/space/malloc_space.h index 7d28516961..9a90dfd2ac 100644 --- a/runtime/gc/space/malloc_space.h +++ b/runtime/gc/space/malloc_space.h @@ -19,7 +19,8 @@ #include "space.h" -#include <ostream> +#include <iosfwd> + #include "base/memory_tool.h" #include "base/mutex.h" diff --git a/runtime/gc/space/space.h b/runtime/gc/space/space.h index dd5451bf2e..903263f26a 100644 --- a/runtime/gc/space/space.h +++ b/runtime/gc/space/space.h @@ -21,12 +21,12 @@ #include <string> #include "base/atomic.h" -#include "base/globals.h" #include "base/locks.h" #include "base/macros.h" #include "base/mem_map.h" #include "gc/accounting/space_bitmap.h" #include "gc/collector/object_byte_pair.h" +#include "runtime_globals.h" namespace art { namespace mirror { diff --git a/runtime/gc/space/space_test.h b/runtime/gc/space/space_test.h index 1b111e3496..7fbd0b5887 100644 --- a/runtime/gc/space/space_test.h +++ b/runtime/gc/space/space_test.h @@ -20,13 +20,13 @@ #include <stdint.h> #include <memory> -#include "base/globals.h" #include "common_runtime_test.h" #include "handle_scope-inl.h" #include "mirror/array-inl.h" #include "mirror/class-inl.h" #include "mirror/class_loader.h" #include "mirror/object-inl.h" +#include "runtime_globals.h" #include "scoped_thread_state_change-inl.h" #include "thread_list.h" #include "zygote_space.h" diff --git a/runtime/gc/task_processor.h b/runtime/gc/task_processor.h index 6db3c37689..86e36ab6d6 100644 --- a/runtime/gc/task_processor.h +++ b/runtime/gc/task_processor.h @@ -20,8 +20,8 @@ #include <memory> #include <set> -#include "base/globals.h" #include "base/mutex.h" +#include "runtime_globals.h" #include "thread_pool.h" namespace art { diff --git a/runtime/handle_scope-inl.h b/runtime/handle_scope-inl.h index f61c700a36..765ed7d53b 100644 --- a/runtime/handle_scope-inl.h +++ b/runtime/handle_scope-inl.h @@ -21,6 +21,7 @@ #include "base/mutex.h" #include "handle.h" +#include "handle_wrapper.h" #include "obj_ptr-inl.h" #include "thread-current-inl.h" #include "verify_object.h" @@ -106,6 +107,15 @@ inline bool HandleScope::Contains(StackReference<mirror::Object>* handle_scope_e handle_scope_entry <= &GetReferences()[number_of_references_ - 1]; } +template <typename Visitor> +inline void HandleScope::VisitRoots(Visitor& visitor) { + for (size_t i = 0, count = NumberOfReferences(); i < count; ++i) { + // GetReference returns a pointer to the stack reference within the handle scope. If this + // needs to be updated, it will be done by the root visitor. + visitor.VisitRootIfNonNull(GetHandle(i).GetReference()); + } +} + template<size_t kNumReferences> template<class T> inline MutableHandle<T> FixedSizeHandleScope<kNumReferences>::NewHandle(T* object) { SetReference(pos_, object); diff --git a/runtime/handle_scope.h b/runtime/handle_scope.h index 1a1c92f9c5..dae8e29ef0 100644 --- a/runtime/handle_scope.h +++ b/runtime/handle_scope.h @@ -24,13 +24,16 @@ #include "base/enums.h" #include "base/locks.h" #include "base/macros.h" -#include "handle.h" #include "stack_reference.h" #include "verify_object.h" namespace art { +template<class T> class Handle; class HandleScope; +template<class T> class HandleWrapper; +template<class T> class HandleWrapperObjPtr; +template<class T> class MutableHandle; template<class MirrorType> class ObjPtr; class Thread; class VariableSizedHandleScope; @@ -144,13 +147,7 @@ class PACKED(4) HandleScope : public BaseHandleScope { } template <typename Visitor> - void VisitRoots(Visitor& visitor) REQUIRES_SHARED(Locks::mutator_lock_) { - for (size_t i = 0, count = NumberOfReferences(); i < count; ++i) { - // GetReference returns a pointer to the stack reference within the handle scope. If this - // needs to be updated, it will be done by the root visitor. - visitor.VisitRootIfNonNull(GetHandle(i).GetReference()); - } - } + ALWAYS_INLINE void VisitRoots(Visitor& visitor) REQUIRES_SHARED(Locks::mutator_lock_); protected: // Return backing storage used for references. @@ -172,44 +169,6 @@ class PACKED(4) HandleScope : public BaseHandleScope { DISALLOW_COPY_AND_ASSIGN(HandleScope); }; -// A wrapper which wraps around Object** and restores the pointer in the destructor. -// TODO: Delete -template<class T> -class HandleWrapper : public MutableHandle<T> { - public: - HandleWrapper(T** obj, const MutableHandle<T>& handle) - : MutableHandle<T>(handle), obj_(obj) { - } - - HandleWrapper(const HandleWrapper&) = default; - - ~HandleWrapper() { - *obj_ = MutableHandle<T>::Get(); - } - - private: - T** const obj_; -}; - - -// A wrapper which wraps around ObjPtr<Object>* and restores the pointer in the destructor. -// TODO: Add more functionality. -template<class T> -class HandleWrapperObjPtr : public MutableHandle<T> { - public: - HandleWrapperObjPtr(ObjPtr<T>* obj, const MutableHandle<T>& handle) - : MutableHandle<T>(handle), obj_(obj) {} - - HandleWrapperObjPtr(const HandleWrapperObjPtr&) = default; - - ~HandleWrapperObjPtr() { - *obj_ = ObjPtr<T>(MutableHandle<T>::Get()); - } - - private: - ObjPtr<T>* const obj_; -}; - // Fixed size handle scope that is not necessarily linked in the thread. template<size_t kNumReferences> class PACKED(4) FixedSizeHandleScope : public HandleScope { diff --git a/runtime/handle_wrapper.h b/runtime/handle_wrapper.h new file mode 100644 index 0000000000..01252c724d --- /dev/null +++ b/runtime/handle_wrapper.h @@ -0,0 +1,65 @@ +/* + * 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. + */ + +#ifndef ART_RUNTIME_HANDLE_WRAPPER_H_ +#define ART_RUNTIME_HANDLE_WRAPPER_H_ + +#include "handle.h" +#include "obj_ptr.h" + +namespace art { + +// A wrapper which wraps around Object** and restores the pointer in the destructor. +// TODO: Delete +template<class T> +class HandleWrapper : public MutableHandle<T> { + public: + HandleWrapper(T** obj, const MutableHandle<T>& handle) + : MutableHandle<T>(handle), obj_(obj) { + } + + HandleWrapper(const HandleWrapper&) = default; + + ~HandleWrapper() { + *obj_ = MutableHandle<T>::Get(); + } + + private: + T** const obj_; +}; + + +// A wrapper which wraps around ObjPtr<Object>* and restores the pointer in the destructor. +// TODO: Add more functionality. +template<class T> +class HandleWrapperObjPtr : public MutableHandle<T> { + public: + HandleWrapperObjPtr(ObjPtr<T>* obj, const MutableHandle<T>& handle) + : MutableHandle<T>(handle), obj_(obj) {} + + HandleWrapperObjPtr(const HandleWrapperObjPtr&) = default; + + ~HandleWrapperObjPtr() { + *obj_ = ObjPtr<T>(MutableHandle<T>::Get()); + } + + private: + ObjPtr<T>* const obj_; +}; + +} // namespace art + +#endif // ART_RUNTIME_HANDLE_WRAPPER_H_ diff --git a/runtime/hidden_api.cc b/runtime/hidden_api.cc index c146daa809..2d3493d60e 100644 --- a/runtime/hidden_api.cc +++ b/runtime/hidden_api.cc @@ -361,9 +361,11 @@ bool ShouldDenyAccessToMemberImpl(T* member, hiddenapi::ApiList api_list, AccessMethod access_method) { DCHECK(member != nullptr); - Runtime* runtime = Runtime::Current(); + EnforcementPolicy policy = runtime->GetHiddenApiEnforcementPolicy(); + DCHECK(policy != EnforcementPolicy::kDisabled) + << "Should never enter this function when access checks are completely disabled"; const bool deny_access = (policy == EnforcementPolicy::kEnabled) && diff --git a/runtime/hidden_api.h b/runtime/hidden_api.h index a0eeae2950..1a5e010a7d 100644 --- a/runtime/hidden_api.h +++ b/runtime/hidden_api.h @@ -311,6 +311,11 @@ inline bool ShouldDenyAccessToMember(T* member, return false; } + // Exit early if access checks are completely disabled. + if (Runtime::Current()->GetHiddenApiEnforcementPolicy() == EnforcementPolicy::kDisabled) { + return false; + } + // Check if caller is exempted from access checks. // This can be *very* expensive. Save it for last. if (fn_get_access_context().IsTrusted()) { diff --git a/runtime/hidden_api_test.cc b/runtime/hidden_api_test.cc index 595f0779e2..1f83c052eb 100644 --- a/runtime/hidden_api_test.cc +++ b/runtime/hidden_api_test.cc @@ -100,13 +100,6 @@ class HiddenApiTest : public CommonRuntimeTest { TEST_F(HiddenApiTest, CheckGetActionFromRuntimeFlags) { ScopedObjectAccess soa(self_); - runtime_->SetHiddenApiEnforcementPolicy(hiddenapi::EnforcementPolicy::kDisabled); - ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Whitelist()), false); - ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Greylist()), false); - ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::GreylistMaxP()), false); - ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::GreylistMaxO()), false); - ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Blacklist()), false); - runtime_->SetHiddenApiEnforcementPolicy(hiddenapi::EnforcementPolicy::kJustWarn); ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Whitelist()), false); ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Greylist()), false); diff --git a/runtime/hprof/hprof.cc b/runtime/hprof/hprof.cc index 3abe4c529a..34f645b54c 100644 --- a/runtime/hprof/hprof.cc +++ b/runtime/hprof/hprof.cc @@ -42,7 +42,6 @@ #include "art_method-inl.h" #include "base/array_ref.h" #include "base/file_utils.h" -#include "base/globals.h" #include "base/macros.h" #include "base/mutex.h" #include "base/os.h" @@ -66,6 +65,7 @@ #include "mirror/class-inl.h" #include "mirror/class.h" #include "mirror/object-refvisitor-inl.h" +#include "runtime_globals.h" #include "scoped_thread_state_change-inl.h" #include "thread_list.h" diff --git a/runtime/image.h b/runtime/image.h index 140f50412c..657828708f 100644 --- a/runtime/image.h +++ b/runtime/image.h @@ -20,9 +20,9 @@ #include <string.h> #include "base/enums.h" -#include "base/globals.h" #include "base/iteration_range.h" #include "mirror/object.h" +#include "runtime_globals.h" namespace art { diff --git a/runtime/jdwp_provider.h b/runtime/jdwp_provider.h index 9579513939..29fbc3f998 100644 --- a/runtime/jdwp_provider.h +++ b/runtime/jdwp_provider.h @@ -19,7 +19,7 @@ #include <ios> -#include "base/globals.h" +#include "runtime_globals.h" namespace art { diff --git a/runtime/mirror/class-inl.h b/runtime/mirror/class-inl.h index 40c7d30707..fe498133fe 100644 --- a/runtime/mirror/class-inl.h +++ b/runtime/mirror/class-inl.h @@ -39,6 +39,7 @@ #include "runtime.h" #include "string.h" #include "subtype_check.h" +#include "thread-current-inl.h" namespace art { namespace mirror { @@ -1117,6 +1118,18 @@ inline void Class::SetClassLoader(ObjPtr<ClassLoader> new_class_loader) { } } +inline void Class::SetRecursivelyInitialized() { + DCHECK_EQ(GetLockOwnerThreadId(), Thread::Current()->GetThreadId()); + uint32_t flags = GetField32(OFFSET_OF_OBJECT_MEMBER(Class, access_flags_)); + SetAccessFlags(flags | kAccRecursivelyInitialized); +} + +inline void Class::SetHasDefaultMethods() { + DCHECK_EQ(GetLockOwnerThreadId(), Thread::Current()->GetThreadId()); + uint32_t flags = GetField32(OFFSET_OF_OBJECT_MEMBER(Class, access_flags_)); + SetAccessFlags(flags | kAccHasDefaultMethod); +} + } // namespace mirror } // namespace art diff --git a/runtime/mirror/class.h b/runtime/mirror/class.h index f7a41f7f56..d35d526dab 100644 --- a/runtime/mirror/class.h +++ b/runtime/mirror/class.h @@ -30,7 +30,6 @@ #include "object.h" #include "object_array.h" #include "read_barrier_option.h" -#include "thread-current-inl.h" namespace art { @@ -52,6 +51,7 @@ template<typename T> class ArraySlice; class Signature; class StringPiece; template<size_t kNumReferences> class PACKED(4) StackHandleScope; +class Thread; namespace mirror { @@ -223,17 +223,9 @@ class MANAGED Class final : public Object { SetAccessFlags(flags | kAccSkipHiddenapiChecks); } - ALWAYS_INLINE void SetRecursivelyInitialized() REQUIRES_SHARED(Locks::mutator_lock_) { - DCHECK_EQ(GetLockOwnerThreadId(), Thread::Current()->GetThreadId()); - uint32_t flags = GetField32(OFFSET_OF_OBJECT_MEMBER(Class, access_flags_)); - SetAccessFlags(flags | kAccRecursivelyInitialized); - } + ALWAYS_INLINE void SetRecursivelyInitialized() REQUIRES_SHARED(Locks::mutator_lock_); - ALWAYS_INLINE void SetHasDefaultMethods() REQUIRES_SHARED(Locks::mutator_lock_) { - DCHECK_EQ(GetLockOwnerThreadId(), Thread::Current()->GetThreadId()); - uint32_t flags = GetField32(OFFSET_OF_OBJECT_MEMBER(Class, access_flags_)); - SetAccessFlags(flags | kAccHasDefaultMethod); - } + ALWAYS_INLINE void SetHasDefaultMethods() REQUIRES_SHARED(Locks::mutator_lock_); ALWAYS_INLINE void SetFinalizable() REQUIRES_SHARED(Locks::mutator_lock_) { uint32_t flags = GetField32(OFFSET_OF_OBJECT_MEMBER(Class, access_flags_)); diff --git a/runtime/mirror/dex_cache.cc b/runtime/mirror/dex_cache.cc index 8d2b838cb2..7e79ebe070 100644 --- a/runtime/mirror/dex_cache.cc +++ b/runtime/mirror/dex_cache.cc @@ -17,7 +17,6 @@ #include "dex_cache-inl.h" #include "art_method-inl.h" -#include "base/globals.h" #include "class_linker.h" #include "gc/accounting/card_table-inl.h" #include "gc/heap.h" @@ -27,6 +26,7 @@ #include "object.h" #include "object_array-inl.h" #include "runtime.h" +#include "runtime_globals.h" #include "string.h" #include "thread.h" #include "utils/dex_cache_arrays_layout-inl.h" diff --git a/runtime/mirror/object.h b/runtime/mirror/object.h index bca7511489..ba222f6695 100644 --- a/runtime/mirror/object.h +++ b/runtime/mirror/object.h @@ -20,13 +20,13 @@ #include "base/atomic.h" #include "base/casts.h" #include "base/enums.h" -#include "base/globals.h" #include "dex/primitive.h" #include "obj_ptr.h" #include "object_reference.h" #include "offsets.h" #include "read_barrier_config.h" #include "read_barrier_option.h" +#include "runtime_globals.h" #include "verify_object.h" namespace art { diff --git a/runtime/mirror/object_reference.h b/runtime/mirror/object_reference.h index 8636928620..e19e1656ee 100644 --- a/runtime/mirror/object_reference.h +++ b/runtime/mirror/object_reference.h @@ -18,10 +18,10 @@ #define ART_RUNTIME_MIRROR_OBJECT_REFERENCE_H_ #include "base/atomic.h" -#include "base/globals.h" #include "base/locks.h" // For Locks::mutator_lock_. #include "heap_poisoning.h" #include "obj_ptr.h" +#include "runtime_globals.h" namespace art { namespace mirror { diff --git a/runtime/mirror/string-alloc-inl.h b/runtime/mirror/string-alloc-inl.h index c31eccff7c..4c4e2af3e7 100644 --- a/runtime/mirror/string-alloc-inl.h +++ b/runtime/mirror/string-alloc-inl.h @@ -22,11 +22,11 @@ #include "array.h" #include "base/bit_utils.h" -#include "base/globals.h" #include "class.h" #include "class_root.h" #include "gc/heap-inl.h" #include "runtime.h" +#include "runtime_globals.h" #include "thread.h" namespace art { diff --git a/runtime/mirror/string-inl.h b/runtime/mirror/string-inl.h index e11906a85a..f04a8aaa38 100644 --- a/runtime/mirror/string-inl.h +++ b/runtime/mirror/string-inl.h @@ -20,10 +20,10 @@ #include "android-base/stringprintf.h" -#include "base/globals.h" #include "class-inl.h" #include "common_throws.h" #include "dex/utf.h" +#include "runtime_globals.h" namespace art { namespace mirror { diff --git a/runtime/mirror/string.h b/runtime/mirror/string.h index b32db08605..c367957bc3 100644 --- a/runtime/mirror/string.h +++ b/runtime/mirror/string.h @@ -18,10 +18,10 @@ #define ART_RUNTIME_MIRROR_STRING_H_ #include "base/bit_utils.h" -#include "base/globals.h" #include "gc/allocator_type.h" #include "class.h" #include "object.h" +#include "runtime_globals.h" namespace art { diff --git a/runtime/oat.cc b/runtime/oat.cc index d7c968f9d1..c6a963a54f 100644 --- a/runtime/oat.cc +++ b/runtime/oat.cc @@ -20,6 +20,7 @@ #include "android-base/stringprintf.h" +#include "arch/instruction_set.h" #include "arch/instruction_set_features.h" #include "base/bit_utils.h" #include "base/strlcpy.h" diff --git a/runtime/oat.h b/runtime/oat.h index ded148914f..88238d96ec 100644 --- a/runtime/oat.h +++ b/runtime/oat.h @@ -19,13 +19,13 @@ #include <vector> -#include "arch/instruction_set.h" #include "base/macros.h" #include "base/safe_map.h" #include "compiler_filter.h" namespace art { +enum class InstructionSet; class InstructionSetFeatures; class PACKED(4) OatHeader { diff --git a/runtime/obj_ptr-inl.h b/runtime/obj_ptr-inl.h index b949c96dd2..f096445913 100644 --- a/runtime/obj_ptr-inl.h +++ b/runtime/obj_ptr-inl.h @@ -17,6 +17,8 @@ #ifndef ART_RUNTIME_OBJ_PTR_INL_H_ #define ART_RUNTIME_OBJ_PTR_INL_H_ +#include <ostream> + #include "base/bit_utils.h" #include "obj_ptr.h" #include "thread-current-inl.h" diff --git a/runtime/obj_ptr.h b/runtime/obj_ptr.h index 9e2ee295c7..b0f24dabc8 100644 --- a/runtime/obj_ptr.h +++ b/runtime/obj_ptr.h @@ -17,12 +17,12 @@ #ifndef ART_RUNTIME_OBJ_PTR_H_ #define ART_RUNTIME_OBJ_PTR_H_ -#include <ostream> +#include <iosfwd> #include <type_traits> -#include "base/globals.h" #include "base/locks.h" // For Locks::mutator_lock_. #include "base/macros.h" +#include "runtime_globals.h" // Always inline ObjPtr methods even in debug builds. #define OBJPTR_INLINE __attribute__ ((always_inline)) diff --git a/runtime/offsets.h b/runtime/offsets.h index 372b821809..6d1a8e0ed6 100644 --- a/runtime/offsets.h +++ b/runtime/offsets.h @@ -17,10 +17,10 @@ #ifndef ART_RUNTIME_OFFSETS_H_ #define ART_RUNTIME_OFFSETS_H_ -#include <ostream> +#include <iosfwd> #include "base/enums.h" -#include "base/globals.h" +#include "runtime_globals.h" namespace art { diff --git a/runtime/parsed_options.h b/runtime/parsed_options.h index 8c77d39f7b..095d66e62c 100644 --- a/runtime/parsed_options.h +++ b/runtime/parsed_options.h @@ -23,10 +23,10 @@ #include <jni.h> #include "arch/instruction_set.h" -#include "base/globals.h" #include "gc/collector_type.h" #include "gc/space/large_object_space.h" // #include "jit/profile_saver_options.h" +#include "runtime_globals.h" #include "runtime_options.h" namespace art { diff --git a/runtime/quick_exception_handler.cc b/runtime/quick_exception_handler.cc index 0d570c39ae..3bc718b058 100644 --- a/runtime/quick_exception_handler.cc +++ b/runtime/quick_exception_handler.cc @@ -20,6 +20,7 @@ #include "art_method-inl.h" #include "base/enums.h" #include "base/logging.h" // For VLOG_IS_ON. +#include "base/systrace.h" #include "dex/dex_file_types.h" #include "dex/dex_instruction.h" #include "entrypoints/entrypoint_utils.h" @@ -592,6 +593,10 @@ void QuickExceptionHandler::DeoptimizeSingleFrame(DeoptimizationKind kind) { // Compiled code made an explicit deoptimization. ArtMethod* deopt_method = visitor.GetSingleFrameDeoptMethod(); + SCOPED_TRACE << "Deoptimizing " + << deopt_method->PrettyMethod() + << ": " << GetDeoptimizationKindName(kind); + DCHECK(deopt_method != nullptr); if (VLOG_IS_ON(deopt) || kDebugExceptionDelivery) { LOG(INFO) << "Single-frame deopting: " diff --git a/runtime/reflection.cc b/runtime/reflection.cc index dfd7e64a08..dbf40f6a8a 100644 --- a/runtime/reflection.cc +++ b/runtime/reflection.cc @@ -33,6 +33,7 @@ #include "nth_caller_visitor.h" #include "scoped_thread_state_change-inl.h" #include "stack_reference.h" +#include "thread-inl.h" #include "well_known_classes.h" namespace art { diff --git a/runtime/runtime.h b/runtime/runtime.h index a2d519de57..a249c9fb9c 100644 --- a/runtime/runtime.h +++ b/runtime/runtime.h @@ -27,7 +27,6 @@ #include <memory> #include <vector> -#include "arch/instruction_set.h" #include "base/locks.h" #include "base/macros.h" #include "base/mem_map.h" @@ -84,6 +83,7 @@ enum class CalleeSaveType: uint32_t; class ClassLinker; class CompilerCallbacks; class DexFile; +enum class InstructionSet; class InternTable; class IsMarkedVisitor; class JavaVMExt; diff --git a/runtime/runtime_globals.h b/runtime/runtime_globals.h new file mode 100644 index 0000000000..793291a008 --- /dev/null +++ b/runtime/runtime_globals.h @@ -0,0 +1,82 @@ +/* + * 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. + */ + +#ifndef ART_RUNTIME_RUNTIME_GLOBALS_H_ +#define ART_RUNTIME_RUNTIME_GLOBALS_H_ + +#include "base/globals.h" + +namespace art { + +// Size of Dex virtual registers. +static constexpr size_t kVRegSize = 4; + +// Returns whether the given memory offset can be used for generating +// an implicit null check. +static inline bool CanDoImplicitNullCheckOn(uintptr_t offset) { + return offset < kPageSize; +} + +// Required object alignment +static constexpr size_t kObjectAlignmentShift = 3; +static constexpr size_t kObjectAlignment = 1u << kObjectAlignmentShift; +static constexpr size_t kLargeObjectAlignment = kPageSize; + +// Garbage collector constants. +static constexpr bool kMovingCollector = true; +static constexpr bool kMarkCompactSupport = false && kMovingCollector; +// True if we allow moving classes. +static constexpr bool kMovingClasses = !kMarkCompactSupport; +// If true, enable generational collection when using the Concurrent Copying +// (CC) collector, i.e. use sticky-bit CC for minor collections and (full) CC +// for major collections. +// +// Generational CC collection is currently only compatible with Baker read +// barriers. +#if defined(ART_USE_GENERATIONAL_CC) && defined(ART_READ_BARRIER_TYPE_IS_BAKER) +static constexpr bool kEnableGenerationalConcurrentCopyingCollection = true; +#else +static constexpr bool kEnableGenerationalConcurrentCopyingCollection = false; +#endif + +// If true, enable the tlab allocator by default. +#ifdef ART_USE_TLAB +static constexpr bool kUseTlab = true; +#else +static constexpr bool kUseTlab = false; +#endif + +// Kinds of tracing clocks. +enum class TraceClockSource { + kThreadCpu, + kWall, + kDual, // Both wall and thread CPU clocks. +}; + +#if defined(__linux__) +static constexpr TraceClockSource kDefaultTraceClockSource = TraceClockSource::kDual; +#else +static constexpr TraceClockSource kDefaultTraceClockSource = TraceClockSource::kWall; +#endif + +static constexpr bool kDefaultMustRelocate = true; + +// Size of a heap reference. +static constexpr size_t kHeapReferenceSize = sizeof(uint32_t); + +} // namespace art + +#endif // ART_RUNTIME_RUNTIME_GLOBALS_H_ diff --git a/runtime/suspend_reason.h b/runtime/suspend_reason.h index 289a1a4fb3..af2be10dfd 100644 --- a/runtime/suspend_reason.h +++ b/runtime/suspend_reason.h @@ -17,7 +17,7 @@ #ifndef ART_RUNTIME_SUSPEND_REASON_H_ #define ART_RUNTIME_SUSPEND_REASON_H_ -#include <ostream> +#include <iosfwd> namespace art { diff --git a/runtime/thread-inl.h b/runtime/thread-inl.h index 0c00fb93ac..00f882e3e0 100644 --- a/runtime/thread-inl.h +++ b/runtime/thread-inl.h @@ -19,6 +19,7 @@ #include "thread.h" +#include "arch/instruction_set.h" #include "base/aborting.h" #include "base/casts.h" #include "base/mutex-inl.h" @@ -393,6 +394,26 @@ inline ShadowFrame* Thread::PopShadowFrame() { return tlsPtr_.managed_stack.PopShadowFrame(); } +inline uint8_t* Thread::GetStackEndForInterpreter(bool implicit_overflow_check) const { + uint8_t* end = tlsPtr_.stack_end + (implicit_overflow_check + ? GetStackOverflowReservedBytes(kRuntimeISA) + : 0); + if (kIsDebugBuild) { + // In a debuggable build, but especially under ASAN, the access-checks interpreter has a + // potentially humongous stack size. We don't want to take too much of the stack regularly, + // so do not increase the regular reserved size (for compiled code etc) and only report the + // virtually smaller stack to the interpreter here. + end += GetStackOverflowReservedBytes(kRuntimeISA); + } + return end; +} + +inline void Thread::ResetDefaultStackEnd() { + // Our stacks grow down, so we want stack_end_ to be near there, but reserving enough room + // to throw a StackOverflowError. + tlsPtr_.stack_end = tlsPtr_.stack_begin + GetStackOverflowReservedBytes(kRuntimeISA); +} + } // namespace art #endif // ART_RUNTIME_THREAD_INL_H_ diff --git a/runtime/thread.h b/runtime/thread.h index ad69ecfacc..592013bd03 100644 --- a/runtime/thread.h +++ b/runtime/thread.h @@ -26,13 +26,12 @@ #include <string> #include "arch/context.h" -#include "arch/instruction_set.h" #include "base/atomic.h" #include "base/enums.h" -#include "base/globals.h" #include "base/locks.h" #include "base/macros.h" #include "base/safe_map.h" +#include "base/value_object.h" #include "entrypoints/jni/jni_entrypoints.h" #include "entrypoints/quick/quick_entrypoints.h" #include "handle_scope.h" @@ -41,6 +40,7 @@ #include "managed_stack.h" #include "offsets.h" #include "read_barrier_config.h" +#include "runtime_globals.h" #include "runtime_stats.h" #include "suspend_reason.h" #include "thread_state.h" @@ -819,19 +819,7 @@ class Thread { return tlsPtr_.stack_size - (tlsPtr_.stack_end - tlsPtr_.stack_begin); } - uint8_t* GetStackEndForInterpreter(bool implicit_overflow_check) const { - uint8_t* end = tlsPtr_.stack_end + (implicit_overflow_check - ? GetStackOverflowReservedBytes(kRuntimeISA) - : 0); - if (kIsDebugBuild) { - // In a debuggable build, but especially under ASAN, the access-checks interpreter has a - // potentially humongous stack size. We don't want to take too much of the stack regularly, - // so do not increase the regular reserved size (for compiled code etc) and only report the - // virtually smaller stack to the interpreter here. - end += GetStackOverflowReservedBytes(kRuntimeISA); - } - return end; - } + ALWAYS_INLINE uint8_t* GetStackEndForInterpreter(bool implicit_overflow_check) const; uint8_t* GetStackEnd() const { return tlsPtr_.stack_end; @@ -841,11 +829,7 @@ class Thread { void SetStackEndForStackOverflow() REQUIRES_SHARED(Locks::mutator_lock_); // Set the stack end to that to be used during regular execution - void ResetDefaultStackEnd() { - // Our stacks grow down, so we want stack_end_ to be near there, but reserving enough room - // to throw a StackOverflowError. - tlsPtr_.stack_end = tlsPtr_.stack_begin + GetStackOverflowReservedBytes(kRuntimeISA); - } + ALWAYS_INLINE void ResetDefaultStackEnd(); bool IsHandlingStackOverflow() const { return tlsPtr_.stack_end == tlsPtr_.stack_begin; diff --git a/runtime/thread_state.h b/runtime/thread_state.h index 8edfeecbdd..e57a040cb1 100644 --- a/runtime/thread_state.h +++ b/runtime/thread_state.h @@ -17,7 +17,7 @@ #ifndef ART_RUNTIME_THREAD_STATE_H_ #define ART_RUNTIME_THREAD_STATE_H_ -#include <ostream> +#include <iosfwd> namespace art { diff --git a/runtime/trace.h b/runtime/trace.h index 582f756ca9..567f6edb22 100644 --- a/runtime/trace.h +++ b/runtime/trace.h @@ -27,12 +27,12 @@ #include <vector> #include "base/atomic.h" -#include "base/globals.h" #include "base/locks.h" #include "base/macros.h" #include "base/os.h" #include "base/safe_map.h" #include "instrumentation.h" +#include "runtime_globals.h" namespace unix_file { class FdFile; diff --git a/runtime/utils/dex_cache_arrays_layout-inl.h b/runtime/utils/dex_cache_arrays_layout-inl.h index c0ea6be5a3..3512efe080 100644 --- a/runtime/utils/dex_cache_arrays_layout-inl.h +++ b/runtime/utils/dex_cache_arrays_layout-inl.h @@ -22,10 +22,10 @@ #include <android-base/logging.h> #include "base/bit_utils.h" -#include "base/globals.h" #include "dex/primitive.h" #include "gc_root.h" #include "mirror/dex_cache.h" +#include "runtime_globals.h" namespace art { diff --git a/runtime/verifier/method_verifier.cc b/runtime/verifier/method_verifier.cc index 167982124c..91eba2149b 100644 --- a/runtime/verifier/method_verifier.cc +++ b/runtime/verifier/method_verifier.cc @@ -2654,6 +2654,7 @@ bool MethodVerifier::CodeFlowVerifyInstruction(uint32_t* start_guess) { // See if instance-of was preceded by a move-object operation, common due to the small // register encoding space of instance-of, and propagate type information to the source // of the move-object. + // Note: this is only valid if the move source was not clobbered. uint32_t move_idx = instance_of_idx - 1; while (0 != move_idx && !GetInstructionFlags(move_idx).IsOpcode()) { move_idx--; @@ -2663,28 +2664,25 @@ bool MethodVerifier::CodeFlowVerifyInstruction(uint32_t* start_guess) { work_insn_idx_)) { break; } + auto maybe_update_fn = [&instance_of_inst, update_line, this, &cast_type]( + uint16_t move_src, + uint16_t move_trg) + REQUIRES_SHARED(Locks::mutator_lock_) { + if (move_trg == instance_of_inst.VRegB_22c() && + move_src != instance_of_inst.VRegA_22c()) { + update_line->SetRegisterType<LockOp::kKeep>(this, move_src, cast_type); + } + }; const Instruction& move_inst = code_item_accessor_.InstructionAt(move_idx); switch (move_inst.Opcode()) { case Instruction::MOVE_OBJECT: - if (move_inst.VRegA_12x() == instance_of_inst.VRegB_22c()) { - update_line->SetRegisterType<LockOp::kKeep>(this, - move_inst.VRegB_12x(), - cast_type); - } + maybe_update_fn(move_inst.VRegB_12x(), move_inst.VRegA_12x()); break; case Instruction::MOVE_OBJECT_FROM16: - if (move_inst.VRegA_22x() == instance_of_inst.VRegB_22c()) { - update_line->SetRegisterType<LockOp::kKeep>(this, - move_inst.VRegB_22x(), - cast_type); - } + maybe_update_fn(move_inst.VRegB_22x(), move_inst.VRegA_22x()); break; case Instruction::MOVE_OBJECT_16: - if (move_inst.VRegA_32x() == instance_of_inst.VRegB_22c()) { - update_line->SetRegisterType<LockOp::kKeep>(this, - move_inst.VRegB_32x(), - cast_type); - } + maybe_update_fn(move_inst.VRegB_32x(), move_inst.VRegA_32x()); break; default: break; diff --git a/runtime/verify_object.cc b/runtime/verify_object.cc index 70ca13f913..2b8c7da76b 100644 --- a/runtime/verify_object.cc +++ b/runtime/verify_object.cc @@ -17,11 +17,11 @@ #include "verify_object-inl.h" #include "base/bit_utils.h" -#include "base/globals.h" #include "gc/heap.h" #include "mirror/object-inl.h" #include "obj_ptr-inl.h" #include "runtime.h" +#include "runtime_globals.h" namespace art { diff --git a/test/689-multi-catch/expected.txt b/test/689-multi-catch/expected.txt new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/test/689-multi-catch/expected.txt diff --git a/test/689-multi-catch/info.txt b/test/689-multi-catch/info.txt new file mode 100644 index 0000000000..0778ea83c0 --- /dev/null +++ b/test/689-multi-catch/info.txt @@ -0,0 +1,2 @@ +Regression test for the optimizing compiler which used +to wrongly type an exception in a multi-catch handler. diff --git a/test/689-multi-catch/src/Main.java b/test/689-multi-catch/src/Main.java new file mode 100644 index 0000000000..18a17f9e2e --- /dev/null +++ b/test/689-multi-catch/src/Main.java @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2019 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. + */ + +public class Main { + public static void main(String[] args) { + try { + willThrow(); + } catch (IllegalStateException | NullPointerException e) { + if (e instanceof NullPointerException) { + return; + } + throw new Error("Expected NullPointerException"); + } + } + + public static void willThrow() { + throw new NullPointerException(); + } +} diff --git a/test/800-smali/expected.txt b/test/800-smali/expected.txt index f3c3f03a9a..291de725b3 100644 --- a/test/800-smali/expected.txt +++ b/test/800-smali/expected.txt @@ -73,4 +73,5 @@ b/29778499 (2) b/30458218 b/31313170 ConstClassAliasing +b/121191566 Done! diff --git a/test/800-smali/smali/b_121191566.smali b/test/800-smali/smali/b_121191566.smali new file mode 100644 index 0000000000..bcf9ef5036 --- /dev/null +++ b/test/800-smali/smali/b_121191566.smali @@ -0,0 +1,26 @@ +.class public LB121191566; +.super Ljava/lang/Object; + + +.method public constructor <init>()V +.registers 1 + invoke-direct {p0}, Ljava/lang/Object;-><init>()V + return-void +.end method + +.method public static run(Ljava/lang/Object;)Z +.registers 5 + move-object v3, v4 + instance-of v4, v3, Ljava/lang/String; + if-eqz v4, :Branch + # The peephole must not overwrite v4 (from the move-object). Use an integral move + # to check. + move v0, v4 + goto :End +:Branch + # See above. + move v0, v4 +:End + # Triple-check: the merge should be consistent. + return v0 +.end method diff --git a/test/800-smali/src/Main.java b/test/800-smali/src/Main.java index 9b06e9edda..d7979e1d30 100644 --- a/test/800-smali/src/Main.java +++ b/test/800-smali/src/Main.java @@ -193,6 +193,8 @@ public class Main { testCases.add(new TestCase("b/31313170", "B31313170", "run", null, null, 0)); testCases.add(new TestCase("ConstClassAliasing", "ConstClassAliasing", "run", null, null, null, true)); + testCases.add(new TestCase("b/121191566", "B121191566", "run", new Object[] { "a" }, null, + true, false)); } public void runTests() { @@ -222,6 +222,8 @@ function run_dex2oat() { # -Xcompiler-options arguments are stored in DEX2OAT_FLAGS array # -cp argument is split by ':' and stored in DEX2OAT_CLASSPATH # -Ximage argument is stored in DEX2OAT_BOOT_IMAGE +# -Xbootclasspath argument is stored in DEX2OAT_BCP +# -Xbootclasspath-locations argument is stored in DEX2OAT_BCP_LOCS function extract_dex2oat_flags() { while [ $# -gt 0 ]; do case $1 in @@ -234,6 +236,16 @@ function extract_dex2oat_flags() { # Remove '-Ximage:' from the argument. DEX2OAT_BOOT_IMAGE=${DEX2OAT_BOOT_IMAGE##-Ximage:} ;; + -Xbootclasspath:*) + DEX2OAT_BCP=$1 + # Remove '-Xbootclasspath:' from the argument. + DEX2OAT_BCP=${DEX2OAT_BCP##-Xbootclasspath:} + ;; + -Xbootclasspath-locations:*) + DEX2OAT_BCP_LOCS=$1 + # Remove '-Xbootclasspath-locations:' from the argument. + DEX2OAT_BCP_LOCS=${DEX2OAT_BCP_LOCS##-Xbootclasspath-locations:} + ;; -cp) # Reset any previously parsed classpath, just like dalvikvm # only supports one -cp argument. @@ -386,7 +398,7 @@ while [ -h "$PROG_NAME" ]; do done PROG_DIR="$(cd "${PROG_NAME%/*}" ; pwd -P)" -ANDROID_ROOT=$PROG_DIR/.. +ANDROID_ROOT="$(cd $PROG_DIR/..; pwd -P)" ANDROID_RUNTIME_ROOT=$ANDROID_ROOT/com.android.runtime ART_BINARY_PATH=$ANDROID_ROOT/bin/$ART_BINARY @@ -439,6 +451,55 @@ if [ "$ANDROID_DATA" = "/data" ] || [ "$ANDROID_DATA" = "" ]; then DELETE_ANDROID_DATA="yes" fi +if [[ "$DEX2OAT_BCP" = "" && "$DEX2OAT_BCP_LOCS" != "" ]]; then + echo "Cannot use -Xbootclasspath-locations without -Xbootclasspath" + exit 1 +fi + +if [[ "$DEX2OAT_BOOT_IMAGE" = *core.art && "$DEX2OAT_BCP" = "" ]]; then + # Note: This must start with the CORE_IMG_JARS in Android.common_path.mk + # because that's what we use for compiling the core.art image. + # It may contain additional modules from TEST_CORE_JARS. + core_jars_list="core-oj core-libart core-simple okhttp bouncycastle apache-xml conscrypt" + core_jars_suffix= + if [[ -e $ANDROID_ROOT/framework/core-oj-hostdex.jar ]]; then + core_jars_suffix=-hostdex + core_locations_dir=$ANDROID_ROOT/framework + prefix=$PWD/ + if [[ ${core_locations_dir:0:${#prefix}} = $prefix ]]; then + core_locations_dir="${core_locations_dir##$prefix}" + fi + elif [[ -e $ANDROID_ROOT/framework/core-oj-testdex.jar ]]; then + core_jars_suffix=-testdex + core_locations_dir=/system/framework + fi + if [[ $core_jars_suffix != "" ]]; then + boot_separator="" + for boot_module in ${core_jars_list}; do + DEX_FILENAME="$boot_module$core_jars_suffix.jar" + DEX2OAT_BCP+="$boot_separator$ANDROID_ROOT/framework/${DEX_FILENAME}" + DEX2OAT_BCP_LOCS+="$boot_separator$core_locations_dir/${DEX_FILENAME}" + boot_separator=":" + done + if [ "$VERBOSE" = "yes" ]; then + echo "Using predefined -Xbootclasspath for image $DEX2OAT_BOOT_IMAGE:" + echo DEX2OAT_BOOT_IMAGE=$DEX2OAT_BOOT_IMAGE + echo DEX2OAT_BCP=$DEX2OAT_BCP + echo DEX2OAT_BCP_LOCS=$DEX2OAT_BCP_LOCS + fi + fi +fi + +if [ "$DEX2OAT_BCP" != "" ]; then + EXTRA_OPTIONS+=("-Xbootclasspath:$DEX2OAT_BCP") + DEX2OAT_FLAGS+=("--runtime-arg" "-Xbootclasspath:$DEX2OAT_BCP") + if [ "$DEX2OAT_BCP_LOCS" != "" ]; then + EXTRA_OPTIONS+=("-Xbootclasspath-locations:$DEX2OAT_BCP_LOCS") + DEX2OAT_FLAGS+=("--runtime-arg" \ + "-Xbootclasspath-locations:$DEX2OAT_BCP_LOCS") + fi +fi + if [ "$PERF" != "" ]; then LAUNCH_WRAPPER="perf record -g --call-graph dwarf -F 10000 -o $ANDROID_DATA/perf.data -e cycles:u $LAUNCH_WRAPPER" DEX2OAT_FLAGS+=(--generate-debug-info) diff --git a/tools/cpp-define-generator/globals.def b/tools/cpp-define-generator/globals.def index 6443a0c517..10542622ac 100644 --- a/tools/cpp-define-generator/globals.def +++ b/tools/cpp-define-generator/globals.def @@ -26,6 +26,7 @@ #include "jit/jit.h" #include "mirror/object.h" #include "mirror/object_reference.h" +#include "runtime_globals.h" #include "stack.h" #endif diff --git a/tools/hiddenapi/hiddenapi.cc b/tools/hiddenapi/hiddenapi.cc index 6af822d6b6..86e5f543a0 100644 --- a/tools/hiddenapi/hiddenapi.cc +++ b/tools/hiddenapi/hiddenapi.cc @@ -34,6 +34,8 @@ namespace art { +const char kErrorHelp[] = "\nSee go/hiddenapi-error for help."; + static int original_argc; static char** original_argv; @@ -983,16 +985,27 @@ class HiddenApi final { std::map<std::string, hiddenapi::ApiList> api_flag_map; - for (std::string line; std::getline(api_file, line);) { + int line_number = 1; + for (std::string line; std::getline(api_file, line); line_number++) { std::vector<std::string> values = android::base::Split(line, ","); - CHECK_EQ(values.size(), 2u) << "Currently only signature and one flag are supported"; - + CHECK_GT(values.size(), 1u) << path << ":" << line_number << ": No flags found" + << kErrorHelp; const std::string& signature = values[0]; - CHECK(api_flag_map.find(signature) == api_flag_map.end()) << "Duplicate entry: " << signature; + + CHECK(api_flag_map.find(signature) == api_flag_map.end()) << "Duplicate entry in " << path + << ": " << signature << kErrorHelp; + + int numFlags = values.size() - 1; + + CHECK_EQ(numFlags, 1) << "\n" << path << ":" << line_number << "\n" + << signature << ": Expected one flag, found " << numFlags << ":\n" + << ::android::base::Join(std::vector<std::string>(values.begin() + 1, values.end()), ",") + << kErrorHelp; const std::string& flag_str = values[1]; hiddenapi::ApiList membership = hiddenapi::ApiList::FromName(flag_str); - CHECK(membership.IsValid()) << "Unknown ApiList name: " << flag_str; + CHECK(membership.IsValid()) << path << ":" << line_number << ": Unknown ApiList name: " + << flag_str << kErrorHelp; api_flag_map.emplace(signature, membership); } diff --git a/tools/run-jdwp-tests.sh b/tools/run-jdwp-tests.sh index c7503bbd1b..ac9f09aa2d 100755 --- a/tools/run-jdwp-tests.sh +++ b/tools/run-jdwp-tests.sh @@ -125,6 +125,11 @@ while true; do # Vogar knows which VM to use on host. vm_command="" shift + elif [[ "$1" == "--mode=device" ]]; then + # Remove the --mode=device from the arguments and replace it with --mode=device_testdex + args=${args/$1} + args="$args --mode=device_testdex" + shift elif [[ "$1" == "--mode=jvm" ]]; then mode="ri" make_target_name="apache-harmony-jdwp-tests-host" diff --git a/tools/run-libcore-tests.sh b/tools/run-libcore-tests.sh index 68c4fd8563..ea7464ffed 100755 --- a/tools/run-libcore-tests.sh +++ b/tools/run-libcore-tests.sh @@ -125,6 +125,9 @@ device_mode=false while true; do if [[ "$1" == "--mode=device" ]]; then device_mode=true + # Remove the --mode=device from the arguments and replace it with --mode=device_testdex + vogar_args=${vogar_args/$1} + vogar_args="$vogar_args --mode=device_testdex" vogar_args="$vogar_args --vm-arg -Ximage:/data/art-test/core.art" vogar_args="$vogar_args $(boot_classpath_arg /system/framework -testdex $BOOT_CLASSPATH_JARS)" shift |