diff options
author | Michaël Zasso <targos@protonmail.com> | 2019-08-16 11:32:46 +0200 |
---|---|---|
committer | Michaël Zasso <targos@protonmail.com> | 2019-08-19 09:25:23 +0200 |
commit | e31f0a7d25668d3c1531294d2ef44a9f3bde4ef4 (patch) | |
tree | 6c6bed9804be9df6162b2483f0a56f371f66464d /deps/v8/src/diagnostics | |
parent | ec16fdae540adaf710b1a86c620170b2880088f0 (diff) | |
download | android-node-v8-e31f0a7d25668d3c1531294d2ef44a9f3bde4ef4.tar.gz android-node-v8-e31f0a7d25668d3c1531294d2ef44a9f3bde4ef4.tar.bz2 android-node-v8-e31f0a7d25668d3c1531294d2ef44a9f3bde4ef4.zip |
deps: update V8 to 7.7.299.4
PR-URL: https://github.com/nodejs/node/pull/28918
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Jiawen Geng <technicalcute@gmail.com>
Reviewed-By: Rich Trott <rtrott@gmail.com>
Diffstat (limited to 'deps/v8/src/diagnostics')
-rw-r--r-- | deps/v8/src/diagnostics/DEPS | 3 | ||||
-rw-r--r-- | deps/v8/src/diagnostics/eh-frame.cc | 8 | ||||
-rw-r--r-- | deps/v8/src/diagnostics/eh-frame.h | 14 | ||||
-rw-r--r-- | deps/v8/src/diagnostics/gdb-jit.cc | 87 | ||||
-rw-r--r-- | deps/v8/src/diagnostics/ia32/disasm-ia32.cc | 124 | ||||
-rw-r--r-- | deps/v8/src/diagnostics/objects-debug.cc | 294 | ||||
-rw-r--r-- | deps/v8/src/diagnostics/objects-printer.cc | 82 | ||||
-rw-r--r-- | deps/v8/src/diagnostics/unwinding-info-win64.cc | 31 | ||||
-rw-r--r-- | deps/v8/src/diagnostics/x64/disasm-x64.cc | 108 |
9 files changed, 369 insertions, 382 deletions
diff --git a/deps/v8/src/diagnostics/DEPS b/deps/v8/src/diagnostics/DEPS new file mode 100644 index 0000000000..27782f9ecd --- /dev/null +++ b/deps/v8/src/diagnostics/DEPS @@ -0,0 +1,3 @@ +include_rules = [ + "+src/compiler/node.h", +] diff --git a/deps/v8/src/diagnostics/eh-frame.cc b/deps/v8/src/diagnostics/eh-frame.cc index e19e09f332..45d693a476 100644 --- a/deps/v8/src/diagnostics/eh-frame.cc +++ b/deps/v8/src/diagnostics/eh-frame.cc @@ -582,7 +582,8 @@ void EhFrameDisassembler::DumpDwarfDirectives(std::ostream& stream, // NOLINT void EhFrameDisassembler::DisassembleToStream(std::ostream& stream) { // NOLINT // The encoded CIE size does not include the size field itself. const int cie_size = - ReadUnalignedUInt32(reinterpret_cast<Address>(start_)) + kInt32Size; + base::ReadUnalignedValue<uint32_t>(reinterpret_cast<Address>(start_)) + + kInt32Size; const int fde_offset = cie_size; const byte* cie_directives_start = @@ -597,12 +598,13 @@ void EhFrameDisassembler::DisassembleToStream(std::ostream& stream) { // NOLINT reinterpret_cast<Address>(start_) + fde_offset + EhFrameConstants::kProcedureAddressOffsetInFde; int32_t procedure_offset = - ReadUnalignedValue<int32_t>(procedure_offset_address); + base::ReadUnalignedValue<int32_t>(procedure_offset_address); Address procedure_size_address = reinterpret_cast<Address>(start_) + fde_offset + EhFrameConstants::kProcedureSizeOffsetInFde; - uint32_t procedure_size = ReadUnalignedUInt32(procedure_size_address); + uint32_t procedure_size = + base::ReadUnalignedValue<uint32_t>(procedure_size_address); const byte* fde_start = start_ + fde_offset; stream << reinterpret_cast<const void*>(fde_start) << " .eh_frame: FDE\n" diff --git a/deps/v8/src/diagnostics/eh-frame.h b/deps/v8/src/diagnostics/eh-frame.h index 8b78b04b16..a9d76a2743 100644 --- a/deps/v8/src/diagnostics/eh-frame.h +++ b/deps/v8/src/diagnostics/eh-frame.h @@ -6,9 +6,9 @@ #define V8_DIAGNOSTICS_EH_FRAME_H_ #include "src/base/compiler-specific.h" +#include "src/base/memory.h" #include "src/codegen/register-arch.h" #include "src/common/globals.h" -#include "src/common/v8memory.h" #include "src/zone/zone-containers.h" namespace v8 { @@ -144,11 +144,11 @@ class V8_EXPORT_PRIVATE EhFrameWriter { } void PatchInt32(int base_offset, uint32_t value) { DCHECK_EQ( - ReadUnalignedUInt32(reinterpret_cast<Address>(eh_frame_buffer_.data()) + - base_offset), + base::ReadUnalignedValue<uint32_t>( + reinterpret_cast<Address>(eh_frame_buffer_.data()) + base_offset), kInt32Placeholder); DCHECK_LT(base_offset + kInt32Size, eh_frame_offset()); - WriteUnalignedUInt32( + base::WriteUnalignedValue<uint32_t>( reinterpret_cast<Address>(eh_frame_buffer_.data()) + base_offset, value); } @@ -216,7 +216,9 @@ class V8_EXPORT_PRIVATE EhFrameIterator { void SkipCie() { DCHECK_EQ(next_, start_); - next_ += ReadUnalignedUInt32(reinterpret_cast<Address>(next_)) + kInt32Size; + next_ += + base::ReadUnalignedValue<uint32_t>(reinterpret_cast<Address>(next_)) + + kInt32Size; } void SkipToFdeDirectives() { @@ -267,7 +269,7 @@ class V8_EXPORT_PRIVATE EhFrameIterator { T GetNextValue() { T result; DCHECK_LE(next_ + sizeof(result), end_); - result = ReadUnalignedValue<T>(reinterpret_cast<Address>(next_)); + result = base::ReadUnalignedValue<T>(reinterpret_cast<Address>(next_)); next_ += sizeof(result); return result; } diff --git a/deps/v8/src/diagnostics/gdb-jit.cc b/deps/v8/src/diagnostics/gdb-jit.cc index 70fd9fb06d..e1290bae4e 100644 --- a/deps/v8/src/diagnostics/gdb-jit.cc +++ b/deps/v8/src/diagnostics/gdb-jit.cc @@ -4,6 +4,7 @@ #include "src/diagnostics/gdb-jit.h" +#include <map> #include <memory> #include <vector> @@ -17,7 +18,6 @@ #include "src/objects/objects.h" #include "src/snapshot/natives.h" #include "src/utils/ostreams.h" -#include "src/utils/splay-tree-inl.h" #include "src/utils/vector.h" #include "src/zone/zone-chunk-list.h" @@ -1822,23 +1822,24 @@ struct AddressRange { Address end; }; -struct SplayTreeConfig { +struct AddressRangeLess { + bool operator()(const AddressRange& a, const AddressRange& b) const { + if (a.start == b.start) return a.end < b.end; + return a.start < b.start; + } +}; + +struct CodeMapConfig { using Key = AddressRange; using Value = JITCodeEntry*; - static const AddressRange kNoKey; - static Value NoValue() { return nullptr; } - static int Compare(const AddressRange& a, const AddressRange& b) { - // ptrdiff_t probably doesn't fit in an int. - if (a.start < b.start) return -1; - if (a.start == b.start) return 0; - return 1; - } + using Less = AddressRangeLess; }; -const AddressRange SplayTreeConfig::kNoKey = {0, 0}; -using CodeMap = SplayTree<SplayTreeConfig>; +using CodeMap = + std::map<CodeMapConfig::Key, CodeMapConfig::Value, CodeMapConfig::Less>; static CodeMap* GetCodeMap() { + // TODO(jgruber): Don't leak. static CodeMap* code_map = nullptr; if (code_map == nullptr) code_map = new CodeMap(); return code_map; @@ -1909,37 +1910,49 @@ static void AddUnwindInfo(CodeDescription* desc) { static base::LazyMutex mutex = LAZY_MUTEX_INITIALIZER; -// Remove entries from the splay tree that intersect the given address range, +// Remove entries from the map that intersect the given address range, // and deregister them from GDB. static void RemoveJITCodeEntries(CodeMap* map, const AddressRange& range) { DCHECK(range.start < range.end); - CodeMap::Locator cur; - if (map->FindGreatestLessThan(range, &cur) || map->FindLeast(&cur)) { - // Skip entries that are entirely less than the range of interest. - while (cur.key().end <= range.start) { - // CodeMap::FindLeastGreaterThan succeeds for entries whose key is greater - // than _or equal to_ the given key, so we have to advance our key to get - // the next one. - AddressRange new_key; - new_key.start = cur.key().end; - new_key.end = 0; - if (!map->FindLeastGreaterThan(new_key, &cur)) return; - } - // Evict intersecting ranges. - while (cur.key().start < range.end) { - AddressRange old_range = cur.key(); - JITCodeEntry* old_entry = cur.value(); - UnregisterCodeEntry(old_entry); - DestroyCodeEntry(old_entry); + if (map->empty()) return; + + // Find the first overlapping entry. - CHECK(map->Remove(old_range)); - if (!map->FindLeastGreaterThan(old_range, &cur)) return; + // If successful, points to the first element not less than `range`. The + // returned iterator has the key in `first` and the value in `second`. + auto it = map->lower_bound(range); + auto start_it = it; + + if (it == map->end()) { + start_it = map->begin(); + } else if (it != map->begin()) { + for (--it; it != map->begin(); --it) { + if ((*it).first.end <= range.start) break; + start_it = it; } } + + DCHECK(start_it != map->end()); + + // Find the first non-overlapping entry after `range`. + + const auto end_it = map->lower_bound({range.end, 0}); + + // Evict intersecting ranges. + + if (std::distance(start_it, end_it) < 1) return; // No overlapping entries. + + for (auto it = start_it; it != end_it; it++) { + JITCodeEntry* old_entry = (*it).second; + UnregisterCodeEntry(old_entry); + DestroyCodeEntry(old_entry); + } + + map->erase(start_it, end_it); } -// Insert the entry into the splay tree and register it with GDB. +// Insert the entry into the map and register it with GDB. static void AddJITCodeEntry(CodeMap* map, const AddressRange& range, JITCodeEntry* entry, bool dump_if_enabled, const char* name_hint) { @@ -1956,9 +1969,9 @@ static void AddJITCodeEntry(CodeMap* map, const AddressRange& range, } #endif - CodeMap::Locator cur; - CHECK(map->Insert(range, &cur)); - cur.set_value(entry); + auto result = map->emplace(range, entry); + DCHECK(result.second); // Insertion happened. + USE(result); RegisterCodeEntry(entry); } diff --git a/deps/v8/src/diagnostics/ia32/disasm-ia32.cc b/deps/v8/src/diagnostics/ia32/disasm-ia32.cc index 534898fdf5..e8c9588bbe 100644 --- a/deps/v8/src/diagnostics/ia32/disasm-ia32.cc +++ b/deps/v8/src/diagnostics/ia32/disasm-ia32.cc @@ -184,6 +184,24 @@ void InstructionTable::AddJumpConditionalShort() { } } +namespace { +int8_t Imm8(const uint8_t* data) { + return *reinterpret_cast<const int8_t*>(data); +} +uint8_t Imm8_U(const uint8_t* data) { + return *reinterpret_cast<const uint8_t*>(data); +} +int16_t Imm16(const uint8_t* data) { + return *reinterpret_cast<const int16_t*>(data); +} +uint16_t Imm16_U(const uint8_t* data) { + return *reinterpret_cast<const uint16_t*>(data); +} +int32_t Imm32(const uint8_t* data) { + return *reinterpret_cast<const int32_t*>(data); +} +} // namespace + // The IA32 disassembler implementation. class DisassemblerIA32 { public: @@ -373,8 +391,7 @@ int DisassemblerIA32::PrintRightOperandHelper( switch (mod) { case 0: if (rm == ebp) { - int32_t disp = *reinterpret_cast<int32_t*>(modrmp + 1); - AppendToBuffer("[0x%x]", disp); + AppendToBuffer("[0x%x]", Imm32(modrmp + 1)); return 5; } else if (rm == esp) { byte sib = *(modrmp + 1); @@ -384,7 +401,7 @@ int DisassemblerIA32::PrintRightOperandHelper( AppendToBuffer("[%s]", (this->*register_name)(rm)); return 2; } else if (base == ebp) { - int32_t disp = *reinterpret_cast<int32_t*>(modrmp + 2); + int32_t disp = Imm32(modrmp + 2); AppendToBuffer("[%s*%d%s0x%x]", (this->*register_name)(index), 1 << scale, disp < 0 ? "-" : "+", disp < 0 ? -disp : disp); @@ -409,8 +426,7 @@ int DisassemblerIA32::PrintRightOperandHelper( byte sib = *(modrmp + 1); int scale, index, base; get_sib(sib, &scale, &index, &base); - int disp = mod == 2 ? *reinterpret_cast<int32_t*>(modrmp + 2) - : *reinterpret_cast<int8_t*>(modrmp + 2); + int disp = mod == 2 ? Imm32(modrmp + 2) : Imm8(modrmp + 2); if (index == base && index == rm /*esp*/ && scale == 0 /*times_1*/) { AppendToBuffer("[%s%s0x%x]", (this->*register_name)(rm), disp < 0 ? "-" : "+", disp < 0 ? -disp : disp); @@ -422,8 +438,7 @@ int DisassemblerIA32::PrintRightOperandHelper( return mod == 2 ? 6 : 3; } else { // No sib. - int disp = mod == 2 ? *reinterpret_cast<int32_t*>(modrmp + 1) - : *reinterpret_cast<int8_t*>(modrmp + 1); + int disp = mod == 2 ? Imm32(modrmp + 1) : Imm8(modrmp + 1); AppendToBuffer("[%s%s0x%x]", (this->*register_name)(rm), disp < 0 ? "-" : "+", disp < 0 ? -disp : disp); return mod == 2 ? 5 : 2; @@ -517,7 +532,7 @@ int DisassemblerIA32::PrintImmediateOp(byte* data) { AppendToBuffer(",0x%x", *(data + 1 + count)); return 1 + count + 1 /*int8*/; } else { - AppendToBuffer(",0x%x", *reinterpret_cast<int32_t*>(data + 1 + count)); + AppendToBuffer(",0x%x", Imm32(data + 1 + count)); return 1 + count + 4 /*int32_t*/; } } @@ -557,7 +572,7 @@ int DisassemblerIA32::F7Instruction(byte* data) { AppendToBuffer("%s ", mnem); int count = PrintRightOperand(data); if (regop == 0) { - AppendToBuffer(",0x%x", *reinterpret_cast<int32_t*>(data + count)); + AppendToBuffer(",0x%x", Imm32(data + count)); count += 4; } return 1 + count; @@ -627,7 +642,7 @@ int DisassemblerIA32::JumpShort(byte* data) { int DisassemblerIA32::JumpConditional(byte* data, const char* comment) { DCHECK_EQ(0x0F, *data); byte cond = *(data + 1) & 0x0F; - byte* dest = data + *reinterpret_cast<int32_t*>(data + 2) + 6; + byte* dest = data + Imm32(data + 2) + 6; const char* mnem = jump_conditional_mnem[cond]; AppendToBuffer("%s %s", mnem, NameOfAddress(dest)); if (comment != nullptr) { @@ -775,56 +790,53 @@ int DisassemblerIA32::AVXInstruction(byte* data) { AppendToBuffer("vpblendw %s,%s,", NameOfXMMRegister(regop), NameOfXMMRegister(vvvv)); current += PrintRightXMMOperand(current); - AppendToBuffer(",%d", *reinterpret_cast<uint8_t*>(current)); + AppendToBuffer(",%d", Imm8_U(current)); current++; break; case 0x0F: AppendToBuffer("vpalignr %s,%s,", NameOfXMMRegister(regop), NameOfXMMRegister(vvvv)); current += PrintRightXMMOperand(current); - AppendToBuffer(",%d", *reinterpret_cast<uint8_t*>(current)); + AppendToBuffer(",%d", Imm8_U(current)); current++; break; case 0x14: AppendToBuffer("vpextrb "); current += PrintRightOperand(current); - AppendToBuffer(",%s,%d", NameOfXMMRegister(regop), - *reinterpret_cast<int8_t*>(current)); + AppendToBuffer(",%s,%d", NameOfXMMRegister(regop), Imm8(current)); current++; break; case 0x15: AppendToBuffer("vpextrw "); current += PrintRightOperand(current); - AppendToBuffer(",%s,%d", NameOfXMMRegister(regop), - *reinterpret_cast<int8_t*>(current)); + AppendToBuffer(",%s,%d", NameOfXMMRegister(regop), Imm8(current)); current++; break; case 0x16: AppendToBuffer("vpextrd "); current += PrintRightOperand(current); - AppendToBuffer(",%s,%d", NameOfXMMRegister(regop), - *reinterpret_cast<int8_t*>(current)); + AppendToBuffer(",%s,%d", NameOfXMMRegister(regop), Imm8(current)); current++; break; case 0x20: AppendToBuffer("vpinsrb %s,%s,", NameOfXMMRegister(regop), NameOfXMMRegister(vvvv)); current += PrintRightOperand(current); - AppendToBuffer(",%d", *reinterpret_cast<int8_t*>(current)); + AppendToBuffer(",%d", Imm8(current)); current++; break; case 0x21: AppendToBuffer("vinsertps %s,%s,", NameOfXMMRegister(regop), NameOfXMMRegister(vvvv)); current += PrintRightXMMOperand(current); - AppendToBuffer(",%d", *reinterpret_cast<int8_t*>(current)); + AppendToBuffer(",%d", Imm8(current)); current++; break; case 0x22: AppendToBuffer("vpinsrd %s,%s,", NameOfXMMRegister(regop), NameOfXMMRegister(vvvv)); current += PrintRightOperand(current); - AppendToBuffer(",%d", *reinterpret_cast<int8_t*>(current)); + AppendToBuffer(",%d", Imm8(current)); current++; break; default: @@ -872,7 +884,7 @@ int DisassemblerIA32::AVXInstruction(byte* data) { case 0x70: AppendToBuffer("vpshuflw %s,", NameOfXMMRegister(regop)); current += PrintRightXMMOperand(current); - AppendToBuffer(",%d", *reinterpret_cast<int8_t*>(current)); + AppendToBuffer(",%d", Imm8(current)); current++; break; case 0x7C: @@ -933,7 +945,7 @@ int DisassemblerIA32::AVXInstruction(byte* data) { case 0x70: AppendToBuffer("vpshufhw %s,", NameOfXMMRegister(regop)); current += PrintRightXMMOperand(current); - AppendToBuffer(",%d", *reinterpret_cast<int8_t*>(current)); + AppendToBuffer(",%d", Imm8(current)); current++; break; case 0x7f: @@ -1173,7 +1185,7 @@ int DisassemblerIA32::AVXInstruction(byte* data) { case 0x70: AppendToBuffer("vpshufd %s,", NameOfXMMRegister(regop)); current += PrintRightXMMOperand(current); - AppendToBuffer(",%d", *reinterpret_cast<int8_t*>(current)); + AppendToBuffer(",%d", Imm8(current)); current++; break; case 0x71: @@ -1197,7 +1209,7 @@ int DisassemblerIA32::AVXInstruction(byte* data) { AppendToBuffer("vpinsrw %s,%s,", NameOfXMMRegister(regop), NameOfXMMRegister(vvvv)); current += PrintRightOperand(current); - AppendToBuffer(",%d", *reinterpret_cast<int8_t*>(current)); + AppendToBuffer(",%d", Imm8(current)); current++; break; #define DECLARE_SSE_AVX_DIS_CASE(instruction, notUsed1, notUsed2, opcode) \ @@ -1615,8 +1627,7 @@ int DisassemblerIA32::InstructionDecode(v8::internal::Vector<char> out_buffer, break; case MOVE_REG_INSTR: { - byte* addr = - reinterpret_cast<byte*>(*reinterpret_cast<int32_t*>(data + 1)); + byte* addr = reinterpret_cast<byte*>(Imm32(data + 1)); AppendToBuffer("mov %s,%s", NameOfCPURegister(*data & 0x07), NameOfAddress(addr)); data += 5; @@ -1624,15 +1635,14 @@ int DisassemblerIA32::InstructionDecode(v8::internal::Vector<char> out_buffer, } case CALL_JUMP_INSTR: { - byte* addr = data + *reinterpret_cast<int32_t*>(data + 1) + 5; + byte* addr = data + Imm32(data + 1) + 5; AppendToBuffer("%s %s", idesc.mnem, NameOfAddress(addr)); data += 5; break; } case SHORT_IMMEDIATE_INSTR: { - byte* addr = - reinterpret_cast<byte*>(*reinterpret_cast<int32_t*>(data + 1)); + byte* addr = reinterpret_cast<byte*>(Imm32(data + 1)); AppendToBuffer("%s eax,%s", idesc.mnem, NameOfAddress(addr)); data += 5; break; @@ -1656,7 +1666,7 @@ int DisassemblerIA32::InstructionDecode(v8::internal::Vector<char> out_buffer, if (!processed) { switch (*data) { case 0xC2: - AppendToBuffer("ret 0x%x", *reinterpret_cast<uint16_t*>(data + 1)); + AppendToBuffer("ret 0x%x", Imm16_U(data + 1)); data += 3; break; @@ -1670,7 +1680,7 @@ int DisassemblerIA32::InstructionDecode(v8::internal::Vector<char> out_buffer, case 0x69: { data++; data += PrintOperands("imul", REG_OPER_OP_ORDER, data); - AppendToBuffer(",%d", *reinterpret_cast<int32_t*>(data)); + AppendToBuffer(",%d", Imm32(data)); data += 4; } break; @@ -1860,6 +1870,9 @@ int DisassemblerIA32::InstructionDecode(v8::internal::Vector<char> out_buffer, int mod, regop, rm; get_modrm(*data, &mod, ®op, &rm); data += PrintRightOperand(data); + } else if (f0byte == 0xAE && (data[2] & 0xF8) == 0xF0) { + AppendToBuffer("mfence"); + data += 3; } else if (f0byte == 0xAE && (data[2] & 0xF8) == 0xE8) { AppendToBuffer("lfence"); data += 3; @@ -1920,8 +1933,7 @@ int DisassemblerIA32::InstructionDecode(v8::internal::Vector<char> out_buffer, } else { AppendToBuffer("%s ", "mov"); data += PrintRightOperand(data); - int32_t imm = *reinterpret_cast<int32_t*>(data); - AppendToBuffer(",0x%x", imm); + AppendToBuffer(",0x%x", Imm32(data)); data += 4; } } break; @@ -1980,8 +1992,7 @@ int DisassemblerIA32::InstructionDecode(v8::internal::Vector<char> out_buffer, data++; AppendToBuffer("cmpw "); data += PrintRightOperand(data); - int imm = *reinterpret_cast<int16_t*>(data); - AppendToBuffer(",0x%x", imm); + AppendToBuffer(",0x%x", Imm16(data)); data += 2; } else if (*data == 0x87) { data++; @@ -2005,15 +2016,13 @@ int DisassemblerIA32::InstructionDecode(v8::internal::Vector<char> out_buffer, data++; AppendToBuffer("%s ", "mov_w"); data += PrintRightOperand(data); - int imm = *reinterpret_cast<int16_t*>(data); - AppendToBuffer(",0x%x", imm); + AppendToBuffer(",0x%x", Imm16(data)); data += 2; } else if (*data == 0xF7) { data++; AppendToBuffer("%s ", "test_w"); data += PrintRightOperand(data); - int imm = *reinterpret_cast<int16_t*>(data); - AppendToBuffer(",0x%x", imm); + AppendToBuffer(",0x%x", Imm16(data)); data += 2; } else if (*data == 0x0F) { data++; @@ -2062,7 +2071,7 @@ int DisassemblerIA32::InstructionDecode(v8::internal::Vector<char> out_buffer, get_modrm(*data, &mod, ®op, &rm); AppendToBuffer("pblendw %s,", NameOfXMMRegister(regop)); data += PrintRightXMMOperand(data); - AppendToBuffer(",%d", *reinterpret_cast<uint8_t*>(data)); + AppendToBuffer(",%d", Imm8_U(data)); data++; } else if (*data == 0x0F) { data++; @@ -2070,7 +2079,7 @@ int DisassemblerIA32::InstructionDecode(v8::internal::Vector<char> out_buffer, get_modrm(*data, &mod, ®op, &rm); AppendToBuffer("palignr %s,", NameOfXMMRegister(regop)); data += PrintRightXMMOperand(data); - AppendToBuffer(",%d", *reinterpret_cast<uint8_t*>(data)); + AppendToBuffer(",%d", Imm8_U(data)); data++; } else if (*data == 0x14) { data++; @@ -2078,8 +2087,7 @@ int DisassemblerIA32::InstructionDecode(v8::internal::Vector<char> out_buffer, get_modrm(*data, &mod, ®op, &rm); AppendToBuffer("pextrb "); data += PrintRightOperand(data); - AppendToBuffer(",%s,%d", NameOfXMMRegister(regop), - *reinterpret_cast<int8_t*>(data)); + AppendToBuffer(",%s,%d", NameOfXMMRegister(regop), Imm8(data)); data++; } else if (*data == 0x15) { data++; @@ -2087,8 +2095,7 @@ int DisassemblerIA32::InstructionDecode(v8::internal::Vector<char> out_buffer, get_modrm(*data, &mod, ®op, &rm); AppendToBuffer("pextrw "); data += PrintRightOperand(data); - AppendToBuffer(",%s,%d", NameOfXMMRegister(regop), - *reinterpret_cast<int8_t*>(data)); + AppendToBuffer(",%s,%d", NameOfXMMRegister(regop), Imm8(data)); data++; } else if (*data == 0x16) { data++; @@ -2096,8 +2103,7 @@ int DisassemblerIA32::InstructionDecode(v8::internal::Vector<char> out_buffer, get_modrm(*data, &mod, ®op, &rm); AppendToBuffer("pextrd "); data += PrintRightOperand(data); - AppendToBuffer(",%s,%d", NameOfXMMRegister(regop), - *reinterpret_cast<int8_t*>(data)); + AppendToBuffer(",%s,%d", NameOfXMMRegister(regop), Imm8(data)); data++; } else if (*data == 0x17) { data++; @@ -2113,7 +2119,7 @@ int DisassemblerIA32::InstructionDecode(v8::internal::Vector<char> out_buffer, get_modrm(*data, &mod, ®op, &rm); AppendToBuffer("pinsrb %s,", NameOfXMMRegister(regop)); data += PrintRightOperand(data); - AppendToBuffer(",%d", *reinterpret_cast<int8_t*>(data)); + AppendToBuffer(",%d", Imm8(data)); data++; } else if (*data == 0x21) { data++; @@ -2121,7 +2127,7 @@ int DisassemblerIA32::InstructionDecode(v8::internal::Vector<char> out_buffer, get_modrm(*data, &mod, ®op, &rm); AppendToBuffer("insertps %s,", NameOfXMMRegister(regop)); data += PrintRightXMMOperand(data); - AppendToBuffer(",%d", *reinterpret_cast<int8_t*>(data)); + AppendToBuffer(",%d", Imm8(data)); data++; } else if (*data == 0x22) { data++; @@ -2129,7 +2135,7 @@ int DisassemblerIA32::InstructionDecode(v8::internal::Vector<char> out_buffer, get_modrm(*data, &mod, ®op, &rm); AppendToBuffer("pinsrd %s,", NameOfXMMRegister(regop)); data += PrintRightOperand(data); - AppendToBuffer(",%d", *reinterpret_cast<int8_t*>(data)); + AppendToBuffer(",%d", Imm8(data)); data++; } else { UnimplementedInstruction(); @@ -2193,7 +2199,7 @@ int DisassemblerIA32::InstructionDecode(v8::internal::Vector<char> out_buffer, get_modrm(*data, &mod, ®op, &rm); AppendToBuffer("pshufd %s,", NameOfXMMRegister(regop)); data += PrintRightXMMOperand(data); - AppendToBuffer(",%d", *reinterpret_cast<int8_t*>(data)); + AppendToBuffer(",%d", Imm8(data)); data++; } else if (*data == 0x90) { data++; @@ -2257,7 +2263,7 @@ int DisassemblerIA32::InstructionDecode(v8::internal::Vector<char> out_buffer, get_modrm(*data, &mod, ®op, &rm); AppendToBuffer("pinsrw %s,", NameOfXMMRegister(regop)); data += PrintRightOperand(data); - AppendToBuffer(",%d", *reinterpret_cast<int8_t*>(data)); + AppendToBuffer(",%d", Imm8(data)); data++; } else if (*data == 0xE7) { data++; @@ -2309,22 +2315,22 @@ int DisassemblerIA32::InstructionDecode(v8::internal::Vector<char> out_buffer, } break; case 0x68: - AppendToBuffer("push 0x%x", *reinterpret_cast<int32_t*>(data + 1)); + AppendToBuffer("push 0x%x", Imm32(data + 1)); data += 5; break; case 0x6A: - AppendToBuffer("push 0x%x", *reinterpret_cast<int8_t*>(data + 1)); + AppendToBuffer("push 0x%x", Imm8(data + 1)); data += 2; break; case 0xA8: - AppendToBuffer("test al,0x%x", *reinterpret_cast<uint8_t*>(data + 1)); + AppendToBuffer("test al,0x%x", Imm8_U(data + 1)); data += 2; break; case 0xA9: - AppendToBuffer("test eax,0x%x", *reinterpret_cast<int32_t*>(data + 1)); + AppendToBuffer("test eax,0x%x", Imm32(data + 1)); data += 5; break; @@ -2377,7 +2383,7 @@ int DisassemblerIA32::InstructionDecode(v8::internal::Vector<char> out_buffer, get_modrm(*data, &mod, ®op, &rm); AppendToBuffer("pshuflw %s,", NameOfXMMRegister(regop)); data += PrintRightXMMOperand(data); - AppendToBuffer(",%d", *reinterpret_cast<int8_t*>(data)); + AppendToBuffer(",%d", Imm8(data)); data++; } else { const char* mnem = "?"; @@ -2477,7 +2483,7 @@ int DisassemblerIA32::InstructionDecode(v8::internal::Vector<char> out_buffer, get_modrm(*data, &mod, ®op, &rm); AppendToBuffer("pshufhw %s,", NameOfXMMRegister(regop)); data += PrintRightXMMOperand(data); - AppendToBuffer(",%d", *reinterpret_cast<int8_t*>(data)); + AppendToBuffer(",%d", Imm8(data)); data++; } else if (b2 == 0x7F) { AppendToBuffer("movdqu "); diff --git a/deps/v8/src/diagnostics/objects-debug.cc b/deps/v8/src/diagnostics/objects-debug.cc index c5219970cb..dc3b3b8091 100644 --- a/deps/v8/src/diagnostics/objects-debug.cc +++ b/deps/v8/src/diagnostics/objects-debug.cc @@ -63,10 +63,11 @@ #include "src/objects/struct-inl.h" #include "src/objects/template-objects-inl.h" #include "src/objects/transitions-inl.h" -#include "src/regexp/jsregexp.h" +#include "src/regexp/regexp.h" #include "src/utils/ostreams.h" #include "src/wasm/wasm-objects-inl.h" #include "torque-generated/class-verifiers-tq.h" +#include "torque-generated/internal-class-definitions-tq-inl.h" namespace v8 { namespace internal { @@ -127,13 +128,6 @@ void MaybeObject::VerifyMaybeObjectPointer(Isolate* isolate, MaybeObject p) { } } -namespace { -void VerifyForeignPointer(Isolate* isolate, HeapObject host, Object foreign) { - host.VerifyPointer(isolate, foreign); - CHECK(foreign.IsUndefined(isolate) || Foreign::IsNormalized(foreign)); -} -} // namespace - void Smi::SmiVerify(Isolate* isolate) { CHECK(IsSmi()); CHECK(!IsCallable()); @@ -153,6 +147,10 @@ void HeapObject::HeapObjectVerify(Isolate* isolate) { SlicedString::cast(*this).SlicedStringVerify(isolate); } else if (IsThinString()) { ThinString::cast(*this).ThinStringVerify(isolate); + } else if (IsSeqString()) { + SeqString::cast(*this).SeqStringVerify(isolate); + } else if (IsExternalString()) { + ExternalString::cast(*this).ExternalStringVerify(isolate); } else { String::cast(*this).StringVerify(isolate); } @@ -293,8 +291,8 @@ void HeapObject::HeapObjectVerify(Isolate* isolate) { case JS_ASYNC_GENERATOR_OBJECT_TYPE: JSAsyncGeneratorObject::cast(*this).JSAsyncGeneratorObjectVerify(isolate); break; - case JS_VALUE_TYPE: - JSValue::cast(*this).JSValueVerify(isolate); + case JS_PRIMITIVE_WRAPPER_TYPE: + JSPrimitiveWrapper::cast(*this).JSPrimitiveWrapperVerify(isolate); break; case JS_DATE_TYPE: JSDate::cast(*this).JSDateVerify(isolate); @@ -420,6 +418,12 @@ void HeapObject::HeapObjectVerify(Isolate* isolate) { SmallOrderedNameDictionary::cast(*this).SmallOrderedNameDictionaryVerify( isolate); break; + case SOURCE_TEXT_MODULE_TYPE: + SourceTextModule::cast(*this).SourceTextModuleVerify(isolate); + break; + case SYNTHETIC_MODULE_TYPE: + SyntheticModule::cast(*this).SyntheticModuleVerify(isolate); + break; case CODE_DATA_CONTAINER_TYPE: CodeDataContainer::cast(*this).CodeDataContainerVerify(isolate); break; @@ -502,6 +506,11 @@ void BytecodeArray::BytecodeArrayVerify(Isolate* isolate) { CHECK(IsBytecodeArray()); CHECK(constant_pool().IsFixedArray()); VerifyHeapPointer(isolate, constant_pool()); + CHECK(source_position_table().IsUndefined() || + source_position_table().IsException() || + source_position_table().IsByteArray() || + source_position_table().IsSourcePositionTableWithFrameCache()); + CHECK(handler_table().IsByteArray()); } USE_TORQUE_VERIFIER(FreeSpace) @@ -515,10 +524,13 @@ void FeedbackVector::FeedbackVectorVerify(Isolate* isolate) { CHECK(code->IsSmi() || code->IsWeakOrCleared()); } -bool JSObject::ElementsAreSafeToExamine() const { +USE_TORQUE_VERIFIER(JSReceiver) + +bool JSObject::ElementsAreSafeToExamine(Isolate* isolate) const { // If a GC was caused while constructing this object, the elements // pointer may point to a one pointer filler map. - return elements() != GetReadOnlyRoots().one_pointer_filler_map(); + return elements(isolate) != + GetReadOnlyRoots(isolate).one_pointer_filler_map(); } namespace { @@ -624,7 +636,7 @@ void JSObject::JSObjectVerify(Isolate* isolate) { // If a GC was caused while constructing this object, the elements // pointer may point to a one pointer filler map. - if (ElementsAreSafeToExamine()) { + if (ElementsAreSafeToExamine(isolate)) { CHECK_EQ((map().has_fast_smi_or_object_elements() || map().has_frozen_or_sealed_elements() || (elements() == GetReadOnlyRoots().empty_fixed_array()) || @@ -699,6 +711,8 @@ void EmbedderDataArray::EmbedderDataArrayVerify(Isolate* isolate) { } } +USE_TORQUE_VERIFIER(FixedArrayBase) + USE_TORQUE_VERIFIER(FixedArray) void WeakFixedArray::WeakFixedArrayVerify(Isolate* isolate) { @@ -709,6 +723,8 @@ void WeakFixedArray::WeakFixedArrayVerify(Isolate* isolate) { } void WeakArrayList::WeakArrayListVerify(Isolate* isolate) { + VerifySmiField(kCapacityOffset); + VerifySmiField(kLengthOffset); for (int i = 0; i < length(); i++) { MaybeObject::VerifyMaybeObjectPointer(isolate, Get(i)); } @@ -774,24 +790,27 @@ void FeedbackMetadata::FeedbackMetadataVerify(Isolate* isolate) { void DescriptorArray::DescriptorArrayVerify(Isolate* isolate) { TorqueGeneratedClassVerifiers::DescriptorArrayVerify(*this, isolate); for (int i = 0; i < number_of_all_descriptors(); i++) { - MaybeObject::VerifyMaybeObjectPointer(isolate, get(ToKeyIndex(i))); - MaybeObject::VerifyMaybeObjectPointer(isolate, get(ToDetailsIndex(i))); - MaybeObject::VerifyMaybeObjectPointer(isolate, get(ToValueIndex(i))); + MaybeObjectSlot slot(GetDescriptorSlot(i)); + MaybeObject::VerifyMaybeObjectPointer(isolate, *(slot + kEntryKeyIndex)); + MaybeObject::VerifyMaybeObjectPointer(isolate, + *(slot + kEntryDetailsIndex)); + MaybeObject::VerifyMaybeObjectPointer(isolate, *(slot + kEntryValueIndex)); } if (number_of_all_descriptors() == 0) { - Heap* heap = isolate->heap(); - CHECK_EQ(ReadOnlyRoots(heap).empty_descriptor_array(), *this); + CHECK_EQ(ReadOnlyRoots(isolate).empty_descriptor_array(), *this); CHECK_EQ(0, number_of_all_descriptors()); CHECK_EQ(0, number_of_descriptors()); - CHECK_EQ(ReadOnlyRoots(heap).empty_enum_cache(), enum_cache()); + CHECK_EQ(ReadOnlyRoots(isolate).empty_enum_cache(), enum_cache()); } else { CHECK_LT(0, number_of_all_descriptors()); CHECK_LE(number_of_descriptors(), number_of_all_descriptors()); - // Check that properties with private symbols names are non-enumerable. + // Check that properties with private symbols names are non-enumerable, and + // that fields are in order. + int expected_field_index = 0; for (int descriptor = 0; descriptor < number_of_descriptors(); descriptor++) { - Object key = get(ToKeyIndex(descriptor))->cast<Object>(); + Object key = *(GetDescriptorSlot(descriptor) + kEntryKeyIndex); // number_of_descriptors() may be out of sync with the actual descriptors // written during descriptor array construction. if (key.IsUndefined(isolate)) continue; @@ -799,14 +818,16 @@ void DescriptorArray::DescriptorArrayVerify(Isolate* isolate) { if (Name::cast(key).IsPrivate()) { CHECK_NE(details.attributes() & DONT_ENUM, 0); } - MaybeObject value = get(ToValueIndex(descriptor)); + MaybeObject value = GetValue(descriptor); HeapObject heap_object; if (details.location() == kField) { + CHECK_EQ(details.field_index(), expected_field_index); CHECK( value == MaybeObject::FromObject(FieldType::None()) || value == MaybeObject::FromObject(FieldType::Any()) || value->IsCleared() || (value->GetHeapObjectIfWeak(&heap_object) && heap_object.IsMap())); + expected_field_index += details.field_width_in_words(); } else { CHECK(!value->IsWeakOrCleared()); CHECK(!value->cast<Object>().IsMap()); @@ -905,8 +926,6 @@ void JSAsyncGeneratorObject::JSAsyncGeneratorObjectVerify(Isolate* isolate) { queue().HeapObjectVerify(isolate); } -USE_TORQUE_VERIFIER(JSValue) - void JSDate::JSDateVerify(Isolate* isolate) { TorqueGeneratedClassVerifiers::JSDateVerify(*this, isolate); @@ -940,13 +959,7 @@ void JSDate::JSDateVerify(Isolate* isolate) { } } -void JSMessageObject::JSMessageObjectVerify(Isolate* isolate) { - TorqueGeneratedClassVerifiers::JSMessageObjectVerify(*this, isolate); - VerifySmiField(kMessageTypeOffset); - VerifySmiField(kStartPositionOffset); - VerifySmiField(kEndPositionOffset); - VerifySmiField(kErrorLevelOffset); -} +USE_TORQUE_VERIFIER(JSMessageObject) void String::StringVerify(Isolate* isolate) { TorqueGeneratedClassVerifiers::StringVerify(*this, isolate); @@ -982,19 +995,16 @@ void SlicedString::SlicedStringVerify(Isolate* isolate) { CHECK_GE(this->length(), SlicedString::kMinLength); } +USE_TORQUE_VERIFIER(ExternalString) + void JSBoundFunction::JSBoundFunctionVerify(Isolate* isolate) { TorqueGeneratedClassVerifiers::JSBoundFunctionVerify(*this, isolate); CHECK(IsCallable()); - - if (!raw_bound_target_function().IsUndefined(isolate)) { - CHECK(bound_target_function().IsCallable()); - CHECK_EQ(IsConstructor(), bound_target_function().IsConstructor()); - } + CHECK_EQ(IsConstructor(), bound_target_function().IsConstructor()); } void JSFunction::JSFunctionVerify(Isolate* isolate) { TorqueGeneratedClassVerifiers::JSFunctionVerify(*this, isolate); - CHECK(raw_feedback_cell().IsFeedbackCell()); CHECK(code().IsCode()); CHECK(map().is_callable()); Handle<JSFunction> function(*this, isolate); @@ -1168,13 +1178,12 @@ void JSArray::JSArrayVerify(Isolate* isolate) { TorqueGeneratedClassVerifiers::JSArrayVerify(*this, isolate); // If a GC was caused while constructing this array, the elements // pointer may point to a one pointer filler map. - if (!ElementsAreSafeToExamine()) return; + if (!ElementsAreSafeToExamine(isolate)) return; if (elements().IsUndefined(isolate)) return; CHECK(elements().IsFixedArray() || elements().IsFixedDoubleArray()); if (elements().length() == 0) { CHECK_EQ(elements(), ReadOnlyRoots(isolate).empty_fixed_array()); } - if (!length().IsNumber()) return; // Verify that the length and the elements backing store are in sync. if (length().IsSmi() && (HasFastElements() || HasFrozenOrSealedElements())) { if (elements().length() > 0) { @@ -1206,32 +1215,32 @@ void JSArray::JSArrayVerify(Isolate* isolate) { } } +USE_TORQUE_VERIFIER(JSCollection) + void JSSet::JSSetVerify(Isolate* isolate) { TorqueGeneratedClassVerifiers::JSSetVerify(*this, isolate); - VerifyHeapPointer(isolate, table()); CHECK(table().IsOrderedHashSet() || table().IsUndefined(isolate)); // TODO(arv): Verify OrderedHashTable too. } void JSMap::JSMapVerify(Isolate* isolate) { TorqueGeneratedClassVerifiers::JSMapVerify(*this, isolate); - VerifyHeapPointer(isolate, table()); CHECK(table().IsOrderedHashMap() || table().IsUndefined(isolate)); // TODO(arv): Verify OrderedHashTable too. } +USE_TORQUE_VERIFIER(JSCollectionIterator) + void JSSetIterator::JSSetIteratorVerify(Isolate* isolate) { CHECK(IsJSSetIterator()); - JSObjectVerify(isolate); - VerifyHeapPointer(isolate, table()); + JSCollectionIteratorVerify(isolate); CHECK(table().IsOrderedHashSet()); CHECK(index().IsSmi()); } void JSMapIterator::JSMapIteratorVerify(Isolate* isolate) { CHECK(IsJSMapIterator()); - JSObjectVerify(isolate); - VerifyHeapPointer(isolate, table()); + JSCollectionIteratorVerify(isolate); CHECK(table().IsOrderedHashMap()); CHECK(index().IsSmi()); } @@ -1257,14 +1266,8 @@ void WeakCell::WeakCellVerify(Isolate* isolate) { key_list_next().IsUndefined(isolate)); CHECK(key_list_prev().IsWeakCell() || key_list_prev().IsUndefined(isolate)); - if (key_list_prev().IsWeakCell()) { - CHECK_EQ(WeakCell::cast(key_list_prev()).key_list_next(), *this); - } CHECK(key_list_next().IsWeakCell() || key_list_next().IsUndefined(isolate)); - if (key_list_next().IsWeakCell()) { - CHECK_EQ(WeakCell::cast(key_list_next()).key_list_prev(), *this); - } CHECK(finalization_group().IsUndefined(isolate) || finalization_group().IsJSFinalizationGroup()); @@ -1288,6 +1291,7 @@ void JSFinalizationGroup::JSFinalizationGroupVerify(Isolate* isolate) { if (cleared_cells().IsWeakCell()) { CHECK(WeakCell::cast(cleared_cells()).prev().IsUndefined(isolate)); } + CHECK(next().IsUndefined(isolate) || next().IsJSFinalizationGroup()); } void JSFinalizationGroupCleanupIterator:: @@ -1305,13 +1309,11 @@ void FinalizationGroupCleanupJobTask::FinalizationGroupCleanupJobTaskVerify( void JSWeakMap::JSWeakMapVerify(Isolate* isolate) { TorqueGeneratedClassVerifiers::JSWeakMapVerify(*this, isolate); - VerifyHeapPointer(isolate, table()); CHECK(table().IsEphemeronHashTable() || table().IsUndefined(isolate)); } void JSArrayIterator::JSArrayIteratorVerify(Isolate* isolate) { TorqueGeneratedClassVerifiers::JSArrayIteratorVerify(*this, isolate); - CHECK(iterated_object().IsJSReceiver()); CHECK_GE(next_index().Number(), 0); CHECK_LE(next_index().Number(), kMaxSafeInteger); @@ -1328,17 +1330,16 @@ void JSArrayIterator::JSArrayIteratorVerify(Isolate* isolate) { void JSStringIterator::JSStringIteratorVerify(Isolate* isolate) { TorqueGeneratedClassVerifiers::JSStringIteratorVerify(*this, isolate); - CHECK(string().IsString()); - CHECK_GE(index(), 0); CHECK_LE(index(), String::kMaxLength); } USE_TORQUE_VERIFIER(JSAsyncFromSyncIterator) +USE_TORQUE_VERIFIER(JSWeakCollection) + void JSWeakSet::JSWeakSetVerify(Isolate* isolate) { TorqueGeneratedClassVerifiers::JSWeakSetVerify(*this, isolate); - VerifyHeapPointer(isolate, table()); CHECK(table().IsEphemeronHashTable() || table().IsUndefined(isolate)); } @@ -1351,11 +1352,7 @@ void CallableTask::CallableTaskVerify(Isolate* isolate) { USE_TORQUE_VERIFIER(CallbackTask) -void PromiseReactionJobTask::PromiseReactionJobTaskVerify(Isolate* isolate) { - TorqueGeneratedClassVerifiers::PromiseReactionJobTaskVerify(*this, isolate); - VerifyHeapPointer(isolate, handler()); - CHECK(handler().IsUndefined(isolate) || handler().IsCallable()); -} +USE_TORQUE_VERIFIER(PromiseReactionJobTask) USE_TORQUE_VERIFIER(PromiseFulfillReactionJobTask) @@ -1369,7 +1366,6 @@ USE_TORQUE_VERIFIER(PromiseReaction) void JSPromise::JSPromiseVerify(Isolate* isolate) { TorqueGeneratedClassVerifiers::JSPromiseVerify(*this, isolate); - VerifySmiField(kFlagsOffset); if (status() == Promise::kPending) { CHECK(reactions().IsSmi() || reactions().IsPromiseReaction()); } @@ -1460,7 +1456,7 @@ void JSRegExp::JSRegExpVerify(Isolate* isolate) { break; } case JSRegExp::IRREGEXP: { - bool is_native = RegExpImpl::UsesNativeRegExp(); + bool is_native = RegExp::GeneratesNativeCode(); FixedArray arr = FixedArray::cast(data()); Object one_byte_data = arr.get(JSRegExp::kIrregexpLatin1CodeIndex); @@ -1485,11 +1481,7 @@ void JSRegExp::JSRegExpVerify(Isolate* isolate) { } } -void JSRegExpStringIterator::JSRegExpStringIteratorVerify(Isolate* isolate) { - TorqueGeneratedClassVerifiers::JSRegExpStringIteratorVerify(*this, isolate); - CHECK(iterating_string().IsString()); - VerifySmiField(kFlagsOffset); -} +USE_TORQUE_VERIFIER(JSRegExpStringIterator) void JSProxy::JSProxyVerify(Isolate* isolate) { TorqueGeneratedClassVerifiers::JSProxyVerify(*this, isolate); @@ -1548,50 +1540,49 @@ void BigInt::BigIntVerify(Isolate* isolate) { CHECK_IMPLIES(is_zero(), !sign()); // There is no -0n. } -void JSModuleNamespace::JSModuleNamespaceVerify(Isolate* isolate) { - CHECK(IsJSModuleNamespace()); - VerifyPointer(isolate, module()); -} +USE_TORQUE_VERIFIER(JSModuleNamespace) -void ModuleInfoEntry::ModuleInfoEntryVerify(Isolate* isolate) { - TorqueGeneratedClassVerifiers::ModuleInfoEntryVerify(*this, isolate); +void SourceTextModuleInfoEntry::SourceTextModuleInfoEntryVerify( + Isolate* isolate) { + TorqueGeneratedClassVerifiers::SourceTextModuleInfoEntryVerify(*this, + isolate); CHECK_IMPLIES(import_name().IsString(), module_request() >= 0); CHECK_IMPLIES(export_name().IsString() && import_name().IsString(), local_name().IsUndefined(isolate)); } void Module::ModuleVerify(Isolate* isolate) { - CHECK(IsModule()); - - VerifyPointer(isolate, code()); - VerifyPointer(isolate, exports()); - VerifyPointer(isolate, module_namespace()); - VerifyPointer(isolate, requested_modules()); - VerifyPointer(isolate, script()); - VerifyPointer(isolate, import_meta()); - VerifyPointer(isolate, exception()); - VerifySmiField(kHashOffset); - VerifySmiField(kStatusOffset); - - CHECK((status() >= kEvaluating && code().IsModuleInfo()) || - (status() == kInstantiated && code().IsJSGeneratorObject()) || - (status() == kInstantiating && code().IsJSFunction()) || - (code().IsSharedFunctionInfo())); + TorqueGeneratedClassVerifiers::ModuleVerify(*this, isolate); - CHECK_EQ(status() == kErrored, !exception().IsTheHole(isolate)); + CHECK_EQ(status() == Module::kErrored, !exception().IsTheHole(isolate)); CHECK(module_namespace().IsUndefined(isolate) || module_namespace().IsJSModuleNamespace()); if (module_namespace().IsJSModuleNamespace()) { - CHECK_LE(kInstantiating, status()); + CHECK_LE(Module::kInstantiating, status()); CHECK_EQ(JSModuleNamespace::cast(module_namespace()).module(), *this); } + CHECK_NE(hash(), 0); +} + +void SourceTextModule::SourceTextModuleVerify(Isolate* isolate) { + TorqueGeneratedClassVerifiers::SourceTextModuleVerify(*this, isolate); + + CHECK((status() >= kEvaluating && code().IsSourceTextModuleInfo()) || + (status() == kInstantiated && code().IsJSGeneratorObject()) || + (status() == kInstantiating && code().IsJSFunction()) || + (code().IsSharedFunctionInfo())); + CHECK_EQ(requested_modules().length(), info().module_requests().length()); +} - CHECK(import_meta().IsTheHole(isolate) || import_meta().IsJSObject()); +void SyntheticModule::SyntheticModuleVerify(Isolate* isolate) { + TorqueGeneratedClassVerifiers::SyntheticModuleVerify(*this, isolate); - CHECK_NE(hash(), 0); + for (int i = 0; i < export_names().length(); i++) { + CHECK(export_names().get(i).IsString()); + } } void PrototypeInfo::PrototypeInfoVerify(Isolate* isolate) { @@ -1646,8 +1637,6 @@ void EnumCache::EnumCacheVerify(Isolate* isolate) { } } -USE_TORQUE_VERIFIER(SourcePositionTableWithFrameCache) - USE_TORQUE_VERIFIER(ClassPositions) void ObjectBoilerplateDescription::ObjectBoilerplateDescriptionVerify( @@ -1686,31 +1675,15 @@ void WasmExportedFunctionData::WasmExportedFunctionDataVerify( wrapper_code().kind() == Code::C_WASM_ENTRY); } -void WasmModuleObject::WasmModuleObjectVerify(Isolate* isolate) { - TorqueGeneratedClassVerifiers::WasmModuleObjectVerify(*this, isolate); - CHECK(managed_native_module().IsForeign()); - CHECK(export_wrappers().IsFixedArray()); - CHECK(script().IsScript()); -} +USE_TORQUE_VERIFIER(WasmModuleObject) -void WasmTableObject::WasmTableObjectVerify(Isolate* isolate) { - TorqueGeneratedClassVerifiers::WasmTableObjectVerify(*this, isolate); - CHECK(elements().IsFixedArray()); - VerifySmiField(kRawTypeOffset); -} +USE_TORQUE_VERIFIER(WasmTableObject) -void WasmMemoryObject::WasmMemoryObjectVerify(Isolate* isolate) { - TorqueGeneratedClassVerifiers::WasmMemoryObjectVerify(*this, isolate); - CHECK(array_buffer().IsJSArrayBuffer()); - VerifySmiField(kMaximumPagesOffset); -} +USE_TORQUE_VERIFIER(WasmMemoryObject) USE_TORQUE_VERIFIER(WasmGlobalObject) -void WasmExceptionObject::WasmExceptionObjectVerify(Isolate* isolate) { - TorqueGeneratedClassVerifiers::WasmExceptionObjectVerify(*this, isolate); - CHECK(serialized_signature().IsByteArray()); -} +USE_TORQUE_VERIFIER(WasmExceptionObject) void DataHandler::DataHandlerVerify(Isolate* isolate) { TorqueGeneratedClassVerifiers::DataHandlerVerify(*this, isolate); @@ -1738,39 +1711,22 @@ void StoreHandler::StoreHandlerVerify(Isolate* isolate) { // TODO(ishell): check handler integrity } -void AccessorInfo::AccessorInfoVerify(Isolate* isolate) { - TorqueGeneratedClassVerifiers::AccessorInfoVerify(*this, isolate); - VerifyForeignPointer(isolate, *this, getter()); - VerifyForeignPointer(isolate, *this, setter()); - VerifyForeignPointer(isolate, *this, js_getter()); -} +USE_TORQUE_VERIFIER(AccessorInfo) USE_TORQUE_VERIFIER(AccessorPair) USE_TORQUE_VERIFIER(AccessCheckInfo) void CallHandlerInfo::CallHandlerInfoVerify(Isolate* isolate) { - CHECK(IsCallHandlerInfo()); + TorqueGeneratedClassVerifiers::CallHandlerInfoVerify(*this, isolate); CHECK(map() == ReadOnlyRoots(isolate).side_effect_call_handler_info_map() || map() == ReadOnlyRoots(isolate).side_effect_free_call_handler_info_map() || map() == ReadOnlyRoots(isolate) .next_call_side_effect_free_call_handler_info_map()); - VerifyPointer(isolate, callback()); - VerifyPointer(isolate, js_callback()); - VerifyPointer(isolate, data()); } -void InterceptorInfo::InterceptorInfoVerify(Isolate* isolate) { - TorqueGeneratedClassVerifiers::InterceptorInfoVerify(*this, isolate); - VerifyForeignPointer(isolate, *this, getter()); - VerifyForeignPointer(isolate, *this, setter()); - VerifyForeignPointer(isolate, *this, query()); - VerifyForeignPointer(isolate, *this, descriptor()); - VerifyForeignPointer(isolate, *this, deleter()); - VerifyForeignPointer(isolate, *this, enumerator()); - VerifyForeignPointer(isolate, *this, definer()); -} +USE_TORQUE_VERIFIER(InterceptorInfo) USE_TORQUE_VERIFIER(TemplateInfo) @@ -1782,6 +1738,8 @@ USE_TORQUE_VERIFIER(WasmCapiFunctionData) USE_TORQUE_VERIFIER(WasmJSFunctionData) +USE_TORQUE_VERIFIER(WasmIndirectFunctionTable) + USE_TORQUE_VERIFIER(ObjectTemplateInfo) void AllocationSite::AllocationSiteVerify(Isolate* isolate) { @@ -1792,11 +1750,7 @@ void AllocationSite::AllocationSiteVerify(Isolate* isolate) { CHECK(nested_site().IsAllocationSite() || nested_site() == Smi::kZero); } -void AllocationMemento::AllocationMementoVerify(Isolate* isolate) { - TorqueGeneratedClassVerifiers::AllocationMementoVerify(*this, isolate); - VerifyHeapPointer(isolate, allocation_site()); - CHECK(!IsValid() || GetAllocationSite().IsAllocationSite()); -} +USE_TORQUE_VERIFIER(AllocationMemento) void Script::ScriptVerify(Isolate* isolate) { TorqueGeneratedClassVerifiers::ScriptVerify(*this, isolate); @@ -1859,62 +1813,26 @@ void UncompiledDataWithoutPreparseData::UncompiledDataWithoutPreparseDataVerify( USE_TORQUE_VERIFIER(InterpreterData) #ifdef V8_INTL_SUPPORT -void JSV8BreakIterator::JSV8BreakIteratorVerify(Isolate* isolate) { - JSObjectVerify(isolate); - VerifyObjectField(isolate, kLocaleOffset); - VerifyObjectField(isolate, kTypeOffset); - VerifyObjectField(isolate, kBreakIteratorOffset); - VerifyObjectField(isolate, kUnicodeStringOffset); - VerifyObjectField(isolate, kBoundAdoptTextOffset); - VerifyObjectField(isolate, kBoundFirstOffset); - VerifyObjectField(isolate, kBoundNextOffset); - VerifyObjectField(isolate, kBoundCurrentOffset); - VerifyObjectField(isolate, kBoundBreakTypeOffset); -} - -void JSCollator::JSCollatorVerify(Isolate* isolate) { - CHECK(IsJSCollator()); - JSObjectVerify(isolate); - VerifyObjectField(isolate, kICUCollatorOffset); - VerifyObjectField(isolate, kBoundCompareOffset); -} -void JSDateTimeFormat::JSDateTimeFormatVerify(Isolate* isolate) { - TorqueGeneratedClassVerifiers::JSDateTimeFormatVerify(*this, isolate); - VerifySmiField(kFlagsOffset); -} +USE_TORQUE_VERIFIER(JSV8BreakIterator) -void JSListFormat::JSListFormatVerify(Isolate* isolate) { - TorqueGeneratedClassVerifiers::JSListFormatVerify(*this, isolate); - VerifySmiField(kFlagsOffset); -} +USE_TORQUE_VERIFIER(JSCollator) + +USE_TORQUE_VERIFIER(JSDateTimeFormat) + +USE_TORQUE_VERIFIER(JSListFormat) USE_TORQUE_VERIFIER(JSLocale) -void JSNumberFormat::JSNumberFormatVerify(Isolate* isolate) { - TorqueGeneratedClassVerifiers::JSNumberFormatVerify(*this, isolate); - VerifySmiField(kFlagsOffset); -} +USE_TORQUE_VERIFIER(JSNumberFormat) -void JSPluralRules::JSPluralRulesVerify(Isolate* isolate) { - TorqueGeneratedClassVerifiers::JSPluralRulesVerify(*this, isolate); - VerifySmiField(kFlagsOffset); -} +USE_TORQUE_VERIFIER(JSPluralRules) -void JSRelativeTimeFormat::JSRelativeTimeFormatVerify(Isolate* isolate) { - TorqueGeneratedClassVerifiers::JSRelativeTimeFormatVerify(*this, isolate); - VerifySmiField(kFlagsOffset); -} +USE_TORQUE_VERIFIER(JSRelativeTimeFormat) -void JSSegmentIterator::JSSegmentIteratorVerify(Isolate* isolate) { - TorqueGeneratedClassVerifiers::JSSegmentIteratorVerify(*this, isolate); - VerifySmiField(kFlagsOffset); -} +USE_TORQUE_VERIFIER(JSSegmentIterator) -void JSSegmenter::JSSegmenterVerify(Isolate* isolate) { - TorqueGeneratedClassVerifiers::JSSegmenterVerify(*this, isolate); - VerifySmiField(kFlagsOffset); -} +USE_TORQUE_VERIFIER(JSSegmenter) #endif // V8_INTL_SUPPORT diff --git a/deps/v8/src/diagnostics/objects-printer.cc b/deps/v8/src/diagnostics/objects-printer.cc index e65c0af190..5284208285 100644 --- a/deps/v8/src/diagnostics/objects-printer.cc +++ b/deps/v8/src/diagnostics/objects-printer.cc @@ -50,6 +50,7 @@ #include "src/objects/js-segment-iterator-inl.h" #include "src/objects/js-segmenter-inl.h" #endif // V8_INTL_SUPPORT +#include "src/compiler/node.h" #include "src/objects/js-weak-refs-inl.h" #include "src/objects/literal-objects-inl.h" #include "src/objects/microtask-inl.h" @@ -60,11 +61,13 @@ #include "src/objects/struct-inl.h" #include "src/objects/template-objects-inl.h" #include "src/objects/transitions-inl.h" -#include "src/regexp/jsregexp.h" +#include "src/regexp/regexp.h" #include "src/utils/ostreams.h" #include "src/wasm/wasm-code-manager.h" #include "src/wasm/wasm-engine.h" #include "src/wasm/wasm-objects-inl.h" +#include "torque-generated/class-definitions-tq-inl.h" +#include "torque-generated/internal-class-definitions-tq-inl.h" namespace v8 { namespace internal { @@ -217,8 +220,6 @@ void HeapObject::HeapObjectPrint(std::ostream& os) { // NOLINT case JS_API_OBJECT_TYPE: case JS_SPECIAL_API_OBJECT_TYPE: case JS_CONTEXT_EXTENSION_OBJECT_TYPE: - case JS_ASYNC_FUNCTION_OBJECT_TYPE: - case JS_ASYNC_GENERATOR_OBJECT_TYPE: case JS_ARGUMENTS_TYPE: case JS_ERROR_TYPE: // TODO(titzer): debug printing for more wasm objects @@ -240,6 +241,8 @@ void HeapObject::HeapObjectPrint(std::ostream& os) { // NOLINT case WASM_INSTANCE_TYPE: WasmInstanceObject::cast(*this).WasmInstanceObjectPrint(os); break; + case JS_ASYNC_FUNCTION_OBJECT_TYPE: + case JS_ASYNC_GENERATOR_OBJECT_TYPE: case JS_GENERATOR_OBJECT_TYPE: JSGeneratorObject::cast(*this).JSGeneratorObjectPrint(os); break; @@ -270,8 +273,8 @@ void HeapObject::HeapObjectPrint(std::ostream& os) { // NOLINT case JS_GLOBAL_OBJECT_TYPE: JSGlobalObject::cast(*this).JSGlobalObjectPrint(os); break; - case JS_VALUE_TYPE: - JSValue::cast(*this).JSValuePrint(os); + case JS_PRIMITIVE_WRAPPER_TYPE: + JSPrimitiveWrapper::cast(*this).JSPrimitiveWrapperPrint(os); break; case JS_DATE_TYPE: JSDate::cast(*this).JSDatePrint(os); @@ -414,6 +417,12 @@ void HeapObject::HeapObjectPrint(std::ostream& os) { // NOLINT case SCOPE_INFO_TYPE: ScopeInfo::cast(*this).ScopeInfoPrint(os); break; + case SOURCE_TEXT_MODULE_TYPE: + SourceTextModule::cast(*this).SourceTextModulePrint(os); + break; + case SYNTHETIC_MODULE_TYPE: + SyntheticModule::cast(*this).SyntheticModulePrint(os); + break; case FEEDBACK_METADATA_TYPE: FeedbackMetadata::cast(*this).FeedbackMetadataPrint(os); break; @@ -1191,8 +1200,8 @@ void FeedbackNexus::Print(std::ostream& os) { // NOLINT } } -void JSValue::JSValuePrint(std::ostream& os) { // NOLINT - JSObjectPrintHeader(os, *this, "JSValue"); +void JSPrimitiveWrapper::JSPrimitiveWrapperPrint(std::ostream& os) { // NOLINT + JSObjectPrintHeader(os, *this, "JSPrimitiveWrapper"); os << "\n - value: " << Brief(value()); JSObjectPrintBody(os, *this); } @@ -1730,8 +1739,9 @@ void AsyncGeneratorRequest::AsyncGeneratorRequestPrint( os << "\n"; } -void ModuleInfoEntry::ModuleInfoEntryPrint(std::ostream& os) { // NOLINT - PrintHeader(os, "ModuleInfoEntry"); +void SourceTextModuleInfoEntry::SourceTextModuleInfoEntryPrint( + std::ostream& os) { // NOLINT + PrintHeader(os, "SourceTextModuleInfoEntry"); os << "\n - export_name: " << Brief(export_name()); os << "\n - local_name: " << Brief(local_name()); os << "\n - import_name: " << Brief(import_name()); @@ -1742,16 +1752,37 @@ void ModuleInfoEntry::ModuleInfoEntryPrint(std::ostream& os) { // NOLINT os << "\n"; } +static void PrintModuleFields(Module module, std::ostream& os) { + os << "\n - exports: " << Brief(module.exports()); + os << "\n - status: " << module.status(); + os << "\n - exception: " << Brief(module.exception()); +} + void Module::ModulePrint(std::ostream& os) { // NOLINT - PrintHeader(os, "Module"); + if (this->IsSourceTextModule()) { + SourceTextModule::cast(*this).SourceTextModulePrint(os); + } else if (this->IsSyntheticModule()) { + SyntheticModule::cast(*this).SyntheticModulePrint(os); + } else { + UNREACHABLE(); + } +} + +void SourceTextModule::SourceTextModulePrint(std::ostream& os) { // NOLINT + PrintHeader(os, "SourceTextModule"); + PrintModuleFields(*this, os); os << "\n - origin: " << Brief(script().GetNameOrSourceURL()); os << "\n - code: " << Brief(code()); - os << "\n - exports: " << Brief(exports()); os << "\n - requested_modules: " << Brief(requested_modules()); os << "\n - script: " << Brief(script()); os << "\n - import_meta: " << Brief(import_meta()); - os << "\n - status: " << status(); - os << "\n - exception: " << Brief(exception()); + os << "\n"; +} + +void SyntheticModule::SyntheticModulePrint(std::ostream& os) { // NOLINT + PrintHeader(os, "SyntheticModule"); + PrintModuleFields(*this, os); + os << "\n - export_names: " << Brief(export_names()); os << "\n"; } @@ -2040,6 +2071,20 @@ void WasmCapiFunctionData::WasmCapiFunctionDataPrint( os << "\n"; } +void WasmIndirectFunctionTable::WasmIndirectFunctionTablePrint( + std::ostream& os) { + PrintHeader(os, "WasmIndirectFunctionTable"); + os << "\n - size: " << size(); + os << "\n - sig_ids: " << static_cast<void*>(sig_ids()); + os << "\n - targets: " << static_cast<void*>(targets()); + if (has_managed_native_allocations()) { + os << "\n - managed_native_allocations: " + << Brief(managed_native_allocations()); + } + os << "\n - refs: " << Brief(refs()); + os << "\n"; +} + void ObjectTemplateInfo::ObjectTemplateInfoPrint(std::ostream& os) { // NOLINT PrintHeader(os, "ObjectTemplateInfo"); os << "\n - tag: " << Brief(tag()); @@ -2167,7 +2212,7 @@ void JSPluralRules::JSPluralRulesPrint(std::ostream& os) { // NOLINT os << "\n - locale: " << Brief(locale()); os << "\n - type: " << TypeAsString(); os << "\n - icu plural rules: " << Brief(icu_plural_rules()); - os << "\n - icu decimal format: " << Brief(icu_decimal_format()); + os << "\n - icu_number_formatter: " << Brief(icu_number_formatter()); JSObjectPrintBody(os, *this); } @@ -2483,7 +2528,6 @@ void Map::MapPrint(std::ostream& os) { // NOLINT if (is_stable()) os << "\n - stable_map"; if (is_migration_target()) os << "\n - migration_target"; if (is_dictionary_map()) os << "\n - dictionary_map"; - if (has_hidden_prototype()) os << "\n - has_hidden_prototype"; if (has_named_interceptor()) os << "\n - named_interceptor"; if (has_indexed_interceptor()) os << "\n - indexed_interceptor"; if (may_have_interesting_symbols()) os << "\n - may_have_interesting_symbols"; @@ -2511,10 +2555,10 @@ void Map::MapPrint(std::ostream& os) { // NOLINT layout_descriptor().ShortPrint(os); } - Isolate* isolate; // Read-only maps can't have transitions, which is fortunate because we need // the isolate to iterate over the transitions. - if (GetIsolateFromWritableObject(*this, &isolate)) { + if (!IsReadOnlyHeapObject(*this)) { + Isolate* isolate = GetIsolateFromWritableObject(*this); DisallowHeapAllocation no_gc; TransitionsAccessor transitions(isolate, *this, &no_gc); int nof_transitions = transitions.NumberOfTransitions(); @@ -2812,3 +2856,7 @@ V8_EXPORT_PRIVATE extern void _v8_internal_Print_TransitionTree(void* object) { #endif } } + +V8_EXPORT_PRIVATE extern void _v8_internal_Node_Print(void* object) { + reinterpret_cast<i::compiler::Node*>(object)->Print(); +} diff --git a/deps/v8/src/diagnostics/unwinding-info-win64.cc b/deps/v8/src/diagnostics/unwinding-info-win64.cc index 096ffa2d48..8fb01dba9a 100644 --- a/deps/v8/src/diagnostics/unwinding-info-win64.cc +++ b/deps/v8/src/diagnostics/unwinding-info-win64.cc @@ -10,37 +10,6 @@ #include "src/codegen/x64/assembler-x64.h" #include "src/utils/allocation.h" -// Forward declaration to keep this independent of Win8 -NTSYSAPI -DWORD -NTAPI -RtlAddGrowableFunctionTable( - _Out_ PVOID* DynamicTable, - _In_reads_(MaximumEntryCount) PRUNTIME_FUNCTION FunctionTable, - _In_ DWORD EntryCount, - _In_ DWORD MaximumEntryCount, - _In_ ULONG_PTR RangeBase, - _In_ ULONG_PTR RangeEnd - ); - - -NTSYSAPI -void -NTAPI -RtlGrowFunctionTable( - _Inout_ PVOID DynamicTable, - _In_ DWORD NewEntryCount - ); - - -NTSYSAPI -void -NTAPI -RtlDeleteGrowableFunctionTable( - _In_ PVOID DynamicTable - ); - - namespace v8 { namespace internal { namespace win64_unwindinfo { diff --git a/deps/v8/src/diagnostics/x64/disasm-x64.cc b/deps/v8/src/diagnostics/x64/disasm-x64.cc index ab8ba34d90..493c56996b 100644 --- a/deps/v8/src/diagnostics/x64/disasm-x64.cc +++ b/deps/v8/src/diagnostics/x64/disasm-x64.cc @@ -237,6 +237,30 @@ static const InstructionDesc cmov_instructions[16] = { {"cmovle", TWO_OPERANDS_INSTR, REG_OPER_OP_ORDER, false}, {"cmovg", TWO_OPERANDS_INSTR, REG_OPER_OP_ORDER, false}}; +namespace { +int8_t Imm8(const uint8_t* data) { + return *reinterpret_cast<const int8_t*>(data); +} +uint8_t Imm8_U(const uint8_t* data) { + return *reinterpret_cast<const uint8_t*>(data); +} +int16_t Imm16(const uint8_t* data) { + return *reinterpret_cast<const int16_t*>(data); +} +uint16_t Imm16_U(const uint8_t* data) { + return *reinterpret_cast<const uint16_t*>(data); +} +int32_t Imm32(const uint8_t* data) { + return *reinterpret_cast<const int32_t*>(data); +} +uint32_t Imm32_U(const uint8_t* data) { + return *reinterpret_cast<const uint32_t*>(data); +} +int64_t Imm64(const uint8_t* data) { + return *reinterpret_cast<const int64_t*>(data); +} +} // namespace + //------------------------------------------------------------------------------ // DisassemblerX64 implementation. @@ -458,8 +482,7 @@ int DisassemblerX64::PrintRightOperandHelper( switch (mod) { case 0: if ((rm & 7) == 5) { - int32_t disp = *reinterpret_cast<int32_t*>(modrmp + 1); - AppendToBuffer("[rip+0x%x]", disp); + AppendToBuffer("[rip+0x%x]", Imm32(modrmp + 1)); return 5; } else if ((rm & 7) == 4) { // Codes for SIB byte. @@ -473,7 +496,7 @@ int DisassemblerX64::PrintRightOperandHelper( return 2; } else if (base == 5) { // base == rbp means no base register (when mod == 0). - int32_t disp = *reinterpret_cast<int32_t*>(modrmp + 2); + int32_t disp = Imm32(modrmp + 2); AppendToBuffer("[%s*%d%s0x%x]", NameOfCPURegister(index), 1 << scale, disp < 0 ? "-" : "+", disp < 0 ? -disp : disp); return 6; @@ -497,8 +520,7 @@ int DisassemblerX64::PrintRightOperandHelper( byte sib = *(modrmp + 1); int scale, index, base; get_sib(sib, &scale, &index, &base); - int disp = (mod == 2) ? *reinterpret_cast<int32_t*>(modrmp + 2) - : *reinterpret_cast<int8_t*>(modrmp + 2); + int disp = (mod == 2) ? Imm32(modrmp + 2) : Imm8(modrmp + 2); if (index == 4 && (base & 7) == 4 && scale == 0 /*times_1*/) { AppendToBuffer("[%s%s0x%x]", NameOfCPURegister(base), disp < 0 ? "-" : "+", disp < 0 ? -disp : disp); @@ -510,8 +532,7 @@ int DisassemblerX64::PrintRightOperandHelper( return mod == 2 ? 6 : 3; } else { // No sib. - int disp = (mod == 2) ? *reinterpret_cast<int32_t*>(modrmp + 1) - : *reinterpret_cast<int8_t*>(modrmp + 1); + int disp = (mod == 2) ? Imm32(modrmp + 1) : Imm8(modrmp + 1); AppendToBuffer("[%s%s0x%x]", NameOfCPURegister(rm), disp < 0 ? "-" : "+", disp < 0 ? -disp : disp); if (rm == i::kRootRegister.code()) { @@ -540,15 +561,15 @@ int DisassemblerX64::PrintImmediate(byte* data, OperandSize size) { count = 1; break; case OPERAND_WORD_SIZE: - value = *reinterpret_cast<int16_t*>(data); + value = Imm16(data); count = 2; break; case OPERAND_DOUBLEWORD_SIZE: - value = *reinterpret_cast<uint32_t*>(data); + value = Imm32_U(data); count = 4; break; case OPERAND_QUADWORD_SIZE: - value = *reinterpret_cast<int32_t*>(data); + value = Imm32(data); count = 4; break; default: @@ -763,7 +784,7 @@ int DisassemblerX64::JumpShort(byte* data) { int DisassemblerX64::JumpConditional(byte* data) { DCHECK_EQ(0x0F, *data); byte cond = *(data + 1) & 0x0F; - byte* dest = data + *reinterpret_cast<int32_t*>(data + 2) + 6; + byte* dest = data + Imm32(data + 2) + 6; const char* mnem = conditional_code_suffix[cond]; AppendToBuffer("j%s %s", mnem, NameOfAddress(dest)); return 6; // includes 0x0F @@ -1663,6 +1684,7 @@ int DisassemblerX64::TwoByteOpcodeInstruction(byte* data) { SSSE3_INSTRUCTION_LIST(SSE34_DIS_CASE) SSE4_INSTRUCTION_LIST(SSE34_DIS_CASE) + SSE4_2_INSTRUCTION_LIST(SSE34_DIS_CASE) #undef SSE34_DIS_CASE default: UnimplementedInstruction(); @@ -1715,13 +1737,14 @@ int DisassemblerX64::TwoByteOpcodeInstruction(byte* data) { current += 1; } else if (third_byte == 0x16) { get_modrm(*current, &mod, ®op, &rm); - AppendToBuffer("pextrd "); // reg/m32, xmm, imm8 + // reg/m32/reg/m64, xmm, imm8 + AppendToBuffer("pextr%c ", rex_w() ? 'q' : 'd'); current += PrintRightOperand(current); AppendToBuffer(",%s,%d", NameOfXMMRegister(regop), (*current) & 3); current += 1; } else if (third_byte == 0x20) { get_modrm(*current, &mod, ®op, &rm); - AppendToBuffer("pinsrd "); // xmm, reg/m32, imm8 + AppendToBuffer("pinsrb "); // xmm, reg/m32, imm8 AppendToBuffer(" %s,", NameOfXMMRegister(regop)); current += PrintRightOperand(current); AppendToBuffer(",%d", (*current) & 3); @@ -1735,7 +1758,8 @@ int DisassemblerX64::TwoByteOpcodeInstruction(byte* data) { current += 1; } else if (third_byte == 0x22) { get_modrm(*current, &mod, ®op, &rm); - AppendToBuffer("pinsrd "); // xmm, reg/m32, imm8 + // xmm, reg/m32/reg/m64, imm8 + AppendToBuffer("pinsr%c ", rex_w() ? 'q' : 'd'); AppendToBuffer(" %s,", NameOfXMMRegister(regop)); current += PrintRightOperand(current); AppendToBuffer(",%d", (*current) & 3); @@ -1871,6 +1895,8 @@ int DisassemblerX64::TwoByteOpcodeInstruction(byte* data) { mnemonic = "psrlw"; } else if (opcode == 0xD2) { mnemonic = "psrld"; + } else if (opcode == 0xD4) { + mnemonic = "paddq"; } else if (opcode == 0xD5) { mnemonic = "pmullw"; } else if (opcode == 0xD7) { @@ -1880,9 +1906,9 @@ int DisassemblerX64::TwoByteOpcodeInstruction(byte* data) { } else if (opcode == 0xD9) { mnemonic = "psubusw"; } else if (opcode == 0xDA) { - mnemonic = "pand"; - } else if (opcode == 0xDB) { mnemonic = "pminub"; + } else if (opcode == 0xDB) { + mnemonic = "pand"; } else if (opcode == 0xDC) { mnemonic = "paddusb"; } else if (opcode == 0xDD) { @@ -1921,6 +1947,8 @@ int DisassemblerX64::TwoByteOpcodeInstruction(byte* data) { mnemonic = "psubw"; } else if (opcode == 0xFA) { mnemonic = "psubd"; + } else if (opcode == 0xFB) { + mnemonic = "psubq"; } else if (opcode == 0xFC) { mnemonic = "paddb"; } else if (opcode == 0xFD) { @@ -2262,7 +2290,10 @@ int DisassemblerX64::TwoByteOpcodeInstruction(byte* data) { byte_size_operand_ = true; } current += PrintOperands(mnemonic, OPER_REG_OP_ORDER, current); - } else if (opcode == 0xAE && (*(data + 2) & 0xF8) == 0xE8) { + } else if (opcode == 0xAE && (data[2] & 0xF8) == 0xF0) { + AppendToBuffer("mfence"); + current = data + 3; + } else if (opcode == 0xAE && (data[2] & 0xF8) == 0xE8) { AppendToBuffer("lfence"); current = data + 3; } else { @@ -2415,18 +2446,15 @@ int DisassemblerX64::InstructionDecode(v8::internal::Vector<char> out_buffer, byte* addr = nullptr; switch (operand_size()) { case OPERAND_WORD_SIZE: - addr = - reinterpret_cast<byte*>(*reinterpret_cast<int16_t*>(data + 1)); + addr = reinterpret_cast<byte*>(Imm16(data + 1)); data += 3; break; case OPERAND_DOUBLEWORD_SIZE: - addr = - reinterpret_cast<byte*>(*reinterpret_cast<uint32_t*>(data + 1)); + addr = reinterpret_cast<byte*>(Imm32_U(data + 1)); data += 5; break; case OPERAND_QUADWORD_SIZE: - addr = - reinterpret_cast<byte*>(*reinterpret_cast<int64_t*>(data + 1)); + addr = reinterpret_cast<byte*>(Imm64(data + 1)); data += 9; break; default: @@ -2439,7 +2467,7 @@ int DisassemblerX64::InstructionDecode(v8::internal::Vector<char> out_buffer, } case CALL_JUMP_INSTR: { - byte* addr = data + *reinterpret_cast<int32_t*>(data + 1) + 5; + byte* addr = data + Imm32(data + 1) + 5; AppendToBuffer("%s %s", idesc.mnem, NameOfAddress(addr)); data += 5; break; @@ -2448,10 +2476,10 @@ int DisassemblerX64::InstructionDecode(v8::internal::Vector<char> out_buffer, case SHORT_IMMEDIATE_INSTR: { int32_t imm; if (operand_size() == OPERAND_WORD_SIZE) { - imm = *reinterpret_cast<int16_t*>(data + 1); + imm = Imm16(data + 1); data += 3; } else { - imm = *reinterpret_cast<int32_t*>(data + 1); + imm = Imm32(data + 1); data += 5; } AppendToBuffer("%s rax,0x%x", idesc.mnem, imm); @@ -2472,7 +2500,7 @@ int DisassemblerX64::InstructionDecode(v8::internal::Vector<char> out_buffer, if (!processed) { switch (*data) { case 0xC2: - AppendToBuffer("ret 0x%x", *reinterpret_cast<uint16_t*>(data + 1)); + AppendToBuffer("ret 0x%x", Imm16_U(data + 1)); data += 3; break; @@ -2556,12 +2584,10 @@ int DisassemblerX64::InstructionDecode(v8::internal::Vector<char> out_buffer, AppendToBuffer("mov%c ", operand_size_code()); data += PrintRightOperand(data); if (operand_size() == OPERAND_WORD_SIZE) { - int16_t imm = *reinterpret_cast<int16_t*>(data); - AppendToBuffer(",0x%x", imm); + AppendToBuffer(",0x%x", Imm16(data)); data += 2; } else { - int32_t imm = *reinterpret_cast<int32_t*>(data); - AppendToBuffer(",0x%x", imm); + AppendToBuffer(",0x%x", Imm32(data)); data += 4; } } @@ -2657,12 +2683,12 @@ int DisassemblerX64::InstructionDecode(v8::internal::Vector<char> out_buffer, break; } case 0x68: - AppendToBuffer("push 0x%x", *reinterpret_cast<int32_t*>(data + 1)); + AppendToBuffer("push 0x%x", Imm32(data + 1)); data += 5; break; case 0x6A: - AppendToBuffer("push 0x%x", *reinterpret_cast<int8_t*>(data + 1)); + AppendToBuffer("push 0x%x", Imm8(data + 1)); data += 2; break; @@ -2670,8 +2696,8 @@ int DisassemblerX64::InstructionDecode(v8::internal::Vector<char> out_buffer, case 0xA3: switch (operand_size()) { case OPERAND_DOUBLEWORD_SIZE: { - const char* memory_location = NameOfAddress( - reinterpret_cast<byte*>(*reinterpret_cast<int32_t*>(data + 1))); + const char* memory_location = + NameOfAddress(reinterpret_cast<byte*>(Imm32(data + 1))); if (*data == 0xA1) { // Opcode 0xA1 AppendToBuffer("movzxlq rax,(%s)", memory_location); } else { // Opcode 0xA3 @@ -2683,7 +2709,7 @@ int DisassemblerX64::InstructionDecode(v8::internal::Vector<char> out_buffer, case OPERAND_QUADWORD_SIZE: { // New x64 instruction mov rax,(imm_64). const char* memory_location = - NameOfAddress(*reinterpret_cast<byte**>(data + 1)); + NameOfAddress(reinterpret_cast<byte*>(Imm64(data + 1))); if (*data == 0xA1) { // Opcode 0xA1 AppendToBuffer("movq rax,(%s)", memory_location); } else { // Opcode 0xA3 @@ -2699,7 +2725,7 @@ int DisassemblerX64::InstructionDecode(v8::internal::Vector<char> out_buffer, break; case 0xA8: - AppendToBuffer("test al,0x%x", *reinterpret_cast<uint8_t*>(data + 1)); + AppendToBuffer("test al,0x%x", Imm8_U(data + 1)); data += 2; break; @@ -2707,15 +2733,15 @@ int DisassemblerX64::InstructionDecode(v8::internal::Vector<char> out_buffer, int64_t value = 0; switch (operand_size()) { case OPERAND_WORD_SIZE: - value = *reinterpret_cast<uint16_t*>(data + 1); + value = Imm16_U(data + 1); data += 3; break; case OPERAND_DOUBLEWORD_SIZE: - value = *reinterpret_cast<uint32_t*>(data + 1); + value = Imm32_U(data + 1); data += 5; break; case OPERAND_QUADWORD_SIZE: - value = *reinterpret_cast<int32_t*>(data + 1); + value = Imm32(data + 1); data += 5; break; default: @@ -2758,7 +2784,7 @@ int DisassemblerX64::InstructionDecode(v8::internal::Vector<char> out_buffer, break; case 0x3C: - AppendToBuffer("cmp al,0x%x", *reinterpret_cast<int8_t*>(data + 1)); + AppendToBuffer("cmp al,0x%x", Imm8(data + 1)); data += 2; break; |