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

Unified Diff: src/compiler/linkage.h

Issue 426233002: Land the Fan (disabled) (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Review feedback, rebase and "git cl format" Created 6 years, 5 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/js-typed-lowering.cc ('k') | src/compiler/linkage.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/compiler/linkage.h
diff --git a/src/compiler/linkage.h b/src/compiler/linkage.h
new file mode 100644
index 0000000000000000000000000000000000000000..9d9c50876aa1204ca1aff307d3b68540da0faf62
--- /dev/null
+++ b/src/compiler/linkage.h
@@ -0,0 +1,188 @@
+// 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_H_
+#define V8_COMPILER_LINKAGE_H_
+
+#include "src/v8.h"
+
+#include "src/code-stubs.h"
+#include "src/compiler/frame.h"
+#include "src/compiler/machine-operator.h"
+#include "src/compiler/node.h"
+#include "src/compiler/operator.h"
+#include "src/zone.h"
+
+namespace v8 {
+namespace internal {
+namespace compiler {
+
+// Describes the location for a parameter or a return value to a call.
+// TODO(titzer): replace with Radium locations when they are ready.
+class LinkageLocation {
+ public:
+ LinkageLocation(MachineRepresentation rep, int location)
+ : rep_(rep), location_(location) {}
+
+ inline MachineRepresentation representation() const { return rep_; }
+
+ static const int16_t ANY_REGISTER = 32767;
+
+ private:
+ friend class CallDescriptor;
+ friend class OperandGenerator;
+ MachineRepresentation rep_;
+ int16_t location_; // >= 0 implies register, otherwise stack slot.
+};
+
+
+class CallDescriptor : public ZoneObject {
+ public:
+ // Describes whether the first parameter is a code object, a JSFunction,
+ // or an address--all of which require different machine sequences to call.
+ enum Kind { kCallCodeObject, kCallJSFunction, kCallAddress };
+
+ enum DeoptimizationSupport { kCanDeoptimize, kCannotDeoptimize };
+
+ CallDescriptor(Kind kind, int8_t return_count, int16_t parameter_count,
+ int16_t input_count, LinkageLocation* locations,
+ Operator::Property properties, RegList callee_saved_registers,
+ DeoptimizationSupport deoptimization_support,
+ const char* debug_name = "")
+ : kind_(kind),
+ return_count_(return_count),
+ parameter_count_(parameter_count),
+ input_count_(input_count),
+ locations_(locations),
+ properties_(properties),
+ callee_saved_registers_(callee_saved_registers),
+ deoptimization_support_(deoptimization_support),
+ debug_name_(debug_name) {}
+ // Returns the kind of this call.
+ Kind kind() const { return kind_; }
+
+ // Returns {true} if this descriptor is a call to a JSFunction.
+ bool IsJSFunctionCall() const { return kind_ == kCallJSFunction; }
+
+ // The number of return values from this call, usually 0 or 1.
+ int ReturnCount() const { return return_count_; }
+
+ // The number of JavaScript parameters to this call, including receiver,
+ // but not the context.
+ int ParameterCount() const { return parameter_count_; }
+
+ int InputCount() const { return input_count_; }
+
+ bool CanLazilyDeoptimize() const {
+ return deoptimization_support_ == kCanDeoptimize;
+ }
+
+ LinkageLocation GetReturnLocation(int index) {
+ ASSERT(index < return_count_);
+ return locations_[0 + index]; // return locations start at 0.
+ }
+
+ LinkageLocation GetInputLocation(int index) {
+ ASSERT(index < input_count_ + 1); // input_count + 1 is the context.
+ return locations_[return_count_ + index]; // inputs start after returns.
+ }
+
+ // Operator properties describe how this call can be optimized, if at all.
+ Operator::Property properties() const { return properties_; }
+
+ // Get the callee-saved registers, if any, across this call.
+ RegList CalleeSavedRegisters() { return callee_saved_registers_; }
+
+ const char* debug_name() const { return debug_name_; }
+
+ private:
+ friend class Linkage;
+
+ Kind kind_;
+ int8_t return_count_;
+ int16_t parameter_count_;
+ int16_t input_count_;
+ LinkageLocation* locations_;
+ Operator::Property properties_;
+ RegList callee_saved_registers_;
+ DeoptimizationSupport deoptimization_support_;
+ const char* debug_name_;
+};
+
+OStream& operator<<(OStream& os, const CallDescriptor& d);
+OStream& operator<<(OStream& os, const CallDescriptor::Kind& k);
+
+// Defines the linkage for a compilation, including the calling conventions
+// for incoming parameters and return value(s) as well as the outgoing calling
+// convention for any kind of call. Linkage is generally architecture-specific.
+//
+// Can be used to translate {arg_index} (i.e. index of the call node input) as
+// well as {param_index} (i.e. as stored in parameter nodes) into an operator
+// representing the architecture-specific location. The following call node
+// layouts are supported (where {n} is the number value inputs):
+//
+// #0 #1 #2 #3 [...] #n
+// Call[CodeStub] code, arg 1, arg 2, arg 3, [...], context
+// Call[JSFunction] function, rcvr, arg 1, arg 2, [...], context
+// Call[Runtime] CEntryStub, arg 1, arg 2, arg 3, [...], fun, #arg, context
+class Linkage : public ZoneObject {
+ public:
+ explicit Linkage(CompilationInfo* info);
+ explicit Linkage(CompilationInfo* info, CallDescriptor* incoming)
+ : info_(info), incoming_(incoming) {}
+
+ // The call descriptor for this compilation unit describes the locations
+ // of incoming parameters and the outgoing return value(s).
+ CallDescriptor* GetIncomingDescriptor() { return incoming_; }
+ CallDescriptor* GetJSCallDescriptor(int parameter_count);
+ static CallDescriptor* GetJSCallDescriptor(int parameter_count, Zone* zone);
+ CallDescriptor* GetRuntimeCallDescriptor(
+ Runtime::FunctionId function, int parameter_count,
+ Operator::Property properties,
+ CallDescriptor::DeoptimizationSupport can_deoptimize =
+ CallDescriptor::kCannotDeoptimize);
+ static CallDescriptor* GetRuntimeCallDescriptor(
+ Runtime::FunctionId function, int parameter_count,
+ Operator::Property properties,
+ CallDescriptor::DeoptimizationSupport can_deoptimize, Zone* zone);
+
+ CallDescriptor* GetStubCallDescriptor(CodeStubInterfaceDescriptor* descriptor,
+ int stack_parameter_count = 0);
+
+ // Creates a call descriptor for simplified C calls that is appropriate
+ // for the host platform. This simplified calling convention only supports
+ // integers and pointers of one word size each, i.e. no floating point,
+ // structs, pointers to members, etc.
+ static CallDescriptor* GetSimplifiedCDescriptor(
+ Zone* zone, int num_params, MachineRepresentation return_type,
+ const MachineRepresentation* param_types);
+
+ // Get the location of an (incoming) parameter to this function.
+ LinkageLocation GetParameterLocation(int index) {
+ return incoming_->GetInputLocation(index + 1);
+ }
+
+ // Get the location where this function should place its return value.
+ LinkageLocation GetReturnLocation() {
+ return incoming_->GetReturnLocation(0);
+ }
+
+ // Get the frame offset for a given spill slot. The location depends on the
+ // calling convention and the specific frame layout, and may thus be
+ // architecture-specific. Negative spill slots indicate arguments on the
+ // caller's frame. The {extra} parameter indicates an additional offset from
+ // the frame offset, e.g. to index into part of a double slot.
+ FrameOffset GetFrameOffset(int spill_slot, Frame* frame, int extra = 0);
+
+ CompilationInfo* info() const { return info_; }
+
+ private:
+ CompilationInfo* info_;
+ CallDescriptor* incoming_;
+};
+}
+}
+} // namespace v8::internal::compiler
+
+#endif // V8_COMPILER_LINKAGE_H_
« no previous file with comments | « src/compiler/js-typed-lowering.cc ('k') | src/compiler/linkage.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698