aboutsummaryrefslogtreecommitdiff
path: root/deps/v8/src/codegen/assembler.cc
diff options
context:
space:
mode:
authorMichaël Zasso <targos@protonmail.com>2019-08-01 08:38:30 +0200
committerMichaël Zasso <targos@protonmail.com>2019-08-01 12:53:56 +0200
commit2dcc3665abf57c3607cebffdeeca062f5894885d (patch)
tree4f560748132edcfb4c22d6f967a7e80d23d7ea2c /deps/v8/src/codegen/assembler.cc
parent1ee47d550c6de132f06110aa13eceb7551d643b3 (diff)
downloadandroid-node-v8-2dcc3665abf57c3607cebffdeeca062f5894885d.tar.gz
android-node-v8-2dcc3665abf57c3607cebffdeeca062f5894885d.tar.bz2
android-node-v8-2dcc3665abf57c3607cebffdeeca062f5894885d.zip
deps: update V8 to 7.6.303.28
PR-URL: https://github.com/nodejs/node/pull/28016 Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Refael Ackermann (רפאל פלחי) <refack@gmail.com> Reviewed-By: Rich Trott <rtrott@gmail.com> Reviewed-By: Michael Dawson <michael_dawson@ca.ibm.com> Reviewed-By: Jiawen Geng <technicalcute@gmail.com>
Diffstat (limited to 'deps/v8/src/codegen/assembler.cc')
-rw-r--r--deps/v8/src/codegen/assembler.cc256
1 files changed, 256 insertions, 0 deletions
diff --git a/deps/v8/src/codegen/assembler.cc b/deps/v8/src/codegen/assembler.cc
new file mode 100644
index 0000000000..687ae98bfe
--- /dev/null
+++ b/deps/v8/src/codegen/assembler.cc
@@ -0,0 +1,256 @@
+// Copyright (c) 1994-2006 Sun Microsystems Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// - Redistributions of source code must retain the above copyright notice,
+// this list of conditions and the following disclaimer.
+//
+// - Redistribution in binary form must reproduce the above copyright
+// notice, this list of conditions and the following disclaimer in the
+// documentation and/or other materials provided with the distribution.
+//
+// - Neither the name of Sun Microsystems or the names of contributors may
+// be used to endorse or promote products derived from this software without
+// specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// The original source code covered by the above license above has been
+// modified significantly by Google Inc.
+// Copyright 2012 the V8 project authors. All rights reserved.
+
+#include "src/codegen/assembler.h"
+
+#include "src/codegen/assembler-inl.h"
+#include "src/codegen/string-constants.h"
+#include "src/deoptimizer/deoptimizer.h"
+#include "src/diagnostics/disassembler.h"
+#include "src/execution/isolate.h"
+#include "src/heap/heap-inl.h" // For MemoryAllocator. TODO(jkummerow): Drop.
+#include "src/snapshot/embedded/embedded-data.h"
+#include "src/snapshot/serializer-common.h"
+#include "src/snapshot/snapshot.h"
+#include "src/utils/ostreams.h"
+#include "src/utils/vector.h"
+
+namespace v8 {
+namespace internal {
+
+AssemblerOptions AssemblerOptions::Default(
+ Isolate* isolate, bool explicitly_support_serialization) {
+ AssemblerOptions options;
+ const bool serializer =
+ isolate->serializer_enabled() || explicitly_support_serialization;
+ const bool generating_embedded_builtin =
+ isolate->IsGeneratingEmbeddedBuiltins();
+ options.record_reloc_info_for_serialization = serializer;
+ options.enable_root_array_delta_access =
+ !serializer && !generating_embedded_builtin;
+#ifdef USE_SIMULATOR
+ // Don't generate simulator specific code if we are building a snapshot, which
+ // might be run on real hardware.
+ options.enable_simulator_code = !serializer;
+#endif
+ options.inline_offheap_trampolines =
+ FLAG_embedded_builtins && !serializer && !generating_embedded_builtin;
+#if V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64
+ const base::AddressRegion& code_range =
+ isolate->heap()->memory_allocator()->code_range();
+ DCHECK_IMPLIES(code_range.begin() != kNullAddress, !code_range.is_empty());
+ options.code_range_start = code_range.begin();
+#endif
+ return options;
+}
+
+namespace {
+
+class DefaultAssemblerBuffer : public AssemblerBuffer {
+ public:
+ explicit DefaultAssemblerBuffer(int size)
+ : buffer_(OwnedVector<uint8_t>::New(size)) {
+#ifdef DEBUG
+ ZapCode(reinterpret_cast<Address>(buffer_.start()), size);
+#endif
+ }
+
+ byte* start() const override { return buffer_.start(); }
+
+ int size() const override { return static_cast<int>(buffer_.size()); }
+
+ std::unique_ptr<AssemblerBuffer> Grow(int new_size) override {
+ DCHECK_LT(size(), new_size);
+ return base::make_unique<DefaultAssemblerBuffer>(new_size);
+ }
+
+ private:
+ OwnedVector<uint8_t> buffer_;
+};
+
+class ExternalAssemblerBufferImpl : public AssemblerBuffer {
+ public:
+ ExternalAssemblerBufferImpl(byte* start, int size)
+ : start_(start), size_(size) {}
+
+ byte* start() const override { return start_; }
+
+ int size() const override { return size_; }
+
+ std::unique_ptr<AssemblerBuffer> Grow(int new_size) override {
+ FATAL("Cannot grow external assembler buffer");
+ }
+
+ private:
+ byte* const start_;
+ const int size_;
+};
+
+} // namespace
+
+std::unique_ptr<AssemblerBuffer> ExternalAssemblerBuffer(void* start,
+ int size) {
+ return base::make_unique<ExternalAssemblerBufferImpl>(
+ reinterpret_cast<byte*>(start), size);
+}
+
+std::unique_ptr<AssemblerBuffer> NewAssemblerBuffer(int size) {
+ return base::make_unique<DefaultAssemblerBuffer>(size);
+}
+
+// -----------------------------------------------------------------------------
+// Implementation of AssemblerBase
+
+AssemblerBase::AssemblerBase(const AssemblerOptions& options,
+ std::unique_ptr<AssemblerBuffer> buffer)
+ : buffer_(std::move(buffer)),
+ options_(options),
+ enabled_cpu_features_(0),
+ emit_debug_code_(FLAG_debug_code),
+ predictable_code_size_(false),
+ constant_pool_available_(false),
+ jump_optimization_info_(nullptr) {
+ if (!buffer_) buffer_ = NewAssemblerBuffer(kMinimalBufferSize);
+ buffer_start_ = buffer_->start();
+ pc_ = buffer_start_;
+}
+
+AssemblerBase::~AssemblerBase() = default;
+
+void AssemblerBase::Print(Isolate* isolate) {
+ StdoutStream os;
+ v8::internal::Disassembler::Decode(isolate, &os, buffer_start_, pc_);
+}
+
+// -----------------------------------------------------------------------------
+// Implementation of CpuFeatureScope
+
+#ifdef DEBUG
+CpuFeatureScope::CpuFeatureScope(AssemblerBase* assembler, CpuFeature f,
+ CheckPolicy check)
+ : assembler_(assembler) {
+ DCHECK_IMPLIES(check == kCheckSupported, CpuFeatures::IsSupported(f));
+ old_enabled_ = assembler_->enabled_cpu_features();
+ assembler_->EnableCpuFeature(f);
+}
+
+CpuFeatureScope::~CpuFeatureScope() {
+ assembler_->set_enabled_cpu_features(old_enabled_);
+}
+#endif
+
+bool CpuFeatures::initialized_ = false;
+unsigned CpuFeatures::supported_ = 0;
+unsigned CpuFeatures::icache_line_size_ = 0;
+unsigned CpuFeatures::dcache_line_size_ = 0;
+
+HeapObjectRequest::HeapObjectRequest(double heap_number, int offset)
+ : kind_(kHeapNumber), offset_(offset) {
+ value_.heap_number = heap_number;
+ DCHECK(!IsSmiDouble(value_.heap_number));
+}
+
+HeapObjectRequest::HeapObjectRequest(const StringConstantBase* string,
+ int offset)
+ : kind_(kStringConstant), offset_(offset) {
+ value_.string = string;
+ DCHECK_NOT_NULL(value_.string);
+}
+
+// Platform specific but identical code for all the platforms.
+
+void Assembler::RecordDeoptReason(DeoptimizeReason reason,
+ SourcePosition position, int id) {
+ EnsureSpace ensure_space(this);
+ RecordRelocInfo(RelocInfo::DEOPT_SCRIPT_OFFSET, position.ScriptOffset());
+ RecordRelocInfo(RelocInfo::DEOPT_INLINING_ID, position.InliningId());
+ RecordRelocInfo(RelocInfo::DEOPT_REASON, static_cast<int>(reason));
+ RecordRelocInfo(RelocInfo::DEOPT_ID, id);
+}
+
+void Assembler::DataAlign(int m) {
+ DCHECK(m >= 2 && base::bits::IsPowerOfTwo(m));
+ while ((pc_offset() & (m - 1)) != 0) {
+ // Pad with 0xcc (= int3 on ia32 and x64); the primary motivation is that
+ // the disassembler expects to find valid instructions, but this is also
+ // nice from a security point of view.
+ db(0xcc);
+ }
+}
+
+void AssemblerBase::RequestHeapObject(HeapObjectRequest request) {
+ request.set_offset(pc_offset());
+ heap_object_requests_.push_front(request);
+}
+
+int AssemblerBase::AddCodeTarget(Handle<Code> target) {
+ int current = static_cast<int>(code_targets_.size());
+ if (current > 0 && !target.is_null() &&
+ code_targets_.back().address() == target.address()) {
+ // Optimization if we keep jumping to the same code target.
+ return current - 1;
+ } else {
+ code_targets_.push_back(target);
+ return current;
+ }
+}
+
+int AssemblerBase::AddCompressedEmbeddedObject(Handle<HeapObject> object) {
+ int current = static_cast<int>(compressed_embedded_objects_.size());
+ compressed_embedded_objects_.push_back(object);
+ return current;
+}
+
+Handle<HeapObject> AssemblerBase::GetCompressedEmbeddedObject(
+ intptr_t index) const {
+ DCHECK_LT(static_cast<size_t>(index), compressed_embedded_objects_.size());
+ return compressed_embedded_objects_[index];
+}
+
+Handle<Code> AssemblerBase::GetCodeTarget(intptr_t code_target_index) const {
+ DCHECK_LT(static_cast<size_t>(code_target_index), code_targets_.size());
+ return code_targets_[code_target_index];
+}
+
+int Assembler::WriteCodeComments() {
+ if (!FLAG_code_comments || code_comments_writer_.entry_count() == 0) return 0;
+ int offset = pc_offset();
+ code_comments_writer_.Emit(this);
+ int size = pc_offset() - offset;
+ DCHECK_EQ(size, code_comments_writer_.section_size());
+ return size;
+}
+
+} // namespace internal
+} // namespace v8