• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2018 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef V8_COMPILER_ALLOCATION_BUILDER_INL_H_
6 #define V8_COMPILER_ALLOCATION_BUILDER_INL_H_
7 
8 #include "src/compiler/access-builder.h"
9 #include "src/compiler/allocation-builder.h"
10 #include "src/heap/heap-inl.h"
11 #include "src/objects/arguments-inl.h"
12 #include "src/objects/map-inl.h"
13 
14 namespace v8 {
15 namespace internal {
16 namespace compiler {
17 
Allocate(int size,AllocationType allocation,Type type)18 void AllocationBuilder::Allocate(int size, AllocationType allocation,
19                                  Type type) {
20   CHECK_GT(size, 0);
21   DCHECK_LE(size, isolate()->heap()->MaxRegularHeapObjectSize(allocation));
22   effect_ = graph()->NewNode(
23       common()->BeginRegion(RegionObservability::kNotObservable), effect_);
24   allocation_ = graph()->NewNode(simplified()->Allocate(type, allocation),
25                                  jsgraph()->Constant(size), effect_, control_);
26   effect_ = allocation_;
27 }
28 
AllocateContext(int variadic_part_length,MapRef map)29 void AllocationBuilder::AllocateContext(int variadic_part_length, MapRef map) {
30   DCHECK(base::IsInRange(map.instance_type(), FIRST_CONTEXT_TYPE,
31                          LAST_CONTEXT_TYPE));
32   DCHECK_NE(NATIVE_CONTEXT_TYPE, map.instance_type());
33   int size = Context::SizeFor(variadic_part_length);
34   Allocate(size, AllocationType::kYoung, Type::OtherInternal());
35   Store(AccessBuilder::ForMap(), map);
36   STATIC_ASSERT(static_cast<int>(Context::kLengthOffset) ==
37                 static_cast<int>(FixedArray::kLengthOffset));
38   Store(AccessBuilder::ForFixedArrayLength(),
39         jsgraph()->Constant(variadic_part_length));
40 }
41 
CanAllocateArray(int length,MapRef map,AllocationType allocation)42 bool AllocationBuilder::CanAllocateArray(int length, MapRef map,
43                                          AllocationType allocation) {
44   DCHECK(map.instance_type() == FIXED_ARRAY_TYPE ||
45          map.instance_type() == FIXED_DOUBLE_ARRAY_TYPE);
46   int const size = (map.instance_type() == FIXED_ARRAY_TYPE)
47                        ? FixedArray::SizeFor(length)
48                        : FixedDoubleArray::SizeFor(length);
49   return size <= isolate()->heap()->MaxRegularHeapObjectSize(allocation);
50 }
51 
52 // Compound allocation of a FixedArray.
AllocateArray(int length,MapRef map,AllocationType allocation)53 void AllocationBuilder::AllocateArray(int length, MapRef map,
54                                       AllocationType allocation) {
55   DCHECK(CanAllocateArray(length, map, allocation));
56   int size = (map.instance_type() == FIXED_ARRAY_TYPE)
57                  ? FixedArray::SizeFor(length)
58                  : FixedDoubleArray::SizeFor(length);
59   Allocate(size, allocation, Type::OtherInternal());
60   Store(AccessBuilder::ForMap(), map);
61   Store(AccessBuilder::ForFixedArrayLength(), jsgraph()->Constant(length));
62 }
63 
CanAllocateSloppyArgumentElements(int length,MapRef map,AllocationType allocation)64 bool AllocationBuilder::CanAllocateSloppyArgumentElements(
65     int length, MapRef map, AllocationType allocation) {
66   int const size = SloppyArgumentsElements::SizeFor(length);
67   return size <= isolate()->heap()->MaxRegularHeapObjectSize(allocation);
68 }
69 
AllocateSloppyArgumentElements(int length,MapRef map,AllocationType allocation)70 void AllocationBuilder::AllocateSloppyArgumentElements(
71     int length, MapRef map, AllocationType allocation) {
72   DCHECK(CanAllocateSloppyArgumentElements(length, map, allocation));
73   int size = SloppyArgumentsElements::SizeFor(length);
74   Allocate(size, allocation, Type::OtherInternal());
75   Store(AccessBuilder::ForMap(), map);
76   Store(AccessBuilder::ForFixedArrayLength(), jsgraph()->Constant(length));
77 }
78 
79 }  // namespace compiler
80 }  // namespace internal
81 }  // namespace v8
82 
83 #endif  // V8_COMPILER_ALLOCATION_BUILDER_INL_H_
84