mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-28 15:36:07 +00:00

This adjusts header file includes for headers and source files in Core. In doing so, one dependency cycle is eliminated because all the includes from Core to that project were dead includes anyway. In places where some files in other projects were only compiling due to a transitive include from another header, fixups have been made so that those files also include the header they need. Tested on Windows and Linux, and plan to address failures on OSX and FreeBSD after watching the bots. llvm-svn: 299714
141 lines
3.8 KiB
C++
141 lines
3.8 KiB
C++
//===-- Opcode.cpp ----------------------------------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "lldb/Core/Opcode.h"
|
|
|
|
#include "lldb/Utility/DataBufferHeap.h"
|
|
#include "lldb/Utility/DataExtractor.h"
|
|
#include "lldb/Utility/Endian.h"
|
|
#include "lldb/Utility/Stream.h"
|
|
#include "lldb/lldb-forward.h" // for DataBufferSP
|
|
|
|
#include <memory> // for make_shared
|
|
|
|
#include <inttypes.h> // for PRIx64
|
|
|
|
using namespace lldb;
|
|
using namespace lldb_private;
|
|
|
|
int Opcode::Dump(Stream *s, uint32_t min_byte_width) {
|
|
int bytes_written = 0;
|
|
switch (m_type) {
|
|
case Opcode::eTypeInvalid:
|
|
bytes_written = s->PutCString("<invalid>");
|
|
break;
|
|
case Opcode::eType8:
|
|
bytes_written = s->Printf("0x%2.2x", m_data.inst8);
|
|
break;
|
|
case Opcode::eType16:
|
|
bytes_written = s->Printf("0x%4.4x", m_data.inst16);
|
|
break;
|
|
case Opcode::eType16_2:
|
|
case Opcode::eType32:
|
|
bytes_written = s->Printf("0x%8.8x", m_data.inst32);
|
|
break;
|
|
|
|
case Opcode::eType64:
|
|
bytes_written = s->Printf("0x%16.16" PRIx64, m_data.inst64);
|
|
break;
|
|
|
|
case Opcode::eTypeBytes:
|
|
for (uint32_t i = 0; i < m_data.inst.length; ++i) {
|
|
if (i > 0)
|
|
bytes_written += s->PutChar(' ');
|
|
bytes_written += s->Printf("%2.2x", m_data.inst.bytes[i]);
|
|
}
|
|
break;
|
|
}
|
|
|
|
// Add spaces to make sure bytes dispay comes out even in case opcodes
|
|
// aren't all the same size
|
|
if (static_cast<uint32_t>(bytes_written) < min_byte_width)
|
|
bytes_written = s->Printf("%*s", min_byte_width - bytes_written, "");
|
|
return bytes_written;
|
|
}
|
|
|
|
lldb::ByteOrder Opcode::GetDataByteOrder() const {
|
|
if (m_byte_order != eByteOrderInvalid) {
|
|
return m_byte_order;
|
|
}
|
|
switch (m_type) {
|
|
case Opcode::eTypeInvalid:
|
|
break;
|
|
case Opcode::eType8:
|
|
case Opcode::eType16:
|
|
case Opcode::eType16_2:
|
|
case Opcode::eType32:
|
|
case Opcode::eType64:
|
|
return endian::InlHostByteOrder();
|
|
case Opcode::eTypeBytes:
|
|
break;
|
|
}
|
|
return eByteOrderInvalid;
|
|
}
|
|
|
|
uint32_t Opcode::GetData(DataExtractor &data) const {
|
|
uint32_t byte_size = GetByteSize();
|
|
uint8_t swap_buf[8];
|
|
const void *buf = nullptr;
|
|
|
|
if (byte_size > 0) {
|
|
if (!GetEndianSwap()) {
|
|
if (m_type == Opcode::eType16_2) {
|
|
// 32 bit thumb instruction, we need to sizzle this a bit
|
|
swap_buf[0] = m_data.inst.bytes[2];
|
|
swap_buf[1] = m_data.inst.bytes[3];
|
|
swap_buf[2] = m_data.inst.bytes[0];
|
|
swap_buf[3] = m_data.inst.bytes[1];
|
|
buf = swap_buf;
|
|
} else {
|
|
buf = GetOpcodeDataBytes();
|
|
}
|
|
} else {
|
|
switch (m_type) {
|
|
case Opcode::eTypeInvalid:
|
|
break;
|
|
case Opcode::eType8:
|
|
buf = GetOpcodeDataBytes();
|
|
break;
|
|
case Opcode::eType16:
|
|
*(uint16_t *)swap_buf = llvm::ByteSwap_16(m_data.inst16);
|
|
buf = swap_buf;
|
|
break;
|
|
case Opcode::eType16_2:
|
|
swap_buf[0] = m_data.inst.bytes[1];
|
|
swap_buf[1] = m_data.inst.bytes[0];
|
|
swap_buf[2] = m_data.inst.bytes[3];
|
|
swap_buf[3] = m_data.inst.bytes[2];
|
|
buf = swap_buf;
|
|
break;
|
|
case Opcode::eType32:
|
|
*(uint32_t *)swap_buf = llvm::ByteSwap_32(m_data.inst32);
|
|
buf = swap_buf;
|
|
break;
|
|
case Opcode::eType64:
|
|
*(uint32_t *)swap_buf = llvm::ByteSwap_64(m_data.inst64);
|
|
buf = swap_buf;
|
|
break;
|
|
case Opcode::eTypeBytes:
|
|
buf = GetOpcodeDataBytes();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (buf != nullptr) {
|
|
DataBufferSP buffer_sp;
|
|
|
|
buffer_sp = std::make_shared<DataBufferHeap>(buf, byte_size);
|
|
data.SetByteOrder(GetDataByteOrder());
|
|
data.SetData(buffer_sp);
|
|
return byte_size;
|
|
}
|
|
data.Clear();
|
|
return 0;
|
|
}
|