diff options
-rw-r--r-- | build/Android.gtest.mk | 6 | ||||
-rw-r--r-- | cmdline/cmdline_types.h | 10 | ||||
-rw-r--r-- | cmdline/detail/cmdline_parse_argument_detail.h | 8 | ||||
-rw-r--r-- | compiler/utils/arm/assembler_arm.h | 6 | ||||
-rw-r--r-- | runtime/base/bit_utils.h | 7 | ||||
-rw-r--r-- | runtime/base/stl_util.h | 17 | ||||
-rw-r--r-- | runtime/base/variant_map.h | 9 | ||||
-rw-r--r-- | runtime/parsed_options.cc | 17 | ||||
-rw-r--r-- | runtime/parsed_options.h | 10 | ||||
-rw-r--r-- | runtime/parsed_options_test.cc | 8 | ||||
-rw-r--r-- | runtime/runtime.cc | 34 | ||||
-rw-r--r-- | runtime/runtime.h | 14 | ||||
-rw-r--r-- | runtime/runtime_options.h | 7 |
13 files changed, 98 insertions, 55 deletions
diff --git a/build/Android.gtest.mk b/build/Android.gtest.mk index a17da3421f..291a69de10 100644 --- a/build/Android.gtest.mk +++ b/build/Android.gtest.mk @@ -382,7 +382,7 @@ LOCAL_MODULE := libart-gtest LOCAL_MODULE_TAGS := optional LOCAL_CPP_EXTENSION := cc LOCAL_SRC_FILES := runtime/common_runtime_test.cc compiler/common_compiler_test.cc -LOCAL_C_INCLUDES := $(ART_C_INCLUDES) art/runtime art/compiler +LOCAL_C_INCLUDES := $(ART_C_INCLUDES) art/runtime art/cmdline art/compiler LOCAL_SHARED_LIBRARIES := libartd libartd-compiler libdl LOCAL_STATIC_LIBRARIES += libgtest LOCAL_ADDITIONAL_DEPENDENCIES := art/build/Android.common_build.mk @@ -399,7 +399,7 @@ LOCAL_CPP_EXTENSION := cc LOCAL_CFLAGS := $(ART_HOST_CFLAGS) LOCAL_ASFLAGS := $(ART_HOST_ASFLAGS) LOCAL_SRC_FILES := runtime/common_runtime_test.cc compiler/common_compiler_test.cc -LOCAL_C_INCLUDES := $(ART_C_INCLUDES) art/runtime art/compiler +LOCAL_C_INCLUDES := $(ART_C_INCLUDES) art/runtime art/cmdline art/compiler LOCAL_SHARED_LIBRARIES := libartd libartd-compiler LOCAL_STATIC_LIBRARIES := libgtest_host LOCAL_LDLIBS += -ldl -lpthread @@ -542,7 +542,7 @@ define define-art-gtest endif LOCAL_CPP_EXTENSION := $$(ART_CPP_EXTENSION) LOCAL_SRC_FILES := $$(art_gtest_filename) - LOCAL_C_INCLUDES += $$(ART_C_INCLUDES) art/runtime $$(art_gtest_extra_c_includes) + LOCAL_C_INCLUDES += $$(ART_C_INCLUDES) art/runtime art/cmdline $$(art_gtest_extra_c_includes) LOCAL_SHARED_LIBRARIES += libartd $$(art_gtest_extra_shared_libraries) libart-gtest libartd-disassembler LOCAL_WHOLE_STATIC_LIBRARIES += libsigchain diff --git a/cmdline/cmdline_types.h b/cmdline/cmdline_types.h index c594adbc94..47519894eb 100644 --- a/cmdline/cmdline_types.h +++ b/cmdline/cmdline_types.h @@ -18,17 +18,17 @@ #define CMDLINE_NDEBUG 1 // Do not output any debugging information for parsing. -#include "cmdline/memory_representation.h" -#include "cmdline/detail/cmdline_debug_detail.h" +#include "memory_representation.h" +#include "detail/cmdline_debug_detail.h" #include "cmdline_type_parser.h" // Includes for the types that are being specialized #include <string> #include "unit.h" #include "jdwp/jdwp.h" -#include "runtime/base/logging.h" -#include "runtime/base/time_utils.h" -#include "runtime/experimental_flags.h" +#include "base/logging.h" +#include "base/time_utils.h" +#include "experimental_flags.h" #include "gc/collector_type.h" #include "gc/space/large_object_space.h" #include "profiler_options.h" diff --git a/cmdline/detail/cmdline_parse_argument_detail.h b/cmdline/detail/cmdline_parse_argument_detail.h index 3009b32162..4b56804ea6 100644 --- a/cmdline/detail/cmdline_parse_argument_detail.h +++ b/cmdline/detail/cmdline_parse_argument_detail.h @@ -25,10 +25,10 @@ #include <numeric> #include <memory> -#include "cmdline/cmdline_parse_result.h" -#include "cmdline/token_range.h" -#include "cmdline/unit.h" -#include "cmdline/cmdline_types.h" +#include "cmdline_parse_result.h" +#include "cmdline_types.h" +#include "token_range.h" +#include "unit.h" namespace art { // Implementation details for the parser. Do not look inside if you hate templates. diff --git a/compiler/utils/arm/assembler_arm.h b/compiler/utils/arm/assembler_arm.h index 4a6e6d7c3f..98a1a8f9a1 100644 --- a/compiler/utils/arm/assembler_arm.h +++ b/compiler/utils/arm/assembler_arm.h @@ -22,6 +22,7 @@ #include "base/bit_utils.h" #include "base/logging.h" +#include "base/stl_util.h" #include "base/value_object.h" #include "constants_arm.h" #include "utils/arm/managed_register_arm.h" @@ -697,10 +698,9 @@ class ArmAssembler : public Assembler { // Most of these are pure virtual as they need to be implemented per instruction set. // Create a new literal with a given value. - // NOTE: Force the template parameter to be explicitly specified. In the absence of - // std::omit_from_type_deduction<T> or std::identity<T>, use std::decay<T>. + // NOTE: Force the template parameter to be explicitly specified. template <typename T> - Literal* NewLiteral(typename std::decay<T>::type value) { + Literal* NewLiteral(typename Identity<T>::type value) { static_assert(std::is_integral<T>::value, "T must be an integral type."); return NewLiteral(sizeof(value), reinterpret_cast<const uint8_t*>(&value)); } diff --git a/runtime/base/bit_utils.h b/runtime/base/bit_utils.h index d6a44f7293..8430d68d0e 100644 --- a/runtime/base/bit_utils.h +++ b/runtime/base/bit_utils.h @@ -23,6 +23,7 @@ #include "base/logging.h" #include "base/iteration_range.h" +#include "base/stl_util.h" namespace art { @@ -108,12 +109,12 @@ static inline int WhichPowerOf2(T x) { } // For rounding integers. -// NOTE: In the absence of std::omit_from_type_deduction<T> or std::identity<T>, use std::decay<T>. +// Note: Omit the `n` from T type deduction, deduce only from the `x` argument. template<typename T> -static constexpr T RoundDown(T x, typename std::decay<T>::type n) WARN_UNUSED; +static constexpr T RoundDown(T x, typename Identity<T>::type n) WARN_UNUSED; template<typename T> -static constexpr T RoundDown(T x, typename std::decay<T>::type n) { +static constexpr T RoundDown(T x, typename Identity<T>::type n) { return DCHECK_CONSTEXPR(IsPowerOfTwo(n), , T(0)) (x & -n); diff --git a/runtime/base/stl_util.h b/runtime/base/stl_util.h index 324ab218d2..ad03c319d9 100644 --- a/runtime/base/stl_util.h +++ b/runtime/base/stl_util.h @@ -156,6 +156,23 @@ struct CStringLess { } }; +// Use to suppress type deduction for a function argument. +// See std::identity<> for more background: +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1856.html#20.2.2 - move/forward helpers +// +// e.g. "template <typename X> void bar(identity<X>::type foo); +// bar(5); // compilation error +// bar<int>(5); // ok +// or "template <typename T> void foo(T* x, typename Identity<T*>::type y); +// Base b; +// Derived d; +// foo(&b, &d); // Use implicit Derived* -> Base* conversion. +// If T was deduced from both &b and &d, there would be a mismatch, i.e. deduction failure. +template <typename T> +struct Identity { + using type = T; +}; + } // namespace art #endif // ART_RUNTIME_BASE_STL_UTIL_H_ diff --git a/runtime/base/variant_map.h b/runtime/base/variant_map.h index 82e5d2e21b..531cb37355 100644 --- a/runtime/base/variant_map.h +++ b/runtime/base/variant_map.h @@ -19,8 +19,11 @@ #include <memory.h> #include <map> +#include <type_traits> #include <utility> +#include "base/stl_util.h" + namespace art { // @@ -268,8 +271,9 @@ struct VariantMap { } // Set a value for a given key, overwriting the previous value if any. + // Note: Omit the `value` from TValue type deduction, deduce only from the `key` argument. template <typename TValue> - void Set(const TKey<TValue>& key, const TValue& value) { + void Set(const TKey<TValue>& key, const typename Identity<TValue>::type& value) { // Clone the value first, to protect against &value == GetValuePtr(key). auto* new_value = new TValue(value); @@ -279,8 +283,9 @@ struct VariantMap { // Set a value for a given key, only if there was no previous value before. // Returns true if the value was set, false if a previous value existed. + // Note: Omit the `value` from TValue type deduction, deduce only from the `key` argument. template <typename TValue> - bool SetIfMissing(const TKey<TValue>& key, const TValue& value) { + bool SetIfMissing(const TKey<TValue>& key, const typename Identity<TValue>::type& value) { TValue* ptr = Get(key); if (ptr == nullptr) { Set(key, value); diff --git a/runtime/parsed_options.cc b/runtime/parsed_options.cc index 7f4519c8f2..5b1061087d 100644 --- a/runtime/parsed_options.cc +++ b/runtime/parsed_options.cc @@ -41,15 +41,13 @@ ParsedOptions::ParsedOptions() // Runtime::Abort } -ParsedOptions* ParsedOptions::Create(const RuntimeOptions& options, bool ignore_unrecognized, - RuntimeArgumentMap* runtime_options) { +bool ParsedOptions::Parse(const RuntimeOptions& options, + bool ignore_unrecognized, + RuntimeArgumentMap* runtime_options) { CHECK(runtime_options != nullptr); - std::unique_ptr<ParsedOptions> parsed(new ParsedOptions()); - if (parsed->Parse(options, ignore_unrecognized, runtime_options)) { - return parsed.release(); - } - return nullptr; + ParsedOptions parser; + return parser.DoParse(options, ignore_unrecognized, runtime_options); } using RuntimeParser = CmdlineParser<RuntimeArgumentMap, RuntimeArgumentMap::Key>; @@ -407,8 +405,9 @@ static void MaybeOverrideVerbosity() { // gLogVerbosity.verifier = true; // TODO: don't check this in! } -bool ParsedOptions::Parse(const RuntimeOptions& options, bool ignore_unrecognized, - RuntimeArgumentMap* runtime_options) { +bool ParsedOptions::DoParse(const RuntimeOptions& options, + bool ignore_unrecognized, + RuntimeArgumentMap* runtime_options) { for (size_t i = 0; i < options.size(); ++i) { if (true && options[0].first == "-Xzygote") { LOG(INFO) << "option[" << i << "]=" << options[i].first; diff --git a/runtime/parsed_options.h b/runtime/parsed_options.h index 529dd5ce1c..5974fb6a6e 100644 --- a/runtime/parsed_options.h +++ b/runtime/parsed_options.h @@ -50,8 +50,9 @@ class ParsedOptions { static std::unique_ptr<RuntimeParser> MakeParser(bool ignore_unrecognized); // returns true if parsing succeeds, and stores the resulting options into runtime_options - static ParsedOptions* Create(const RuntimeOptions& options, bool ignore_unrecognized, - RuntimeArgumentMap* runtime_options); + static bool Parse(const RuntimeOptions& options, + bool ignore_unrecognized, + RuntimeArgumentMap* runtime_options); bool (*hook_is_sensitive_thread_)(); jint (*hook_vfprintf_)(FILE* stream, const char* format, va_list ap); @@ -72,8 +73,9 @@ class ParsedOptions { void Exit(int status); void Abort(); - bool Parse(const RuntimeOptions& options, bool ignore_unrecognized, - RuntimeArgumentMap* runtime_options); + bool DoParse(const RuntimeOptions& options, + bool ignore_unrecognized, + RuntimeArgumentMap* runtime_options); }; } // namespace art diff --git a/runtime/parsed_options_test.cc b/runtime/parsed_options_test.cc index a8575de425..fad00c73d8 100644 --- a/runtime/parsed_options_test.cc +++ b/runtime/parsed_options_test.cc @@ -60,8 +60,8 @@ TEST_F(ParsedOptionsTest, ParsedOptions) { options.push_back(std::make_pair("exit", test_exit)); RuntimeArgumentMap map; - std::unique_ptr<ParsedOptions> parsed(ParsedOptions::Create(options, false, &map)); - ASSERT_TRUE(parsed.get() != nullptr); + bool parsed = ParsedOptions::Parse(options, false, &map); + ASSERT_TRUE(parsed); ASSERT_NE(0u, map.Size()); using Opt = RuntimeArgumentMap; @@ -102,8 +102,8 @@ TEST_F(ParsedOptionsTest, ParsedOptionsGc) { options.push_back(std::make_pair("-Xgc:MC", nullptr)); RuntimeArgumentMap map; - std::unique_ptr<ParsedOptions> parsed(ParsedOptions::Create(options, false, &map)); - ASSERT_TRUE(parsed.get() != nullptr); + bool parsed = ParsedOptions::Parse(options, false, &map); + ASSERT_TRUE(parsed); ASSERT_NE(0u, map.Size()); using Opt = RuntimeArgumentMap; diff --git a/runtime/runtime.cc b/runtime/runtime.cc index fe8eb0d78d..dedc110b00 100644 --- a/runtime/runtime.cc +++ b/runtime/runtime.cc @@ -434,14 +434,25 @@ void Runtime::SweepSystemWeaks(IsMarkedVisitor* visitor) { GetLambdaBoxTable()->SweepWeakBoxedLambdas(visitor); } -bool Runtime::Create(const RuntimeOptions& options, bool ignore_unrecognized) { +bool Runtime::ParseOptions(const RuntimeOptions& raw_options, + bool ignore_unrecognized, + RuntimeArgumentMap* runtime_options) { + InitLogging(/* argv */ nullptr); // Calls Locks::Init() as a side effect. + bool parsed = ParsedOptions::Parse(raw_options, ignore_unrecognized, runtime_options); + if (!parsed) { + LOG(ERROR) << "Failed to parse options"; + return false; + } + return true; +} + +bool Runtime::Create(RuntimeArgumentMap&& runtime_options) { // TODO: acquire a static mutex on Runtime to avoid racing. if (Runtime::instance_ != nullptr) { return false; } - InitLogging(nullptr); // Calls Locks::Init() as a side effect. instance_ = new Runtime; - if (!instance_->Init(options, ignore_unrecognized)) { + if (!instance_->Init(std::move(runtime_options))) { // TODO: Currently deleting the instance will abort the runtime on destruction. Now This will // leak memory, instead. Fix the destructor. b/19100793. // delete instance_; @@ -451,6 +462,12 @@ bool Runtime::Create(const RuntimeOptions& options, bool ignore_unrecognized) { return true; } +bool Runtime::Create(const RuntimeOptions& raw_options, bool ignore_unrecognized) { + RuntimeArgumentMap runtime_options; + return ParseOptions(raw_options, ignore_unrecognized, &runtime_options) && + Create(std::move(runtime_options)); +} + static jobject CreateSystemClassLoader(Runtime* runtime) { if (runtime->IsAotCompiler() && !runtime->GetCompilerCallbacks()->IsBootImage()) { return nullptr; @@ -829,21 +846,14 @@ void Runtime::SetSentinel(mirror::Object* sentinel) { sentinel_ = GcRoot<mirror::Object>(sentinel); } -bool Runtime::Init(const RuntimeOptions& raw_options, bool ignore_unrecognized) { +bool Runtime::Init(RuntimeArgumentMap&& runtime_options_in) { + RuntimeArgumentMap runtime_options(std::move(runtime_options_in)); ATRACE_BEGIN("Runtime::Init"); CHECK_EQ(sysconf(_SC_PAGE_SIZE), kPageSize); MemMap::Init(); using Opt = RuntimeArgumentMap; - RuntimeArgumentMap runtime_options; - std::unique_ptr<ParsedOptions> parsed_options( - ParsedOptions::Create(raw_options, ignore_unrecognized, &runtime_options)); - if (parsed_options.get() == nullptr) { - LOG(ERROR) << "Failed to parse options"; - ATRACE_END(); - return false; - } VLOG(startup) << "Runtime::Init -verbose:startup enabled"; QuasiAtomic::Startup(); diff --git a/runtime/runtime.h b/runtime/runtime.h index bd3641405d..93d8fcfa46 100644 --- a/runtime/runtime.h +++ b/runtime/runtime.h @@ -84,6 +84,7 @@ class MonitorList; class MonitorPool; class NullPointerHandler; class OatFileManager; +struct RuntimeArgumentMap; class SignalCatcher; class StackOverflowHandler; class SuspensionHandler; @@ -112,8 +113,17 @@ enum VisitRootFlags : uint8_t { class Runtime { public: + // Parse raw runtime options. + static bool ParseOptions(const RuntimeOptions& raw_options, + bool ignore_unrecognized, + RuntimeArgumentMap* runtime_options); + + // Creates and initializes a new runtime. + static bool Create(RuntimeArgumentMap&& runtime_options) + SHARED_TRYLOCK_FUNCTION(true, Locks::mutator_lock_); + // Creates and initializes a new runtime. - static bool Create(const RuntimeOptions& options, bool ignore_unrecognized) + static bool Create(const RuntimeOptions& raw_options, bool ignore_unrecognized) SHARED_TRYLOCK_FUNCTION(true, Locks::mutator_lock_); // IsAotCompiler for compilers that don't have a running runtime. Only dex2oat currently. @@ -599,7 +609,7 @@ class Runtime { void BlockSignals(); - bool Init(const RuntimeOptions& options, bool ignore_unrecognized) + bool Init(RuntimeArgumentMap&& runtime_options) SHARED_TRYLOCK_FUNCTION(true, Locks::mutator_lock_); void InitNativeMethods() REQUIRES(!Locks::mutator_lock_); void InitThreadGroups(Thread* self); diff --git a/runtime/runtime_options.h b/runtime/runtime_options.h index 88ac00a672..4610f6f4a1 100644 --- a/runtime/runtime_options.h +++ b/runtime/runtime_options.h @@ -17,14 +17,13 @@ #ifndef ART_RUNTIME_RUNTIME_OPTIONS_H_ #define ART_RUNTIME_RUNTIME_OPTIONS_H_ -#include "runtime/base/variant_map.h" -#include "cmdline/cmdline_types.h" // TODO: don't need to include this file here +#include "base/variant_map.h" +#include "cmdline_types.h" // TODO: don't need to include this file here // Map keys #include <vector> #include <string> -#include "runtime/base/logging.h" -#include "cmdline/unit.h" +#include "base/logging.h" #include "jdwp/jdwp.h" #include "jit/jit.h" #include "jit/jit_code_cache.h" |