// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. #ifndef RUNTIME_BIN_SNAPSHOT_UTILS_H_ #define RUNTIME_BIN_SNAPSHOT_UTILS_H_ #include "bin/dartutils.h" #include "platform/globals.h" namespace dart { namespace bin { class AppSnapshot { public: virtual ~AppSnapshot() {} virtual void SetBuffers(const uint8_t** vm_data_buffer, const uint8_t** vm_instructions_buffer, const uint8_t** isolate_data_buffer, const uint8_t** isolate_instructions_buffer) = 0; bool IsJIT() const { return magic_number_ == DartUtils::kAppJITMagicNumber; } bool IsAOT() const { return DartUtils::IsAotMagicNumber(magic_number_); } bool IsJITorAOT() const { return IsJIT() || IsAOT(); } bool IsKernel() const { return magic_number_ == DartUtils::kKernelMagicNumber; } bool IsKernelList() const { return magic_number_ == DartUtils::kKernelListMagicNumber; } protected: explicit AppSnapshot(DartUtils::MagicNumber num) : magic_number_(num) {} private: DartUtils::MagicNumber magic_number_; DISALLOW_COPY_AND_ASSIGN(AppSnapshot); }; class Snapshot { public: static void GenerateKernel(const char* snapshot_filename, const char* script_name, const char* package_config); static void GenerateAppJIT(const char* snapshot_filename); static void GenerateAppAOTAsAssembly(const char* snapshot_filename); #if defined(DART_TARGET_OS_MACOS) static bool IsMachOFormattedBinary(const char* container_path); #endif #if defined(DART_TARGET_OS_WINDOWS) static bool IsPEFormattedBinary(const char* container_path); #endif static AppSnapshot* TryReadAppendedAppSnapshotElf(const char* container_path); static AppSnapshot* TryReadAppSnapshot( const char* script_uri, bool force_load_elf_from_memory = false, bool decode_uri = true); static void WriteAppSnapshot(const char* filename, uint8_t* isolate_data_buffer, intptr_t isolate_data_size, uint8_t* isolate_instructions_buffer, intptr_t isolate_instructions_size); private: #if defined(DART_TARGET_OS_MACOS) static AppSnapshot* TryReadAppendedAppSnapshotElfFromMachO( const char* container_path); #endif #if defined(DART_TARGET_OS_WINDOWS) static AppSnapshot* TryReadAppendedAppSnapshotElfFromPE( const char* container_path); #endif DISALLOW_ALLOCATION(); DISALLOW_IMPLICIT_CONSTRUCTORS(Snapshot); }; } // namespace bin } // namespace dart #endif // RUNTIME_BIN_SNAPSHOT_UTILS_H_