| Index: src/interface-descriptors.h
|
| diff --git a/src/interface-descriptors.h b/src/interface-descriptors.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..97dc272951b15696aeb9c6643040e0ebf4124a76
|
| --- /dev/null
|
| +++ b/src/interface-descriptors.h
|
| @@ -0,0 +1,126 @@
|
| +// 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_CALL_INTERFACE_DESCRIPTOR_H_
|
| +#define V8_CALL_INTERFACE_DESCRIPTOR_H_
|
| +
|
| +#include "src/assembler.h"
|
| +#include "src/macro-assembler.h"
|
| +
|
| +namespace v8 {
|
| +namespace internal {
|
| +
|
| +class PlatformInterfaceDescriptor;
|
| +
|
| +class InterfaceDescriptor {
|
| + public:
|
| + bool IsInitialized() const { return register_param_count_ >= 0; }
|
| +
|
| + int GetEnvironmentLength() const { return register_param_count_; }
|
| +
|
| + int GetRegisterParameterCount() const { return register_param_count_; }
|
| +
|
| + Register GetParameterRegister(int index) const {
|
| + return register_params_[index];
|
| + }
|
| +
|
| + Representation GetParameterRepresentation(int index) const {
|
| + DCHECK(index < register_param_count_);
|
| + if (register_param_representations_.get() == NULL) {
|
| + return Representation::Tagged();
|
| + }
|
| +
|
| + return register_param_representations_[index];
|
| + }
|
| +
|
| + // "Environment" versions of parameter functions. The first register
|
| + // parameter (context) is not included.
|
| + int GetEnvironmentParameterCount() const {
|
| + return GetEnvironmentLength() - 1;
|
| + }
|
| +
|
| + Register GetEnvironmentParameterRegister(int index) const {
|
| + return GetParameterRegister(index + 1);
|
| + }
|
| +
|
| + Representation GetEnvironmentParameterRepresentation(int index) const {
|
| + return GetParameterRepresentation(index + 1);
|
| + }
|
| +
|
| + // Some platforms have extra information to associate with the descriptor.
|
| + PlatformInterfaceDescriptor* platform_specific_descriptor() const {
|
| + return platform_specific_descriptor_;
|
| + }
|
| +
|
| + static const Register ContextRegister();
|
| +
|
| + protected:
|
| + InterfaceDescriptor();
|
| + virtual ~InterfaceDescriptor() {}
|
| +
|
| + void Initialize(int register_parameter_count, Register* registers,
|
| + Representation* register_param_representations,
|
| + PlatformInterfaceDescriptor* platform_descriptor = NULL);
|
| +
|
| + private:
|
| + int register_param_count_;
|
| +
|
| + // The Register params are allocated dynamically by the
|
| + // InterfaceDescriptor, and freed on destruction. This is because static
|
| + // arrays of Registers cause creation of runtime static initializers
|
| + // which we don't want.
|
| + SmartArrayPointer<Register> register_params_;
|
| + // Specifies Representations for the stub's parameter. Points to an array of
|
| + // Representations of the same length of the numbers of parameters to the
|
| + // stub, or if NULL (the default value), Representation of each parameter
|
| + // assumed to be Tagged().
|
| + SmartArrayPointer<Representation> register_param_representations_;
|
| +
|
| + PlatformInterfaceDescriptor* platform_specific_descriptor_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(InterfaceDescriptor);
|
| +};
|
| +
|
| +
|
| +enum CallDescriptorKey {
|
| + KeyedCall,
|
| + NamedCall,
|
| + CallHandler,
|
| + ArgumentAdaptorCall,
|
| + ApiFunctionCall,
|
| + NUMBER_OF_CALL_DESCRIPTORS
|
| +};
|
| +
|
| +
|
| +class CallInterfaceDescriptor : public InterfaceDescriptor {
|
| + public:
|
| + CallInterfaceDescriptor() {}
|
| +
|
| + // A copy of the passed in registers and param_representations is made
|
| + // and owned by the CallInterfaceDescriptor.
|
| +
|
| + // TODO(mvstanton): Instead of taking parallel arrays register and
|
| + // param_representations, how about a struct that puts the representation
|
| + // and register side by side (eg, RegRep(r1, Representation::Tagged()).
|
| + // The same should go for the CodeStubInterfaceDescriptor class.
|
| + void Initialize(int register_parameter_count, Register* registers,
|
| + Representation* param_representations,
|
| + PlatformInterfaceDescriptor* platform_descriptor = NULL);
|
| +};
|
| +
|
| +
|
| +class CallDescriptors {
|
| + public:
|
| + static void InitializeForIsolate(Isolate* isolate);
|
| +};
|
| +}
|
| +} // namespace v8::internal
|
| +
|
| +#if V8_TARGET_ARCH_ARM64
|
| +#include "src/arm64/interface-descriptors-arm64.h"
|
| +#elif V8_TARGET_ARCH_ARM
|
| +#include "src/arm/interface-descriptors-arm.h"
|
| +#endif
|
| +
|
| +#endif // V8_CALL_INTERFACE_DESCRIPTOR_H_
|
|
|