1 //===-- Baton.cpp -----------------------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "lldb/Core/Opcode.h" 11 12 // C Includes 13 // C++ Includes 14 // Other libraries and framework includes 15 // Project includes 16 #include "lldb/Core/DataBufferHeap.h" 17 #include "lldb/Core/DataExtractor.h" 18 #include "lldb/Core/Stream.h" 19 #include "lldb/Host/Endian.h" 20 21 using namespace lldb; 22 using namespace lldb_private; 23 24 25 int 26 Opcode::Dump (Stream *s, uint32_t min_byte_width) 27 { 28 int bytes_written = 0; 29 switch (m_type) 30 { 31 case Opcode::eTypeInvalid: 32 bytes_written = s->PutCString ("<invalid>"); 33 break; 34 case Opcode::eType8: 35 bytes_written = s->Printf ("0x%2.2x", m_data.inst8); 36 break; 37 case Opcode::eType16: 38 bytes_written = s->Printf ("0x%4.4x", m_data.inst16); 39 break; 40 41 case Opcode::eType32: 42 bytes_written = s->Printf ("0x%8.8x", m_data.inst32); 43 break; 44 45 case Opcode::eType64: 46 bytes_written = s->Printf ("0x%16.16llx", m_data.inst64); 47 break; 48 49 case Opcode::eTypeBytes: 50 { 51 for (uint32_t i=0; i<m_data.inst.length; ++i) 52 { 53 if (i > 0) 54 bytes_written += s->PutChar (' '); 55 bytes_written += s->Printf ("%2.2x", m_data.inst.bytes[i]); 56 } 57 } 58 break; 59 } 60 61 // Add spaces to make sure bytes dispay comes out even in case opcodes 62 // aren't all the same size 63 if (bytes_written < min_byte_width) 64 bytes_written = s->Printf ("%*s", min_byte_width - bytes_written, ""); 65 return bytes_written; 66 } 67 68 lldb::ByteOrder 69 Opcode::GetDataByteOrder () const 70 { 71 switch (m_type) 72 { 73 case Opcode::eTypeInvalid: break; 74 case Opcode::eType8: 75 case Opcode::eType16: 76 case Opcode::eType32: 77 case Opcode::eType64: return lldb::endian::InlHostByteOrder(); 78 case Opcode::eTypeBytes: 79 break; 80 } 81 return eByteOrderInvalid; 82 } 83 84 uint32_t 85 Opcode::GetData (DataExtractor &data) const 86 { 87 uint32_t byte_size = GetByteSize (); 88 DataBufferSP buffer_sp; 89 if (byte_size > 0) 90 { 91 switch (m_type) 92 { 93 case Opcode::eTypeInvalid: 94 break; 95 96 case Opcode::eType8: buffer_sp.reset (new DataBufferHeap (&m_data.inst8, byte_size)); break; 97 case Opcode::eType16: buffer_sp.reset (new DataBufferHeap (&m_data.inst16, byte_size)); break; 98 case Opcode::eType32: buffer_sp.reset (new DataBufferHeap (&m_data.inst32, byte_size)); break; 99 case Opcode::eType64: buffer_sp.reset (new DataBufferHeap (&m_data.inst64, byte_size)); break; 100 case Opcode::eTypeBytes:buffer_sp.reset (new DataBufferHeap (GetOpcodeBytes(), byte_size)); break; 101 break; 102 } 103 } 104 105 if (buffer_sp) 106 { 107 data.SetByteOrder(GetDataByteOrder()); 108 data.SetData (buffer_sp); 109 return byte_size; 110 } 111 data.Clear(); 112 return 0; 113 } 114 115 116 117