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

Unified Diff: src/compiler/linkage-impl.h

Issue 1272883003: [turbofan] Remove architecture-specific linkage files and LinkageTraits. Use macro-assembler-define… (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 4 months 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/compiler/linkage.cc ('k') | src/compiler/mips/linkage-mips.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/compiler/linkage-impl.h
diff --git a/src/compiler/linkage-impl.h b/src/compiler/linkage-impl.h
deleted file mode 100644
index 60d6424a238a4884fa943606440922dbbc5aa751..0000000000000000000000000000000000000000
--- a/src/compiler/linkage-impl.h
+++ /dev/null
@@ -1,295 +0,0 @@
-// Copyright 2014 the V8 project authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef V8_COMPILER_LINKAGE_IMPL_H_
-#define V8_COMPILER_LINKAGE_IMPL_H_
-
-#include "src/code-stubs.h"
-#include "src/compiler/osr.h"
-
-namespace v8 {
-namespace internal {
-namespace compiler {
-
-// TODO(titzer): replace uses of int with size_t in LinkageHelper.
-template <typename LinkageTraits>
-class LinkageHelper {
- public:
- static const RegList kNoCalleeSaved = 0;
-
- static void AddReturnLocations(LocationSignature::Builder* locations) {
- DCHECK(locations->return_count_ <= 2);
- if (locations->return_count_ > 0) {
- locations->AddReturn(regloc(LinkageTraits::ReturnValueReg()));
- }
- if (locations->return_count_ > 1) {
- locations->AddReturn(regloc(LinkageTraits::ReturnValue2Reg()));
- }
- }
-
- // TODO(turbofan): cache call descriptors for JSFunction calls.
- static CallDescriptor* GetJSCallDescriptor(Zone* zone, bool is_osr,
- int js_parameter_count,
- CallDescriptor::Flags flags) {
- const size_t return_count = 1;
- const size_t context_count = 1;
- const size_t parameter_count = js_parameter_count + context_count;
-
- LocationSignature::Builder locations(zone, return_count, parameter_count);
- MachineSignature::Builder types(zone, return_count, parameter_count);
-
- // Add returns.
- AddReturnLocations(&locations);
- for (size_t i = 0; i < return_count; i++) {
- types.AddReturn(kMachAnyTagged);
- }
-
- // All parameters to JS calls go on the stack.
- for (int i = 0; i < js_parameter_count; i++) {
- int spill_slot_index = i - js_parameter_count;
- locations.AddParam(stackloc(spill_slot_index));
- types.AddParam(kMachAnyTagged);
- }
- // Add context.
- locations.AddParam(regloc(LinkageTraits::ContextReg()));
- types.AddParam(kMachAnyTagged);
-
- // The target for JS function calls is the JSFunction object.
- MachineType target_type = kMachAnyTagged;
- // TODO(titzer): When entering into an OSR function from unoptimized code,
- // the JSFunction is not in a register, but it is on the stack in an
- // unaddressable spill slot. We hack this in the OSR prologue. Fix.
- LinkageLocation target_loc = regloc(LinkageTraits::JSCallFunctionReg());
- return new (zone) CallDescriptor( // --
- CallDescriptor::kCallJSFunction, // kind
- target_type, // target MachineType
- target_loc, // target location
- types.Build(), // machine_sig
- locations.Build(), // location_sig
- js_parameter_count, // stack_parameter_count
- Operator::kNoProperties, // properties
- kNoCalleeSaved, // callee-saved
- kNoCalleeSaved, // callee-saved fp
- flags, // flags
- "js-call");
- }
-
-
- // TODO(turbofan): cache call descriptors for runtime calls.
- static CallDescriptor* GetRuntimeCallDescriptor(
- Zone* zone, Runtime::FunctionId function_id, int js_parameter_count,
- Operator::Properties properties) {
- const size_t function_count = 1;
- const size_t num_args_count = 1;
- const size_t context_count = 1;
- const size_t parameter_count = function_count +
- static_cast<size_t>(js_parameter_count) +
- num_args_count + context_count;
-
- const Runtime::Function* function = Runtime::FunctionForId(function_id);
- const size_t return_count = static_cast<size_t>(function->result_size);
-
- LocationSignature::Builder locations(zone, return_count, parameter_count);
- MachineSignature::Builder types(zone, return_count, parameter_count);
-
- // Add returns.
- AddReturnLocations(&locations);
- for (size_t i = 0; i < return_count; i++) {
- types.AddReturn(kMachAnyTagged);
- }
-
- // All parameters to the runtime call go on the stack.
- for (int i = 0; i < js_parameter_count; i++) {
- locations.AddParam(stackloc(i - js_parameter_count));
- types.AddParam(kMachAnyTagged);
- }
- // Add runtime function itself.
- locations.AddParam(regloc(LinkageTraits::RuntimeCallFunctionReg()));
- types.AddParam(kMachAnyTagged);
-
- // Add runtime call argument count.
- locations.AddParam(regloc(LinkageTraits::RuntimeCallArgCountReg()));
- types.AddParam(kMachPtr);
-
- // Add context.
- locations.AddParam(regloc(LinkageTraits::ContextReg()));
- types.AddParam(kMachAnyTagged);
-
- CallDescriptor::Flags flags = Linkage::FrameStateInputCount(function_id) > 0
- ? CallDescriptor::kNeedsFrameState
- : CallDescriptor::kNoFlags;
-
- // The target for runtime calls is a code object.
- MachineType target_type = kMachAnyTagged;
- LinkageLocation target_loc = LinkageLocation::ForAnyRegister();
- return new (zone) CallDescriptor( // --
- CallDescriptor::kCallCodeObject, // kind
- target_type, // target MachineType
- target_loc, // target location
- types.Build(), // machine_sig
- locations.Build(), // location_sig
- js_parameter_count, // stack_parameter_count
- properties, // properties
- kNoCalleeSaved, // callee-saved
- kNoCalleeSaved, // callee-saved fp
- flags, // flags
- function->name); // debug name
- }
-
-
- // TODO(all): Add support for return representations/locations to
- // CallInterfaceDescriptor.
- // TODO(turbofan): cache call descriptors for code stub calls.
- static CallDescriptor* GetStubCallDescriptor(
- Isolate* isolate, Zone* zone, const CallInterfaceDescriptor& descriptor,
- int stack_parameter_count, CallDescriptor::Flags flags,
- Operator::Properties properties, MachineType return_type) {
- const int register_parameter_count = descriptor.GetRegisterParameterCount();
- const int js_parameter_count =
- register_parameter_count + stack_parameter_count;
- const int context_count = 1;
- const size_t return_count = 1;
- const size_t parameter_count =
- static_cast<size_t>(js_parameter_count + context_count);
-
- LocationSignature::Builder locations(zone, return_count, parameter_count);
- MachineSignature::Builder types(zone, return_count, parameter_count);
-
- // Add return location.
- AddReturnLocations(&locations);
- types.AddReturn(return_type);
-
- // Add parameters in registers and on the stack.
- for (int i = 0; i < js_parameter_count; i++) {
- if (i < register_parameter_count) {
- // The first parameters go in registers.
- Register reg = descriptor.GetRegisterParameter(i);
- Representation rep =
- RepresentationFromType(descriptor.GetParameterType(i));
- locations.AddParam(regloc(reg));
- types.AddParam(reptyp(rep));
- } else {
- // The rest of the parameters go on the stack.
- int stack_slot = i - register_parameter_count - stack_parameter_count;
- locations.AddParam(stackloc(stack_slot));
- types.AddParam(kMachAnyTagged);
- }
- }
- // Add context.
- locations.AddParam(regloc(LinkageTraits::ContextReg()));
- types.AddParam(kMachAnyTagged);
-
- // The target for stub calls is a code object.
- MachineType target_type = kMachAnyTagged;
- LinkageLocation target_loc = LinkageLocation::ForAnyRegister();
- return new (zone) CallDescriptor( // --
- CallDescriptor::kCallCodeObject, // kind
- target_type, // target MachineType
- target_loc, // target location
- types.Build(), // machine_sig
- locations.Build(), // location_sig
- stack_parameter_count, // stack_parameter_count
- properties, // properties
- kNoCalleeSaved, // callee-saved registers
- kNoCalleeSaved, // callee-saved fp
- flags, // flags
- descriptor.DebugName(isolate));
- }
-
- static CallDescriptor* GetInterpreterDispatchDescriptor(Zone* zone) {
- MachineSignature::Builder types(zone, 0, 3);
- LocationSignature::Builder locations(zone, 0, 3);
-
- // Add registers for fixed parameters passed via interpreter dispatch.
- STATIC_ASSERT(0 == Linkage::kInterpreterBytecodeOffsetParameter);
- types.AddParam(kMachIntPtr);
- locations.AddParam(regloc(LinkageTraits::InterpreterBytecodeOffsetReg()));
-
- STATIC_ASSERT(1 == Linkage::kInterpreterBytecodeArrayParameter);
- types.AddParam(kMachAnyTagged);
- locations.AddParam(regloc(LinkageTraits::InterpreterBytecodeArrayReg()));
-
- STATIC_ASSERT(2 == Linkage::kInterpreterDispatchTableParameter);
- types.AddParam(kMachPtr);
- locations.AddParam(regloc(LinkageTraits::InterpreterDispatchTableReg()));
-
- LinkageLocation target_loc = LinkageLocation::ForAnyRegister();
- return new (zone) CallDescriptor( // --
- CallDescriptor::kInterpreterDispatch, // kind
- kMachNone, // target MachineType
- target_loc, // target location
- types.Build(), // machine_sig
- locations.Build(), // location_sig
- 0, // stack_parameter_count
- Operator::kNoProperties, // properties
- kNoCalleeSaved, // callee-saved registers
- kNoCalleeSaved, // callee-saved fp regs
- CallDescriptor::kSupportsTailCalls, // flags
- "interpreter-dispatch");
- }
-
- static LinkageLocation regloc(Register reg) {
- return LinkageLocation::ForRegister(Register::ToAllocationIndex(reg));
- }
-
- static LinkageLocation stackloc(int i) {
- return LinkageLocation::ForCallerFrameSlot(i);
- }
-
- static MachineType reptyp(Representation representation) {
- switch (representation.kind()) {
- case Representation::kInteger8:
- return kMachInt8;
- case Representation::kUInteger8:
- return kMachUint8;
- case Representation::kInteger16:
- return kMachInt16;
- case Representation::kUInteger16:
- return kMachUint16;
- case Representation::kInteger32:
- return kMachInt32;
- case Representation::kSmi:
- case Representation::kTagged:
- case Representation::kHeapObject:
- return kMachAnyTagged;
- case Representation::kDouble:
- return kMachFloat64;
- case Representation::kExternal:
- return kMachPtr;
- case Representation::kNone:
- case Representation::kNumRepresentations:
- break;
- }
- UNREACHABLE();
- return kMachNone;
- }
-};
-
-
-LinkageLocation Linkage::GetOsrValueLocation(int index) const {
- CHECK(incoming_->IsJSFunctionCall());
- int parameter_count = static_cast<int>(incoming_->JSParameterCount() - 1);
- int first_stack_slot = OsrHelper::FirstStackSlotIndex(parameter_count);
-
- if (index == kOsrContextSpillSlotIndex) {
- // Context. Use the parameter location of the context spill slot.
- // Parameter (arity + 1) is special for the context of the function frame.
- int context_index = 1 + 1 + parameter_count; // target + receiver + params
- return incoming_->GetInputLocation(context_index);
- } else if (index >= first_stack_slot) {
- // Local variable stored in this (callee) stack.
- int spill_index = index - first_stack_slot;
- return LinkageLocation::ForCalleeFrameSlot(spill_index);
- } else {
- // Parameter. Use the assigned location from the incoming call descriptor.
- int parameter_index = 1 + index; // skip index 0, which is the target.
- return incoming_->GetInputLocation(parameter_index);
- }
-}
-
-} // namespace compiler
-} // namespace internal
-} // namespace v8
-
-#endif // V8_COMPILER_LINKAGE_IMPL_H_
« no previous file with comments | « src/compiler/linkage.cc ('k') | src/compiler/mips/linkage-mips.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698