aboutsummaryrefslogtreecommitdiff
path: root/deps/v8/src/assembler.cc
diff options
context:
space:
mode:
authorMichaƫl Zasso <targos@protonmail.com>2018-01-24 20:16:06 +0100
committerMyles Borins <mylesborins@google.com>2018-01-24 15:02:20 -0800
commit4c4af643e5042d615a60c6bbc05aee9d81b903e5 (patch)
tree3fb0a97988fe4439ae3ae06f26915d1dcf8cab92 /deps/v8/src/assembler.cc
parentfa9f31a4fda5a3782c652e56e394465805ebb50f (diff)
downloadandroid-node-v8-4c4af643e5042d615a60c6bbc05aee9d81b903e5.tar.gz
android-node-v8-4c4af643e5042d615a60c6bbc05aee9d81b903e5.tar.bz2
android-node-v8-4c4af643e5042d615a60c6bbc05aee9d81b903e5.zip
deps: update V8 to 6.4.388.40
PR-URL: https://github.com/nodejs/node/pull/17489 Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Myles Borins <myles.borins@gmail.com> Reviewed-By: Ali Ijaz Sheikh <ofrobots@google.com>
Diffstat (limited to 'deps/v8/src/assembler.cc')
-rw-r--r--deps/v8/src/assembler.cc126
1 files changed, 72 insertions, 54 deletions
diff --git a/deps/v8/src/assembler.cc b/deps/v8/src/assembler.cc
index b36c494129..90d7ac3ff8 100644
--- a/deps/v8/src/assembler.cc
+++ b/deps/v8/src/assembler.cc
@@ -163,9 +163,9 @@ AssemblerBase::AssemblerBase(IsolateData isolate_data, void* buffer,
predictable_code_size_(false),
constant_pool_available_(false),
jump_optimization_info_(nullptr) {
- own_buffer_ = buffer == NULL;
+ own_buffer_ = buffer == nullptr;
if (buffer_size == 0) buffer_size = kMinimalBufferSize;
- DCHECK(buffer_size > 0);
+ DCHECK_GT(buffer_size, 0);
if (own_buffer_) buffer = NewArray<byte>(buffer_size);
buffer_ = static_cast<byte*>(buffer);
buffer_size_ = buffer_size;
@@ -313,24 +313,20 @@ void RelocInfo::set_global_handle(Isolate* isolate, Address address,
set_embedded_address(isolate, address, icache_flush_mode);
}
-Address RelocInfo::global_handle() const {
- DCHECK_EQ(rmode_, WASM_GLOBAL_HANDLE);
- return embedded_address();
+Address RelocInfo::wasm_call_address() const {
+ DCHECK_EQ(rmode_, WASM_CALL);
+ return Assembler::target_address_at(pc_, constant_pool_);
}
-void RelocInfo::update_wasm_global_reference(
- Isolate* isolate, Address old_base, Address new_base,
- ICacheFlushMode icache_flush_mode) {
- DCHECK(IsWasmGlobalReference(rmode_));
- Address updated_reference;
- DCHECK_LE(old_base, wasm_global_reference());
- updated_reference = new_base + (wasm_global_reference() - old_base);
- DCHECK_LE(new_base, updated_reference);
- set_embedded_address(isolate, updated_reference, icache_flush_mode);
+void RelocInfo::set_wasm_call_address(Isolate* isolate, Address address,
+ ICacheFlushMode icache_flush_mode) {
+ DCHECK_EQ(rmode_, WASM_CALL);
+ Assembler::set_target_address_at(isolate, pc_, constant_pool_, address,
+ icache_flush_mode);
}
-Address RelocInfo::wasm_global_reference() const {
- DCHECK(IsWasmGlobalReference(rmode_));
+Address RelocInfo::global_handle() const {
+ DCHECK_EQ(rmode_, WASM_GLOBAL_HANDLE);
return embedded_address();
}
@@ -354,10 +350,10 @@ void RelocInfo::update_wasm_function_table_size_reference(
void RelocInfo::set_target_address(Isolate* isolate, Address target,
WriteBarrierMode write_barrier_mode,
ICacheFlushMode icache_flush_mode) {
- DCHECK(IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_));
+ DCHECK(IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_) || IsWasmCall(rmode_));
Assembler::set_target_address_at(isolate, pc_, host_, target,
icache_flush_mode);
- if (write_barrier_mode == UPDATE_WRITE_BARRIER && host() != NULL &&
+ if (write_barrier_mode == UPDATE_WRITE_BARRIER && host() != nullptr &&
IsCodeTarget(rmode_)) {
Code* target_code = Code::GetCodeFromTargetAddress(target);
host()->GetHeap()->incremental_marking()->RecordWriteIntoCode(host(), this,
@@ -372,7 +368,7 @@ uint32_t RelocInfoWriter::WriteLongPCJump(uint32_t pc_delta) {
if (is_uintn(pc_delta, kSmallPCDeltaBits)) return pc_delta;
WriteMode(RelocInfo::PC_JUMP);
uint32_t pc_jump = pc_delta >> kSmallPCDeltaBits;
- DCHECK(pc_jump > 0);
+ DCHECK_GT(pc_jump, 0);
// Write kChunkBits size chunks of the pc_jump.
for (; pc_jump > 0; pc_jump = pc_jump >> kChunkBits) {
byte b = pc_jump & kChunkMask;
@@ -428,7 +424,7 @@ void RelocInfoWriter::Write(const RelocInfo* rinfo) {
byte* begin_pos = pos_;
#endif
DCHECK(rinfo->rmode() < RelocInfo::NUMBER_OF_MODES);
- DCHECK(rinfo->pc() - last_pc_ >= 0);
+ DCHECK_GE(rinfo->pc() - last_pc_, 0);
// Use unsigned delta-encoding for pc.
uint32_t pc_delta = static_cast<uint32_t>(rinfo->pc() - last_pc_);
@@ -437,7 +433,7 @@ void RelocInfoWriter::Write(const RelocInfo* rinfo) {
WriteShortTaggedPC(pc_delta, kEmbeddedObjectTag);
} else if (rmode == RelocInfo::CODE_TARGET) {
WriteShortTaggedPC(pc_delta, kCodeTargetTag);
- DCHECK(begin_pos - pos_ <= RelocInfo::kMaxCallSize);
+ DCHECK_LE(begin_pos - pos_, RelocInfo::kMaxCallSize);
} else if (rmode == RelocInfo::DEOPT_REASON) {
DCHECK(rinfo->data() < (1 << kBitsPerByte));
WriteShortTaggedPC(pc_delta, kLocatableTag);
@@ -448,15 +444,14 @@ void RelocInfoWriter::Write(const RelocInfo* rinfo) {
WriteData(rinfo->data());
} else if (RelocInfo::IsConstPool(rmode) ||
RelocInfo::IsVeneerPool(rmode) || RelocInfo::IsDeoptId(rmode) ||
- RelocInfo::IsDeoptPosition(rmode) ||
- RelocInfo::IsWasmProtectedLanding(rmode)) {
+ RelocInfo::IsDeoptPosition(rmode)) {
WriteIntData(static_cast<int>(rinfo->data()));
}
}
last_pc_ = rinfo->pc();
last_mode_ = rmode;
#ifdef DEBUG
- DCHECK(begin_pos - pos_ <= kMaxSize);
+ DCHECK_LE(begin_pos - pos_, kMaxSize);
#endif
}
@@ -536,7 +531,7 @@ void RelocIterator::next() {
return;
}
} else {
- DCHECK(tag == kDefaultTag);
+ DCHECK_EQ(tag, kDefaultTag);
RelocInfo::Mode rmode = GetMode();
if (rmode == RelocInfo::PC_JUMP) {
AdvanceReadLongPCJump();
@@ -551,8 +546,7 @@ void RelocIterator::next() {
} else if (RelocInfo::IsConstPool(rmode) ||
RelocInfo::IsVeneerPool(rmode) ||
RelocInfo::IsDeoptId(rmode) ||
- RelocInfo::IsDeoptPosition(rmode) ||
- RelocInfo::IsWasmProtectedLanding(rmode)) {
+ RelocInfo::IsDeoptPosition(rmode)) {
if (SetMode(rmode)) {
AdvanceReadInt();
return;
@@ -571,6 +565,7 @@ RelocIterator::RelocIterator(Code* code, int mode_mask) {
rinfo_.host_ = code;
rinfo_.pc_ = code->instruction_start();
rinfo_.data_ = 0;
+ rinfo_.constant_pool_ = code->constant_pool();
// Relocation info is read backwards.
pos_ = code->relocation_start() + code->relocation_size();
end_ = code->relocation_start();
@@ -592,6 +587,21 @@ RelocIterator::RelocIterator(const CodeDesc& desc, int mode_mask) {
next();
}
+RelocIterator::RelocIterator(Vector<byte> instructions,
+ Vector<const byte> reloc_info, Address const_pool,
+ int mode_mask) {
+ rinfo_.pc_ = instructions.start();
+ rinfo_.data_ = 0;
+ rinfo_.constant_pool_ = const_pool;
+ // Relocation info is read backwards.
+ pos_ = reloc_info.start() + reloc_info.size();
+ end_ = reloc_info.start();
+ done_ = false;
+ mode_mask_ = mode_mask;
+ if (mode_mask_ == 0) pos_ = end_;
+ next();
+}
+
// -----------------------------------------------------------------------------
// Implementation of RelocInfo
@@ -643,14 +653,14 @@ const char* RelocInfo::RelocModeName(RelocInfo::Mode rmode) {
return "veneer pool";
case WASM_CONTEXT_REFERENCE:
return "wasm context reference";
- case WASM_GLOBAL_REFERENCE:
- return "wasm global value reference";
case WASM_FUNCTION_TABLE_SIZE_REFERENCE:
return "wasm function table size reference";
- case WASM_PROTECTED_INSTRUCTION_LANDING:
- return "wasm protected instruction landing";
case WASM_GLOBAL_HANDLE:
return "global handle";
+ case WASM_CALL:
+ return "internal wasm call";
+ case JS_TO_WASM_CALL:
+ return "js to wasm call";
case NUMBER_OF_MODES:
case PC_JUMP:
UNREACHABLE();
@@ -679,8 +689,7 @@ void RelocInfo::Print(Isolate* isolate, std::ostream& os) { // NOLINT
Code* code = Code::GetCodeFromTargetAddress(target_address());
os << " (" << Code::Kind2String(code->kind()) << ") ("
<< static_cast<const void*>(target_address()) << ")";
- } else if (IsRuntimeEntry(rmode_) &&
- isolate->deoptimizer_data() != NULL) {
+ } else if (IsRuntimeEntry(rmode_) && isolate->deoptimizer_data() != nullptr) {
// Depotimization bailouts are stored as runtime entries.
int id = Deoptimizer::GetDeoptimizationId(
isolate, target_address(), Deoptimizer::EAGER);
@@ -704,7 +713,7 @@ void RelocInfo::Verify(Isolate* isolate) {
case CODE_TARGET: {
// convert inline target address to code object
Address addr = target_address();
- CHECK(addr != NULL);
+ CHECK_NOT_NULL(addr);
// Check that we can find the right code object.
Code* code = Code::GetCodeFromTargetAddress(addr);
Object* found = isolate->FindCodeObject(addr);
@@ -731,11 +740,10 @@ void RelocInfo::Verify(Isolate* isolate) {
case CONST_POOL:
case VENEER_POOL:
case WASM_CONTEXT_REFERENCE:
- case WASM_GLOBAL_REFERENCE:
case WASM_FUNCTION_TABLE_SIZE_REFERENCE:
case WASM_GLOBAL_HANDLE:
- case WASM_PROTECTED_INSTRUCTION_LANDING:
- // TODO(eholk): make sure the protected instruction is in range.
+ case WASM_CALL:
+ case JS_TO_WASM_CALL:
case NONE32:
case NONE64:
break;
@@ -773,10 +781,9 @@ ExternalReference::ExternalReference(Address address, Isolate* isolate)
: address_(Redirect(isolate, address)) {}
ExternalReference::ExternalReference(
- ApiFunction* fun,
- Type type = ExternalReference::BUILTIN_CALL,
- Isolate* isolate = NULL)
- : address_(Redirect(isolate, fun->address(), type)) {}
+ ApiFunction* fun, Type type = ExternalReference::BUILTIN_CALL,
+ Isolate* isolate = nullptr)
+ : address_(Redirect(isolate, fun->address(), type)) {}
ExternalReference::ExternalReference(Runtime::FunctionId id, Isolate* isolate)
: ExternalReference(Runtime::FunctionForId(id), isolate) {}
@@ -853,7 +860,7 @@ ExternalReference ExternalReference::date_cache_stamp(Isolate* isolate) {
void ExternalReference::set_redirector(
Isolate* isolate, ExternalReferenceRedirector* redirector) {
// We can't stack them.
- DCHECK(isolate->external_reference_redirector() == NULL);
+ DCHECK_NULL(isolate->external_reference_redirector());
isolate->set_external_reference_redirector(
reinterpret_cast<ExternalReferenceRedirectorPointer*>(redirector));
}
@@ -862,6 +869,10 @@ ExternalReference ExternalReference::stress_deopt_count(Isolate* isolate) {
return ExternalReference(isolate->stress_deopt_count_address());
}
+ExternalReference ExternalReference::force_slow_path(Isolate* isolate) {
+ return ExternalReference(isolate->force_slow_path_address());
+}
+
ExternalReference ExternalReference::new_deoptimizer_function(
Isolate* isolate) {
return ExternalReference(
@@ -1028,7 +1039,7 @@ ExternalReference ExternalReference::wasm_clear_thread_in_wasm_flag(
static void f64_mod_wrapper(double* param0, double* param1) {
WriteDoubleValue(param0,
- modulo(ReadDoubleValue(param0), ReadDoubleValue(param1)));
+ Modulo(ReadDoubleValue(param0), ReadDoubleValue(param1)));
}
ExternalReference ExternalReference::f64_mod_wrapper_function(
@@ -1077,11 +1088,6 @@ ExternalReference ExternalReference::address_of_regexp_stack_limit(
return ExternalReference(isolate->regexp_stack()->limit_address());
}
-ExternalReference ExternalReference::address_of_regexp_dotall_flag(
- Isolate* isolate) {
- return ExternalReference(&FLAG_harmony_regexp_dotall);
-}
-
ExternalReference ExternalReference::store_buffer_top(Isolate* isolate) {
return ExternalReference(isolate->heap()->store_buffer_top_address());
}
@@ -1397,6 +1403,10 @@ ExternalReference ExternalReference::libc_memset_function(Isolate* isolate) {
return ExternalReference(Redirect(isolate, FUNCTION_ADDR(libc_memset)));
}
+ExternalReference ExternalReference::printf_function(Isolate* isolate) {
+ return ExternalReference(Redirect(isolate, FUNCTION_ADDR(std::printf)));
+}
+
template <typename SubjectChar, typename PatternChar>
ExternalReference ExternalReference::search_string_raw(Isolate* isolate) {
auto f = SearchStringRaw<SubjectChar, PatternChar>;
@@ -1415,6 +1425,13 @@ ExternalReference ExternalReference::get_or_create_hash_raw(Isolate* isolate) {
return ExternalReference(Redirect(isolate, FUNCTION_ADDR(f)));
}
+ExternalReference ExternalReference::jsreceiver_create_identity_hash(
+ Isolate* isolate) {
+ typedef Smi* (*CreateIdentityHash)(Isolate * isolate, JSReceiver * key);
+ CreateIdentityHash f = JSReceiver::CreateIdentityHash;
+ return ExternalReference(Redirect(isolate, FUNCTION_ADDR(f)));
+}
+
ExternalReference
ExternalReference::copy_fast_number_jsarray_elements_to_typed_array(
Isolate* isolate) {
@@ -1542,6 +1559,8 @@ double power_double_double(double x, double y) {
return Pow(x, y);
}
+double modulo_double_double(double x, double y) { return Modulo(x, y); }
+
ExternalReference ExternalReference::power_double_double_function(
Isolate* isolate) {
return ExternalReference(Redirect(isolate,
@@ -1551,9 +1570,8 @@ ExternalReference ExternalReference::power_double_double_function(
ExternalReference ExternalReference::mod_two_doubles_operation(
Isolate* isolate) {
- return ExternalReference(Redirect(isolate,
- FUNCTION_ADDR(modulo),
- BUILTIN_FP_FP_CALL));
+ return ExternalReference(Redirect(
+ isolate, FUNCTION_ADDR(modulo_double_double), BUILTIN_FP_FP_CALL));
}
ExternalReference ExternalReference::debug_last_step_action_address(
@@ -1685,7 +1703,7 @@ void ConstantPoolBuilder::EmitSharedEntries(Assembler* assm,
std::vector<ConstantPoolEntry>& shared_entries = info.shared_entries;
const int entry_size = ConstantPoolEntry::size(type);
int base = emitted_label_.pos();
- DCHECK(base > 0);
+ DCHECK_GT(base, 0);
int shared_end = static_cast<int>(shared_entries.size());
std::vector<ConstantPoolEntry>::iterator shared_it = shared_entries.begin();
for (int i = 0; i < shared_end; i++, shared_it++) {
@@ -1713,7 +1731,7 @@ void ConstantPoolBuilder::EmitGroup(Assembler* assm,
std::vector<ConstantPoolEntry>& shared_entries = info.shared_entries;
const int entry_size = ConstantPoolEntry::size(type);
int base = emitted_label_.pos();
- DCHECK(base > 0);
+ DCHECK_GT(base, 0);
int begin;
int end;
@@ -1842,7 +1860,7 @@ void SetUpJSCallerSavedCodeData() {
for (int r = 0; r < kNumRegs; r++)
if ((kJSCallerSaved & (1 << r)) != 0) caller_saved_codes[i++] = r;
- DCHECK(i == kNumJSCallerSaved);
+ DCHECK_EQ(i, kNumJSCallerSaved);
}
int JSCallerSavedCode(int n) {