| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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 #include "src/ast/scopes.h" | 5 #include "src/ast/scopes.h" |
| 6 #include "src/code-stubs.h" | 6 #include "src/code-stubs.h" |
| 7 #include "src/compiler.h" | 7 #include "src/compiler.h" |
| 8 #include "src/compiler/common-operator.h" | 8 #include "src/compiler/common-operator.h" |
| 9 #include "src/compiler/frame.h" | 9 #include "src/compiler/frame.h" |
| 10 #include "src/compiler/linkage.h" | 10 #include "src/compiler/linkage.h" |
| 11 #include "src/compiler/node.h" | 11 #include "src/compiler/node.h" |
| 12 #include "src/compiler/osr.h" | 12 #include "src/compiler/osr.h" |
| 13 #include "src/compiler/pipeline.h" | 13 #include "src/compiler/pipeline.h" |
| 14 | 14 |
| 15 namespace v8 { | 15 namespace v8 { |
| 16 namespace internal { | 16 namespace internal { |
| 17 namespace compiler { | 17 namespace compiler { |
| 18 | 18 |
| 19 namespace { | 19 namespace { |
| 20 LinkageLocation regloc(Register reg) { | 20 LinkageLocation regloc(Register reg) { |
| 21 return LinkageLocation::ForRegister(reg.code()); | 21 return LinkageLocation::ForRegister(reg.code()); |
| 22 } | 22 } |
| 23 | 23 |
| 24 | 24 |
| 25 MachineType reptyp(Representation representation) { | 25 MachineType reptyp(Representation representation) { |
| 26 switch (representation.kind()) { | 26 switch (representation.kind()) { |
| 27 case Representation::kInteger8: | 27 case Representation::kInteger8: |
| 28 return kMachInt8; | 28 return MachineType::Int8(); |
| 29 case Representation::kUInteger8: | 29 case Representation::kUInteger8: |
| 30 return kMachUint8; | 30 return MachineType::Uint8(); |
| 31 case Representation::kInteger16: | 31 case Representation::kInteger16: |
| 32 return kMachInt16; | 32 return MachineType::Int16(); |
| 33 case Representation::kUInteger16: | 33 case Representation::kUInteger16: |
| 34 return kMachUint16; | 34 return MachineType::Uint16(); |
| 35 case Representation::kInteger32: | 35 case Representation::kInteger32: |
| 36 return kMachInt32; | 36 return MachineType::Int32(); |
| 37 case Representation::kSmi: | 37 case Representation::kSmi: |
| 38 case Representation::kTagged: | 38 case Representation::kTagged: |
| 39 case Representation::kHeapObject: | 39 case Representation::kHeapObject: |
| 40 return kMachAnyTagged; | 40 return MachineType::AnyTagged(); |
| 41 case Representation::kDouble: | 41 case Representation::kDouble: |
| 42 return kMachFloat64; | 42 return MachineType::Float64(); |
| 43 case Representation::kExternal: | 43 case Representation::kExternal: |
| 44 return kMachPtr; | 44 return MachineType::Pointer(); |
| 45 case Representation::kNone: | 45 case Representation::kNone: |
| 46 case Representation::kNumRepresentations: | 46 case Representation::kNumRepresentations: |
| 47 break; | 47 break; |
| 48 } | 48 } |
| 49 UNREACHABLE(); | 49 UNREACHABLE(); |
| 50 return kMachNone; | 50 return MachineType::None(); |
| 51 } | 51 } |
| 52 } // namespace | 52 } // namespace |
| 53 | 53 |
| 54 | 54 |
| 55 std::ostream& operator<<(std::ostream& os, const CallDescriptor::Kind& k) { | 55 std::ostream& operator<<(std::ostream& os, const CallDescriptor::Kind& k) { |
| 56 switch (k) { | 56 switch (k) { |
| 57 case CallDescriptor::kCallCodeObject: | 57 case CallDescriptor::kCallCodeObject: |
| 58 os << "Code"; | 58 os << "Code"; |
| 59 break; | 59 break; |
| 60 case CallDescriptor::kCallJSFunction: | 60 case CallDescriptor::kCallJSFunction: |
| (...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 235 MachineSignature::Builder types(zone, return_count, parameter_count); | 235 MachineSignature::Builder types(zone, return_count, parameter_count); |
| 236 | 236 |
| 237 // Add returns. | 237 // Add returns. |
| 238 if (locations.return_count_ > 0) { | 238 if (locations.return_count_ > 0) { |
| 239 locations.AddReturn(regloc(kReturnRegister0)); | 239 locations.AddReturn(regloc(kReturnRegister0)); |
| 240 } | 240 } |
| 241 if (locations.return_count_ > 1) { | 241 if (locations.return_count_ > 1) { |
| 242 locations.AddReturn(regloc(kReturnRegister1)); | 242 locations.AddReturn(regloc(kReturnRegister1)); |
| 243 } | 243 } |
| 244 for (size_t i = 0; i < return_count; i++) { | 244 for (size_t i = 0; i < return_count; i++) { |
| 245 types.AddReturn(kMachAnyTagged); | 245 types.AddReturn(MachineType::AnyTagged()); |
| 246 } | 246 } |
| 247 | 247 |
| 248 // All parameters to the runtime call go on the stack. | 248 // All parameters to the runtime call go on the stack. |
| 249 for (int i = 0; i < js_parameter_count; i++) { | 249 for (int i = 0; i < js_parameter_count; i++) { |
| 250 locations.AddParam( | 250 locations.AddParam( |
| 251 LinkageLocation::ForCallerFrameSlot(i - js_parameter_count)); | 251 LinkageLocation::ForCallerFrameSlot(i - js_parameter_count)); |
| 252 types.AddParam(kMachAnyTagged); | 252 types.AddParam(MachineType::AnyTagged()); |
| 253 } | 253 } |
| 254 // Add runtime function itself. | 254 // Add runtime function itself. |
| 255 locations.AddParam(regloc(kRuntimeCallFunctionRegister)); | 255 locations.AddParam(regloc(kRuntimeCallFunctionRegister)); |
| 256 types.AddParam(kMachAnyTagged); | 256 types.AddParam(MachineType::AnyTagged()); |
| 257 | 257 |
| 258 // Add runtime call argument count. | 258 // Add runtime call argument count. |
| 259 locations.AddParam(regloc(kRuntimeCallArgCountRegister)); | 259 locations.AddParam(regloc(kRuntimeCallArgCountRegister)); |
| 260 types.AddParam(kMachPtr); | 260 types.AddParam(MachineType::Pointer()); |
| 261 | 261 |
| 262 // Add context. | 262 // Add context. |
| 263 locations.AddParam(regloc(kContextRegister)); | 263 locations.AddParam(regloc(kContextRegister)); |
| 264 types.AddParam(kMachAnyTagged); | 264 types.AddParam(MachineType::AnyTagged()); |
| 265 | 265 |
| 266 if (Linkage::FrameStateInputCount(function_id) == 0) { | 266 if (Linkage::FrameStateInputCount(function_id) == 0) { |
| 267 flags = static_cast<CallDescriptor::Flags>( | 267 flags = static_cast<CallDescriptor::Flags>( |
| 268 flags & ~CallDescriptor::kNeedsFrameState); | 268 flags & ~CallDescriptor::kNeedsFrameState); |
| 269 } | 269 } |
| 270 | 270 |
| 271 // The target for runtime calls is a code object. | 271 // The target for runtime calls is a code object. |
| 272 MachineType target_type = kMachAnyTagged; | 272 MachineType target_type = MachineType::AnyTagged(); |
| 273 LinkageLocation target_loc = LinkageLocation::ForAnyRegister(); | 273 LinkageLocation target_loc = LinkageLocation::ForAnyRegister(); |
| 274 return new (zone) CallDescriptor( // -- | 274 return new (zone) CallDescriptor( // -- |
| 275 CallDescriptor::kCallCodeObject, // kind | 275 CallDescriptor::kCallCodeObject, // kind |
| 276 target_type, // target MachineType | 276 target_type, // target MachineType |
| 277 target_loc, // target location | 277 target_loc, // target location |
| 278 types.Build(), // machine_sig | 278 types.Build(), // machine_sig |
| 279 locations.Build(), // location_sig | 279 locations.Build(), // location_sig |
| 280 js_parameter_count, // stack_parameter_count | 280 js_parameter_count, // stack_parameter_count |
| 281 properties, // properties | 281 properties, // properties |
| 282 kNoCalleeSaved, // callee-saved | 282 kNoCalleeSaved, // callee-saved |
| 283 kNoCalleeSaved, // callee-saved fp | 283 kNoCalleeSaved, // callee-saved fp |
| 284 flags, // flags | 284 flags, // flags |
| 285 function->name); // debug name | 285 function->name); // debug name |
| 286 } | 286 } |
| 287 | 287 |
| 288 | 288 |
| 289 CallDescriptor* Linkage::GetLazyBailoutDescriptor(Zone* zone) { | 289 CallDescriptor* Linkage::GetLazyBailoutDescriptor(Zone* zone) { |
| 290 const size_t return_count = 0; | 290 const size_t return_count = 0; |
| 291 const size_t parameter_count = 0; | 291 const size_t parameter_count = 0; |
| 292 | 292 |
| 293 LocationSignature::Builder locations(zone, return_count, parameter_count); | 293 LocationSignature::Builder locations(zone, return_count, parameter_count); |
| 294 MachineSignature::Builder types(zone, return_count, parameter_count); | 294 MachineSignature::Builder types(zone, return_count, parameter_count); |
| 295 | 295 |
| 296 // The target is ignored, but we need to give some values here. | 296 // The target is ignored, but we need to give some values here. |
| 297 MachineType target_type = kMachAnyTagged; | 297 MachineType target_type = MachineType::AnyTagged(); |
| 298 LinkageLocation target_loc = regloc(kJSFunctionRegister); | 298 LinkageLocation target_loc = regloc(kJSFunctionRegister); |
| 299 return new (zone) CallDescriptor( // -- | 299 return new (zone) CallDescriptor( // -- |
| 300 CallDescriptor::kLazyBailout, // kind | 300 CallDescriptor::kLazyBailout, // kind |
| 301 target_type, // target MachineType | 301 target_type, // target MachineType |
| 302 target_loc, // target location | 302 target_loc, // target location |
| 303 types.Build(), // machine_sig | 303 types.Build(), // machine_sig |
| 304 locations.Build(), // location_sig | 304 locations.Build(), // location_sig |
| 305 0, // stack_parameter_count | 305 0, // stack_parameter_count |
| 306 Operator::kNoThrow, // properties | 306 Operator::kNoThrow, // properties |
| 307 kNoCalleeSaved, // callee-saved | 307 kNoCalleeSaved, // callee-saved |
| (...skipping 11 matching lines...) Expand all Loading... |
| 319 const size_t new_target_count = 1; | 319 const size_t new_target_count = 1; |
| 320 const size_t num_args_count = 1; | 320 const size_t num_args_count = 1; |
| 321 const size_t parameter_count = | 321 const size_t parameter_count = |
| 322 js_parameter_count + new_target_count + num_args_count + context_count; | 322 js_parameter_count + new_target_count + num_args_count + context_count; |
| 323 | 323 |
| 324 LocationSignature::Builder locations(zone, return_count, parameter_count); | 324 LocationSignature::Builder locations(zone, return_count, parameter_count); |
| 325 MachineSignature::Builder types(zone, return_count, parameter_count); | 325 MachineSignature::Builder types(zone, return_count, parameter_count); |
| 326 | 326 |
| 327 // All JS calls have exactly one return value. | 327 // All JS calls have exactly one return value. |
| 328 locations.AddReturn(regloc(kReturnRegister0)); | 328 locations.AddReturn(regloc(kReturnRegister0)); |
| 329 types.AddReturn(kMachAnyTagged); | 329 types.AddReturn(MachineType::AnyTagged()); |
| 330 | 330 |
| 331 // All parameters to JS calls go on the stack. | 331 // All parameters to JS calls go on the stack. |
| 332 for (int i = 0; i < js_parameter_count; i++) { | 332 for (int i = 0; i < js_parameter_count; i++) { |
| 333 int spill_slot_index = i - js_parameter_count; | 333 int spill_slot_index = i - js_parameter_count; |
| 334 locations.AddParam(LinkageLocation::ForCallerFrameSlot(spill_slot_index)); | 334 locations.AddParam(LinkageLocation::ForCallerFrameSlot(spill_slot_index)); |
| 335 types.AddParam(kMachAnyTagged); | 335 types.AddParam(MachineType::AnyTagged()); |
| 336 } | 336 } |
| 337 | 337 |
| 338 // Add JavaScript call new target value. | 338 // Add JavaScript call new target value. |
| 339 locations.AddParam(regloc(kJavaScriptCallNewTargetRegister)); | 339 locations.AddParam(regloc(kJavaScriptCallNewTargetRegister)); |
| 340 types.AddParam(kMachAnyTagged); | 340 types.AddParam(MachineType::AnyTagged()); |
| 341 | 341 |
| 342 // Add JavaScript call argument count. | 342 // Add JavaScript call argument count. |
| 343 locations.AddParam(regloc(kJavaScriptCallArgCountRegister)); | 343 locations.AddParam(regloc(kJavaScriptCallArgCountRegister)); |
| 344 types.AddParam(kMachInt32); | 344 types.AddParam(MachineType::Int32()); |
| 345 | 345 |
| 346 // Add context. | 346 // Add context. |
| 347 locations.AddParam(regloc(kContextRegister)); | 347 locations.AddParam(regloc(kContextRegister)); |
| 348 types.AddParam(kMachAnyTagged); | 348 types.AddParam(MachineType::AnyTagged()); |
| 349 | 349 |
| 350 // The target for JS function calls is the JSFunction object. | 350 // The target for JS function calls is the JSFunction object. |
| 351 MachineType target_type = kMachAnyTagged; | 351 MachineType target_type = MachineType::AnyTagged(); |
| 352 // TODO(titzer): When entering into an OSR function from unoptimized code, | 352 // TODO(titzer): When entering into an OSR function from unoptimized code, |
| 353 // the JSFunction is not in a register, but it is on the stack in an | 353 // the JSFunction is not in a register, but it is on the stack in an |
| 354 // unaddressable spill slot. We hack this in the OSR prologue. Fix. | 354 // unaddressable spill slot. We hack this in the OSR prologue. Fix. |
| 355 LinkageLocation target_loc = regloc(kJSFunctionRegister); | 355 LinkageLocation target_loc = regloc(kJSFunctionRegister); |
| 356 return new (zone) CallDescriptor( // -- | 356 return new (zone) CallDescriptor( // -- |
| 357 CallDescriptor::kCallJSFunction, // kind | 357 CallDescriptor::kCallJSFunction, // kind |
| 358 target_type, // target MachineType | 358 target_type, // target MachineType |
| 359 target_loc, // target location | 359 target_loc, // target location |
| 360 types.Build(), // machine_sig | 360 types.Build(), // machine_sig |
| 361 locations.Build(), // location_sig | 361 locations.Build(), // location_sig |
| 362 js_parameter_count, // stack_parameter_count | 362 js_parameter_count, // stack_parameter_count |
| 363 Operator::kNoProperties, // properties | 363 Operator::kNoProperties, // properties |
| 364 kNoCalleeSaved, // callee-saved | 364 kNoCalleeSaved, // callee-saved |
| 365 kNoCalleeSaved, // callee-saved fp | 365 kNoCalleeSaved, // callee-saved fp |
| 366 CallDescriptor::kCanUseRoots | // flags | 366 CallDescriptor::kCanUseRoots | // flags |
| 367 flags, // flags | 367 flags, // flags |
| 368 "js-call"); | 368 "js-call"); |
| 369 } | 369 } |
| 370 | 370 |
| 371 | 371 |
| 372 CallDescriptor* Linkage::GetInterpreterDispatchDescriptor(Zone* zone) { | 372 CallDescriptor* Linkage::GetInterpreterDispatchDescriptor(Zone* zone) { |
| 373 MachineSignature::Builder types(zone, 0, 6); | 373 MachineSignature::Builder types(zone, 0, 6); |
| 374 LocationSignature::Builder locations(zone, 0, 6); | 374 LocationSignature::Builder locations(zone, 0, 6); |
| 375 | 375 |
| 376 // Add registers for fixed parameters passed via interpreter dispatch. | 376 // Add registers for fixed parameters passed via interpreter dispatch. |
| 377 STATIC_ASSERT(0 == Linkage::kInterpreterAccumulatorParameter); | 377 STATIC_ASSERT(0 == Linkage::kInterpreterAccumulatorParameter); |
| 378 types.AddParam(kMachAnyTagged); | 378 types.AddParam(MachineType::AnyTagged()); |
| 379 locations.AddParam(regloc(kInterpreterAccumulatorRegister)); | 379 locations.AddParam(regloc(kInterpreterAccumulatorRegister)); |
| 380 | 380 |
| 381 STATIC_ASSERT(1 == Linkage::kInterpreterRegisterFileParameter); | 381 STATIC_ASSERT(1 == Linkage::kInterpreterRegisterFileParameter); |
| 382 types.AddParam(kMachPtr); | 382 types.AddParam(MachineType::Pointer()); |
| 383 locations.AddParam(regloc(kInterpreterRegisterFileRegister)); | 383 locations.AddParam(regloc(kInterpreterRegisterFileRegister)); |
| 384 | 384 |
| 385 STATIC_ASSERT(2 == Linkage::kInterpreterBytecodeOffsetParameter); | 385 STATIC_ASSERT(2 == Linkage::kInterpreterBytecodeOffsetParameter); |
| 386 types.AddParam(kMachIntPtr); | 386 types.AddParam(MachineType::IntPtr()); |
| 387 locations.AddParam(regloc(kInterpreterBytecodeOffsetRegister)); | 387 locations.AddParam(regloc(kInterpreterBytecodeOffsetRegister)); |
| 388 | 388 |
| 389 STATIC_ASSERT(3 == Linkage::kInterpreterBytecodeArrayParameter); | 389 STATIC_ASSERT(3 == Linkage::kInterpreterBytecodeArrayParameter); |
| 390 types.AddParam(kMachAnyTagged); | 390 types.AddParam(MachineType::AnyTagged()); |
| 391 locations.AddParam(regloc(kInterpreterBytecodeArrayRegister)); | 391 locations.AddParam(regloc(kInterpreterBytecodeArrayRegister)); |
| 392 | 392 |
| 393 STATIC_ASSERT(4 == Linkage::kInterpreterDispatchTableParameter); | 393 STATIC_ASSERT(4 == Linkage::kInterpreterDispatchTableParameter); |
| 394 types.AddParam(kMachPtr); | 394 types.AddParam(MachineType::Pointer()); |
| 395 #if defined(V8_TARGET_ARCH_IA32) || defined(V8_TARGET_ARCH_X87) | 395 #if defined(V8_TARGET_ARCH_IA32) || defined(V8_TARGET_ARCH_X87) |
| 396 // TODO(rmcilroy): Make the context param the one spilled to the stack once | 396 // TODO(rmcilroy): Make the context param the one spilled to the stack once |
| 397 // Turbofan supports modified stack arguments in tail calls. | 397 // Turbofan supports modified stack arguments in tail calls. |
| 398 locations.AddParam( | 398 locations.AddParam( |
| 399 LinkageLocation::ForCallerFrameSlot(kInterpreterDispatchTableSpillSlot)); | 399 LinkageLocation::ForCallerFrameSlot(kInterpreterDispatchTableSpillSlot)); |
| 400 #else | 400 #else |
| 401 locations.AddParam(regloc(kInterpreterDispatchTableRegister)); | 401 locations.AddParam(regloc(kInterpreterDispatchTableRegister)); |
| 402 #endif | 402 #endif |
| 403 | 403 |
| 404 STATIC_ASSERT(5 == Linkage::kInterpreterContextParameter); | 404 STATIC_ASSERT(5 == Linkage::kInterpreterContextParameter); |
| 405 types.AddParam(kMachAnyTagged); | 405 types.AddParam(MachineType::AnyTagged()); |
| 406 locations.AddParam(regloc(kContextRegister)); | 406 locations.AddParam(regloc(kContextRegister)); |
| 407 | 407 |
| 408 LinkageLocation target_loc = LinkageLocation::ForAnyRegister(); | 408 LinkageLocation target_loc = LinkageLocation::ForAnyRegister(); |
| 409 return new (zone) CallDescriptor( // -- | 409 return new (zone) CallDescriptor( // -- |
| 410 CallDescriptor::kCallCodeObject, // kind | 410 CallDescriptor::kCallCodeObject, // kind |
| 411 kMachNone, // target MachineType | 411 MachineType::None(), // target MachineType |
| 412 target_loc, // target location | 412 target_loc, // target location |
| 413 types.Build(), // machine_sig | 413 types.Build(), // machine_sig |
| 414 locations.Build(), // location_sig | 414 locations.Build(), // location_sig |
| 415 0, // stack_parameter_count | 415 0, // stack_parameter_count |
| 416 Operator::kNoProperties, // properties | 416 Operator::kNoProperties, // properties |
| 417 kNoCalleeSaved, // callee-saved registers | 417 kNoCalleeSaved, // callee-saved registers |
| 418 kNoCalleeSaved, // callee-saved fp regs | 418 kNoCalleeSaved, // callee-saved fp regs |
| 419 CallDescriptor::kSupportsTailCalls | // flags | 419 CallDescriptor::kSupportsTailCalls | // flags |
| 420 CallDescriptor::kCanUseRoots, // flags | 420 CallDescriptor::kCanUseRoots, // flags |
| 421 "interpreter-dispatch"); | 421 "interpreter-dispatch"); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 450 // The first parameters go in registers. | 450 // The first parameters go in registers. |
| 451 Register reg = descriptor.GetRegisterParameter(i); | 451 Register reg = descriptor.GetRegisterParameter(i); |
| 452 Representation rep = | 452 Representation rep = |
| 453 RepresentationFromType(descriptor.GetParameterType(i)); | 453 RepresentationFromType(descriptor.GetParameterType(i)); |
| 454 locations.AddParam(regloc(reg)); | 454 locations.AddParam(regloc(reg)); |
| 455 types.AddParam(reptyp(rep)); | 455 types.AddParam(reptyp(rep)); |
| 456 } else { | 456 } else { |
| 457 // The rest of the parameters go on the stack. | 457 // The rest of the parameters go on the stack. |
| 458 int stack_slot = i - register_parameter_count - stack_parameter_count; | 458 int stack_slot = i - register_parameter_count - stack_parameter_count; |
| 459 locations.AddParam(LinkageLocation::ForCallerFrameSlot(stack_slot)); | 459 locations.AddParam(LinkageLocation::ForCallerFrameSlot(stack_slot)); |
| 460 types.AddParam(kMachAnyTagged); | 460 types.AddParam(MachineType::AnyTagged()); |
| 461 } | 461 } |
| 462 } | 462 } |
| 463 // Add context. | 463 // Add context. |
| 464 locations.AddParam(regloc(kContextRegister)); | 464 locations.AddParam(regloc(kContextRegister)); |
| 465 types.AddParam(kMachAnyTagged); | 465 types.AddParam(MachineType::AnyTagged()); |
| 466 | 466 |
| 467 // The target for stub calls is a code object. | 467 // The target for stub calls is a code object. |
| 468 MachineType target_type = kMachAnyTagged; | 468 MachineType target_type = MachineType::AnyTagged(); |
| 469 LinkageLocation target_loc = LinkageLocation::ForAnyRegister(); | 469 LinkageLocation target_loc = LinkageLocation::ForAnyRegister(); |
| 470 return new (zone) CallDescriptor( // -- | 470 return new (zone) CallDescriptor( // -- |
| 471 CallDescriptor::kCallCodeObject, // kind | 471 CallDescriptor::kCallCodeObject, // kind |
| 472 target_type, // target MachineType | 472 target_type, // target MachineType |
| 473 target_loc, // target location | 473 target_loc, // target location |
| 474 types.Build(), // machine_sig | 474 types.Build(), // machine_sig |
| 475 locations.Build(), // location_sig | 475 locations.Build(), // location_sig |
| 476 stack_parameter_count, // stack_parameter_count | 476 stack_parameter_count, // stack_parameter_count |
| 477 properties, // properties | 477 properties, // properties |
| 478 kNoCalleeSaved, // callee-saved registers | 478 kNoCalleeSaved, // callee-saved registers |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 522 } else { | 522 } else { |
| 523 DCHECK(loc == regloc(kContextRegister)); | 523 DCHECK(loc == regloc(kContextRegister)); |
| 524 return LinkageLocation::ForCalleeFrameSlot(Frame::kContextSlot); | 524 return LinkageLocation::ForCalleeFrameSlot(Frame::kContextSlot); |
| 525 } | 525 } |
| 526 } | 526 } |
| 527 | 527 |
| 528 | 528 |
| 529 } // namespace compiler | 529 } // namespace compiler |
| 530 } // namespace internal | 530 } // namespace internal |
| 531 } // namespace v8 | 531 } // namespace v8 |
| OLD | NEW |