diff options
Diffstat (limited to 'runtime/oat/oat_file_assistant.h')
| -rw-r--r-- | runtime/oat/oat_file_assistant.h | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/runtime/oat/oat_file_assistant.h b/runtime/oat/oat_file_assistant.h index 4526843756..85021bea33 100644 --- a/runtime/oat/oat_file_assistant.h +++ b/runtime/oat/oat_file_assistant.h @@ -23,6 +23,7 @@ #include <sstream> #include <string> #include <string_view> +#include <utility> #include <variant> #include "arch/instruction_set.h" @@ -356,10 +357,11 @@ class OatFileAssistant { // anonymous dex file(s) created by AnonymousDexVdexLocation. EXPORT static bool IsAnonymousVdexBasename(const std::string& basename); - bool ClassLoaderContextIsOkay(const OatFile& oat_file) const; + bool ClassLoaderContextIsOkay(const OatFile& oat_file, /*out*/ std::string* error_msg) const; // Validates the boot class path checksum of an OatFile. - EXPORT bool ValidateBootClassPathChecksums(const OatFile& oat_file); + EXPORT bool ValidateBootClassPathChecksums(const OatFile& oat_file, + /*out*/ std::string* error_msg); // Validates the given bootclasspath and bootclasspath checksums found in an oat header. static bool ValidateBootClassPathChecksums(OatFileAssistantContext* ofa_context, @@ -393,7 +395,8 @@ class OatFileAssistant { bool IsUseable(); // Returns the status of this oat file. - OatStatus Status(); + // Optionally, returns `error_msg` showing why the status is not `kOatUpToDate`. + OatStatus Status(/*out*/ std::string* error_msg = nullptr); // Return the DexOptNeeded value for this oat file with respect to the given target compilation // filter and dexopt trigger. @@ -406,7 +409,8 @@ class OatFileAssistant { // Returns the loaded file. // Loads the file if needed. Returns null if the file failed to load. // The caller shouldn't clean up or free the returned pointer. - const OatFile* GetFile(); + // Optionally, returns `error_msg` showing why the file failed to load. + const OatFile* GetFile(/*out*/ std::string* error_msg = nullptr); // Returns true if the file is opened executable. bool IsExecutable(); @@ -439,6 +443,8 @@ class OatFileAssistant { bool CheckDisableCompactDex(); private: + std::unique_ptr<OatFile> LoadFile(std::string* error_msg) const; + // Returns true if the oat file is usable but at least one dexopt trigger is matched. This // function should only be called if the oat file is usable. bool ShouldRecompileForFilter(CompilerFilter::Filter target, @@ -463,11 +469,13 @@ class OatFileAssistant { int vdex_fd_ = -1; bool use_fd_ = false; - bool load_attempted_ = false; - std::unique_ptr<OatFile> file_; + // A pair of the loaded file and the error message, if `GetFile` has been attempted. + // `std::nullopt` if `GetFile` has not been attempted. + std::optional<std::pair<std::unique_ptr<OatFile>, std::string>> file_ = std::nullopt; - bool status_attempted_ = false; - OatStatus status_ = OatStatus::kOatCannotOpen; + // A pair of the oat status and the error message, if `Status` has been attempted. + // `std::nullopt` if `Status` has not been attempted. + std::optional<std::pair<OatStatus, std::string>> status_ = std::nullopt; // For debugging only. // If this flag is set, the file has been released to the user and the @@ -491,7 +499,7 @@ class OatFileAssistant { // Return the status for a given opened oat file with respect to the dex // location. - OatStatus GivenOatFileStatus(const OatFile& file); + OatStatus GivenOatFileStatus(const OatFile& file, /*out*/ std::string* error_msg); // Gets the dex checksum required for an up-to-date oat file. // Returns cached result from GetMultiDexChecksum. |