Merge V8 5.2.361.47 DO NOT MERGE
https://chromium.googlesource.com/v8/v8/+/5.2.361.47
FPIIM-449
Change-Id: Ibec421b85a9b88cb3a432ada642e469fe7e78346
(cherry picked from commit bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8)
diff --git a/src/compiler/wasm-compiler.h b/src/compiler/wasm-compiler.h
index bbcafa7..93c2ae9 100644
--- a/src/compiler/wasm-compiler.h
+++ b/src/compiler/wasm-compiler.h
@@ -18,6 +18,9 @@
class Node;
class JSGraph;
class Graph;
+class Operator;
+class SourcePositionTable;
+class WasmCompilationUnit;
}
namespace wasm {
@@ -33,9 +36,9 @@
namespace compiler {
// Compiles a single function, producing a code object.
-Handle<Code> CompileWasmFunction(wasm::ErrorThrower& thrower, Isolate* isolate,
+Handle<Code> CompileWasmFunction(wasm::ErrorThrower* thrower, Isolate* isolate,
wasm::ModuleEnv* module_env,
- const wasm::WasmFunction& function);
+ const wasm::WasmFunction* function);
// Wraps a JS function, producing a code object that can be called from WASM.
Handle<Code> CompileWasmToJSWrapper(Isolate* isolate, wasm::ModuleEnv* module,
@@ -50,12 +53,24 @@
Isolate* isolate, wasm::ModuleEnv* module, Handle<String> name,
Handle<Code> wasm_code, Handle<JSObject> module_object, uint32_t index);
+WasmCompilationUnit* CreateWasmCompilationUnit(
+ wasm::ErrorThrower* thrower, Isolate* isolate, wasm::ModuleEnv* module_env,
+ const wasm::WasmFunction* function, uint32_t index);
+
+void ExecuteCompilation(WasmCompilationUnit* unit);
+
+Handle<Code> FinishCompilation(WasmCompilationUnit* unit);
+
+uint32_t GetIndexOfWasmCompilationUnit(WasmCompilationUnit* unit);
+
// Abstracts details of building TurboFan graph nodes for WASM to separate
// the WASM decoder from the internal details of TurboFan.
class WasmTrapHelper;
class WasmGraphBuilder {
public:
- WasmGraphBuilder(Zone* z, JSGraph* g, wasm::FunctionSig* function_signature);
+ WasmGraphBuilder(
+ Zone* z, JSGraph* g, wasm::FunctionSig* function_signature,
+ compiler::SourcePositionTable* source_position_table = nullptr);
Node** Buffer(size_t count) {
if (count > cur_bufsize_) {
@@ -78,17 +93,20 @@
Node* Merge(unsigned count, Node** controls);
Node* Phi(wasm::LocalType type, unsigned count, Node** vals, Node* control);
Node* EffectPhi(unsigned count, Node** effects, Node* control);
+ Node* NumberConstant(int32_t value);
Node* Int32Constant(int32_t value);
Node* Int64Constant(int64_t value);
Node* Float32Constant(float value);
Node* Float64Constant(double value);
- Node* Constant(Handle<Object> value);
- Node* Binop(wasm::WasmOpcode opcode, Node* left, Node* right);
- Node* Unop(wasm::WasmOpcode opcode, Node* input);
+ Node* HeapConstant(Handle<HeapObject> value);
+ Node* Binop(wasm::WasmOpcode opcode, Node* left, Node* right,
+ wasm::WasmCodePosition position = wasm::kNoCodePosition);
+ Node* Unop(wasm::WasmOpcode opcode, Node* input,
+ wasm::WasmCodePosition position = wasm::kNoCodePosition);
unsigned InputCount(Node* node);
bool IsPhiWithMerge(Node* phi, Node* merge);
void AppendToMerge(Node* merge, Node* from);
- void AppendToPhi(Node* merge, Node* phi, Node* from);
+ void AppendToPhi(Node* phi, Node* from);
//-----------------------------------------------------------------------
// Operations that read and/or write {control} and {effect}.
@@ -99,14 +117,18 @@
Node* IfDefault(Node* sw);
Node* Return(unsigned count, Node** vals);
Node* ReturnVoid();
- Node* Unreachable();
+ Node* Unreachable(wasm::WasmCodePosition position);
- Node* CallDirect(uint32_t index, Node** args);
- Node* CallImport(uint32_t index, Node** args);
- Node* CallIndirect(uint32_t index, Node** args);
+ Node* CallDirect(uint32_t index, Node** args,
+ wasm::WasmCodePosition position);
+ Node* CallImport(uint32_t index, Node** args,
+ wasm::WasmCodePosition position);
+ Node* CallIndirect(uint32_t index, Node** args,
+ wasm::WasmCodePosition position);
void BuildJSToWasmWrapper(Handle<Code> wasm_code, wasm::FunctionSig* sig);
void BuildWasmToJSWrapper(Handle<JSFunction> function,
wasm::FunctionSig* sig);
+
Node* ToJS(Node* node, Node* context, wasm::LocalType type);
Node* FromJS(Node* node, Node* context, wasm::LocalType type);
Node* Invert(Node* node);
@@ -119,8 +141,9 @@
Node* LoadGlobal(uint32_t index);
Node* StoreGlobal(uint32_t index, Node* val);
Node* LoadMem(wasm::LocalType type, MachineType memtype, Node* index,
- uint32_t offset);
- Node* StoreMem(MachineType type, Node* index, uint32_t offset, Node* val);
+ uint32_t offset, wasm::WasmCodePosition position);
+ Node* StoreMem(MachineType type, Node* index, uint32_t offset, Node* val,
+ wasm::WasmCodePosition position);
static void PrintDebugName(Node* node);
@@ -137,6 +160,8 @@
void Int64LoweringForTesting();
+ void SetSourcePosition(Node* node, wasm::WasmCodePosition position);
+
private:
static const int kDefaultBufferSize = 16;
friend class WasmTrapHelper;
@@ -155,6 +180,9 @@
WasmTrapHelper* trap_;
wasm::FunctionSig* function_signature_;
+ SetOncePointer<const Operator> allocate_heap_number_operator_;
+
+ compiler::SourcePositionTable* source_position_table_ = nullptr;
// Internal helper methods.
JSGraph* jsgraph() { return jsgraph_; }
@@ -162,13 +190,15 @@
Node* String(const char* string);
Node* MemBuffer(uint32_t offset);
- void BoundsCheckMem(MachineType memtype, Node* index, uint32_t offset);
+ void BoundsCheckMem(MachineType memtype, Node* index, uint32_t offset,
+ wasm::WasmCodePosition position);
Node* MaskShiftCount32(Node* node);
Node* MaskShiftCount64(Node* node);
Node* BuildCCall(MachineSignature* sig, Node** args);
- Node* BuildWasmCall(wasm::FunctionSig* sig, Node** args);
+ Node* BuildWasmCall(wasm::FunctionSig* sig, Node** args,
+ wasm::WasmCodePosition position);
Node* BuildF32Neg(Node* input);
Node* BuildF64Neg(Node* input);
@@ -178,14 +208,17 @@
Node* BuildF32Max(Node* left, Node* right);
Node* BuildF64Min(Node* left, Node* right);
Node* BuildF64Max(Node* left, Node* right);
- Node* BuildI32SConvertF32(Node* input);
- Node* BuildI32SConvertF64(Node* input);
- Node* BuildI32UConvertF32(Node* input);
- Node* BuildI32UConvertF64(Node* input);
+ Node* BuildI32SConvertF32(Node* input, wasm::WasmCodePosition position);
+ Node* BuildI32SConvertF64(Node* input, wasm::WasmCodePosition position);
+ Node* BuildI32UConvertF32(Node* input, wasm::WasmCodePosition position);
+ Node* BuildI32UConvertF64(Node* input, wasm::WasmCodePosition position);
Node* BuildI32Ctz(Node* input);
Node* BuildI32Popcnt(Node* input);
Node* BuildI64Ctz(Node* input);
Node* BuildI64Popcnt(Node* input);
+ Node* BuildBitCountingCall(Node* input, ExternalReference ref,
+ MachineRepresentation input_type);
+
Node* BuildCFuncInstruction(ExternalReference ref, MachineType type,
Node* input0, Node* input1 = nullptr);
Node* BuildF32Trunc(Node* input);
@@ -223,23 +256,52 @@
Node* BuildFloatToIntConversionInstruction(
Node* input, ExternalReference ref,
MachineRepresentation parameter_representation,
- const MachineType result_type);
- Node* BuildI64SConvertF32(Node* input);
- Node* BuildI64UConvertF32(Node* input);
- Node* BuildI64SConvertF64(Node* input);
- Node* BuildI64UConvertF64(Node* input);
+ const MachineType result_type, wasm::WasmCodePosition position);
+ Node* BuildI64SConvertF32(Node* input, wasm::WasmCodePosition position);
+ Node* BuildI64UConvertF32(Node* input, wasm::WasmCodePosition position);
+ Node* BuildI64SConvertF64(Node* input, wasm::WasmCodePosition position);
+ Node* BuildI64UConvertF64(Node* input, wasm::WasmCodePosition position);
- Node* BuildI32DivS(Node* left, Node* right);
- Node* BuildI32RemS(Node* left, Node* right);
- Node* BuildI32DivU(Node* left, Node* right);
- Node* BuildI32RemU(Node* left, Node* right);
+ Node* BuildI32DivS(Node* left, Node* right, wasm::WasmCodePosition position);
+ Node* BuildI32RemS(Node* left, Node* right, wasm::WasmCodePosition position);
+ Node* BuildI32DivU(Node* left, Node* right, wasm::WasmCodePosition position);
+ Node* BuildI32RemU(Node* left, Node* right, wasm::WasmCodePosition position);
- Node* BuildI64DivS(Node* left, Node* right);
- Node* BuildI64RemS(Node* left, Node* right);
- Node* BuildI64DivU(Node* left, Node* right);
- Node* BuildI64RemU(Node* left, Node* right);
+ Node* BuildI64DivS(Node* left, Node* right, wasm::WasmCodePosition position);
+ Node* BuildI64RemS(Node* left, Node* right, wasm::WasmCodePosition position);
+ Node* BuildI64DivU(Node* left, Node* right, wasm::WasmCodePosition position);
+ Node* BuildI64RemU(Node* left, Node* right, wasm::WasmCodePosition position);
Node* BuildDiv64Call(Node* left, Node* right, ExternalReference ref,
- MachineType result_type, int trap_zero);
+ MachineType result_type, int trap_zero,
+ wasm::WasmCodePosition position);
+
+ Node* BuildJavaScriptToNumber(Node* node, Node* context, Node* effect,
+ Node* control);
+ Node* BuildChangeInt32ToTagged(Node* value);
+ Node* BuildChangeFloat64ToTagged(Node* value);
+ Node* BuildChangeTaggedToFloat64(Node* value);
+
+ Node* BuildChangeInt32ToSmi(Node* value);
+ Node* BuildChangeSmiToInt32(Node* value);
+ Node* BuildChangeSmiToFloat64(Node* value);
+ Node* BuildTestNotSmi(Node* value);
+ Node* BuildSmiShiftBitsConstant();
+
+ Node* BuildAllocateHeapNumberWithValue(Node* value, Node* control);
+ Node* BuildLoadHeapNumberValue(Node* value, Node* control);
+ Node* BuildHeapNumberValueIndexConstant();
+
+ // Asm.js specific functionality.
+ Node* BuildI32AsmjsSConvertF32(Node* input);
+ Node* BuildI32AsmjsSConvertF64(Node* input);
+ Node* BuildI32AsmjsUConvertF32(Node* input);
+ Node* BuildI32AsmjsUConvertF64(Node* input);
+ Node* BuildI32AsmjsDivS(Node* left, Node* right);
+ Node* BuildI32AsmjsRemS(Node* left, Node* right);
+ Node* BuildI32AsmjsDivU(Node* left, Node* right);
+ Node* BuildI32AsmjsRemU(Node* left, Node* right);
+ Node* BuildAsmjsLoadMem(MachineType type, Node* index);
+ Node* BuildAsmjsStoreMem(MachineType type, Node* index, Node* val);
Node** Realloc(Node** buffer, size_t old_count, size_t new_count) {
Node** buf = Buffer(new_count);