2017-09-16 05:22:38 +00:00
|
|
|
// Copyright 2017 the V8 project authors. All rights reserved.
|
|
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
|
|
// found in the LICENSE file.
|
|
|
|
|
2018-02-02 12:05:19 +00:00
|
|
|
#ifndef V8_WASM_WASM_CODE_MANAGER_H_
|
|
|
|
#define V8_WASM_WASM_CODE_MANAGER_H_
|
2017-09-16 05:22:38 +00:00
|
|
|
|
2017-11-20 21:34:04 +00:00
|
|
|
#include <functional>
|
2017-09-16 05:22:38 +00:00
|
|
|
#include <list>
|
2017-11-20 21:34:04 +00:00
|
|
|
#include <map>
|
|
|
|
#include <unordered_map>
|
2018-07-19 12:35:31 +00:00
|
|
|
#include <unordered_set>
|
2017-09-16 05:22:38 +00:00
|
|
|
|
|
|
|
#include "src/base/macros.h"
|
2018-08-22 09:14:23 +00:00
|
|
|
#include "src/builtins/builtins-definitions.h"
|
2017-11-20 21:34:04 +00:00
|
|
|
#include "src/handles.h"
|
|
|
|
#include "src/trap-handler/trap-handler.h"
|
2017-09-16 05:22:38 +00:00
|
|
|
#include "src/vector.h"
|
2018-10-23 11:37:58 +00:00
|
|
|
#include "src/wasm/compilation-environment.h"
|
2018-08-08 14:54:44 +00:00
|
|
|
#include "src/wasm/wasm-features.h"
|
2018-09-25 16:07:22 +00:00
|
|
|
#include "src/wasm/wasm-limits.h"
|
2018-03-19 09:22:23 +00:00
|
|
|
|
2017-09-16 05:22:38 +00:00
|
|
|
namespace v8 {
|
|
|
|
namespace internal {
|
2017-11-20 21:34:04 +00:00
|
|
|
|
|
|
|
struct CodeDesc;
|
|
|
|
class Code;
|
|
|
|
|
2017-09-16 05:22:38 +00:00
|
|
|
namespace wasm {
|
|
|
|
|
2017-11-20 21:34:04 +00:00
|
|
|
class NativeModule;
|
2018-04-05 14:14:24 +00:00
|
|
|
class WasmCodeManager;
|
2018-10-25 13:29:13 +00:00
|
|
|
class WasmEngine;
|
2018-09-18 13:05:45 +00:00
|
|
|
class WasmMemoryTracker;
|
2018-10-10 12:22:19 +00:00
|
|
|
class WasmImportWrapperCache;
|
2017-11-20 21:34:04 +00:00
|
|
|
struct WasmModule;
|
|
|
|
|
2018-09-25 14:21:11 +00:00
|
|
|
// Sorted, disjoint and non-overlapping memory regions. A region is of the
|
2017-09-16 05:22:38 +00:00
|
|
|
// form [start, end). So there's no [start, end), [end, other_end),
|
|
|
|
// because that should have been reduced to [start, other_end).
|
|
|
|
class V8_EXPORT_PRIVATE DisjointAllocationPool final {
|
|
|
|
public:
|
2018-06-08 11:05:58 +00:00
|
|
|
DisjointAllocationPool() = default;
|
2017-09-16 05:22:38 +00:00
|
|
|
|
2018-09-25 14:21:11 +00:00
|
|
|
explicit DisjointAllocationPool(base::AddressRegion region)
|
|
|
|
: regions_({region}) {}
|
2017-09-16 05:22:38 +00:00
|
|
|
|
|
|
|
DisjointAllocationPool(DisjointAllocationPool&& other) = default;
|
|
|
|
DisjointAllocationPool& operator=(DisjointAllocationPool&& other) = default;
|
|
|
|
|
2018-09-25 14:21:11 +00:00
|
|
|
// Merge the parameter region into this object while preserving ordering of
|
|
|
|
// the regions. The assumption is that the passed parameter is not
|
|
|
|
// intersecting this object - for example, it was obtained from a previous
|
|
|
|
// Allocate.
|
|
|
|
void Merge(base::AddressRegion);
|
2017-09-16 05:22:38 +00:00
|
|
|
|
2018-09-25 14:21:11 +00:00
|
|
|
// Allocate a contiguous region of size {size}. Return an empty pool on
|
2017-09-16 05:22:38 +00:00
|
|
|
// failure.
|
2018-09-25 14:21:11 +00:00
|
|
|
base::AddressRegion Allocate(size_t size);
|
2017-09-16 05:22:38 +00:00
|
|
|
|
2018-09-25 14:21:11 +00:00
|
|
|
bool IsEmpty() const { return regions_.empty(); }
|
|
|
|
const std::list<base::AddressRegion>& regions() const { return regions_; }
|
2017-09-16 05:22:38 +00:00
|
|
|
|
|
|
|
private:
|
2018-09-25 14:21:11 +00:00
|
|
|
std::list<base::AddressRegion> regions_;
|
2017-09-16 05:22:38 +00:00
|
|
|
|
2018-12-11 14:20:29 +00:00
|
|
|
DISALLOW_COPY_AND_ASSIGN(DisjointAllocationPool);
|
2017-09-16 05:22:38 +00:00
|
|
|
};
|
|
|
|
|
2017-11-20 21:34:04 +00:00
|
|
|
class V8_EXPORT_PRIVATE WasmCode final {
|
|
|
|
public:
|
|
|
|
enum Kind {
|
2017-11-29 20:23:19 +00:00
|
|
|
kFunction,
|
|
|
|
kWasmToJsWrapper,
|
|
|
|
kLazyStub,
|
2018-06-04 10:12:54 +00:00
|
|
|
kRuntimeStub,
|
2018-05-15 07:18:34 +00:00
|
|
|
kInterpreterEntry,
|
2018-06-19 09:47:17 +00:00
|
|
|
kJumpTable
|
2017-11-20 21:34:04 +00:00
|
|
|
};
|
|
|
|
|
2018-06-04 10:12:54 +00:00
|
|
|
// Each runtime stub is identified by an id. This id is used to reference the
|
|
|
|
// stub via {RelocInfo::WASM_STUB_CALL} and gets resolved during relocation.
|
|
|
|
enum RuntimeStubId {
|
2018-06-06 13:22:09 +00:00
|
|
|
#define DEF_ENUM(Name) k##Name,
|
|
|
|
#define DEF_ENUM_TRAP(Name) kThrowWasm##Name,
|
|
|
|
WASM_RUNTIME_STUB_LIST(DEF_ENUM, DEF_ENUM_TRAP)
|
|
|
|
#undef DEF_ENUM_TRAP
|
2018-06-04 10:12:54 +00:00
|
|
|
#undef DEF_ENUM
|
|
|
|
kRuntimeStubCount
|
|
|
|
};
|
|
|
|
|
2018-02-28 15:49:53 +00:00
|
|
|
// kOther is used if we have WasmCode that is neither
|
|
|
|
// liftoff- nor turbofan-compiled, i.e. if Kind is
|
|
|
|
// not a kFunction.
|
2018-03-24 14:05:21 +00:00
|
|
|
enum Tier : int8_t { kLiftoff, kTurbofan, kOther };
|
2018-02-28 15:49:53 +00:00
|
|
|
|
2017-11-20 21:34:04 +00:00
|
|
|
Vector<byte> instructions() const { return instructions_; }
|
2018-04-13 22:28:05 +00:00
|
|
|
Address instruction_start() const {
|
|
|
|
return reinterpret_cast<Address>(instructions_.start());
|
|
|
|
}
|
2018-06-27 12:57:52 +00:00
|
|
|
Vector<const byte> reloc_info() const { return reloc_info_.as_vector(); }
|
2018-03-23 11:30:26 +00:00
|
|
|
Vector<const byte> source_positions() const {
|
2018-06-27 12:57:52 +00:00
|
|
|
return source_position_table_.as_vector();
|
2018-03-23 11:30:26 +00:00
|
|
|
}
|
2017-11-20 21:34:04 +00:00
|
|
|
|
2018-09-25 16:07:22 +00:00
|
|
|
uint32_t index() const {
|
|
|
|
DCHECK(!IsAnonymous());
|
|
|
|
return index_;
|
|
|
|
}
|
2018-06-19 15:48:38 +00:00
|
|
|
// Anonymous functions are functions that don't carry an index.
|
2018-09-25 16:07:22 +00:00
|
|
|
bool IsAnonymous() const { return index_ == kAnonymousFuncIndex; }
|
2017-11-20 21:34:04 +00:00
|
|
|
Kind kind() const { return kind_; }
|
2018-03-15 12:53:10 +00:00
|
|
|
NativeModule* native_module() const { return native_module_; }
|
2018-02-28 15:49:53 +00:00
|
|
|
Tier tier() const { return tier_; }
|
2017-11-20 21:34:04 +00:00
|
|
|
Address constant_pool() const;
|
|
|
|
size_t constant_pool_offset() const { return constant_pool_offset_; }
|
|
|
|
size_t safepoint_table_offset() const { return safepoint_table_offset_; }
|
2018-02-27 09:23:48 +00:00
|
|
|
size_t handler_table_offset() const { return handler_table_offset_; }
|
2017-11-20 21:34:04 +00:00
|
|
|
uint32_t stack_slots() const { return stack_slots_; }
|
2018-02-28 15:49:53 +00:00
|
|
|
bool is_liftoff() const { return tier_ == kLiftoff; }
|
2018-05-07 13:37:03 +00:00
|
|
|
bool contains(Address pc) const {
|
|
|
|
return reinterpret_cast<Address>(instructions_.start()) <= pc &&
|
|
|
|
pc < reinterpret_cast<Address>(instructions_.end());
|
|
|
|
}
|
2017-11-20 21:34:04 +00:00
|
|
|
|
2018-06-27 10:26:30 +00:00
|
|
|
Vector<trap_handler::ProtectedInstructionData> protected_instructions()
|
|
|
|
const {
|
|
|
|
return protected_instructions_.as_vector();
|
2017-11-20 21:34:04 +00:00
|
|
|
}
|
|
|
|
|
2018-10-01 13:25:37 +00:00
|
|
|
const char* GetRuntimeStubName() const;
|
|
|
|
|
2018-05-24 10:49:13 +00:00
|
|
|
void Validate() const;
|
2018-06-22 11:41:06 +00:00
|
|
|
void Print(const char* name = nullptr) const;
|
|
|
|
void Disassemble(const char* name, std::ostream& os,
|
2018-04-23 07:21:06 +00:00
|
|
|
Address current_pc = kNullAddress) const;
|
2017-11-20 21:34:04 +00:00
|
|
|
|
2018-03-22 12:24:51 +00:00
|
|
|
static bool ShouldBeLogged(Isolate* isolate);
|
|
|
|
void LogCode(Isolate* isolate) const;
|
|
|
|
|
2017-11-20 21:34:04 +00:00
|
|
|
~WasmCode();
|
|
|
|
|
2018-03-22 11:20:00 +00:00
|
|
|
enum FlushICache : bool { kFlushICache = true, kNoFlushICache = false };
|
|
|
|
|
2018-11-15 10:15:13 +00:00
|
|
|
static constexpr uint32_t kAnonymousFuncIndex = 0xffffffff;
|
|
|
|
STATIC_ASSERT(kAnonymousFuncIndex > kV8MaxWasmFunctions);
|
|
|
|
|
2017-11-20 21:34:04 +00:00
|
|
|
private:
|
|
|
|
friend class NativeModule;
|
|
|
|
|
2018-09-25 16:07:22 +00:00
|
|
|
WasmCode(NativeModule* native_module, uint32_t index,
|
2018-06-28 09:45:22 +00:00
|
|
|
Vector<byte> instructions, uint32_t stack_slots,
|
|
|
|
size_t safepoint_table_offset, size_t handler_table_offset,
|
Revert "Reland "Reland "[code-comments] Put code comments into the code object"""
This reverts commit 9c0a48580bc820d93a16f8914281a7359beb2a7a.
Reason for revert: Seems to break nosnap debug: https://ci.chromium.org/p/v8/builders/luci.v8.ci/V8%20Linux%20-%20nosnap%20-%20debug/22228
Original change's description:
> Reland "Reland "[code-comments] Put code comments into the code object""
>
> This is a reland of ed3d647284538e9d6f013ebf2c460697aa06a5df
>
> This reland fixes that padding at the end of Wasm instruction streams
> triggered asserts in the code printer.
>
> Original change's description:
> > Reland "[code-comments] Put code comments into the code object"
> >
> > This is a reland of e774cffe2bd3f00332209d4d5695221963888c96
> >
> > This reland disables a test as v8:8548 is blocking it, which was
> > broken by a recent CL. CQ did not catch this because the merge-base
> > CQ used did not yet contain the CL that caused v8:8548.
> >
> > Original change's description:
> > > [code-comments] Put code comments into the code object
> > >
> > > Code comments in the snapshot can now be enabled with gn
> > > arg 'v8_enable_snapshot_code_comments'
> > >
> > > Bug: v8:7989
> > > Change-Id: I8bd00cafa63132d00d849394c311ba15e6b6daf3
> > > Reviewed-on: https://chromium-review.googlesource.com/c/1329173
> > > Commit-Queue: Sigurd Schneider <sigurds@chromium.org>
> > > Reviewed-by: Jakob Gruber <jgruber@chromium.org>
> > > Reviewed-by: Michael Starzinger <mstarzinger@chromium.org>
> > > Reviewed-by: Michael Stanton <mvstanton@chromium.org>
> > > Cr-Commit-Position: refs/heads/master@{#58020}
> >
> > TBR=mvstanton@chromium.org,mstarzinger@chromium.org,jgruber@chromium.org,tebbi@chromium.org
> >
> > Bug: v8:7989, v8:8548
> > Change-Id: I464fc897205fefdf2dfc2eadc54d699c4e08a0e9
> > Reviewed-on: https://chromium-review.googlesource.com/c/1361166
> > Reviewed-by: Sigurd Schneider <sigurds@chromium.org>
> > Commit-Queue: Sigurd Schneider <sigurds@chromium.org>
> > Cr-Commit-Position: refs/heads/master@{#58028}
>
> Bug: v8:7989, v8:8548
> Change-Id: I254f55ff687ad049f8d92b09331ed26a2bd05d7d
> Reviewed-on: https://chromium-review.googlesource.com/c/1371784
> Commit-Queue: Sigurd Schneider <sigurds@chromium.org>
> Reviewed-by: Michael Starzinger <mstarzinger@chromium.org>
> Reviewed-by: Jakob Gruber <jgruber@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#58221}
TBR=mvstanton@chromium.org,mstarzinger@chromium.org,sigurds@chromium.org,jgruber@chromium.org
Change-Id: I681a3c63120c6ab953bfe9cd2b07bcf560ebfdee
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: v8:7989, v8:8548
Reviewed-on: https://chromium-review.googlesource.com/c/1375916
Commit-Queue: Clemens Hammacher <clemensh@chromium.org>
Reviewed-by: Clemens Hammacher <clemensh@chromium.org>
Cr-Commit-Position: refs/heads/master@{#58228}
2018-12-13 16:52:47 +00:00
|
|
|
size_t constant_pool_offset,
|
2018-06-27 10:26:30 +00:00
|
|
|
OwnedVector<trap_handler::ProtectedInstructionData>
|
|
|
|
protected_instructions,
|
2018-06-28 09:45:22 +00:00
|
|
|
OwnedVector<const byte> reloc_info,
|
|
|
|
OwnedVector<const byte> source_position_table, Kind kind, Tier tier)
|
2017-11-20 21:34:04 +00:00
|
|
|
: instructions_(instructions),
|
|
|
|
reloc_info_(std::move(reloc_info)),
|
2018-06-28 09:45:22 +00:00
|
|
|
source_position_table_(std::move(source_position_table)),
|
2018-03-15 12:53:10 +00:00
|
|
|
native_module_(native_module),
|
2017-11-20 21:34:04 +00:00
|
|
|
index_(index),
|
|
|
|
kind_(kind),
|
|
|
|
constant_pool_offset_(constant_pool_offset),
|
|
|
|
stack_slots_(stack_slots),
|
|
|
|
safepoint_table_offset_(safepoint_table_offset),
|
2018-02-27 09:23:48 +00:00
|
|
|
handler_table_offset_(handler_table_offset),
|
2018-01-08 12:05:08 +00:00
|
|
|
protected_instructions_(std::move(protected_instructions)),
|
2018-03-20 16:14:55 +00:00
|
|
|
tier_(tier) {
|
Revert "Reland "Reland "[code-comments] Put code comments into the code object"""
This reverts commit 9c0a48580bc820d93a16f8914281a7359beb2a7a.
Reason for revert: Seems to break nosnap debug: https://ci.chromium.org/p/v8/builders/luci.v8.ci/V8%20Linux%20-%20nosnap%20-%20debug/22228
Original change's description:
> Reland "Reland "[code-comments] Put code comments into the code object""
>
> This is a reland of ed3d647284538e9d6f013ebf2c460697aa06a5df
>
> This reland fixes that padding at the end of Wasm instruction streams
> triggered asserts in the code printer.
>
> Original change's description:
> > Reland "[code-comments] Put code comments into the code object"
> >
> > This is a reland of e774cffe2bd3f00332209d4d5695221963888c96
> >
> > This reland disables a test as v8:8548 is blocking it, which was
> > broken by a recent CL. CQ did not catch this because the merge-base
> > CQ used did not yet contain the CL that caused v8:8548.
> >
> > Original change's description:
> > > [code-comments] Put code comments into the code object
> > >
> > > Code comments in the snapshot can now be enabled with gn
> > > arg 'v8_enable_snapshot_code_comments'
> > >
> > > Bug: v8:7989
> > > Change-Id: I8bd00cafa63132d00d849394c311ba15e6b6daf3
> > > Reviewed-on: https://chromium-review.googlesource.com/c/1329173
> > > Commit-Queue: Sigurd Schneider <sigurds@chromium.org>
> > > Reviewed-by: Jakob Gruber <jgruber@chromium.org>
> > > Reviewed-by: Michael Starzinger <mstarzinger@chromium.org>
> > > Reviewed-by: Michael Stanton <mvstanton@chromium.org>
> > > Cr-Commit-Position: refs/heads/master@{#58020}
> >
> > TBR=mvstanton@chromium.org,mstarzinger@chromium.org,jgruber@chromium.org,tebbi@chromium.org
> >
> > Bug: v8:7989, v8:8548
> > Change-Id: I464fc897205fefdf2dfc2eadc54d699c4e08a0e9
> > Reviewed-on: https://chromium-review.googlesource.com/c/1361166
> > Reviewed-by: Sigurd Schneider <sigurds@chromium.org>
> > Commit-Queue: Sigurd Schneider <sigurds@chromium.org>
> > Cr-Commit-Position: refs/heads/master@{#58028}
>
> Bug: v8:7989, v8:8548
> Change-Id: I254f55ff687ad049f8d92b09331ed26a2bd05d7d
> Reviewed-on: https://chromium-review.googlesource.com/c/1371784
> Commit-Queue: Sigurd Schneider <sigurds@chromium.org>
> Reviewed-by: Michael Starzinger <mstarzinger@chromium.org>
> Reviewed-by: Jakob Gruber <jgruber@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#58221}
TBR=mvstanton@chromium.org,mstarzinger@chromium.org,sigurds@chromium.org,jgruber@chromium.org
Change-Id: I681a3c63120c6ab953bfe9cd2b07bcf560ebfdee
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: v8:7989, v8:8548
Reviewed-on: https://chromium-review.googlesource.com/c/1375916
Commit-Queue: Clemens Hammacher <clemensh@chromium.org>
Reviewed-by: Clemens Hammacher <clemensh@chromium.org>
Cr-Commit-Position: refs/heads/master@{#58228}
2018-12-13 16:52:47 +00:00
|
|
|
DCHECK_LE(safepoint_table_offset, instructions.size());
|
|
|
|
DCHECK_LE(constant_pool_offset, instructions.size());
|
|
|
|
DCHECK_LE(handler_table_offset, instructions.size());
|
2018-03-20 16:14:55 +00:00
|
|
|
}
|
2017-11-20 21:34:04 +00:00
|
|
|
|
2018-04-06 13:27:34 +00:00
|
|
|
// Code objects that have been registered with the global trap handler within
|
|
|
|
// this process, will have a {trap_handler_index} associated with them.
|
|
|
|
size_t trap_handler_index() const;
|
|
|
|
void set_trap_handler_index(size_t);
|
|
|
|
bool HasTrapHandlerIndex() const;
|
2018-06-18 11:34:41 +00:00
|
|
|
|
|
|
|
// Register protected instruction information with the trap handler. Sets
|
|
|
|
// trap_handler_index.
|
|
|
|
void RegisterTrapHandlerData();
|
2018-04-06 13:27:34 +00:00
|
|
|
|
2017-11-20 21:34:04 +00:00
|
|
|
Vector<byte> instructions_;
|
2018-06-27 12:57:52 +00:00
|
|
|
OwnedVector<const byte> reloc_info_;
|
|
|
|
OwnedVector<const byte> source_position_table_;
|
2018-03-15 12:53:10 +00:00
|
|
|
NativeModule* native_module_ = nullptr;
|
2018-09-25 16:07:22 +00:00
|
|
|
uint32_t index_;
|
2017-11-20 21:34:04 +00:00
|
|
|
Kind kind_;
|
|
|
|
size_t constant_pool_offset_ = 0;
|
|
|
|
uint32_t stack_slots_ = 0;
|
|
|
|
// we care about safepoint data for wasm-to-js functions,
|
|
|
|
// since there may be stack/register tagged values for large number
|
|
|
|
// conversions.
|
|
|
|
size_t safepoint_table_offset_ = 0;
|
2018-02-27 09:23:48 +00:00
|
|
|
size_t handler_table_offset_ = 0;
|
2017-11-20 21:34:04 +00:00
|
|
|
intptr_t trap_handler_index_ = -1;
|
2018-06-27 10:26:30 +00:00
|
|
|
OwnedVector<trap_handler::ProtectedInstructionData> protected_instructions_;
|
2018-02-28 15:49:53 +00:00
|
|
|
Tier tier_;
|
2018-03-21 13:00:04 +00:00
|
|
|
|
|
|
|
DISALLOW_COPY_AND_ASSIGN(WasmCode);
|
2017-11-20 21:34:04 +00:00
|
|
|
};
|
|
|
|
|
2017-11-29 17:53:43 +00:00
|
|
|
// Return a textual description of the kind.
|
|
|
|
const char* GetWasmCodeKindAsString(WasmCode::Kind);
|
|
|
|
|
2017-11-20 21:34:04 +00:00
|
|
|
class V8_EXPORT_PRIVATE NativeModule final {
|
|
|
|
public:
|
2018-06-28 13:23:24 +00:00
|
|
|
#if V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_S390X || V8_TARGET_ARCH_ARM64
|
|
|
|
static constexpr bool kCanAllocateMoreMemory = false;
|
|
|
|
#else
|
|
|
|
static constexpr bool kCanAllocateMoreMemory = true;
|
|
|
|
#endif
|
|
|
|
|
2018-09-21 12:00:23 +00:00
|
|
|
// {AddCode} is thread safe w.r.t. other calls to {AddCode} or methods adding
|
|
|
|
// code below, i.e. it can be called concurrently from background threads.
|
2018-06-28 09:45:22 +00:00
|
|
|
WasmCode* AddCode(uint32_t index, const CodeDesc& desc, uint32_t stack_slots,
|
2018-02-27 09:23:48 +00:00
|
|
|
size_t safepoint_table_offset, size_t handler_table_offset,
|
2018-06-27 10:26:30 +00:00
|
|
|
OwnedVector<trap_handler::ProtectedInstructionData>
|
|
|
|
protected_instructions,
|
2018-06-28 09:45:22 +00:00
|
|
|
OwnedVector<const byte> source_position_table,
|
2018-11-14 15:23:40 +00:00
|
|
|
WasmCode::Kind kind, WasmCode::Tier tier);
|
2017-11-20 21:34:04 +00:00
|
|
|
|
2018-06-28 09:45:22 +00:00
|
|
|
WasmCode* AddDeserializedCode(
|
|
|
|
uint32_t index, Vector<const byte> instructions, uint32_t stack_slots,
|
|
|
|
size_t safepoint_table_offset, size_t handler_table_offset,
|
Revert "Reland "Reland "[code-comments] Put code comments into the code object"""
This reverts commit 9c0a48580bc820d93a16f8914281a7359beb2a7a.
Reason for revert: Seems to break nosnap debug: https://ci.chromium.org/p/v8/builders/luci.v8.ci/V8%20Linux%20-%20nosnap%20-%20debug/22228
Original change's description:
> Reland "Reland "[code-comments] Put code comments into the code object""
>
> This is a reland of ed3d647284538e9d6f013ebf2c460697aa06a5df
>
> This reland fixes that padding at the end of Wasm instruction streams
> triggered asserts in the code printer.
>
> Original change's description:
> > Reland "[code-comments] Put code comments into the code object"
> >
> > This is a reland of e774cffe2bd3f00332209d4d5695221963888c96
> >
> > This reland disables a test as v8:8548 is blocking it, which was
> > broken by a recent CL. CQ did not catch this because the merge-base
> > CQ used did not yet contain the CL that caused v8:8548.
> >
> > Original change's description:
> > > [code-comments] Put code comments into the code object
> > >
> > > Code comments in the snapshot can now be enabled with gn
> > > arg 'v8_enable_snapshot_code_comments'
> > >
> > > Bug: v8:7989
> > > Change-Id: I8bd00cafa63132d00d849394c311ba15e6b6daf3
> > > Reviewed-on: https://chromium-review.googlesource.com/c/1329173
> > > Commit-Queue: Sigurd Schneider <sigurds@chromium.org>
> > > Reviewed-by: Jakob Gruber <jgruber@chromium.org>
> > > Reviewed-by: Michael Starzinger <mstarzinger@chromium.org>
> > > Reviewed-by: Michael Stanton <mvstanton@chromium.org>
> > > Cr-Commit-Position: refs/heads/master@{#58020}
> >
> > TBR=mvstanton@chromium.org,mstarzinger@chromium.org,jgruber@chromium.org,tebbi@chromium.org
> >
> > Bug: v8:7989, v8:8548
> > Change-Id: I464fc897205fefdf2dfc2eadc54d699c4e08a0e9
> > Reviewed-on: https://chromium-review.googlesource.com/c/1361166
> > Reviewed-by: Sigurd Schneider <sigurds@chromium.org>
> > Commit-Queue: Sigurd Schneider <sigurds@chromium.org>
> > Cr-Commit-Position: refs/heads/master@{#58028}
>
> Bug: v8:7989, v8:8548
> Change-Id: I254f55ff687ad049f8d92b09331ed26a2bd05d7d
> Reviewed-on: https://chromium-review.googlesource.com/c/1371784
> Commit-Queue: Sigurd Schneider <sigurds@chromium.org>
> Reviewed-by: Michael Starzinger <mstarzinger@chromium.org>
> Reviewed-by: Jakob Gruber <jgruber@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#58221}
TBR=mvstanton@chromium.org,mstarzinger@chromium.org,sigurds@chromium.org,jgruber@chromium.org
Change-Id: I681a3c63120c6ab953bfe9cd2b07bcf560ebfdee
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: v8:7989, v8:8548
Reviewed-on: https://chromium-review.googlesource.com/c/1375916
Commit-Queue: Clemens Hammacher <clemensh@chromium.org>
Reviewed-by: Clemens Hammacher <clemensh@chromium.org>
Cr-Commit-Position: refs/heads/master@{#58228}
2018-12-13 16:52:47 +00:00
|
|
|
size_t constant_pool_offset,
|
2018-06-28 09:45:22 +00:00
|
|
|
OwnedVector<trap_handler::ProtectedInstructionData>
|
|
|
|
protected_instructions,
|
|
|
|
OwnedVector<const byte> reloc_info,
|
|
|
|
OwnedVector<const byte> source_position_table, WasmCode::Tier tier);
|
|
|
|
|
2018-09-21 12:00:23 +00:00
|
|
|
// Adds anonymous code for testing purposes.
|
|
|
|
WasmCode* AddCodeForTesting(Handle<Code> code);
|
|
|
|
|
2017-11-20 21:34:04 +00:00
|
|
|
// When starting lazy compilation, provide the WasmLazyCompile builtin by
|
2018-06-19 09:47:17 +00:00
|
|
|
// calling SetLazyBuiltin. It will be copied into this NativeModule and the
|
|
|
|
// jump table will be populated with that copy.
|
2018-01-22 16:48:14 +00:00
|
|
|
void SetLazyBuiltin(Handle<Code> code);
|
2017-11-20 21:34:04 +00:00
|
|
|
|
2018-06-04 10:12:54 +00:00
|
|
|
// Initializes all runtime stubs by copying them over from the JS-allocated
|
|
|
|
// heap into this native module. It must be called exactly once per native
|
|
|
|
// module before adding other WasmCode so that runtime stub ids can be
|
|
|
|
// resolved during relocation.
|
|
|
|
void SetRuntimeStubs(Isolate* isolate);
|
|
|
|
|
2018-07-12 15:08:26 +00:00
|
|
|
// Makes the code available to the system (by entering it into the code table
|
|
|
|
// and patching the jump table). Callers have to take care not to race with
|
|
|
|
// threads executing the old code.
|
|
|
|
void PublishCode(WasmCode* code);
|
|
|
|
|
2018-11-15 09:30:52 +00:00
|
|
|
// Switch a function to an interpreter entry wrapper. When adding interpreter
|
|
|
|
// wrappers, we do not insert them in the code_table, however, we let them
|
|
|
|
// self-identify as the {index} function.
|
|
|
|
void PublishInterpreterEntry(WasmCode* code, uint32_t index);
|
|
|
|
|
2018-08-01 11:04:55 +00:00
|
|
|
// Creates a snapshot of the current state of the code table. This is useful
|
|
|
|
// to get a consistent view of the table (e.g. used by the serializer).
|
|
|
|
std::vector<WasmCode*> SnapshotCodeTable() const;
|
|
|
|
|
2018-05-07 13:37:03 +00:00
|
|
|
WasmCode* code(uint32_t index) const {
|
2018-06-28 13:23:24 +00:00
|
|
|
DCHECK_LT(index, num_functions());
|
|
|
|
DCHECK_LE(module_->num_imported_functions, index);
|
|
|
|
return code_table_[index - module_->num_imported_functions];
|
2018-05-07 13:37:03 +00:00
|
|
|
}
|
|
|
|
|
2018-06-28 13:23:24 +00:00
|
|
|
bool has_code(uint32_t index) const { return code(index) != nullptr; }
|
2018-05-15 17:08:44 +00:00
|
|
|
|
2018-06-04 10:12:54 +00:00
|
|
|
WasmCode* runtime_stub(WasmCode::RuntimeStubId index) const {
|
|
|
|
DCHECK_LT(index, WasmCode::kRuntimeStubCount);
|
2018-06-07 00:49:00 +00:00
|
|
|
WasmCode* code = runtime_stub_table_[index];
|
|
|
|
DCHECK_NOT_NULL(code);
|
|
|
|
return code;
|
2018-06-04 10:12:54 +00:00
|
|
|
}
|
|
|
|
|
2018-07-06 14:27:20 +00:00
|
|
|
Address jump_table_start() const {
|
|
|
|
return jump_table_ ? jump_table_->instruction_start() : kNullAddress;
|
|
|
|
}
|
|
|
|
|
2018-08-07 10:33:50 +00:00
|
|
|
ptrdiff_t jump_table_offset(uint32_t func_index) const {
|
|
|
|
DCHECK_GE(func_index, num_imported_functions());
|
|
|
|
return GetCallTargetForFunction(func_index) - jump_table_start();
|
|
|
|
}
|
|
|
|
|
2018-06-19 09:47:17 +00:00
|
|
|
bool is_jump_table_slot(Address address) const {
|
|
|
|
return jump_table_->contains(address);
|
|
|
|
}
|
|
|
|
|
2018-06-11 15:16:26 +00:00
|
|
|
// Transition this module from code relying on trap handlers (i.e. without
|
|
|
|
// explicit memory bounds checks) to code that does not require trap handlers
|
|
|
|
// (i.e. code with explicit bounds checks).
|
|
|
|
// This method must only be called if {use_trap_handler()} is true (it will be
|
|
|
|
// false afterwards). All code in this {NativeModule} needs to be re-added
|
|
|
|
// after calling this method.
|
|
|
|
void DisableTrapHandler();
|
|
|
|
|
2018-06-19 09:47:17 +00:00
|
|
|
// Returns the target to call for the given function (returns a jump table
|
|
|
|
// slot within {jump_table_}).
|
|
|
|
Address GetCallTargetForFunction(uint32_t func_index) const;
|
2017-11-20 21:34:04 +00:00
|
|
|
|
2018-08-17 12:35:29 +00:00
|
|
|
// Reverse lookup from a given call target (i.e. a jump table slot as the
|
|
|
|
// above {GetCallTargetForFunction} returns) to a function index.
|
|
|
|
uint32_t GetFunctionIndexFromJumpTableSlot(Address slot_address) const;
|
|
|
|
|
2017-12-04 16:41:22 +00:00
|
|
|
bool SetExecutable(bool executable);
|
|
|
|
|
2017-11-20 21:34:04 +00:00
|
|
|
// For cctests, where we build both WasmModule and the runtime objects
|
|
|
|
// on the fly, and bypass the instance builder pipeline.
|
2018-06-04 12:01:49 +00:00
|
|
|
void ReserveCodeTableForTesting(uint32_t max_functions);
|
2017-11-20 21:34:04 +00:00
|
|
|
|
2018-06-15 12:00:30 +00:00
|
|
|
void LogWasmCodes(Isolate* isolate);
|
|
|
|
|
2018-03-19 09:22:23 +00:00
|
|
|
CompilationState* compilation_state() { return compilation_state_.get(); }
|
|
|
|
|
2018-10-23 11:56:12 +00:00
|
|
|
// Create a {CompilationEnv} object for compilation. Only valid as long as
|
|
|
|
// this {NativeModule} is alive.
|
|
|
|
CompilationEnv CreateCompilationEnv() const;
|
2018-10-23 11:43:07 +00:00
|
|
|
|
2018-06-28 13:23:24 +00:00
|
|
|
uint32_t num_functions() const {
|
|
|
|
return module_->num_declared_functions + module_->num_imported_functions;
|
|
|
|
}
|
|
|
|
uint32_t num_imported_functions() const {
|
|
|
|
return module_->num_imported_functions;
|
|
|
|
}
|
2018-10-23 11:39:15 +00:00
|
|
|
UseTrapHandler use_trap_handler() const { return use_trap_handler_; }
|
2018-04-30 14:47:44 +00:00
|
|
|
void set_lazy_compile_frozen(bool frozen) { lazy_compile_frozen_ = frozen; }
|
|
|
|
bool lazy_compile_frozen() const { return lazy_compile_frozen_; }
|
2018-06-28 14:29:04 +00:00
|
|
|
Vector<const byte> wire_bytes() const { return wire_bytes_.as_vector(); }
|
2018-06-28 16:31:31 +00:00
|
|
|
const WasmModule* module() const { return module_.get(); }
|
2018-11-12 14:00:26 +00:00
|
|
|
size_t committed_code_space() const { return committed_code_space_.load(); }
|
2018-04-30 14:47:44 +00:00
|
|
|
|
2018-11-07 10:27:10 +00:00
|
|
|
void SetWireBytes(OwnedVector<const byte> wire_bytes);
|
|
|
|
|
2018-06-19 09:47:17 +00:00
|
|
|
WasmCode* Lookup(Address) const;
|
|
|
|
|
2018-10-10 12:22:19 +00:00
|
|
|
WasmImportWrapperCache* import_wrapper_cache() const {
|
|
|
|
return import_wrapper_cache_.get();
|
|
|
|
}
|
|
|
|
|
2017-11-20 21:34:04 +00:00
|
|
|
~NativeModule();
|
|
|
|
|
2018-08-08 14:54:44 +00:00
|
|
|
const WasmFeatures& enabled_features() const { return enabled_features_; }
|
|
|
|
|
2017-11-20 21:34:04 +00:00
|
|
|
private:
|
2018-06-13 13:28:41 +00:00
|
|
|
friend class WasmCode;
|
2017-11-20 21:34:04 +00:00
|
|
|
friend class WasmCodeManager;
|
2018-02-21 11:42:57 +00:00
|
|
|
friend class NativeModuleModificationScope;
|
2017-11-20 21:34:04 +00:00
|
|
|
|
2018-08-08 14:54:44 +00:00
|
|
|
NativeModule(Isolate* isolate, const WasmFeatures& enabled_features,
|
2018-09-26 11:19:18 +00:00
|
|
|
bool can_request_more, VirtualMemory code_space,
|
2018-10-29 10:45:07 +00:00
|
|
|
WasmCodeManager* code_manager,
|
2018-10-23 11:43:07 +00:00
|
|
|
std::shared_ptr<const WasmModule> module);
|
2017-11-20 21:34:04 +00:00
|
|
|
|
2018-10-01 10:51:56 +00:00
|
|
|
WasmCode* AddAnonymousCode(Handle<Code>, WasmCode::Kind kind,
|
|
|
|
const char* name = nullptr);
|
2018-09-27 09:20:06 +00:00
|
|
|
// Allocate code space. Returns a valid buffer or fails with OOM (crash).
|
|
|
|
Vector<byte> AllocateForCode(size_t size);
|
2017-11-20 21:34:04 +00:00
|
|
|
|
|
|
|
// Primitive for adding code to the native module. All code added to a native
|
|
|
|
// module is owned by that module. Various callers get to decide on how the
|
2018-11-08 21:42:34 +00:00
|
|
|
// code is obtained (CodeDesc vs, as a point in time, Code), the kind,
|
2017-11-20 21:34:04 +00:00
|
|
|
// whether it has an index or is anonymous, etc.
|
2018-09-25 16:07:22 +00:00
|
|
|
WasmCode* AddOwnedCode(uint32_t index, Vector<const byte> instructions,
|
2018-06-28 09:45:22 +00:00
|
|
|
uint32_t stack_slots, size_t safepoint_table_offset,
|
2018-02-27 09:23:48 +00:00
|
|
|
size_t handler_table_offset,
|
2018-06-28 09:45:22 +00:00
|
|
|
size_t constant_pool_offset,
|
2018-06-27 10:26:30 +00:00
|
|
|
OwnedVector<trap_handler::ProtectedInstructionData>,
|
2018-06-28 09:45:22 +00:00
|
|
|
OwnedVector<const byte> reloc_info,
|
|
|
|
OwnedVector<const byte> source_position_table,
|
2018-07-09 06:49:01 +00:00
|
|
|
WasmCode::Kind, WasmCode::Tier);
|
2017-11-20 21:34:04 +00:00
|
|
|
|
2018-06-19 09:47:17 +00:00
|
|
|
WasmCode* CreateEmptyJumpTable(uint32_t num_wasm_functions);
|
|
|
|
|
2018-09-25 13:53:17 +00:00
|
|
|
// Hold the {allocation_mutex_} when calling this method.
|
|
|
|
void InstallCode(WasmCode* code);
|
2018-06-19 09:47:17 +00:00
|
|
|
|
2018-08-01 11:04:55 +00:00
|
|
|
Vector<WasmCode*> code_table() const {
|
|
|
|
return {code_table_.get(), module_->num_declared_functions};
|
|
|
|
}
|
2018-06-04 13:58:37 +00:00
|
|
|
|
2018-10-15 14:07:47 +00:00
|
|
|
// Hold the {mutex_} when calling this method.
|
|
|
|
bool has_interpreter_redirection(uint32_t func_index) {
|
|
|
|
DCHECK_LT(func_index, num_functions());
|
|
|
|
DCHECK_LE(module_->num_imported_functions, func_index);
|
|
|
|
if (!interpreter_redirections_) return false;
|
|
|
|
uint32_t bitset_idx = func_index - module_->num_imported_functions;
|
|
|
|
uint8_t byte = interpreter_redirections_[bitset_idx / kBitsPerByte];
|
|
|
|
return byte & (1 << (bitset_idx % kBitsPerByte));
|
|
|
|
}
|
|
|
|
|
|
|
|
// Hold the {mutex_} when calling this method.
|
|
|
|
void SetInterpreterRedirection(uint32_t func_index) {
|
|
|
|
DCHECK_LT(func_index, num_functions());
|
|
|
|
DCHECK_LE(module_->num_imported_functions, func_index);
|
|
|
|
if (!interpreter_redirections_) {
|
|
|
|
interpreter_redirections_.reset(
|
|
|
|
new uint8_t[RoundUp<kBitsPerByte>(module_->num_declared_functions) /
|
|
|
|
kBitsPerByte]);
|
|
|
|
}
|
|
|
|
uint32_t bitset_idx = func_index - module_->num_imported_functions;
|
|
|
|
uint8_t& byte = interpreter_redirections_[bitset_idx / kBitsPerByte];
|
|
|
|
byte |= 1 << (bitset_idx % kBitsPerByte);
|
|
|
|
}
|
|
|
|
|
2018-08-08 14:54:44 +00:00
|
|
|
// Features enabled for this module. We keep a copy of the features that
|
|
|
|
// were enabled at the time of the creation of this native module,
|
|
|
|
// to be consistent across asynchronous compilations later.
|
|
|
|
const WasmFeatures enabled_features_;
|
|
|
|
|
2018-06-28 13:23:24 +00:00
|
|
|
// TODO(clemensh): Make this a unique_ptr (requires refactoring
|
|
|
|
// AsyncCompileJob).
|
|
|
|
std::shared_ptr<const WasmModule> module_;
|
|
|
|
|
2018-06-28 14:29:04 +00:00
|
|
|
OwnedVector<const byte> wire_bytes_;
|
2018-06-22 14:34:47 +00:00
|
|
|
|
2018-06-04 12:01:49 +00:00
|
|
|
WasmCode* runtime_stub_table_[WasmCode::kRuntimeStubCount] = {nullptr};
|
2017-11-20 21:34:04 +00:00
|
|
|
|
2018-06-19 09:47:17 +00:00
|
|
|
// Jump table used to easily redirect wasm function calls.
|
|
|
|
WasmCode* jump_table_ = nullptr;
|
|
|
|
|
2018-07-10 12:30:26 +00:00
|
|
|
// The compilation state keeps track of compilation tasks for this module.
|
|
|
|
// Note that its destructor blocks until all tasks are finished/aborted and
|
|
|
|
// hence needs to be destructed first when this native module dies.
|
2018-10-25 14:24:50 +00:00
|
|
|
std::unique_ptr<CompilationState> compilation_state_;
|
2018-03-19 09:22:23 +00:00
|
|
|
|
2018-10-10 12:22:19 +00:00
|
|
|
// A cache of the import wrappers, keyed on the kind and signature.
|
|
|
|
std::unique_ptr<WasmImportWrapperCache> import_wrapper_cache_;
|
|
|
|
|
2018-09-21 12:00:23 +00:00
|
|
|
// This mutex protects concurrent calls to {AddCode} and friends.
|
2018-07-10 12:30:26 +00:00
|
|
|
mutable base::Mutex allocation_mutex_;
|
|
|
|
|
2018-09-21 12:00:23 +00:00
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
// Protected by {allocation_mutex_}:
|
|
|
|
|
|
|
|
// Holds all allocated code objects, is maintained to be in ascending order
|
|
|
|
// according to the codes instruction start address to allow lookups.
|
|
|
|
std::vector<std::unique_ptr<WasmCode>> owned_code_;
|
|
|
|
|
|
|
|
std::unique_ptr<WasmCode* []> code_table_;
|
|
|
|
|
2018-10-15 14:07:47 +00:00
|
|
|
// Null if no redirections exist, otherwise a bitset over all functions in
|
|
|
|
// this module marking those functions that have been redirected.
|
|
|
|
std::unique_ptr<uint8_t[]> interpreter_redirections_;
|
|
|
|
|
2018-05-16 12:05:49 +00:00
|
|
|
DisjointAllocationPool free_code_space_;
|
|
|
|
DisjointAllocationPool allocated_code_space_;
|
|
|
|
std::list<VirtualMemory> owned_code_space_;
|
|
|
|
|
2018-09-21 12:00:23 +00:00
|
|
|
// End of fields protected by {allocation_mutex_}.
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2018-10-29 10:45:07 +00:00
|
|
|
WasmCodeManager* const code_manager_;
|
2018-07-24 15:58:31 +00:00
|
|
|
std::atomic<size_t> committed_code_space_{0};
|
2018-04-30 14:47:44 +00:00
|
|
|
int modification_scope_depth_ = 0;
|
2017-11-20 21:34:04 +00:00
|
|
|
bool can_request_more_memory_;
|
2018-10-23 11:39:15 +00:00
|
|
|
UseTrapHandler use_trap_handler_ = kNoTrapHandler;
|
2017-12-04 16:41:22 +00:00
|
|
|
bool is_executable_ = false;
|
2018-04-30 14:47:44 +00:00
|
|
|
bool lazy_compile_frozen_ = false;
|
2018-03-21 13:00:04 +00:00
|
|
|
|
|
|
|
DISALLOW_COPY_AND_ASSIGN(NativeModule);
|
2017-11-20 21:34:04 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
class V8_EXPORT_PRIVATE WasmCodeManager final {
|
|
|
|
public:
|
2018-09-18 13:05:45 +00:00
|
|
|
explicit WasmCodeManager(WasmMemoryTracker* memory_tracker,
|
|
|
|
size_t max_committed);
|
2017-11-20 21:34:04 +00:00
|
|
|
// Create a new NativeModule. The caller is responsible for its
|
|
|
|
// lifetime. The native module will be given some memory for code,
|
|
|
|
// which will be page size aligned. The size of the initial memory
|
|
|
|
// is determined with a heuristic based on the total size of wasm
|
|
|
|
// code. The native module may later request more memory.
|
2018-06-12 16:43:02 +00:00
|
|
|
// TODO(titzer): isolate is only required here for CompilationState.
|
|
|
|
std::unique_ptr<NativeModule> NewNativeModule(
|
2018-08-08 14:54:44 +00:00
|
|
|
Isolate* isolate, const WasmFeatures& enabled_features,
|
2018-10-24 11:54:32 +00:00
|
|
|
size_t code_size_estimate, bool can_request_more,
|
2018-10-23 11:43:07 +00:00
|
|
|
std::shared_ptr<const WasmModule> module);
|
2017-11-20 21:34:04 +00:00
|
|
|
|
2018-06-19 09:47:17 +00:00
|
|
|
NativeModule* LookupNativeModule(Address pc) const;
|
2017-11-20 21:34:04 +00:00
|
|
|
WasmCode* LookupCode(Address pc) const;
|
2018-05-16 12:05:49 +00:00
|
|
|
size_t remaining_uncommitted_code_space() const;
|
2017-11-20 21:34:04 +00:00
|
|
|
|
2018-07-19 12:35:31 +00:00
|
|
|
// Add a sample of all module sizes.
|
|
|
|
void SampleModuleSizes(Isolate* isolate) const;
|
|
|
|
|
2018-10-25 13:29:13 +00:00
|
|
|
void SetMaxCommittedMemoryForTesting(size_t limit);
|
|
|
|
|
2018-07-19 12:35:31 +00:00
|
|
|
// TODO(v8:7424): For now we sample module sizes in a GC callback. This will
|
|
|
|
// bias samples towards apps with high memory pressure. We should switch to
|
|
|
|
// using sampling based on regular intervals independent of the GC.
|
|
|
|
static void InstallSamplingGCCallback(Isolate* isolate);
|
|
|
|
|
2018-11-12 14:00:26 +00:00
|
|
|
static size_t EstimateNativeModuleCodeSize(const WasmModule* module);
|
|
|
|
static size_t EstimateNativeModuleNonCodeSize(const WasmModule* module);
|
2018-05-16 12:39:18 +00:00
|
|
|
|
2017-11-20 21:34:04 +00:00
|
|
|
private:
|
|
|
|
friend class NativeModule;
|
|
|
|
|
2018-09-17 08:49:40 +00:00
|
|
|
V8_WARN_UNUSED_RESULT VirtualMemory TryAllocate(size_t size,
|
|
|
|
void* hint = nullptr);
|
2017-11-20 21:34:04 +00:00
|
|
|
bool Commit(Address, size_t);
|
|
|
|
// Currently, we uncommit a whole module, so all we need is account
|
2018-05-16 12:05:49 +00:00
|
|
|
// for the freed memory size. We do that in FreeNativeModule.
|
2017-11-20 21:34:04 +00:00
|
|
|
// There's no separate Uncommit.
|
|
|
|
|
2018-05-16 12:05:49 +00:00
|
|
|
void FreeNativeModule(NativeModule*);
|
2018-04-13 22:28:05 +00:00
|
|
|
void AssignRanges(Address start, Address end, NativeModule*);
|
2018-09-21 09:23:31 +00:00
|
|
|
void AssignRangesAndAddModule(Address start, Address end, NativeModule*);
|
2018-07-24 15:58:31 +00:00
|
|
|
bool ShouldForceCriticalMemoryPressureNotification();
|
2017-11-20 21:34:04 +00:00
|
|
|
|
2018-09-18 13:05:45 +00:00
|
|
|
WasmMemoryTracker* const memory_tracker_;
|
2018-09-21 09:23:31 +00:00
|
|
|
std::atomic<size_t> remaining_uncommitted_code_space_;
|
2018-07-24 15:58:31 +00:00
|
|
|
mutable base::Mutex native_modules_mutex_;
|
2018-09-21 09:23:31 +00:00
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
// Protected by {native_modules_mutex_}:
|
|
|
|
|
2017-11-20 21:34:04 +00:00
|
|
|
std::map<Address, std::pair<Address, NativeModule*>> lookup_map_;
|
2018-07-19 12:35:31 +00:00
|
|
|
std::unordered_set<NativeModule*> native_modules_;
|
2018-09-21 09:23:31 +00:00
|
|
|
|
|
|
|
// End of fields protected by {native_modules_mutex_}.
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
2017-12-01 16:13:36 +00:00
|
|
|
|
2018-03-21 13:00:04 +00:00
|
|
|
DISALLOW_COPY_AND_ASSIGN(WasmCodeManager);
|
2017-11-20 21:34:04 +00:00
|
|
|
};
|
|
|
|
|
2017-12-04 16:41:22 +00:00
|
|
|
// Within the scope, the native_module is writable and not executable.
|
|
|
|
// At the scope's destruction, the native_module is executable and not writable.
|
|
|
|
// The states inside the scope and at the scope termination are irrespective of
|
|
|
|
// native_module's state when entering the scope.
|
|
|
|
// We currently mark the entire module's memory W^X:
|
|
|
|
// - for AOT, that's as efficient as it can be.
|
|
|
|
// - for Lazy, we don't have a heuristic for functions that may need patching,
|
|
|
|
// and even if we did, the resulting set of pages may be fragmented.
|
|
|
|
// Currently, we try and keep the number of syscalls low.
|
|
|
|
// - similar argument for debug time.
|
|
|
|
class NativeModuleModificationScope final {
|
|
|
|
public:
|
|
|
|
explicit NativeModuleModificationScope(NativeModule* native_module);
|
|
|
|
~NativeModuleModificationScope();
|
|
|
|
|
|
|
|
private:
|
|
|
|
NativeModule* native_module_;
|
|
|
|
};
|
|
|
|
|
2017-09-16 05:22:38 +00:00
|
|
|
} // namespace wasm
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace v8
|
2018-02-02 12:05:19 +00:00
|
|
|
|
|
|
|
#endif // V8_WASM_WASM_CODE_MANAGER_H_
|