DisassemblerLLVMC.cpp revision a53324d018afb71a1a53840c426aab47edb56383
132a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan//===-- DisassemblerLLVMC.cpp -----------------------------------*- C++ -*-===//
232a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan//
332a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan//                     The LLVM Compiler Infrastructure
432a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan//
532a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan// This file is distributed under the University of Illinois Open Source
632a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan// License. See LICENSE.TXT for details.
732a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan//
832a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan//===----------------------------------------------------------------------===//
932a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan
1032a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan#include "DisassemblerLLVMC.h"
1132a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan
1232a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan#include "llvm-c/Disassembler.h"
1332a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan#include "llvm/Support/TargetSelect.h"
1432a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan
1532a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan#include "lldb/Core/Address.h"
1632a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan#include "lldb/Core/DataExtractor.h"
1749ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/Module.h"
1832a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan#include "lldb/Core/Stream.h"
1932a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan#include "lldb/Symbol/SymbolContext.h"
2032a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan#include "lldb/Target/ExecutionContext.h"
2132a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan#include "lldb/Target/Process.h"
2232a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan#include "lldb/Target/RegisterContext.h"
2332a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan#include "lldb/Target/Target.h"
2432a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan#include "lldb/Target/StackFrame.h"
2532a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan
2632a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan#include <regex.h>
2732a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan
2832a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callananusing namespace lldb;
2932a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callananusing namespace lldb_private;
3032a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan
3132a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callananclass InstructionLLVMC : public lldb_private::Instruction
3232a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan{
3332a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callananpublic:
3432a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    InstructionLLVMC (DisassemblerLLVMC &disasm,
3532a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan                      const lldb_private::Address &address,
367fb143064009e34dbb7a602924e9807375f72a46Greg Clayton                      AddressClass addr_class) :
3732a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan        Instruction(address, addr_class),
3832a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan        m_is_valid(false),
39432fe10975984c396b38720f62a0c4cd72e7821fBill Wendling        m_disasm(disasm),
404f28c31e4b652a842ce6138b70ded44ffb3e8c48Sean Callanan        m_disasm_sp(disasm.shared_from_this()),
415f1b66cb0210d0f84729740faed4952049acb5edSean Callanan        m_does_branch(eLazyBoolCalculate)
4232a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    {
4332a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    }
4432a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan
4532a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    virtual
4632a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    ~InstructionLLVMC ()
4732a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    {
4832a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    }
4932a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan
5032a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    static void
5132a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    PadToWidth (lldb_private::StreamString &ss,
5232a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan                int new_width)
5332a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    {
5432a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan        int old_width = ss.GetSize();
5532a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan
5632a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan        if (old_width < new_width)
5732a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan        {
5832a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan            ss.Printf("%*s", new_width - old_width, "");
5932a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan        }
6032a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    }
610fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton
620fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton    virtual bool
630fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton    DoesBranch () const
640fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton    {
650fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton        return m_does_branch == eLazyBoolYes;
660fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton    }
6732a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan
680fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton    virtual size_t
690fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton    Decode (const lldb_private::Disassembler &disassembler,
700fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            const lldb_private::DataExtractor &data,
710fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            uint32_t data_offset)
7232a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    {
730fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton        // All we have to do is read the opcode which can be easy for some
740fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton        // architetures
750fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton        bool got_op = false;
760fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton        const ArchSpec &arch = m_disasm.GetArchitecture();
7732a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan
780fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton        const uint32_t min_op_byte_size = arch.GetMinimumOpcodeByteSize();
790fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton        const uint32_t max_op_byte_size = arch.GetMaximumOpcodeByteSize();
800fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton        if (min_op_byte_size == max_op_byte_size)
8132a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan        {
820fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            // Fixed size instructions, just read that amount of data.
830fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            if (!data.ValidOffsetForDataOfSize(data_offset, min_op_byte_size))
840fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                return false;
8532a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan
860fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            switch (min_op_byte_size)
870fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            {
880fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                case 1:
890fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                    m_opcode.SetOpcode8  (data.GetU8  (&data_offset));
900fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                    got_op = true;
910fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                    break;
920fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton
930fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                case 2:
940fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                    m_opcode.SetOpcode16 (data.GetU16 (&data_offset));
950fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                    got_op = true;
960fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                    break;
970fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton
980fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                case 4:
990fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                    m_opcode.SetOpcode32 (data.GetU32 (&data_offset));
1000fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                    got_op = true;
1010fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                    break;
1020fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton
1030fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                case 8:
1040fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                    m_opcode.SetOpcode64 (data.GetU64 (&data_offset));
1050fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                    got_op = true;
1060fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                    break;
1070fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton
1080fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                default:
1090fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                    m_opcode.SetOpcodeBytes(data.PeekData(data_offset, min_op_byte_size), min_op_byte_size);
1100fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                    got_op = true;
1110fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                    break;
1120fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            }
11332a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan        }
1140fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton        if (!got_op)
11532a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan        {
1160fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            ::LLVMDisasmContextRef disasm_context = m_disasm.m_disasm_context;
11732a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan
1180fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            bool is_altnernate_isa = false;
1190fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            if (m_disasm.m_alternate_disasm_context)
1200fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            {
1210fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                const AddressClass address_class = GetAddressClass ();
1220fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton
1230fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                if (address_class == eAddressClassCodeAlternateISA)
1240fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                {
1250fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                    disasm_context = m_disasm.m_alternate_disasm_context;
1260fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                    is_altnernate_isa = true;
1270fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                }
1280fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            }
1290fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            const llvm::Triple::ArchType machine = arch.GetMachine();
1300fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            if (machine == llvm::Triple::arm || machine == llvm::Triple::thumb)
13132a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan            {
1320fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                if (machine == llvm::Triple::thumb || is_altnernate_isa)
1330fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                {
1343da64aed43196bc49cc90aa4f02e36f9e5655c1fGreg Clayton                    uint32_t thumb_opcode = data.GetU16(&data_offset);
1350fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                    if ((thumb_opcode & 0xe000) != 0xe000 || ((thumb_opcode & 0x1800u) == 0))
1360fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                    {
1370fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                        m_opcode.SetOpcode16 (thumb_opcode);
1381424a5e6a6baa6dc1f8e39139da2ff8b67634c91Sean Callanan                        m_is_valid = true;
1390fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                    }
1400fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                    else
1410fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                    {
1423da64aed43196bc49cc90aa4f02e36f9e5655c1fGreg Clayton                        thumb_opcode <<= 16;
1433da64aed43196bc49cc90aa4f02e36f9e5655c1fGreg Clayton                        thumb_opcode |= data.GetU16(&data_offset);
1443da64aed43196bc49cc90aa4f02e36f9e5655c1fGreg Clayton                        m_opcode.SetOpcode16_2 (thumb_opcode);
1450fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                        m_is_valid = true;
1460fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                    }
1470fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                }
14832a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan                else
1490fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                {
1500fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                    m_opcode.SetOpcode32 (data.GetU32(&data_offset));
1511424a5e6a6baa6dc1f8e39139da2ff8b67634c91Sean Callanan                    m_is_valid = true;
1520fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                }
15332a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan            }
15432a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan            else
15532a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan            {
1560fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                // The opcode isn't evenly sized, so we need to actually use the llvm
1570fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                // disassembler to parse it and get the size.
1580fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                char out_string[512];
1590fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                m_disasm.Lock(this, NULL);
1600fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                uint8_t *opcode_data = const_cast<uint8_t *>(data.PeekData (data_offset, 1));
1610fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                const size_t opcode_data_len = data.GetByteSize() - data_offset;
1620fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                const addr_t pc = m_address.GetFileAddress();
1630fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                const size_t inst_size = ::LLVMDisasmInstruction (disasm_context,
1640fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                                                                  opcode_data,
1650fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                                                                  opcode_data_len,
1660fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                                                                  pc, // PC value
1670fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                                                                  out_string,
1680fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                                                                  sizeof(out_string));
1690fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                // The address lookup function could have caused us to fill in our comment
1700fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                m_comment.clear();
1710fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                m_disasm.Unlock();
1720fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                if (inst_size == 0)
1730fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                    m_opcode.Clear();
17432a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan                else
1750fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                {
1760fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                    m_opcode.SetOpcodeBytes(opcode_data, inst_size);
1770fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                    m_is_valid = true;
1780fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                }
1790fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            }
18032a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan        }
18132a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan        return m_opcode.GetByteSize();
18232a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    }
18332a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan
18432a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    void
1850fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton    AppendComment (std::string &description)
18632a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    {
1870fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton        if (m_comment.empty())
1880fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            m_comment.swap (description);
18932a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan        else
1900fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton        {
1910fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            m_comment.append(", ");
1920fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            m_comment.append(description);
1930fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton        }
19432a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    }
19532a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan
19632a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    virtual void
1970fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton    CalculateMnemonicOperandsAndComment (const lldb_private::ExecutionContext *exe_ctx)
19832a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    {
1990fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton        DataExtractor data;
2000fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton        const AddressClass address_class = GetAddressClass ();
2010fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton
202b42f1c8bc38f7af2d687dc1cf5392cf51d6890b4Sean Callanan        if (m_opcode.GetData(data))
2030fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton        {
2040fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            char out_string[512];
2050fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton
2060fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            ::LLVMDisasmContextRef disasm_context;
2070fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton
2080fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            if (address_class == eAddressClassCodeAlternateISA)
2090fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                disasm_context = m_disasm.m_alternate_disasm_context;
2100fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            else
2110fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                disasm_context = m_disasm.m_disasm_context;
2120fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton
2130fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            lldb::addr_t pc = LLDB_INVALID_ADDRESS;
2140fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton
2150fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            if (exe_ctx)
2160fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            {
2170fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                Target *target = exe_ctx->GetTargetPtr();
2180fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                if (target)
2190fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                    pc = m_address.GetLoadAddress(target);
2200fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            }
2210fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton
2220fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            if (pc == LLDB_INVALID_ADDRESS)
2230fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                pc = m_address.GetFileAddress();
2240fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton
2250fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            m_disasm.Lock(this, exe_ctx);
2260fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            uint8_t *opcode_data = const_cast<uint8_t *>(data.PeekData (0, 1));
2270fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            const size_t opcode_data_len = data.GetByteSize();
2280fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            size_t inst_size = ::LLVMDisasmInstruction (disasm_context,
2290fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                                                        opcode_data,
2300fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                                                        opcode_data_len,
2310fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                                                        pc,
2320fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                                                        out_string,
2330fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                                                        sizeof(out_string));
2340fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton
2350fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            m_disasm.Unlock();
2360fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton
2370fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            if (inst_size == 0)
2380fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            {
2390fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                m_comment.assign ("unknown opcode");
2400fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                inst_size = m_opcode.GetByteSize();
2410fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                StreamString mnemonic_strm;
2420fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                uint32_t offset = 0;
2430fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                switch (inst_size)
2440fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                {
2450fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                    case 1:
2460fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                        {
2470fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                            const uint8_t uval8 = data.GetU8 (&offset);
2480fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                            m_opcode.SetOpcode8 (uval8);
2490fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                            m_opcode_name.assign (".byte");
2500fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                            mnemonic_strm.Printf("0x%2.2x", uval8);
2510fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                        }
2520fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                        break;
2530fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                    case 2:
2540fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                        {
2550fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                            const uint16_t uval16 = data.GetU16(&offset);
2560fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                            m_opcode.SetOpcode16(uval16);
2570fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                            m_opcode_name.assign (".short");
2580fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                            mnemonic_strm.Printf("0x%4.4x", uval16);
2590fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                        }
2600fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                        break;
2610fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                    case 4:
2620fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                        {
2630fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                            const uint32_t uval32 = data.GetU32(&offset);
2640fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                            m_opcode.SetOpcode32(uval32);
2650fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                            m_opcode_name.assign (".long");
2660fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                            mnemonic_strm.Printf("0x%8.8x", uval32);
2670fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                        }
2680fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                        break;
2690fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                    case 8:
2700fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                        {
2710fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                            const uint64_t uval64 = data.GetU64(&offset);
2720fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                            m_opcode.SetOpcode64(uval64);
2730fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                            m_opcode_name.assign (".quad");
2740fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                            mnemonic_strm.Printf("0x%16.16llx", uval64);
2750fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                        }
2760fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                        break;
2770fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                    default:
2780fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                        if (inst_size == 0)
2790fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                            return;
2800fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                        else
2810fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                        {
2820fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                            const uint8_t *bytes = data.PeekData(offset, inst_size);
2830fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                            if (bytes == NULL)
2840fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                                return;
2850fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                            m_opcode_name.assign (".byte");
2860fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                            m_opcode.SetOpcodeBytes(bytes, inst_size);
2870fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                            mnemonic_strm.Printf("0x%2.2x", bytes[0]);
2880fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                            for (uint32_t i=1; i<inst_size; ++i)
2890fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                                mnemonic_strm.Printf(" 0x%2.2x", bytes[i]);
2900fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                        }
2910fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                        break;
2920fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                }
2930fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                m_mnemocics.swap(mnemonic_strm.GetString());
2940fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                return;
2950fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            }
2960fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            else
2970fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            {
2980fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                if (m_does_branch == eLazyBoolCalculate)
2990fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                {
3000fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                    if (StringRepresentsBranch (out_string, strlen(out_string)))
3010fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                        m_does_branch = eLazyBoolYes;
3020fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                    else
3030fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                        m_does_branch = eLazyBoolNo;
3040fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                }
3050fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            }
3060fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton
3070fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            if (!s_regex_compiled)
3080fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            {
3090fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                ::regcomp(&s_regex, "[ \t]*([^ ^\t]+)[ \t]*([^ ^\t].*)?", REG_EXTENDED);
3100fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                s_regex_compiled = true;
3110fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            }
3120fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton
3130fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            ::regmatch_t matches[3];
3140fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton
3150fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            if (!::regexec(&s_regex, out_string, sizeof(matches) / sizeof(::regmatch_t), matches, 0))
3160fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            {
3170fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                if (matches[1].rm_so != -1)
3180fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                    m_opcode_name.assign(out_string + matches[1].rm_so, matches[1].rm_eo - matches[1].rm_so);
3190fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                if (matches[2].rm_so != -1)
3200fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                    m_mnemocics.assign(out_string + matches[2].rm_so, matches[2].rm_eo - matches[2].rm_so);
3210fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            }
3220fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton        }
32332a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    }
32432a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan
32532a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    bool
32632a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    IsValid ()
32732a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    {
32832a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan        return m_is_valid;
32932a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    }
33032a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan
33132a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    size_t
33232a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    GetByteSize ()
33332a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    {
33432a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan        return m_opcode.GetByteSize();
33532a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    }
33632a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callananprotected:
33732a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan
3385f1b66cb0210d0f84729740faed4952049acb5edSean Callanan    bool StringRepresentsBranch (const char *data, size_t size)
3395f1b66cb0210d0f84729740faed4952049acb5edSean Callanan    {
3405f1b66cb0210d0f84729740faed4952049acb5edSean Callanan        const char *cursor = data;
3415f1b66cb0210d0f84729740faed4952049acb5edSean Callanan
3425f1b66cb0210d0f84729740faed4952049acb5edSean Callanan        bool inWhitespace = true;
3435f1b66cb0210d0f84729740faed4952049acb5edSean Callanan
3445f1b66cb0210d0f84729740faed4952049acb5edSean Callanan        while (inWhitespace && cursor < data + size)
3455f1b66cb0210d0f84729740faed4952049acb5edSean Callanan        {
3465f1b66cb0210d0f84729740faed4952049acb5edSean Callanan            switch (*cursor)
3475f1b66cb0210d0f84729740faed4952049acb5edSean Callanan            {
3485f1b66cb0210d0f84729740faed4952049acb5edSean Callanan            default:
3495f1b66cb0210d0f84729740faed4952049acb5edSean Callanan                inWhitespace = false;
3505f1b66cb0210d0f84729740faed4952049acb5edSean Callanan                break;
3515f1b66cb0210d0f84729740faed4952049acb5edSean Callanan            case ' ':
3525f1b66cb0210d0f84729740faed4952049acb5edSean Callanan                break;
3535f1b66cb0210d0f84729740faed4952049acb5edSean Callanan            case '\t':
3545f1b66cb0210d0f84729740faed4952049acb5edSean Callanan                break;
3555f1b66cb0210d0f84729740faed4952049acb5edSean Callanan            }
3565f1b66cb0210d0f84729740faed4952049acb5edSean Callanan
3575f1b66cb0210d0f84729740faed4952049acb5edSean Callanan            if (inWhitespace)
3585f1b66cb0210d0f84729740faed4952049acb5edSean Callanan                ++cursor;
3595f1b66cb0210d0f84729740faed4952049acb5edSean Callanan        }
3605f1b66cb0210d0f84729740faed4952049acb5edSean Callanan
3615f1b66cb0210d0f84729740faed4952049acb5edSean Callanan        if (cursor >= data + size)
3625f1b66cb0210d0f84729740faed4952049acb5edSean Callanan            return false;
3635f1b66cb0210d0f84729740faed4952049acb5edSean Callanan
3645f1b66cb0210d0f84729740faed4952049acb5edSean Callanan        llvm::Triple::ArchType arch = m_disasm.GetArchitecture().GetMachine();
3655f1b66cb0210d0f84729740faed4952049acb5edSean Callanan
3665f1b66cb0210d0f84729740faed4952049acb5edSean Callanan        switch (arch)
3675f1b66cb0210d0f84729740faed4952049acb5edSean Callanan        {
3685f1b66cb0210d0f84729740faed4952049acb5edSean Callanan        default:
3695f1b66cb0210d0f84729740faed4952049acb5edSean Callanan            return false;
3705f1b66cb0210d0f84729740faed4952049acb5edSean Callanan        case llvm::Triple::x86:
3715f1b66cb0210d0f84729740faed4952049acb5edSean Callanan        case llvm::Triple::x86_64:
3725f1b66cb0210d0f84729740faed4952049acb5edSean Callanan            switch (cursor[0])
3735f1b66cb0210d0f84729740faed4952049acb5edSean Callanan            {
3745f1b66cb0210d0f84729740faed4952049acb5edSean Callanan            default:
3755f1b66cb0210d0f84729740faed4952049acb5edSean Callanan                return false;
3765f1b66cb0210d0f84729740faed4952049acb5edSean Callanan            case 'j':
3775f1b66cb0210d0f84729740faed4952049acb5edSean Callanan                return true;
3785f1b66cb0210d0f84729740faed4952049acb5edSean Callanan            case 'c':
3795f1b66cb0210d0f84729740faed4952049acb5edSean Callanan                if (cursor[1] == 'a' &&
3805f1b66cb0210d0f84729740faed4952049acb5edSean Callanan                    cursor[2] == 'l' &&
3815f1b66cb0210d0f84729740faed4952049acb5edSean Callanan                    cursor[3] == 'l')
3825f1b66cb0210d0f84729740faed4952049acb5edSean Callanan                    return true;
3835f1b66cb0210d0f84729740faed4952049acb5edSean Callanan                else
3845f1b66cb0210d0f84729740faed4952049acb5edSean Callanan                    return false;
3855f1b66cb0210d0f84729740faed4952049acb5edSean Callanan            }
3865f1b66cb0210d0f84729740faed4952049acb5edSean Callanan        case llvm::Triple::arm:
3875f1b66cb0210d0f84729740faed4952049acb5edSean Callanan        case llvm::Triple::thumb:
3885f1b66cb0210d0f84729740faed4952049acb5edSean Callanan            switch (cursor[0])
3895f1b66cb0210d0f84729740faed4952049acb5edSean Callanan            {
3905f1b66cb0210d0f84729740faed4952049acb5edSean Callanan            default:
3915f1b66cb0210d0f84729740faed4952049acb5edSean Callanan                return false;
3925f1b66cb0210d0f84729740faed4952049acb5edSean Callanan            case 'b':
3935f1b66cb0210d0f84729740faed4952049acb5edSean Callanan                {
3945f1b66cb0210d0f84729740faed4952049acb5edSean Callanan                    switch (cursor[1])
3955f1b66cb0210d0f84729740faed4952049acb5edSean Callanan                    {
3965f1b66cb0210d0f84729740faed4952049acb5edSean Callanan                    default:
3975f1b66cb0210d0f84729740faed4952049acb5edSean Callanan                        return true;
398561bf5889d1677d79024928072bf4817640d842fSean Callanan                    case 'f':
399561bf5889d1677d79024928072bf4817640d842fSean Callanan                    case 'i':
400561bf5889d1677d79024928072bf4817640d842fSean Callanan                    case 'k':
401561bf5889d1677d79024928072bf4817640d842fSean Callanan                        return false;
4025f1b66cb0210d0f84729740faed4952049acb5edSean Callanan                    }
4035f1b66cb0210d0f84729740faed4952049acb5edSean Callanan                }
4045f1b66cb0210d0f84729740faed4952049acb5edSean Callanan            case 'c':
4055f1b66cb0210d0f84729740faed4952049acb5edSean Callanan                {
4065f1b66cb0210d0f84729740faed4952049acb5edSean Callanan                    switch (cursor[1])
4075f1b66cb0210d0f84729740faed4952049acb5edSean Callanan                    {
4085f1b66cb0210d0f84729740faed4952049acb5edSean Callanan                    default:
4095f1b66cb0210d0f84729740faed4952049acb5edSean Callanan                        return false;
4105f1b66cb0210d0f84729740faed4952049acb5edSean Callanan                    case 'b':
4115f1b66cb0210d0f84729740faed4952049acb5edSean Callanan                        return true;
4125f1b66cb0210d0f84729740faed4952049acb5edSean Callanan                    }
4135f1b66cb0210d0f84729740faed4952049acb5edSean Callanan                }
4145f1b66cb0210d0f84729740faed4952049acb5edSean Callanan            }
4155f1b66cb0210d0f84729740faed4952049acb5edSean Callanan        }
4165f1b66cb0210d0f84729740faed4952049acb5edSean Callanan
4175f1b66cb0210d0f84729740faed4952049acb5edSean Callanan        return false;
4185f1b66cb0210d0f84729740faed4952049acb5edSean Callanan    }
4195f1b66cb0210d0f84729740faed4952049acb5edSean Callanan
42032a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    bool                    m_is_valid;
42132a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    DisassemblerLLVMC      &m_disasm;
4224f28c31e4b652a842ce6138b70ded44ffb3e8c48Sean Callanan    DisassemblerSP          m_disasm_sp; // for ownership
4235f1b66cb0210d0f84729740faed4952049acb5edSean Callanan    LazyBool                m_does_branch;
42432a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan
42532a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    static bool             s_regex_compiled;
42632a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    static ::regex_t        s_regex;
42732a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan};
42832a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan
42932a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callananbool InstructionLLVMC::s_regex_compiled = false;
43032a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan::regex_t InstructionLLVMC::s_regex;
43132a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan
43232a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean CallananDisassembler *
43332a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean CallananDisassemblerLLVMC::CreateInstance (const ArchSpec &arch)
43432a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan{
435a53324d018afb71a1a53840c426aab47edb56383Greg Clayton    if (arch.GetTriple().getArch() != llvm::Triple::UnknownArch)
436a53324d018afb71a1a53840c426aab47edb56383Greg Clayton    {
437a53324d018afb71a1a53840c426aab47edb56383Greg Clayton        std::auto_ptr<DisassemblerLLVMC> disasm_ap (new DisassemblerLLVMC(arch));
43832a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan
439a53324d018afb71a1a53840c426aab47edb56383Greg Clayton        if (disasm_ap.get() && disasm_ap->IsValid())
440a53324d018afb71a1a53840c426aab47edb56383Greg Clayton            return disasm_ap.release();
441a53324d018afb71a1a53840c426aab47edb56383Greg Clayton    }
44232a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    return NULL;
44332a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan}
44432a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan
44532a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean CallananDisassemblerLLVMC::DisassemblerLLVMC (const ArchSpec &arch) :
44632a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    Disassembler(arch),
4470fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton    m_exe_ctx (NULL),
4480fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton    m_inst (NULL),
4490fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton    m_disasm_context (NULL),
4500fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton    m_alternate_disasm_context (NULL)
45132a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan{
45232a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    m_disasm_context = ::LLVMCreateDisasm(arch.GetTriple().getTriple().c_str(),
45332a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan                                          (void*)this,
45432a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan                                          /*TagType=*/1,
455aa12be49067f5bb14cc3c4ba6d2e97b34e1aec35Sean Callanan                                          NULL,
45632a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan                                          DisassemblerLLVMC::SymbolLookupCallback);
45732a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan
45832a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    if (arch.GetTriple().getArch() == llvm::Triple::arm)
45932a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    {
4600fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton        ArchSpec thumb_arch(arch);
4610fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton        thumb_arch.GetTriple().setArchName(llvm::StringRef("thumbv7"));
4620fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton        std::string thumb_triple(thumb_arch.GetTriple().getTriple());
4630fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton
4640fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton        m_alternate_disasm_context = ::LLVMCreateDisasm(thumb_triple.c_str(),
46532a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan                                                        (void*)this,
46632a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan                                                        /*TagType=*/1,
467aa12be49067f5bb14cc3c4ba6d2e97b34e1aec35Sean Callanan                                                        NULL,
46832a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan                                                        DisassemblerLLVMC::SymbolLookupCallback);
46932a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    }
47032a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan}
47132a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan
47232a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean CallananDisassemblerLLVMC::~DisassemblerLLVMC()
47332a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan{
474eec2f0864b7881b8215a4c438dd6304b474ce40cSean Callanan    if (m_disasm_context)
475eec2f0864b7881b8215a4c438dd6304b474ce40cSean Callanan    {
476eec2f0864b7881b8215a4c438dd6304b474ce40cSean Callanan        ::LLVMDisasmDispose(m_disasm_context);
477eec2f0864b7881b8215a4c438dd6304b474ce40cSean Callanan        m_disasm_context = NULL;
478eec2f0864b7881b8215a4c438dd6304b474ce40cSean Callanan    }
479eec2f0864b7881b8215a4c438dd6304b474ce40cSean Callanan    if (m_alternate_disasm_context)
480eec2f0864b7881b8215a4c438dd6304b474ce40cSean Callanan    {
481eec2f0864b7881b8215a4c438dd6304b474ce40cSean Callanan        ::LLVMDisasmDispose(m_alternate_disasm_context);
482eec2f0864b7881b8215a4c438dd6304b474ce40cSean Callanan        m_alternate_disasm_context = NULL;
483eec2f0864b7881b8215a4c438dd6304b474ce40cSean Callanan    }
48432a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan}
48532a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan
48632a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanansize_t
48732a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean CallananDisassemblerLLVMC::DecodeInstructions (const Address &base_addr,
48832a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan                                       const DataExtractor& data,
48932a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan                                       uint32_t data_offset,
49032a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan                                       uint32_t num_instructions,
49132a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan                                       bool append)
49232a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan{
49332a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    if (!append)
49432a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan        m_instruction_list.Clear();
49532a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan
49632a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    if (!IsValid())
49732a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan        return 0;
49832a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan
49932a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    uint32_t data_cursor = data_offset;
5000fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton    const size_t data_byte_size = data.GetByteSize();
50132a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    uint32_t instructions_parsed = 0;
5020fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton    Address inst_addr(base_addr);
50332a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan
5040fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton    while (data_cursor < data_byte_size && instructions_parsed < num_instructions)
50532a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    {
50632a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan
5070fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton        AddressClass address_class = eAddressClassCode;
50832a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan
50932a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan        if (m_alternate_disasm_context)
5100fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            address_class = inst_addr.GetAddressClass ();
51132a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan
51232a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan        InstructionSP inst_sp(new InstructionLLVMC(*this,
5130fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                                                   inst_addr,
51432a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan                                                   address_class));
51532a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan
51632a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan        if (!inst_sp)
5170fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            break;
5180fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton
51932a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan        uint32_t inst_size = inst_sp->Decode(*this, data, data_cursor);
52032a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan
5210fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton        if (inst_size == 0)
5220fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            break;
5230fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton
52432a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan        m_instruction_list.Append(inst_sp);
52532a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan        data_cursor += inst_size;
5260fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton        inst_addr.Slide(inst_size);
52732a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan        instructions_parsed++;
52832a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    }
52932a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan
53032a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    return data_cursor - data_offset;
53132a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan}
53232a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan
53332a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callananvoid
53432a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean CallananDisassemblerLLVMC::Initialize()
53532a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan{
53632a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    PluginManager::RegisterPlugin (GetPluginNameStatic(),
53732a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan                                   GetPluginDescriptionStatic(),
53832a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan                                   CreateInstance);
53932a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan
54032a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    llvm::InitializeAllTargetInfos();
54132a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    llvm::InitializeAllTargetMCs();
54232a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    llvm::InitializeAllAsmParsers();
54332a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    llvm::InitializeAllDisassemblers();
54432a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan}
54532a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan
54632a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callananvoid
54732a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean CallananDisassemblerLLVMC::Terminate()
54832a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan{
54932a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    PluginManager::UnregisterPlugin (CreateInstance);
55032a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan}
55132a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan
55232a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan
55332a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callananconst char *
55432a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean CallananDisassemblerLLVMC::GetPluginNameStatic()
55532a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan{
55634814d60bdfd681dab4d604b640f2640a8c42630Greg Clayton    return "llvm-mc";
55732a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan}
55832a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan
55932a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callananconst char *
56032a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean CallananDisassemblerLLVMC::GetPluginDescriptionStatic()
56132a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan{
56234814d60bdfd681dab4d604b640f2640a8c42630Greg Clayton    return "Disassembler that uses LLVM MC to disassemble i386, x86_64 and ARM.";
56332a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan}
56432a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan
5650fef968c843be422d6facc2e8d54d8471eee88edGreg Claytonint DisassemblerLLVMC::OpInfoCallback (void *disassembler,
5660fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                                       uint64_t pc,
5670fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                                       uint64_t offset,
5680fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                                       uint64_t size,
5690fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                                       int tag_type,
5700fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                                       void *tag_bug)
57132a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan{
5720fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton    return static_cast<DisassemblerLLVMC*>(disassembler)->OpInfo (pc,
5730fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                                                                  offset,
5740fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                                                                  size,
5750fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                                                                  tag_type,
5760fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                                                                  tag_bug);
57732a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan}
57832a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan
5790fef968c843be422d6facc2e8d54d8471eee88edGreg Claytonconst char *DisassemblerLLVMC::SymbolLookupCallback (void *disassembler,
5800fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                                                     uint64_t value,
5810fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                                                     uint64_t *type,
5820fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                                                     uint64_t pc,
5830fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                                                     const char **name)
58432a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan{
5850fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton    return static_cast<DisassemblerLLVMC*>(disassembler)->SymbolLookup(value,
5860fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                                                                       type,
5870fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                                                                       pc,
5880fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                                                                       name);
58932a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan}
59032a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan
59132a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callananint DisassemblerLLVMC::OpInfo (uint64_t PC,
59232a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan                               uint64_t Offset,
59332a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan                               uint64_t Size,
5940fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                               int tag_type,
5950fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                               void *tag_bug)
59632a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan{
5970fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton    switch (tag_type)
59832a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    {
59932a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    default:
60032a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan        break;
60132a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    case 1:
6020fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton        bzero (tag_bug, sizeof(::LLVMOpInfo1));
60332a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan        break;
60432a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    }
60532a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    return 0;
60632a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan}
60732a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan
6080fef968c843be422d6facc2e8d54d8471eee88edGreg Claytonconst char *DisassemblerLLVMC::SymbolLookup (uint64_t value,
6090fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                                             uint64_t *type_ptr,
6100fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                                             uint64_t pc,
6110fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                                             const char **name)
61232a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan{
6130fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton    if (*type_ptr)
6140fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton    {
6150fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton        if (m_exe_ctx && m_inst)
6160fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton        {
6170fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            //std::string remove_this_prior_to_checkin;
6180fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            Address reference_address;
6190fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton
6200fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            Target *target = m_exe_ctx ? m_exe_ctx->GetTargetPtr() : NULL;
6210fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton
6220fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            if (target && !target->GetSectionLoadList().IsEmpty())
6230fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                target->GetSectionLoadList().ResolveLoadAddress(value, reference_address);
6240fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            else
625685099b1936ba6021f821323e85dd5be1500f78cSean Callanan            {
6260fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                ModuleSP module_sp(m_inst->GetAddress().GetModule());
6270fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                if (module_sp)
6280fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                    module_sp->ResolveFileAddress(value, reference_address);
629685099b1936ba6021f821323e85dd5be1500f78cSean Callanan            }
6300fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton
631aa12be49067f5bb14cc3c4ba6d2e97b34e1aec35Sean Callanan            if (reference_address.IsValid() && reference_address.GetSection())
63232a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan            {
63332a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan                StreamString ss;
63432a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan
635aa12be49067f5bb14cc3c4ba6d2e97b34e1aec35Sean Callanan                reference_address.Dump (&ss,
636aa12be49067f5bb14cc3c4ba6d2e97b34e1aec35Sean Callanan                                        target,
637aa12be49067f5bb14cc3c4ba6d2e97b34e1aec35Sean Callanan                                        Address::DumpStyleResolvedDescriptionNoModule,
638aa12be49067f5bb14cc3c4ba6d2e97b34e1aec35Sean Callanan                                        Address::DumpStyleSectionNameOffset);
63932a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan
640685099b1936ba6021f821323e85dd5be1500f78cSean Callanan                if (!ss.GetString().empty())
6410fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                {
6420fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                    //remove_this_prior_to_checkin = ss.GetString();
6430fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                    //if (*type_ptr)
6440fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                    m_inst->AppendComment(ss.GetString());
6450fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                }
64632a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan            }
6470fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            //printf ("DisassemblerLLVMC::SymbolLookup (value=0x%16.16llx, type=%llu, pc=0x%16.16llx, name=\"%s\") m_exe_ctx=%p, m_inst=%p\n", value, *type_ptr, pc, remove_this_prior_to_checkin.c_str(), m_exe_ctx, m_inst);
64832a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan        }
64932a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    }
6500fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton
6510fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton    *type_ptr = LLVMDisassembler_ReferenceType_InOut_None;
6520fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton    *name = NULL;
6530fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton    return NULL;
65432a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan}
65532a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan
65632a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan//------------------------------------------------------------------
65732a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan// PluginInterface protocol
65832a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan//------------------------------------------------------------------
65932a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callananconst char *
66032a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean CallananDisassemblerLLVMC::GetPluginName()
66132a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan{
66232a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    return "DisassemblerLLVMC";
66332a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan}
66432a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan
66532a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callananconst char *
66632a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean CallananDisassemblerLLVMC::GetShortPluginName()
66732a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan{
66832a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    return GetPluginNameStatic();
66932a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan}
67032a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan
67132a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callananuint32_t
67232a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean CallananDisassemblerLLVMC::GetPluginVersion()
67332a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan{
67432a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan    return 1;
67532a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan}
67632a56ec72ca8558ff0ef0a129f7ac1ca9b79bde4Sean Callanan
677