Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3)

Side by Side Diff: src/code-stub-assembler.h

Issue 2446073002: [stubs] Add more assertions in the CodeStubAssembler (Closed)
Patch Set: adding slow asserts Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | src/code-stub-assembler.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 the V8 project authors. All rights reserved. 1 // Copyright 2016 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef V8_CODE_STUB_ASSEMBLER_H_ 5 #ifndef V8_CODE_STUB_ASSEMBLER_H_
6 #define V8_CODE_STUB_ASSEMBLER_H_ 6 #define V8_CODE_STUB_ASSEMBLER_H_
7 7
8 #include <functional> 8 #include <functional>
9 9
10 #include "src/compiler/code-assembler.h" 10 #include "src/compiler/code-assembler.h"
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
156 // Allocate an object of the given size. 156 // Allocate an object of the given size.
157 compiler::Node* Allocate(compiler::Node* size, AllocationFlags flags = kNone); 157 compiler::Node* Allocate(compiler::Node* size, AllocationFlags flags = kNone);
158 compiler::Node* Allocate(int size, AllocationFlags flags = kNone); 158 compiler::Node* Allocate(int size, AllocationFlags flags = kNone);
159 compiler::Node* InnerAllocate(compiler::Node* previous, int offset); 159 compiler::Node* InnerAllocate(compiler::Node* previous, int offset);
160 compiler::Node* InnerAllocate(compiler::Node* previous, 160 compiler::Node* InnerAllocate(compiler::Node* previous,
161 compiler::Node* offset); 161 compiler::Node* offset);
162 compiler::Node* IsRegularHeapObjectSize(compiler::Node* size); 162 compiler::Node* IsRegularHeapObjectSize(compiler::Node* size);
163 163
164 void Assert(compiler::Node* condition, const char* string = nullptr, 164 void Assert(compiler::Node* condition, const char* string = nullptr,
165 const char* file = nullptr, int line = 0); 165 const char* file = nullptr, int line = 0);
166 void SlowAssert(compiler::Node* condition, const char* string = nullptr,
Igor Sheludko 2016/10/26 13:24:27 See next comment.
167 const char* file = nullptr, int line = 0);
166 168
167 // Check a value for smi-ness 169 // Check a value for smi-ness
168 compiler::Node* TaggedIsSmi(compiler::Node* a); 170 compiler::Node* TaggedIsSmi(compiler::Node* a);
169 // Check that the value is a non-negative smi. 171 // Check that the value is a non-negative smi.
170 compiler::Node* WordIsPositiveSmi(compiler::Node* a); 172 compiler::Node* WordIsPositiveSmi(compiler::Node* a);
171 // Check that a word has a word-aligned address. 173 // Check that a word has a word-aligned address.
172 compiler::Node* WordIsWordAligned(compiler::Node* word); 174 compiler::Node* WordIsWordAligned(compiler::Node* word);
173 compiler::Node* WordIsPowerOfTwo(compiler::Node* value); 175 compiler::Node* WordIsPowerOfTwo(compiler::Node* value);
174 176
175 void BranchIfSmiEqual(compiler::Node* a, compiler::Node* b, Label* if_true, 177 void BranchIfSmiEqual(compiler::Node* a, compiler::Node* b, Label* if_true,
(...skipping 27 matching lines...) Expand all
203 void BranchIfSimd128Equal(compiler::Node* lhs, compiler::Node* rhs, 205 void BranchIfSimd128Equal(compiler::Node* lhs, compiler::Node* rhs,
204 Label* if_equal, Label* if_notequal) { 206 Label* if_equal, Label* if_notequal) {
205 BranchIfSimd128Equal(lhs, LoadMap(lhs), rhs, LoadMap(rhs), if_equal, 207 BranchIfSimd128Equal(lhs, LoadMap(lhs), rhs, LoadMap(rhs), if_equal,
206 if_notequal); 208 if_notequal);
207 } 209 }
208 210
209 void BranchIfJSReceiver(compiler::Node* object, Label* if_true, 211 void BranchIfJSReceiver(compiler::Node* object, Label* if_true,
210 Label* if_false); 212 Label* if_false);
211 void BranchIfJSObject(compiler::Node* object, Label* if_true, 213 void BranchIfJSObject(compiler::Node* object, Label* if_true,
212 Label* if_false); 214 Label* if_false);
213
214 void BranchIfFastJSArray(compiler::Node* object, compiler::Node* context, 215 void BranchIfFastJSArray(compiler::Node* object, compiler::Node* context,
215 Label* if_true, Label* if_false); 216 Label* if_true, Label* if_false);
216 217
217 // Load value from current frame by given offset in bytes. 218 // Load value from current frame by given offset in bytes.
218 compiler::Node* LoadFromFrame(int offset, 219 compiler::Node* LoadFromFrame(int offset,
219 MachineType rep = MachineType::AnyTagged()); 220 MachineType rep = MachineType::AnyTagged());
220 // Load value from current parent frame by given offset in bytes. 221 // Load value from current parent frame by given offset in bytes.
221 compiler::Node* LoadFromParentFrame( 222 compiler::Node* LoadFromParentFrame(
222 int offset, MachineType rep = MachineType::AnyTagged()); 223 int offset, MachineType rep = MachineType::AnyTagged());
223 224
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
279 compiler::Node* LoadMapPrototypeInfo(compiler::Node* map, 280 compiler::Node* LoadMapPrototypeInfo(compiler::Node* map,
280 Label* if_has_no_proto_info); 281 Label* if_has_no_proto_info);
281 // Load the instance size of a Map. 282 // Load the instance size of a Map.
282 compiler::Node* LoadMapInstanceSize(compiler::Node* map); 283 compiler::Node* LoadMapInstanceSize(compiler::Node* map);
283 // Load the inobject properties count of a Map (valid only for JSObjects). 284 // Load the inobject properties count of a Map (valid only for JSObjects).
284 compiler::Node* LoadMapInobjectProperties(compiler::Node* map); 285 compiler::Node* LoadMapInobjectProperties(compiler::Node* map);
285 // Load the constructor function index of a Map (only for primitive maps). 286 // Load the constructor function index of a Map (only for primitive maps).
286 compiler::Node* LoadMapConstructorFunctionIndex(compiler::Node* map); 287 compiler::Node* LoadMapConstructorFunctionIndex(compiler::Node* map);
287 // Load the constructor of a Map (equivalent to Map::GetConstructor()). 288 // Load the constructor of a Map (equivalent to Map::GetConstructor()).
288 compiler::Node* LoadMapConstructor(compiler::Node* map); 289 compiler::Node* LoadMapConstructor(compiler::Node* map);
289 // Check whether the map is for an object with special properties, such as a
290 // JSProxy or an object with interceptors.
291 compiler::Node* IsSpecialReceiverMap(compiler::Node* map);
292 compiler::Node* IsSpecialReceiverInstanceType(compiler::Node* instance_type);
293 // Check if the map is set for slow properties. 290 // Check if the map is set for slow properties.
294 compiler::Node* IsDictionaryMap(compiler::Node* map); 291 compiler::Node* IsDictionaryMap(compiler::Node* map);
295 292
296 // Load the hash field of a name as an uint32 value. 293 // Load the hash field of a name as an uint32 value.
297 compiler::Node* LoadNameHashField(compiler::Node* name); 294 compiler::Node* LoadNameHashField(compiler::Node* name);
298 // Load the hash value of a name as an uint32 value. 295 // Load the hash value of a name as an uint32 value.
299 // If {if_hash_not_computed} label is specified then it also checks if 296 // If {if_hash_not_computed} label is specified then it also checks if
300 // hash is actually computed. 297 // hash is actually computed.
301 compiler::Node* LoadNameHash(compiler::Node* name, 298 compiler::Node* LoadNameHash(compiler::Node* name,
302 Label* if_hash_not_computed = nullptr); 299 Label* if_hash_not_computed = nullptr);
303 300
304 // Load length field of a String object. 301 // Load length field of a String object.
305 compiler::Node* LoadStringLength(compiler::Node* object); 302 compiler::Node* LoadStringLength(compiler::Node* object);
306 // Load value field of a JSValue object. 303 // Load value field of a JSValue object.
307 compiler::Node* LoadJSValueValue(compiler::Node* object); 304 compiler::Node* LoadJSValueValue(compiler::Node* object);
308 // Load value field of a WeakCell object. 305 // Load value field of a WeakCell object.
306 compiler::Node* LoadWeakCellValueUnchecked(compiler::Node* weak_cell);
309 compiler::Node* LoadWeakCellValue(compiler::Node* weak_cell, 307 compiler::Node* LoadWeakCellValue(compiler::Node* weak_cell,
310 Label* if_cleared = nullptr); 308 Label* if_cleared = nullptr);
311 309
312 // Load an array element from a FixedArray. 310 // Load an array element from a FixedArray.
313 compiler::Node* LoadFixedArrayElement( 311 compiler::Node* LoadFixedArrayElement(
314 compiler::Node* object, compiler::Node* index, int additional_offset = 0, 312 compiler::Node* object, compiler::Node* index, int additional_offset = 0,
315 ParameterMode parameter_mode = INTEGER_PARAMETERS); 313 ParameterMode parameter_mode = INTEGER_PARAMETERS);
316 // Load an array element from a FixedArray, untag it and return it as Word32. 314 // Load an array element from a FixedArray, untag it and return it as Word32.
317 compiler::Node* LoadAndUntagToWord32FixedArrayElement( 315 compiler::Node* LoadAndUntagToWord32FixedArrayElement(
318 compiler::Node* object, compiler::Node* index, int additional_offset = 0, 316 compiler::Node* object, compiler::Node* index, int additional_offset = 0,
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after
602 char const* method_name); 600 char const* method_name);
603 601
604 // Throws a TypeError for {method_name} if {value} is not of the given 602 // Throws a TypeError for {method_name} if {value} is not of the given
605 // instance type. Returns {value}'s map. 603 // instance type. Returns {value}'s map.
606 compiler::Node* ThrowIfNotInstanceType(compiler::Node* context, 604 compiler::Node* ThrowIfNotInstanceType(compiler::Node* context,
607 compiler::Node* value, 605 compiler::Node* value,
608 InstanceType instance_type, 606 InstanceType instance_type,
609 char const* method_name); 607 char const* method_name);
610 608
611 // Type checks. 609 // Type checks.
610 // Check whether the map is for an object with special properties, such as a
611 // JSProxy or an object with interceptors.
612 compiler::Node* IsSpecialReceiverMap(compiler::Node* map);
613 compiler::Node* IsSpecialReceiverInstanceType(compiler::Node* instance_type);
612 compiler::Node* IsStringInstanceType(compiler::Node* instance_type); 614 compiler::Node* IsStringInstanceType(compiler::Node* instance_type);
615 compiler::Node* IsString(compiler::Node* object);
616 compiler::Node* IsJSObject(compiler::Node* object);
613 compiler::Node* IsJSReceiverInstanceType(compiler::Node* instance_type); 617 compiler::Node* IsJSReceiverInstanceType(compiler::Node* instance_type);
614 618 compiler::Node* IsJSReceiver(compiler::Node* object);
619 compiler::Node* IsMap(compiler::Node* object);
615 compiler::Node* IsCallableMap(compiler::Node* map); 620 compiler::Node* IsCallableMap(compiler::Node* map);
621 compiler::Node* IsName(compiler::Node* object);
622 compiler::Node* IsJSValue(compiler::Node* object);
623 compiler::Node* IsJSArray(compiler::Node* object);
624 compiler::Node* IsNativeContext(compiler::Node* object);
625 compiler::Node* IsWeakCell(compiler::Node* object);
626 compiler::Node* IsFixedDoubleArray(compiler::Node* object);
627 compiler::Node* IsHashTable(compiler::Node* object);
628 compiler::Node* IsDictionary(compiler::Node* object);
629 compiler::Node* IsUnseededNumberDictionary(compiler::Node* object);
616 630
617 // String helpers. 631 // String helpers.
618 // Load a character from a String (might flatten a ConsString). 632 // Load a character from a String (might flatten a ConsString).
619 compiler::Node* StringCharCodeAt(compiler::Node* string, 633 compiler::Node* StringCharCodeAt(compiler::Node* string,
620 compiler::Node* smi_index); 634 compiler::Node* smi_index);
621 // Return the single character string with only {code}. 635 // Return the single character string with only {code}.
622 compiler::Node* StringFromCharCode(compiler::Node* code); 636 compiler::Node* StringFromCharCode(compiler::Node* code);
623 // Return a new string object which holds a substring containing the range 637 // Return a new string object which holds a substring containing the range
624 // [from,to[ of string. |from| and |to| are expected to be tagged. 638 // [from,to[ of string. |from| and |to| are expected to be tagged.
625 compiler::Node* SubString(compiler::Node* context, compiler::Node* string, 639 compiler::Node* SubString(compiler::Node* context, compiler::Node* string,
(...skipping 523 matching lines...) Expand 10 before | Expand all | Expand 10 after
1149 1163
1150 compiler::Node* SmiShiftBitsConstant(); 1164 compiler::Node* SmiShiftBitsConstant();
1151 1165
1152 // Emits keyed sloppy arguments load if the |value| is nullptr or store 1166 // Emits keyed sloppy arguments load if the |value| is nullptr or store
1153 // otherwise. Returns either the loaded value or |value|. 1167 // otherwise. Returns either the loaded value or |value|.
1154 compiler::Node* EmitKeyedSloppyArguments(compiler::Node* receiver, 1168 compiler::Node* EmitKeyedSloppyArguments(compiler::Node* receiver,
1155 compiler::Node* key, 1169 compiler::Node* key,
1156 compiler::Node* value, 1170 compiler::Node* value,
1157 Label* bailout); 1171 Label* bailout);
1158 1172
1173 compiler::Node* AllocateSlicedString(Heap::RootListIndex map_root_index,
1174 compiler::Node* length,
1175 compiler::Node* parent,
1176 compiler::Node* offset);
1177
1178 compiler::Node* AllocateConsString(Heap::RootListIndex map_root_index,
1179 compiler::Node* length,
1180 compiler::Node* first,
1181 compiler::Node* second,
1182 AllocationFlags flags);
1183
1159 static const int kElementLoopUnrollThreshold = 8; 1184 static const int kElementLoopUnrollThreshold = 8;
1160 }; 1185 };
1161 1186
1162 #define CSA_ASSERT(x) Assert((x), #x, __FILE__, __LINE__) 1187 #define CSA_ASSERT(x) Assert((x), #x, __FILE__, __LINE__)
1188 #define CSA_SLOW_ASSERT(x) SlowAssert((x), #x, __FILE__, __LINE__)
Igor Sheludko 2016/10/26 13:24:27 I think we don't need SlowAssert function as we ar
Camillo Bruni 2016/10/28 11:09:33 ok, can do it this way.
1163 1189
1164 DEFINE_OPERATORS_FOR_FLAGS(CodeStubAssembler::AllocationFlags); 1190 DEFINE_OPERATORS_FOR_FLAGS(CodeStubAssembler::AllocationFlags);
1165 1191
1166 } // namespace internal 1192 } // namespace internal
1167 } // namespace v8 1193 } // namespace v8
1168 #endif // V8_CODE_STUB_ASSEMBLER_H_ 1194 #endif // V8_CODE_STUB_ASSEMBLER_H_
OLDNEW
« no previous file with comments | « no previous file | src/code-stub-assembler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698