| Index: src/compiler/linkage.h
|
| diff --git a/src/compiler/linkage.h b/src/compiler/linkage.h
|
| index f0f14e3c89edcb3f2cf62f380b1cba768ac4dfe7..e742af824cee9c5f810e764b7095bec0a07e1927 100644
|
| --- a/src/compiler/linkage.h
|
| +++ b/src/compiler/linkage.h
|
| @@ -18,29 +18,32 @@ 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(MachineType rep, int location)
|
| - : rep_(rep), location_(location) {}
|
| -
|
| - inline MachineType representation() const { return rep_; }
|
| + explicit LinkageLocation(int location) : location_(location) {}
|
|
|
| static const int16_t ANY_REGISTER = 32767;
|
|
|
| + static LinkageLocation AnyRegister() { return LinkageLocation(ANY_REGISTER); }
|
| +
|
| private:
|
| friend class CallDescriptor;
|
| friend class OperandGenerator;
|
| - MachineType rep_;
|
| int16_t location_; // >= 0 implies register, otherwise stack slot.
|
| };
|
|
|
| +typedef Signature<LinkageLocation> LocationSignature;
|
|
|
| +// Describes a call to various parts of the compiler. Every call has the notion
|
| +// of a "target", which is the first input to the call.
|
| class CallDescriptor FINAL : 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 };
|
| + // Describes the kind of this call, which determines the target.
|
| + enum Kind {
|
| + kCallCodeObject, // target is a Code object
|
| + kCallJSFunction, // target is a JSFunction object
|
| + kCallAddress // target is a machine pointer
|
| + };
|
|
|
| enum Flag {
|
| // TODO(jarin) kLazyDeoptimization and kNeedsFrameState should be unified.
|
| @@ -52,56 +55,74 @@ class CallDescriptor FINAL : public ZoneObject {
|
| };
|
| typedef base::Flags<Flag> Flags;
|
|
|
| - CallDescriptor(Kind kind, int8_t return_count, int16_t parameter_count,
|
| - int16_t input_count, LinkageLocation* locations,
|
| - Operator::Properties properties,
|
| + CallDescriptor(Kind kind, MachineType target_type, LinkageLocation target_loc,
|
| + MachineSignature* machine_sig, LocationSignature* location_sig,
|
| + size_t js_param_count, Operator::Properties properties,
|
| RegList callee_saved_registers, Flags flags,
|
| const char* debug_name = "")
|
| : kind_(kind),
|
| - return_count_(return_count),
|
| - parameter_count_(parameter_count),
|
| - input_count_(input_count),
|
| - locations_(locations),
|
| + target_type_(target_type),
|
| + target_loc_(target_loc),
|
| + machine_sig_(machine_sig),
|
| + location_sig_(location_sig),
|
| + js_param_count_(js_param_count),
|
| properties_(properties),
|
| callee_saved_registers_(callee_saved_registers),
|
| flags_(flags),
|
| - debug_name_(debug_name) {}
|
| + debug_name_(debug_name) {
|
| + DCHECK(machine_sig->return_count() == location_sig->return_count());
|
| + DCHECK(machine_sig->parameter_count() == location_sig->parameter_count());
|
| + }
|
| +
|
| // 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 return values from this call.
|
| + size_t ReturnCount() const { return machine_sig_->return_count(); }
|
|
|
| - // The number of JavaScript parameters to this call, including receiver,
|
| - // but not the context.
|
| - int ParameterCount() const { return parameter_count_; }
|
| + // The number of JavaScript parameters to this call, including the receiver
|
| + // object.
|
| + size_t JSParameterCount() const { return js_param_count_; }
|
|
|
| - int InputCount() const { return input_count_; }
|
| + // The total number of inputs to this call, which includes the target,
|
| + // receiver, context, etc.
|
| + // TODO(titzer): this should input the framestate input too.
|
| + size_t InputCount() const { return 1 + machine_sig_->parameter_count(); }
|
|
|
| - int FrameStateCount() const { return NeedsFrameState() ? 1 : 0; }
|
| + size_t FrameStateCount() const { return NeedsFrameState() ? 1 : 0; }
|
|
|
| Flags flags() const { return flags_; }
|
|
|
| bool NeedsFrameState() const { return flags() & kNeedsFrameState; }
|
|
|
| - LinkageLocation GetReturnLocation(int index) {
|
| - DCHECK(index < return_count_);
|
| - return locations_[0 + index]; // return locations start at 0.
|
| + LinkageLocation GetReturnLocation(size_t index) const {
|
| + return location_sig_->GetReturn(index);
|
| }
|
|
|
| - LinkageLocation GetInputLocation(int index) {
|
| - DCHECK(index < input_count_ + 1); // input_count + 1 is the context.
|
| - return locations_[return_count_ + index]; // inputs start after returns.
|
| + LinkageLocation GetInputLocation(size_t index) const {
|
| + if (index == 0) return target_loc_;
|
| + return location_sig_->GetParam(index - 1);
|
| + }
|
| +
|
| + const MachineSignature* GetMachineSignature() const { return machine_sig_; }
|
| +
|
| + MachineType GetReturnType(size_t index) const {
|
| + return machine_sig_->GetReturn(index);
|
| + }
|
| +
|
| + MachineType GetInputType(size_t index) const {
|
| + if (index == 0) return target_type_;
|
| + return machine_sig_->GetParam(index - 1);
|
| }
|
|
|
| // Operator properties describe how this call can be optimized, if at all.
|
| Operator::Properties properties() const { return properties_; }
|
|
|
| // Get the callee-saved registers, if any, across this call.
|
| - RegList CalleeSavedRegisters() { return callee_saved_registers_; }
|
| + RegList CalleeSavedRegisters() const { return callee_saved_registers_; }
|
|
|
| const char* debug_name() const { return debug_name_; }
|
|
|
| @@ -109,10 +130,11 @@ class CallDescriptor FINAL : public ZoneObject {
|
| friend class Linkage;
|
|
|
| Kind kind_;
|
| - int8_t return_count_;
|
| - int16_t parameter_count_;
|
| - int16_t input_count_;
|
| - LinkageLocation* locations_;
|
| + MachineType target_type_;
|
| + LinkageLocation target_loc_;
|
| + MachineSignature* machine_sig_;
|
| + LocationSignature* location_sig_;
|
| + size_t js_param_count_;
|
| Operator::Properties properties_;
|
| RegList callee_saved_registers_;
|
| Flags flags_;
|
| @@ -166,13 +188,17 @@ class Linkage : public ZoneObject {
|
| // 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, MachineType return_type,
|
| - const MachineType* param_types);
|
| + static CallDescriptor* GetSimplifiedCDescriptor(Zone* zone,
|
| + MachineSignature* sig);
|
|
|
| // Get the location of an (incoming) parameter to this function.
|
| LinkageLocation GetParameterLocation(int index) {
|
| - return incoming_->GetInputLocation(index + 1);
|
| + return incoming_->GetInputLocation(index + 1); // + 1 to skip target.
|
| + }
|
| +
|
| + // Get the machine type of an (incoming) parameter to this function.
|
| + MachineType GetParameterType(int index) {
|
| + return incoming_->GetInputType(index + 1); // + 1 to skip target.
|
| }
|
|
|
| // Get the location where this function should place its return value.
|
| @@ -180,6 +206,9 @@ class Linkage : public ZoneObject {
|
| return incoming_->GetReturnLocation(0);
|
| }
|
|
|
| + // Get the machine type of this function's return value.
|
| + MachineType GetReturnType() { return incoming_->GetReturnType(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
|
|
|