Commit 33480daa authored by ishell's avatar ishell Committed by Commit bot

[stubs] Enable machine graph verification for fast accessor assembler.

... and clean it up.

BUG=

Review-Url: https://codereview.chromium.org/2569353004
Cr-Commit-Position: refs/heads/master@{#41694}
parent 859414da
...@@ -10,17 +10,20 @@ ...@@ -10,17 +10,20 @@
#include "src/handles-inl.h" #include "src/handles-inl.h"
#include "src/objects.h" // For FAA::LoadInternalField impl. #include "src/objects.h" // For FAA::LoadInternalField impl.
using v8::internal::compiler::Node;
namespace v8 { namespace v8 {
namespace internal { namespace internal {
using compiler::Node;
using compiler::CodeAssemblerLabel;
using compiler::CodeAssemblerVariable;
FastAccessorAssembler::FastAccessorAssembler(Isolate* isolate) FastAccessorAssembler::FastAccessorAssembler(Isolate* isolate)
: zone_(isolate->allocator(), ZONE_NAME), : zone_(isolate->allocator(), ZONE_NAME),
isolate_(isolate), isolate_(isolate),
assembler_state_(isolate, zone(), 1, Code::ComputeFlags(Code::STUB), assembler_state_(new compiler::CodeAssemblerState(
"FastAccessorAssembler"), isolate, zone(), 1, Code::ComputeFlags(Code::STUB),
assembler_(new CodeStubAssembler(&assembler_state_)), "FastAccessorAssembler")),
assembler_(new CodeStubAssembler(assembler_state_.get())),
state_(kBuilding) {} state_(kBuilding) {}
FastAccessorAssembler::~FastAccessorAssembler() { Clear(); } FastAccessorAssembler::~FastAccessorAssembler() { Clear(); }
...@@ -39,19 +42,18 @@ FastAccessorAssembler::ValueId FastAccessorAssembler::GetReceiver() { ...@@ -39,19 +42,18 @@ FastAccessorAssembler::ValueId FastAccessorAssembler::GetReceiver() {
} }
FastAccessorAssembler::ValueId FastAccessorAssembler::LoadInternalField( FastAccessorAssembler::ValueId FastAccessorAssembler::LoadInternalField(
ValueId value, int field_no) { ValueId value_id, int field_no) {
CHECK_EQ(kBuilding, state_); CHECK_EQ(kBuilding, state_);
CodeStubAssembler::Variable result(assembler_.get(), CodeAssemblerVariable result(assembler_.get(),
MachineRepresentation::kTagged); MachineRepresentation::kTagged);
LabelId is_not_jsobject = MakeLabel(); LabelId is_not_jsobject = MakeLabel();
CodeStubAssembler::Label merge(assembler_.get(), &result); CodeAssemblerLabel merge(assembler_.get(), &result);
CheckIsJSObjectOrJump(value, is_not_jsobject); CheckIsJSObjectOrJump(value_id, is_not_jsobject);
Node* internal_field = assembler_->LoadObjectField( Node* internal_field = assembler_->LoadObjectField(
FromId(value), JSObject::kHeaderSize + kPointerSize * field_no, FromId(value_id), JSObject::kHeaderSize + kPointerSize * field_no);
MachineType::Pointer());
result.Bind(internal_field); result.Bind(internal_field);
assembler_->Goto(&merge); assembler_->Goto(&merge);
...@@ -67,14 +69,15 @@ FastAccessorAssembler::ValueId FastAccessorAssembler::LoadInternalField( ...@@ -67,14 +69,15 @@ FastAccessorAssembler::ValueId FastAccessorAssembler::LoadInternalField(
} }
FastAccessorAssembler::ValueId FastAccessorAssembler::ValueId
FastAccessorAssembler::LoadInternalFieldUnchecked(ValueId value, int field_no) { FastAccessorAssembler::LoadInternalFieldUnchecked(ValueId value_id,
int field_no) {
CHECK_EQ(kBuilding, state_); CHECK_EQ(kBuilding, state_);
// Defensive debug checks. // Defensive debug checks.
if (FLAG_debug_code) { if (FLAG_debug_code) {
LabelId is_jsobject = MakeLabel(); LabelId is_jsobject = MakeLabel();
LabelId is_not_jsobject = MakeLabel(); LabelId is_not_jsobject = MakeLabel();
CheckIsJSObjectOrJump(value, is_not_jsobject); CheckIsJSObjectOrJump(value_id, is_not_jsobject);
assembler_->Goto(FromId(is_jsobject)); assembler_->Goto(FromId(is_jsobject));
SetLabel(is_not_jsobject); SetLabel(is_not_jsobject);
...@@ -85,58 +88,56 @@ FastAccessorAssembler::LoadInternalFieldUnchecked(ValueId value, int field_no) { ...@@ -85,58 +88,56 @@ FastAccessorAssembler::LoadInternalFieldUnchecked(ValueId value, int field_no) {
} }
Node* result = assembler_->LoadObjectField( Node* result = assembler_->LoadObjectField(
FromId(value), JSObject::kHeaderSize + kPointerSize * field_no, FromId(value_id), JSObject::kHeaderSize + kPointerSize * field_no);
MachineType::Pointer());
return FromRaw(result); return FromRaw(result);
} }
FastAccessorAssembler::ValueId FastAccessorAssembler::LoadValue(ValueId value, FastAccessorAssembler::ValueId FastAccessorAssembler::LoadValue(
int offset) { ValueId value_id, int offset) {
CHECK_EQ(kBuilding, state_); CHECK_EQ(kBuilding, state_);
return FromRaw(assembler_->LoadBufferObject(FromId(value), offset, return FromRaw(assembler_->LoadBufferObject(FromId(value_id), offset,
MachineType::IntPtr())); MachineType::IntPtr()));
} }
FastAccessorAssembler::ValueId FastAccessorAssembler::LoadObject(ValueId value, FastAccessorAssembler::ValueId FastAccessorAssembler::LoadObject(
int offset) { ValueId value_id, int offset) {
CHECK_EQ(kBuilding, state_); CHECK_EQ(kBuilding, state_);
return FromRaw(assembler_->LoadBufferObject( return FromRaw(assembler_->LoadBufferObject(
assembler_->LoadBufferObject(FromId(value), offset, assembler_->LoadBufferObject(FromId(value_id), offset), 0,
MachineType::Pointer()), MachineType::AnyTagged()));
0, MachineType::AnyTagged()));
} }
FastAccessorAssembler::ValueId FastAccessorAssembler::ToSmi(ValueId value) { FastAccessorAssembler::ValueId FastAccessorAssembler::ToSmi(ValueId value_id) {
CHECK_EQ(kBuilding, state_); CHECK_EQ(kBuilding, state_);
return FromRaw(assembler_->SmiTag(FromId(value))); return FromRaw(assembler_->SmiTag(FromId(value_id)));
} }
void FastAccessorAssembler::ReturnValue(ValueId value) { void FastAccessorAssembler::ReturnValue(ValueId value_id) {
CHECK_EQ(kBuilding, state_); CHECK_EQ(kBuilding, state_);
assembler_->Return(FromId(value)); assembler_->Return(FromId(value_id));
} }
void FastAccessorAssembler::CheckFlagSetOrReturnNull(ValueId value, int mask) { void FastAccessorAssembler::CheckFlagSetOrReturnNull(ValueId value_id,
int mask) {
CHECK_EQ(kBuilding, state_); CHECK_EQ(kBuilding, state_);
CodeStubAssembler::Label pass(assembler_.get()); CodeAssemblerLabel pass(assembler_.get());
CodeStubAssembler::Label fail(assembler_.get()); CodeAssemblerLabel fail(assembler_.get());
Node* value = FromId(value_id);
assembler_->Branch( assembler_->Branch(
assembler_->Word32Equal( assembler_->IsSetWord(assembler_->BitcastTaggedToWord(value), mask),
assembler_->Word32And(FromId(value), assembler_->Int32Constant(mask)), &pass, &fail);
assembler_->Int32Constant(0)),
&fail, &pass);
assembler_->Bind(&fail); assembler_->Bind(&fail);
assembler_->Return(assembler_->NullConstant()); assembler_->Return(assembler_->NullConstant());
assembler_->Bind(&pass); assembler_->Bind(&pass);
} }
void FastAccessorAssembler::CheckNotZeroOrReturnNull(ValueId value) { void FastAccessorAssembler::CheckNotZeroOrReturnNull(ValueId value_id) {
CHECK_EQ(kBuilding, state_); CHECK_EQ(kBuilding, state_);
CodeStubAssembler::Label is_null(assembler_.get()); CodeAssemblerLabel is_null(assembler_.get());
CodeStubAssembler::Label not_null(assembler_.get()); CodeAssemblerLabel not_null(assembler_.get());
assembler_->Branch( assembler_->Branch(
assembler_->WordEqual(FromId(value), assembler_->IntPtrConstant(0)), assembler_->WordEqual(FromId(value_id), assembler_->SmiConstant(0)),
&is_null, &not_null); &is_null, &not_null);
assembler_->Bind(&is_null); assembler_->Bind(&is_null);
assembler_->Return(assembler_->NullConstant()); assembler_->Return(assembler_->NullConstant());
...@@ -145,7 +146,7 @@ void FastAccessorAssembler::CheckNotZeroOrReturnNull(ValueId value) { ...@@ -145,7 +146,7 @@ void FastAccessorAssembler::CheckNotZeroOrReturnNull(ValueId value) {
FastAccessorAssembler::LabelId FastAccessorAssembler::MakeLabel() { FastAccessorAssembler::LabelId FastAccessorAssembler::MakeLabel() {
CHECK_EQ(kBuilding, state_); CHECK_EQ(kBuilding, state_);
return FromRaw(new CodeStubAssembler::Label(assembler_.get())); return FromRaw(new CodeAssemblerLabel(assembler_.get()));
} }
void FastAccessorAssembler::SetLabel(LabelId label_id) { void FastAccessorAssembler::SetLabel(LabelId label_id) {
...@@ -161,9 +162,9 @@ void FastAccessorAssembler::Goto(LabelId label_id) { ...@@ -161,9 +162,9 @@ void FastAccessorAssembler::Goto(LabelId label_id) {
void FastAccessorAssembler::CheckNotZeroOrJump(ValueId value_id, void FastAccessorAssembler::CheckNotZeroOrJump(ValueId value_id,
LabelId label_id) { LabelId label_id) {
CHECK_EQ(kBuilding, state_); CHECK_EQ(kBuilding, state_);
CodeStubAssembler::Label pass(assembler_.get()); CodeAssemblerLabel pass(assembler_.get());
assembler_->Branch( assembler_->Branch(
assembler_->WordEqual(FromId(value_id), assembler_->IntPtrConstant(0)), assembler_->WordEqual(FromId(value_id), assembler_->SmiConstant(0)),
FromId(label_id), &pass); FromId(label_id), &pass);
assembler_->Bind(&pass); assembler_->Bind(&pass);
} }
...@@ -216,28 +217,20 @@ void FastAccessorAssembler::CheckIsJSObjectOrJump(ValueId value_id, ...@@ -216,28 +217,20 @@ void FastAccessorAssembler::CheckIsJSObjectOrJump(ValueId value_id,
CHECK_EQ(kBuilding, state_); CHECK_EQ(kBuilding, state_);
// Determine the 'value' object's instance type. // Determine the 'value' object's instance type.
Node* object_map = assembler_->LoadObjectField( Node* instance_type = assembler_->LoadInstanceType(FromId(value_id));
FromId(value_id), Internals::kHeapObjectMapOffset,
MachineType::Pointer());
Node* instance_type = assembler_->WordAnd( CodeAssemblerLabel is_jsobject(assembler_.get());
assembler_->LoadObjectField(object_map,
Internals::kMapInstanceTypeAndBitFieldOffset,
MachineType::Uint16()),
assembler_->IntPtrConstant(0xff));
CodeStubAssembler::Label is_jsobject(assembler_.get());
// Check whether we have a proper JSObject. // Check whether we have a proper JSObject.
assembler_->GotoIf( assembler_->GotoIf(
assembler_->WordEqual( assembler_->Word32Equal(
instance_type, assembler_->IntPtrConstant(Internals::kJSObjectType)), instance_type, assembler_->Int32Constant(Internals::kJSObjectType)),
&is_jsobject); &is_jsobject);
// JSApiObject?. // JSApiObject?.
assembler_->GotoUnless( assembler_->GotoUnless(
assembler_->WordEqual(instance_type, assembler_->IntPtrConstant( assembler_->Word32Equal(instance_type, assembler_->Int32Constant(
Internals::kJSApiObjectType)), Internals::kJSApiObjectType)),
FromId(label_id)); FromId(label_id));
// Continue. // Continue.
...@@ -247,7 +240,8 @@ void FastAccessorAssembler::CheckIsJSObjectOrJump(ValueId value_id, ...@@ -247,7 +240,8 @@ void FastAccessorAssembler::CheckIsJSObjectOrJump(ValueId value_id,
MaybeHandle<Code> FastAccessorAssembler::Build() { MaybeHandle<Code> FastAccessorAssembler::Build() {
CHECK_EQ(kBuilding, state_); CHECK_EQ(kBuilding, state_);
Handle<Code> code = compiler::CodeAssembler::GenerateCode(&assembler_state_); Handle<Code> code = compiler::CodeAssembler::GenerateCode(
assembler_state_.get(), FLAG_csa_verify);
state_ = !code.is_null() ? kBuilt : kError; state_ = !code.is_null() ? kBuilt : kError;
Clear(); Clear();
return code; return code;
...@@ -255,12 +249,12 @@ MaybeHandle<Code> FastAccessorAssembler::Build() { ...@@ -255,12 +249,12 @@ MaybeHandle<Code> FastAccessorAssembler::Build() {
FastAccessorAssembler::ValueId FastAccessorAssembler::FromRaw(Node* node) { FastAccessorAssembler::ValueId FastAccessorAssembler::FromRaw(Node* node) {
nodes_.push_back(node); nodes_.push_back(node);
ValueId value = {nodes_.size() - 1}; ValueId value_id = {nodes_.size() - 1};
return value; return value_id;
} }
FastAccessorAssembler::LabelId FastAccessorAssembler::FromRaw( FastAccessorAssembler::LabelId FastAccessorAssembler::FromRaw(
CodeStubAssembler::Label* label) { CodeAssemblerLabel* label) {
labels_.push_back(label); labels_.push_back(label);
LabelId label_id = {labels_.size() - 1}; LabelId label_id = {labels_.size() - 1};
return label_id; return label_id;
...@@ -272,7 +266,7 @@ Node* FastAccessorAssembler::FromId(ValueId value) const { ...@@ -272,7 +266,7 @@ Node* FastAccessorAssembler::FromId(ValueId value) const {
return nodes_.at(value.value_id); return nodes_.at(value.value_id);
} }
CodeStubAssembler::Label* FastAccessorAssembler::FromId(LabelId label) const { CodeAssemblerLabel* FastAccessorAssembler::FromId(LabelId label) const {
CHECK_LT(label.label_id, labels_.size()); CHECK_LT(label.label_id, labels_.size());
CHECK_NOT_NULL(labels_.at(label.label_id)); CHECK_NOT_NULL(labels_.at(label.label_id));
return labels_.at(label.label_id); return labels_.at(label.label_id);
......
...@@ -13,18 +13,19 @@ ...@@ -13,18 +13,19 @@
#include "src/base/macros.h" #include "src/base/macros.h"
#include "src/handles.h" #include "src/handles.h"
// For CodeStubAssembler::Label. (We cannot forward-declare inner classes.)
#include "src/code-stub-assembler.h"
namespace v8 { namespace v8 {
namespace internal { namespace internal {
class Code; class Code;
class CodeStubAssembler;
class Isolate; class Isolate;
class Zone; class Zone;
namespace compiler { namespace compiler {
class Node; class Node;
class CodeAssemblerLabel;
class CodeAssemblerState;
class CodeAssemblerVariable;
} }
// This interface "exports" an aggregated subset of RawMachineAssembler, for // This interface "exports" an aggregated subset of RawMachineAssembler, for
...@@ -86,9 +87,9 @@ class FastAccessorAssembler { ...@@ -86,9 +87,9 @@ class FastAccessorAssembler {
private: private:
ValueId FromRaw(compiler::Node* node); ValueId FromRaw(compiler::Node* node);
LabelId FromRaw(CodeStubAssembler::Label* label); LabelId FromRaw(compiler::CodeAssemblerLabel* label);
compiler::Node* FromId(ValueId value) const; compiler::Node* FromId(ValueId value) const;
CodeStubAssembler::Label* FromId(LabelId value) const; compiler::CodeAssemblerLabel* FromId(LabelId value) const;
void CheckIsJSObjectOrJump(ValueId value, LabelId label_id); void CheckIsJSObjectOrJump(ValueId value, LabelId label_id);
...@@ -98,14 +99,14 @@ class FastAccessorAssembler { ...@@ -98,14 +99,14 @@ class FastAccessorAssembler {
Zone zone_; Zone zone_;
Isolate* isolate_; Isolate* isolate_;
compiler::CodeAssemblerState assembler_state_; std::unique_ptr<compiler::CodeAssemblerState> assembler_state_;
std::unique_ptr<CodeStubAssembler> assembler_; std::unique_ptr<CodeStubAssembler> assembler_;
// To prevent exposing the RMA internals to the outside world, we'll map // To prevent exposing the RMA internals to the outside world, we'll map
// Node + Label pointers integers wrapped in ValueId and LabelId instances. // Node + Label pointers integers wrapped in ValueId and LabelId instances.
// These vectors maintain this mapping. // These vectors maintain this mapping.
std::vector<compiler::Node*> nodes_; std::vector<compiler::Node*> nodes_;
std::vector<CodeStubAssembler::Label*> labels_; std::vector<compiler::CodeAssemblerLabel*> labels_;
// Remember the current state for easy error checking. (We prefer to be // Remember the current state for easy error checking. (We prefer to be
// strict as this class will be exposed at the API.) // strict as this class will be exposed at the API.)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment