⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 abstractmacroassembler.h

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 H
📖 第 1 页 / 共 2 页
字号:
/* * Copyright (C) 2008 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  */#ifndef AbstractMacroAssembler_h#define AbstractMacroAssembler_h#include <wtf/Platform.h>#if ENABLE(ASSEMBLER)namespace JSC {template <class AssemblerType>class AbstractMacroAssembler {public:    class Jump;    class PatchBuffer;    class CodeLocationLabel;    class CodeLocationJump;    class CodeLocationCall;    class CodeLocationDataLabel32;    class CodeLocationDataLabelPtr;    typedef typename AssemblerType::RegisterID RegisterID;    typedef typename AssemblerType::JmpSrc JmpSrc;    typedef typename AssemblerType::JmpDst JmpDst;    // Section 1: MacroAssembler operand types    //    // The following types are used as operands to MacroAssembler operations,    // describing immediate  and memory operands to the instructions to be planted.    enum Scale {        TimesOne,        TimesTwo,        TimesFour,        TimesEight,    };    // Address:    //    // Describes a simple base-offset address.    struct Address {        explicit Address(RegisterID base, int32_t offset = 0)            : base(base)            , offset(offset)        {        }        RegisterID base;        int32_t offset;    };    // ImplicitAddress:    //    // This class is used for explicit 'load' and 'store' operations    // (as opposed to situations in which a memory operand is provided    // to a generic operation, such as an integer arithmetic instruction).    //    // In the case of a load (or store) operation we want to permit    // addresses to be implicitly constructed, e.g. the two calls:    //    //     load32(Address(addrReg), destReg);    //     load32(addrReg, destReg);    //    // Are equivalent, and the explicit wrapping of the Address in the former    // is unnecessary.    struct ImplicitAddress {        ImplicitAddress(RegisterID base)            : base(base)            , offset(0)        {        }        ImplicitAddress(Address address)            : base(address.base)            , offset(address.offset)        {        }        RegisterID base;        int32_t offset;    };    // BaseIndex:    //    // Describes a complex addressing mode.    struct BaseIndex {        BaseIndex(RegisterID base, RegisterID index, Scale scale, int32_t offset = 0)            : base(base)            , index(index)            , scale(scale)            , offset(offset)        {        }        RegisterID base;        RegisterID index;        Scale scale;        int32_t offset;    };    // AbsoluteAddress:    //    // Describes an memory operand given by a pointer.  For regular load & store    // operations an unwrapped void* will be used, rather than using this.    struct AbsoluteAddress {        explicit AbsoluteAddress(void* ptr)            : m_ptr(ptr)        {        }        void* m_ptr;    };    // ImmPtr:    //    // A pointer sized immediate operand to an instruction - this is wrapped    // in a class requiring explicit construction in order to differentiate    // from pointers used as absolute addresses to memory operations    struct ImmPtr {        explicit ImmPtr(void* value)            : m_value(value)        {        }        intptr_t asIntptr()        {            return reinterpret_cast<intptr_t>(m_value);        }        void* m_value;    };    // Imm32:    //    // A 32bit immediate operand to an instruction - this is wrapped in a    // class requiring explicit construction in order to prevent RegisterIDs    // (which are implemented as an enum) from accidentally being passed as    // immediate values.    struct Imm32 {        explicit Imm32(int32_t value)            : m_value(value)        {        }#if !PLATFORM(X86_64)        explicit Imm32(ImmPtr ptr)            : m_value(ptr.asIntptr())        {        }#endif        int32_t m_value;    };    // Section 2: MacroAssembler code buffer handles    //    // The following types are used to reference items in the code buffer    // during JIT code generation.  For example, the type Jump is used to    // track the location of a jump instruction so that it may later be    // linked to a label marking its destination.    // Label:    //    // A Label records a point in the generated instruction stream, typically such that    // it may be used as a destination for a jump.    class Label {        friend class Jump;        template<class AssemblerType_T>        friend class AbstractMacroAssembler;        friend class PatchBuffer;    public:        Label()        {        }        Label(AbstractMacroAssembler<AssemblerType>* masm)            : m_label(masm->m_assembler.label())        {        }                bool isUsed() const { return m_label.isUsed(); }        void used() { m_label.used(); }    private:        JmpDst m_label;    };    // DataLabelPtr:    //    // A DataLabelPtr is used to refer to a location in the code containing a pointer to be    // patched after the code has been generated.    class DataLabelPtr {        template<class AssemblerType_T>        friend class AbstractMacroAssembler;        friend class PatchBuffer;    public:        DataLabelPtr()        {        }        DataLabelPtr(AbstractMacroAssembler<AssemblerType>* masm)            : m_label(masm->m_assembler.label())        {        }            private:        JmpDst m_label;    };    // DataLabel32:    //    // A DataLabelPtr is used to refer to a location in the code containing a pointer to be    // patched after the code has been generated.    class DataLabel32 {        template<class AssemblerType_T>        friend class AbstractMacroAssembler;        friend class PatchBuffer;    public:        DataLabel32()        {        }        DataLabel32(AbstractMacroAssembler<AssemblerType>* masm)            : m_label(masm->m_assembler.label())        {        }    private:        JmpDst m_label;    };    // Call:    //    // A Call object is a reference to a call instruction that has been planted    // into the code buffer - it is typically used to link the call, setting the    // relative offset such that when executed it will call to the desired    // destination.    class Call {        friend class PatchBuffer;        template<class AssemblerType_T>        friend class AbstractMacroAssembler;    public:        enum Flags {            None = 0x0,            Linkable = 0x1,            Near = 0x2,            LinkableNear = 0x3,        };        Call()            : m_flags(None)        {        }                Call(JmpSrc jmp, Flags flags)            : m_jmp(jmp)            , m_flags(flags)        {        }        bool isFlagSet(Flags flag)        {            return m_flags & flag;        }        static Call fromTailJump(Jump jump)        {            return Call(jump.m_jmp, Linkable);        }    private:        JmpSrc m_jmp;        Flags m_flags;    };    // Jump:    //    // A jump object is a reference to a jump instruction that has been planted    // into the code buffer - it is typically used to link the jump, setting the    // relative offset such that when executed it will jump to the desired    // destination.    class Jump {        friend class PatchBuffer;        template<class AssemblerType_T>        friend class AbstractMacroAssembler;        friend class Call;    public:        Jump()        {        }                Jump(JmpSrc jmp)                : m_jmp(jmp)        {        }                void link(AbstractMacroAssembler<AssemblerType>* masm)        {            masm->m_assembler.linkJump(m_jmp, masm->m_assembler.label());        }                void linkTo(Label label, AbstractMacroAssembler<AssemblerType>* masm)        {            masm->m_assembler.linkJump(m_jmp, label.m_label);        }    private:        JmpSrc m_jmp;    };    // JumpList:    //    // A JumpList is a set of Jump objects.    // All jumps in the set will be linked to the same destination.    class JumpList {        friend class PatchBuffer;    public:        void link(AbstractMacroAssembler<AssemblerType>* masm)        {            size_t size = m_jumps.size();            for (size_t i = 0; i < size; ++i)                m_jumps[i].link(masm);            m_jumps.clear();        }                void linkTo(Label label, AbstractMacroAssembler<AssemblerType>* masm)        {            size_t size = m_jumps.size();            for (size_t i = 0; i < size; ++i)                m_jumps[i].linkTo(label, masm);            m_jumps.clear();        }                void append(Jump jump)        {            m_jumps.append(jump);        }                void append(JumpList& other)        {            m_jumps.append(other.m_jumps.begin(), other.m_jumps.size());        }        bool empty()        {            return !m_jumps.size();        }    private:        Vector<Jump, 16> m_jumps;    };    // Section 3: MacroAssembler JIT instruction stream handles.    //    // The MacroAssembler supported facilities to modify a JIT generated    // instruction stream after it has been generated (relinking calls and    // jumps, and repatching data values).  The following types are used    // to store handles into the underlying instruction stream, the type    // providing semantic information as to what it is that is in the    // instruction stream at this point, and thus what operations may be    // performed on it.    // CodeLocationCommon:    //    // Base type for other CodeLocation* types.  A postion in the JIT genertaed    // instruction stream, without any semantic information.    class CodeLocationCommon {    public:        CodeLocationCommon()            : m_location(0)        {        }        // In order to avoid the need to store multiple handles into the        // instructions stream, where the code generation is deterministic        // and the labels will always be a fixed distance apart, these        // methods may be used to recover a handle that has nopw been        // retained, based on a known fixed relative offset from one that has.        CodeLocationLabel labelAtOffset(int offset);        CodeLocationJump jumpAtOffset(int offset);        CodeLocationCall callAtOffset(int offset);        CodeLocationDataLabelPtr dataLabelPtrAtOffset(int offset);        CodeLocationDataLabel32 dataLabel32AtOffset(int offset);        operator bool() { return m_location; }        void reset() { m_location = 0; }    protected:        explicit CodeLocationCommon(void* location)            : m_location(location)        {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -