#ifndef V8_WASM_COMPILATION_ENVIRONMENT_H_
#define V8_WASM_COMPILATION_ENVIRONMENT_H_
#if !V8_ENABLE_WEBASSEMBLY
#error This header should only be included if WebAssembly is enabled.
#endif
#include <memory>
#include <optional>
#include "src/wasm/wasm-features.h"
#include "src/wasm/wasm-limits.h"
#include "src/wasm/wasm-module.h"
#include "src/wasm/wasm-tier.h"
namespace v8 {
class CFunctionInfo;
class JobHandle;
namespace internal {
class Counters;
namespace wasm {
class NativeModule;
struct UnpublishedWasmCode;
class WasmCode;
class WasmEngine;
class WasmError;
class WasmModuleCoverageData;
#if V8_TARGET_ARCH_ARM64 && !V8_OS_MACOS
constexpr bool kPartialOOBWritesAreNoops = false;
#else
constexpr bool kPartialOOBWritesAreNoops = true;
#endif
struct CompilationEnv {
const WasmModule* const module;
const WasmEnabledFeatures enabled_features;
const std::atomic<Address>* fast_api_targets;
std::atomic<const MachineSignature*>* fast_api_signatures;
std::shared_ptr<WasmModuleCoverageData> module_coverage_data;
static inline CompilationEnv ForModule(const NativeModule* native_module);
static CompilationEnv NoModuleAllFeaturesForTesting();
private:
CompilationEnv(const WasmModule* module, WasmEnabledFeatures enabled_features,
std::atomic<Address>* fast_api_targets,
std::atomic<const MachineSignature*>* fast_api_signatures,
std::shared_ptr<WasmModuleCoverageData> module_coverage_data)
: module(module),
enabled_features(enabled_features),
fast_api_targets(fast_api_targets),
fast_api_signatures(fast_api_signatures),
module_coverage_data(std::move(module_coverage_data)) {}
};
class WireBytesStorage {
public:
virtual ~WireBytesStorage() = default;
virtual base::Vector<const uint8_t> GetCode(WireBytesRef) const = 0;
virtual std::optional<ModuleWireBytes> GetModuleBytes() const = 0;
};
enum class CompilationEvent : uint8_t {
kFinishedBaselineCompilation,
kFinishedCompilationChunk,
kFailedCompilation,
};
class V8_EXPORT_PRIVATE CompilationEventCallback {
public:
virtual ~CompilationEventCallback() = default;
virtual void call(CompilationEvent event) = 0;
enum ReleaseAfterFinalEvent : bool {
kReleaseAfterFinalEvent = true,
kKeepAfterFinalEvent = false
};
virtual ReleaseAfterFinalEvent release_after_final_event() {
return kReleaseAfterFinalEvent;
}
};
class V8_EXPORT_PRIVATE CompilationState {
public:
~CompilationState();
void operator delete(void* ptr) { ::operator delete(ptr); }
CompilationState() = delete;
void InitCompileJob();
void CancelCompilation();
void CancelInitialCompilation();
void SetError();
void SetWireBytesStorage(std::shared_ptr<WireBytesStorage>);
std::shared_ptr<WireBytesStorage> GetWireBytesStorage() const;
void AddCallback(std::unique_ptr<CompilationEventCallback> callback);
void InitializeAfterDeserialization(base::Vector<const int> lazy_functions,
base::Vector<const int> eager_functions);
void SetHighPriority();
void TierUpAllFunctions();
void AllowAnotherTopTierJob(uint32_t func_index);
void AllowAnotherTopTierJobForAllFunctions();
bool failed() const;
bool baseline_compilation_finished() const;
void set_compilation_id(int compilation_id);
size_t EstimateCurrentMemoryConsumption() const;
std::vector<WasmCode*> PublishCode(
base::Vector<UnpublishedWasmCode> unpublished_code);
WasmDetectedFeatures detected_features() const;
V8_WARN_UNUSED_RESULT WasmDetectedFeatures
UpdateDetectedFeatures(WasmDetectedFeatures);
private:
friend class NativeModule;
static std::unique_ptr<CompilationState> New(
const std::shared_ptr<NativeModule>&, WasmDetectedFeatures);
};
}
}
}
#endif