[Lldb-commits] [lldb] r170171 - in /lldb/trunk/source: Plugins/Disassembler/llvm/DisassemblerLLVM.cpp Plugins/Disassembler/llvm/DisassemblerLLVM.h lldb.cpp
Sean Callanan
scallanan at apple.com
Thu Dec 13 17:29:59 PST 2012
Author: spyffe
Date: Thu Dec 13 19:29:59 2012
New Revision: 170171
URL: http://llvm.org/viewvc/llvm-project?rev=170171&view=rev
Log:
Rmoved the old LLVM disassembler based on libedis.
Removed:
lldb/trunk/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp
lldb/trunk/source/Plugins/Disassembler/llvm/DisassemblerLLVM.h
Modified:
lldb/trunk/source/lldb.cpp
Removed: lldb/trunk/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp?rev=170170&view=auto
==============================================================================
--- lldb/trunk/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp (original)
+++ lldb/trunk/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp (removed)
@@ -1,529 +0,0 @@
-//===-- DisassemblerLLVM.cpp ------------------------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "DisassemblerLLVM.h"
-
-#include "llvm-c/EnhancedDisassembly.h"
-#include "llvm/Support/TargetSelect.h"
-
-#include "lldb/Core/Address.h"
-#include "lldb/Core/DataExtractor.h"
-#include "lldb/Core/Disassembler.h"
-#include "lldb/Core/Module.h"
-#include "lldb/Core/PluginManager.h"
-#include "lldb/Core/Stream.h"
-#include "lldb/Core/StreamString.h"
-#include "lldb/Symbol/SymbolContext.h"
-
-#include "lldb/Target/ExecutionContext.h"
-#include "lldb/Target/Process.h"
-#include "lldb/Target/RegisterContext.h"
-#include "lldb/Target/Target.h"
-
-#include <assert.h>
-
-using namespace lldb;
-using namespace lldb_private;
-
-
-static int
-DataExtractorByteReader (uint8_t *byte, uint64_t address, void *arg)
-{
- DataExtractor &extractor = *((DataExtractor *)arg);
-
- if (extractor.ValidOffset(address))
- {
- *byte = *(extractor.GetDataStart() + address);
- return 0;
- }
- else
- {
- return -1;
- }
-}
-
-namespace {
- struct RegisterReaderArg {
- const lldb::addr_t instructionPointer;
- const EDDisassemblerRef disassembler;
-
- RegisterReaderArg(lldb::addr_t ip,
- EDDisassemblerRef dis) :
- instructionPointer(ip),
- disassembler(dis)
- {
- }
- };
-}
-
-static int IPRegisterReader(uint64_t *value, unsigned regID, void* arg)
-{
- uint64_t instructionPointer = ((RegisterReaderArg*)arg)->instructionPointer;
- EDDisassemblerRef disassembler = ((RegisterReaderArg*)arg)->disassembler;
-
- if (EDRegisterIsProgramCounter(disassembler, regID)) {
- *value = instructionPointer;
- return 0;
- }
-
- return -1;
-}
-
-InstructionLLVM::InstructionLLVM (const Address &addr,
- AddressClass addr_class,
- EDDisassemblerRef disassembler,
- llvm::Triple::ArchType arch_type) :
- Instruction (addr, addr_class),
- m_disassembler (disassembler),
- m_inst (NULL),
- m_arch_type (arch_type)
-{
-}
-
-InstructionLLVM::~InstructionLLVM()
-{
- if (m_inst)
- {
- EDReleaseInst(m_inst);
- m_inst = NULL;
- }
-}
-
-static void
-PadString(Stream *s, const std::string &str, size_t width)
-{
- int diff = width - str.length();
-
- if (diff > 0)
- s->Printf("%s%*.*s", str.c_str(), diff, diff, "");
- else
- s->Printf("%s ", str.c_str());
-}
-static void
-AddSymbolicInfo (const ExecutionContext *exe_ctx,
- StreamString &comment,
- uint64_t operand_value,
- const Address &inst_addr)
-{
- Address so_addr;
- Target *target = NULL;
- if (exe_ctx)
- target = exe_ctx->GetTargetPtr();
- if (target && !target->GetSectionLoadList().IsEmpty())
- {
- if (target->GetSectionLoadList().ResolveLoadAddress(operand_value, so_addr))
- so_addr.Dump (&comment,
- exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL,
- Address::DumpStyleResolvedDescriptionNoModule,
- Address::DumpStyleSectionNameOffset);
- }
- else
- {
- ModuleSP module_sp (inst_addr.GetModule());
- if (module_sp)
- {
- if (module_sp->ResolveFileAddress(operand_value, so_addr))
- so_addr.Dump (&comment,
- exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL,
- Address::DumpStyleResolvedDescriptionNoModule,
- Address::DumpStyleSectionNameOffset);
- }
- }
-}
-
-#include "llvm/ADT/StringRef.h"
-static inline void StripSpaces(llvm::StringRef &Str)
-{
- while (!Str.empty() && isspace(Str[0]))
- Str = Str.substr(1);
- while (!Str.empty() && isspace(Str.back()))
- Str = Str.substr(0, Str.size()-1);
-}
-static inline void RStrip(llvm::StringRef &Str, char c)
-{
- if (!Str.empty() && Str.back() == c)
- Str = Str.substr(0, Str.size()-1);
-}
-// Aligns the raw disassembly (passed as 'str') with the rest of edis'ed disassembly output.
-// This is called from non-raw mode when edis of the current m_inst fails for some reason.
-static void
-Align(Stream *s, const char *str, size_t opcodeColWidth, size_t operandColWidth)
-{
- llvm::StringRef raw_disasm(str);
- StripSpaces(raw_disasm);
- // Split the raw disassembly into opcode and operands.
- std::pair<llvm::StringRef, llvm::StringRef> p = raw_disasm.split('\t');
- PadString(s, p.first, opcodeColWidth);
- if (!p.second.empty())
- PadString(s, p.second, operandColWidth);
-}
-
-#define AlignPC(pc_val) (pc_val & 0xFFFFFFFC)
-
-void
-InstructionLLVM::CalculateMnemonicOperandsAndComment (const ExecutionContext* exe_ctx)
-{
- const int num_tokens = EDNumTokens(m_inst);
- if (num_tokens > 0)
- {
- const char *token_cstr = NULL;
- int currentOpIndex = -1;
- StreamString comment;
- uint32_t addr_nibble_size = 8;
- addr_t base_addr = LLDB_INVALID_ADDRESS;
- Target *target = exe_ctx ? exe_ctx->GetTargetPtr() : NULL;
- if (target)
- {
- addr_nibble_size = target->GetArchitecture().GetAddressByteSize() * 2;
- if (!target->GetSectionLoadList().IsEmpty())
- base_addr = GetAddress().GetLoadAddress (target);
- }
-
- if (base_addr == LLDB_INVALID_ADDRESS)
- base_addr = GetAddress().GetFileAddress ();
-
- lldb::addr_t PC = base_addr + EDInstByteSize(m_inst);
-
- // When executing an ARM instruction, PC reads as the address of the
- // current instruction plus 8. And for Thumb, it is plus 4.
- if (m_arch_type == llvm::Triple::arm)
- PC = base_addr + 8;
- else if (m_arch_type == llvm::Triple::thumb)
- PC = base_addr + 4;
-
- RegisterReaderArg rra(PC, m_disassembler);
-
- for (int token_idx = 0; token_idx < num_tokens; ++token_idx)
- {
- EDTokenRef token;
- if (EDGetToken(&token, m_inst, token_idx))
- break;
-
- if (EDTokenIsOpcode(token) == 1)
- {
- if (EDGetTokenString(&token_cstr, token) == 0) // 0 on success
- {
- if (token_cstr)
- m_opcode_name.assign(token_cstr);
- }
- }
- else
- {
- int operandIndex = EDOperandIndexForToken(token);
-
- if (operandIndex >= 0)
- {
- if (operandIndex != currentOpIndex)
- {
- currentOpIndex = operandIndex;
- EDOperandRef operand;
-
- if (!EDGetOperand(&operand, m_inst, currentOpIndex))
- {
- if (EDOperandIsMemory(operand))
- {
- uint64_t operand_value;
-
- if (!EDEvaluateOperand(&operand_value, operand, IPRegisterReader, &rra))
- {
- comment.Printf("0x%*.*" PRIx64 " ", addr_nibble_size, addr_nibble_size, operand_value);
- AddSymbolicInfo (exe_ctx, comment, operand_value, GetAddress());
- }
- }
- }
- }
- }
- if (m_mnemocics.empty() && EDTokenIsWhitespace (token) == 1)
- continue;
- if (EDGetTokenString (&token_cstr, token))
- break;
- m_mnemocics.append (token_cstr);
- }
- }
- // FIXME!!!
- // Workaround for llvm::tB's operands not properly parsed by ARMAsmParser.
- if (m_arch_type == llvm::Triple::thumb && m_opcode_name.compare("b") == 0)
- {
- const char *inst_str;
- const char *pos = NULL;
- comment.Clear();
- if (EDGetInstString(&inst_str, m_inst) == 0 && (pos = strstr(inst_str, "#")) != NULL)
- {
- uint64_t operand_value = PC + atoi(++pos);
- // Put the address value into the operands.
- comment.Printf("0x%*.*" PRIx64 " ", addr_nibble_size, addr_nibble_size, operand_value);
- AddSymbolicInfo (exe_ctx, comment, operand_value, GetAddress());
- }
- }
- // Yet more workaround for "bl #..." and "blx #...".
- if ((m_arch_type == llvm::Triple::arm || m_arch_type == llvm::Triple::thumb) &&
- (m_opcode_name.compare("bl") == 0 || m_opcode_name.compare("blx") == 0))
- {
- const char *inst_str;
- const char *pos = NULL;
- comment.Clear();
- if (EDGetInstString(&inst_str, m_inst) == 0 && (pos = strstr(inst_str, "#")) != NULL)
- {
- if (m_arch_type == llvm::Triple::thumb && m_opcode_name.compare("blx") == 0)
- {
- // A8.6.23 BLX (immediate)
- // Target Address = Align(PC,4) + offset value
- PC = AlignPC(PC);
- }
- uint64_t operand_value = PC + atoi(++pos);
- // Put the address value into the comment.
- comment.Printf("0x%*.*" PRIx64 " ", addr_nibble_size, addr_nibble_size, operand_value);
- // And the original token string into the operands.
-// llvm::StringRef Str(pos - 1);
-// RStrip(Str, '\n');
-// operands.PutCString(Str.str().c_str());
- AddSymbolicInfo (exe_ctx, comment, operand_value, GetAddress());
- }
- }
- // END of workaround.
-
- m_comment.swap (comment.GetString());
- }
-}
-
-bool
-InstructionLLVM::DoesBranch() const
-{
- return EDInstIsBranch(m_inst);
-}
-
-size_t
-InstructionLLVM::Decode (const Disassembler &disassembler,
- const lldb_private::DataExtractor &data,
- uint32_t data_offset)
-{
- if (EDCreateInsts(&m_inst, 1, m_disassembler, DataExtractorByteReader, data_offset, (void*)(&data)))
- {
- const int byte_size = EDInstByteSize(m_inst);
- uint32_t offset = data_offset;
- // Make a copy of the opcode in m_opcode
- switch (disassembler.GetArchitecture().GetMachine())
- {
- case llvm::Triple::x86:
- case llvm::Triple::x86_64:
- m_opcode.SetOpcodeBytes (data.PeekData (data_offset, byte_size), byte_size);
- break;
-
- case llvm::Triple::arm:
- case llvm::Triple::thumb:
- switch (byte_size)
- {
- case 2:
- m_opcode.SetOpcode16 (data.GetU16 (&offset));
- break;
-
- case 4:
- {
- if (GetAddressClass() == eAddressClassCodeAlternateISA)
- {
- // If it is a 32-bit THUMB instruction, we need to swap the upper & lower halves.
- uint32_t orig_bytes = data.GetU32 (&offset);
- uint16_t upper_bits = (orig_bytes >> 16) & ((1u << 16) - 1);
- uint16_t lower_bits = orig_bytes & ((1u << 16) - 1);
- uint32_t swapped = (lower_bits << 16) | upper_bits;
- m_opcode.SetOpcode32 (swapped);
- }
- else
- m_opcode.SetOpcode32 (data.GetU32 (&offset));
- }
- break;
-
- default:
- assert (!"Invalid ARM opcode size");
- break;
- }
- break;
-
- default:
- assert (!"This shouldn't happen since we control the architecture we allow DisassemblerLLVM to be created for");
- break;
- }
- return byte_size;
- }
- else
- return 0;
-}
-
-static inline EDAssemblySyntax_t
-SyntaxForArchSpec (const ArchSpec &arch)
-{
- switch (arch.GetMachine ())
- {
- case llvm::Triple::x86:
- case llvm::Triple::x86_64:
- return kEDAssemblySyntaxX86ATT;
- case llvm::Triple::arm:
- case llvm::Triple::thumb:
- return kEDAssemblySyntaxARMUAL;
- default:
- break;
- }
- return (EDAssemblySyntax_t)0; // default
-}
-
-Disassembler *
-DisassemblerLLVM::CreateInstance(const ArchSpec &arch)
-{
- std::auto_ptr<DisassemblerLLVM> disasm_ap (new DisassemblerLLVM(arch));
-
- if (disasm_ap.get() && disasm_ap->IsValid())
- return disasm_ap.release();
-
- return NULL;
-}
-
-DisassemblerLLVM::DisassemblerLLVM(const ArchSpec &arch) :
- Disassembler (arch),
- m_disassembler (NULL),
- m_disassembler_thumb (NULL) // For ARM only
-{
- // Initialize the LLVM objects needed to use the disassembler.
- static struct InitializeLLVM {
- InitializeLLVM() {
- llvm::InitializeAllTargetInfos();
- llvm::InitializeAllTargetMCs();
- llvm::InitializeAllAsmParsers();
- llvm::InitializeAllDisassemblers();
- }
- } InitializeLLVM;
-
- const std::string &arch_triple = arch.GetTriple().str();
- if (!arch_triple.empty())
- {
- if (EDGetDisassembler(&m_disassembler, arch_triple.c_str(), SyntaxForArchSpec (arch)))
- m_disassembler = NULL;
- llvm::Triple::ArchType llvm_arch = arch.GetTriple().getArch();
- // Don't have the lldb::Triple::thumb architecture here. If someone specifies
- // "thumb" as the architecture, we want a thumb only disassembler. But if any
- // architecture starting with "arm" if specified, we want to auto detect the
- // arm/thumb code automatically using the AddressClass from section offset
- // addresses.
- if (llvm_arch == llvm::Triple::arm)
- {
- ArchSpec thumb_arch(arch);
- thumb_arch.GetTriple().setArchName(llvm::StringRef("thumbv7"));
- std::string thumb_triple(thumb_arch.GetTriple().getTriple());
- if (EDGetDisassembler(&m_disassembler_thumb, thumb_triple.c_str(), kEDAssemblySyntaxARMUAL))
- m_disassembler_thumb = NULL;
- }
- }
-}
-
-DisassemblerLLVM::~DisassemblerLLVM()
-{
-}
-
-size_t
-DisassemblerLLVM::DecodeInstructions
-(
- const Address &base_addr,
- const DataExtractor& data,
- uint32_t data_offset,
- uint32_t num_instructions,
- bool append
-)
-{
- if (m_disassembler == NULL)
- return 0;
-
- size_t total_inst_byte_size = 0;
-
- if (!append)
- m_instruction_list.Clear();
-
- while (data.ValidOffset(data_offset) && num_instructions)
- {
- Address inst_addr (base_addr);
- inst_addr.Slide(data_offset);
-
- bool use_thumb = false;
- // If we have a thumb disassembler, then we have an ARM architecture
- // so we need to check what the instruction address class is to make
- // sure we shouldn't be disassembling as thumb...
- AddressClass inst_address_class = eAddressClassInvalid;
- if (m_disassembler_thumb)
- {
- inst_address_class = inst_addr.GetAddressClass ();
- if (inst_address_class == eAddressClassCodeAlternateISA)
- use_thumb = true;
- }
-
- InstructionSP inst_sp (new InstructionLLVM (inst_addr,
- inst_address_class,
- use_thumb ? m_disassembler_thumb : m_disassembler,
- use_thumb ? llvm::Triple::thumb : m_arch.GetMachine()));
-
- size_t inst_byte_size = inst_sp->Decode (*this, data, data_offset);
-
- if (inst_byte_size == 0)
- break;
-
- m_instruction_list.Append (inst_sp);
-
- total_inst_byte_size += inst_byte_size;
- data_offset += inst_byte_size;
- num_instructions--;
- }
-
- return total_inst_byte_size;
-}
-
-void
-DisassemblerLLVM::Initialize()
-{
- PluginManager::RegisterPlugin (GetPluginNameStatic(),
- GetPluginDescriptionStatic(),
- CreateInstance);
-}
-
-void
-DisassemblerLLVM::Terminate()
-{
- PluginManager::UnregisterPlugin (CreateInstance);
-}
-
-
-const char *
-DisassemblerLLVM::GetPluginNameStatic()
-{
- return "llvm-edis";
-}
-
-const char *
-DisassemblerLLVM::GetPluginDescriptionStatic()
-{
- return "Disassembler that uses the LLVM enhanced disassembler to disassemble i386, x86_64 and ARM.";
-}
-
-//------------------------------------------------------------------
-// PluginInterface protocol
-//------------------------------------------------------------------
-const char *
-DisassemblerLLVM::GetPluginName()
-{
- return "DisassemblerLLVM";
-}
-
-const char *
-DisassemblerLLVM::GetShortPluginName()
-{
- return GetPluginNameStatic();
-}
-
-uint32_t
-DisassemblerLLVM::GetPluginVersion()
-{
- return 1;
-}
-
Removed: lldb/trunk/source/Plugins/Disassembler/llvm/DisassemblerLLVM.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Disassembler/llvm/DisassemblerLLVM.h?rev=170170&view=auto
==============================================================================
--- lldb/trunk/source/Plugins/Disassembler/llvm/DisassemblerLLVM.h (original)
+++ lldb/trunk/source/Plugins/Disassembler/llvm/DisassemblerLLVM.h (removed)
@@ -1,105 +0,0 @@
-//===-- DisassemblerLLVM.h --------------------------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef liblldb_DisassemblerLLVM_h_
-#define liblldb_DisassemblerLLVM_h_
-
-
-#include "llvm-c/EnhancedDisassembly.h"
-
-#include "lldb/Core/Disassembler.h"
-#include "lldb/Host/Mutex.h"
-
-class InstructionLLVM : public lldb_private::Instruction
-{
-public:
- InstructionLLVM (const lldb_private::Address &addr,
- lldb::AddressClass addr_class,
- EDDisassemblerRef disassembler,
- llvm::Triple::ArchType arch_type);
-
- virtual
- ~InstructionLLVM();
-
- virtual bool
- DoesBranch () const;
-
- virtual size_t
- Decode (const lldb_private::Disassembler &disassembler,
- const lldb_private::DataExtractor &data,
- uint32_t data_offset);
-
- virtual void
- CalculateMnemonicOperandsAndComment (const lldb_private::ExecutionContext* exe_ctx);
-
-protected:
- EDDisassemblerRef m_disassembler;
- EDInstRef m_inst;
- llvm::Triple::ArchType m_arch_type;
-};
-
-
-class DisassemblerLLVM : public lldb_private::Disassembler
-{
-public:
- //------------------------------------------------------------------
- // Static Functions
- //------------------------------------------------------------------
- static void
- Initialize();
-
- static void
- Terminate();
-
- static const char *
- GetPluginNameStatic();
-
- static const char *
- GetPluginDescriptionStatic();
-
- static lldb_private::Disassembler *
- CreateInstance(const lldb_private::ArchSpec &arch);
-
-
- DisassemblerLLVM(const lldb_private::ArchSpec &arch);
-
- virtual
- ~DisassemblerLLVM();
-
- size_t
- DecodeInstructions (const lldb_private::Address &base_addr,
- const lldb_private::DataExtractor& data,
- uint32_t data_offset,
- uint32_t num_instructions,
- bool append);
-
- //------------------------------------------------------------------
- // PluginInterface protocol
- //------------------------------------------------------------------
- virtual const char *
- GetPluginName();
-
- virtual const char *
- GetShortPluginName();
-
- virtual uint32_t
- GetPluginVersion();
-
-protected:
- bool
- IsValid() const
- {
- return m_disassembler != NULL;
- }
-
- EDDisassemblerRef m_disassembler;
- EDDisassemblerRef m_disassembler_thumb;
-};
-
-#endif // liblldb_DisassemblerLLVM_h_
Modified: lldb/trunk/source/lldb.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/lldb.cpp?rev=170171&r1=170170&r2=170171&view=diff
==============================================================================
--- lldb/trunk/source/lldb.cpp (original)
+++ lldb/trunk/source/lldb.cpp Thu Dec 13 19:29:59 2012
@@ -27,7 +27,6 @@
#include "Plugins/ABI/MacOSX-i386/ABIMacOSX_i386.h"
#include "Plugins/ABI/MacOSX-arm/ABIMacOSX_arm.h"
#include "Plugins/ABI/SysV-x86_64/ABISysV_x86_64.h"
-#include "Plugins/Disassembler/llvm/DisassemblerLLVM.h"
#include "Plugins/Disassembler/llvm/DisassemblerLLVMC.h"
#include "Plugins/Instruction/ARM/EmulateInstructionARM.h"
#include "Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.h"
@@ -98,7 +97,6 @@
ABIMacOSX_arm::Initialize();
ABISysV_x86_64::Initialize();
DisassemblerLLVMC::Initialize();
- DisassemblerLLVM::Initialize();
ObjectContainerBSDArchive::Initialize();
ObjectFileELF::Initialize();
SymbolFileDWARF::Initialize();
@@ -179,7 +177,6 @@
ABIMacOSX_arm::Terminate();
ABISysV_x86_64::Terminate();
DisassemblerLLVMC::Terminate();
- DisassemblerLLVM::Terminate();
ObjectContainerBSDArchive::Terminate();
ObjectFileELF::Terminate();
SymbolFileDWARF::Terminate();
More information about the lldb-commits
mailing list