diff options
Diffstat (limited to 'deps/v8/src/assembler.cc')
-rw-r--r-- | deps/v8/src/assembler.cc | 286 |
1 files changed, 0 insertions, 286 deletions
diff --git a/deps/v8/src/assembler.cc b/deps/v8/src/assembler.cc deleted file mode 100644 index 82d0fb9794..0000000000 --- a/deps/v8/src/assembler.cc +++ /dev/null @@ -1,286 +0,0 @@ -// 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/assembler.h" - -#include "src/assembler-inl.h" -#include "src/deoptimizer.h" -#include "src/disassembler.h" -#include "src/heap/heap-inl.h" // For MemoryAllocator. TODO(jkummerow): Drop. -#include "src/isolate.h" -#include "src/ostreams.h" -#include "src/snapshot/embedded-data.h" -#include "src/snapshot/serializer-common.h" -#include "src/snapshot/snapshot.h" -#include "src/string-constants.h" -#include "src/vector.h" - -namespace v8 { -namespace internal { - -AssemblerOptions AssemblerOptions::EnableV8AgnosticCode() const { - AssemblerOptions options = *this; - options.v8_agnostic_code = true; - options.record_reloc_info_for_serialization = false; - options.enable_root_array_delta_access = false; - // Inherit |enable_simulator_code| value. - options.isolate_independent_code = false; - options.inline_offheap_trampolines = false; - // Inherit |code_range_start| value. - // Inherit |use_pc_relative_calls_and_jumps| value. - return options; -} - -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 PredictableCodeSizeScope - -PredictableCodeSizeScope::PredictableCodeSizeScope(AssemblerBase* assembler, - int expected_size) - : assembler_(assembler), - expected_size_(expected_size), - start_offset_(assembler->pc_offset()), - old_value_(assembler->predictable_code_size()) { - assembler_->set_predictable_code_size(true); -} - -PredictableCodeSizeScope::~PredictableCodeSizeScope() { - CHECK_EQ(expected_size_, assembler_->pc_offset() - start_offset_); - assembler_->set_predictable_code_size(old_value_); -} - -// ----------------------------------------------------------------------------- -// 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) { - DCHECK(!options().v8_agnostic_code); - request.set_offset(pc_offset()); - heap_object_requests_.push_front(request); -} - -int AssemblerBase::AddCodeTarget(Handle<Code> target) { - DCHECK(!options().v8_agnostic_code); - 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; - } -} - -Handle<Code> AssemblerBase::GetCodeTarget(intptr_t code_target_index) const { - DCHECK(!options().v8_agnostic_code); - DCHECK_LE(0, code_target_index); - DCHECK_LT(code_target_index, code_targets_.size()); - return code_targets_[code_target_index]; -} - -void AssemblerBase::UpdateCodeTarget(intptr_t code_target_index, - Handle<Code> code) { - DCHECK(!options().v8_agnostic_code); - DCHECK_LE(0, code_target_index); - DCHECK_LT(code_target_index, code_targets_.size()); - code_targets_[code_target_index] = code; -} - -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 |