|  | // Copyright 2013 The Flutter Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef FLUTTER_TESTING_ELF_LOADER_H_ | 
|  | #define FLUTTER_TESTING_ELF_LOADER_H_ | 
|  |  | 
|  | #include <memory> | 
|  |  | 
|  | #include "flutter/common/settings.h" | 
|  | #include "flutter/fml/macros.h" | 
|  | #include "third_party/dart/runtime/bin/elf_loader.h" | 
|  |  | 
|  | namespace flutter { | 
|  | namespace testing { | 
|  |  | 
|  | inline constexpr const char* kDefaultAOTAppELFFileName = "app_elf_snapshot.so"; | 
|  |  | 
|  | // This file name is what gen_snapshot defaults to. It is based off of the | 
|  | // name of the base file, with the `2` indicating that this split corresponds | 
|  | // to loading unit id of 2. The base module id is 1 and is omitted as it is not | 
|  | // considered a split. If dart changes the naming convention, this should be | 
|  | // changed to match, however, this is considered unlikely to happen. | 
|  | inline constexpr const char* kDefaultAOTAppELFSplitFileName = | 
|  | "app_elf_snapshot.so-2.part.so"; | 
|  |  | 
|  | struct LoadedELFDeleter { | 
|  | void operator()(Dart_LoadedElf* elf) { ::Dart_UnloadELF(elf); } | 
|  | }; | 
|  |  | 
|  | using UniqueLoadedELF = std::unique_ptr<Dart_LoadedElf, LoadedELFDeleter>; | 
|  |  | 
|  | struct ELFAOTSymbols { | 
|  | UniqueLoadedELF loaded_elf; | 
|  | const uint8_t* vm_snapshot_data = nullptr; | 
|  | const uint8_t* vm_snapshot_instrs = nullptr; | 
|  | const uint8_t* vm_isolate_data = nullptr; | 
|  | const uint8_t* vm_isolate_instrs = nullptr; | 
|  | }; | 
|  |  | 
|  | //------------------------------------------------------------------------------ | 
|  | /// @brief      Attempts to resolve AOT symbols from the portable ELF loader. | 
|  | ///             This location is automatically resolved from the fixtures | 
|  | ///             generator. This only returns valid symbols when the VM is | 
|  | ///             configured for AOT. | 
|  | /// | 
|  | /// @param[in]  elf_filename  The AOT ELF filename from the fixtures generator. | 
|  | /// | 
|  | /// @return     The loaded ELF symbols. | 
|  | /// | 
|  | ELFAOTSymbols LoadELFSymbolFromFixturesIfNeccessary(std::string elf_filename); | 
|  |  | 
|  | //------------------------------------------------------------------------------ | 
|  | /// @brief      Attempts to resolve split loading unit AOT symbols from the | 
|  | ///             portable ELF loader. If the dart code does not make use of | 
|  | ///             deferred libraries, then there will be no split .so to load. | 
|  | ///             This only returns valid symbols when the VM is configured for | 
|  | ///             AOT. | 
|  | /// | 
|  | /// @param[in]  elf_split_filename  The split AOT ELF filename from the fixtures | 
|  | /// generator. | 
|  | /// | 
|  | /// @return     The loaded ELF symbols. | 
|  | /// | 
|  | ELFAOTSymbols LoadELFSplitSymbolFromFixturesIfNeccessary( | 
|  | std::string elf_split_filename); | 
|  |  | 
|  | //------------------------------------------------------------------------------ | 
|  | /// @brief      Prepare the settings objects various AOT mappings resolvers with | 
|  | ///             the symbols already loaded. This method does nothing in non-AOT | 
|  | ///             runtime modes. | 
|  | /// | 
|  | /// @warning    The symbols must not be collected till all shell instantiations | 
|  | ///             made using the settings object are collected. | 
|  | /// | 
|  | /// @param[in/out] settings  The settings whose AOT resolvers to populate. | 
|  | /// @param[in]     symbols   The symbols used to populate the settings object. | 
|  | /// | 
|  | /// @return     If the settings object was correctly updated. | 
|  | /// | 
|  | bool PrepareSettingsForAOTWithSymbols(Settings& settings, | 
|  | const ELFAOTSymbols& symbols); | 
|  |  | 
|  | }  // namespace testing | 
|  | }  // namespace flutter | 
|  |  | 
|  | #endif  // FLUTTER_TESTING_ELF_LOADER_H_ |