1014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Copyright 2015 the V8 project authors. All rights reserved. 2014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// found in the LICENSE file. 4014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/compiler/bytecode-branch-analysis.h" 6014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/interpreter/bytecode-array-iterator.h" 8014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/objects-inl.h" 9014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace v8 { 11014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace internal { 12014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace compiler { 13014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 14014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochBytecodeBranchAnalysis::BytecodeBranchAnalysis( 15014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<BytecodeArray> bytecode_array, Zone* zone) 16342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch : bytecode_array_(bytecode_array), 17342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch is_backward_target_(bytecode_array->length(), zone), 18342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch is_forward_target_(bytecode_array->length(), zone), 19014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch zone_(zone) {} 20014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 21014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid BytecodeBranchAnalysis::Analyze() { 22014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch interpreter::BytecodeArrayIterator iterator(bytecode_array()); 23014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch while (!iterator.done()) { 24014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch interpreter::Bytecode bytecode = iterator.current_bytecode(); 25014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int current_offset = iterator.current_offset(); 26342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch if (interpreter::Bytecodes::IsJump(bytecode)) { 27342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch AddBranch(current_offset, iterator.GetJumpTargetOffset()); 28014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 29014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch iterator.Advance(); 30014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 31014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 32014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 33014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid BytecodeBranchAnalysis::AddBranch(int source_offset, int target_offset) { 34342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch if (source_offset < target_offset) { 35342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch is_forward_target_.Add(target_offset); 36014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 37342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch is_backward_target_.Add(target_offset); 38014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 39014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 40014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 41014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace compiler 42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace internal 43014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace v8 44