mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-19 18:24:00 +00:00
Make llvm-objdump handle both arm and thumb disassembly from the same Mach-O
file with -macho, the Mach-O specific object file parser option. After some discussion I chose to do this implementation contained in the logic of llvm-objdump’s MachODump.cpp using a second disassembler for thumb when needed and with updates mostly contained in the MachOObjectFile class. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@215931 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -439,6 +439,9 @@ uint32_t MachOObjectFile::getSymbolFlags(DataRefImpl DRI) const {
|
||||
if (MachOFlags & (MachO::N_WEAK_REF | MachO::N_WEAK_DEF))
|
||||
Result |= SymbolRef::SF_Weak;
|
||||
|
||||
if (MachOFlags & (MachO::N_ARM_THUMB_DEF))
|
||||
Result |= SymbolRef::SF_Thumb;
|
||||
|
||||
if ((MachOType & MachO::N_TYPE) == MachO::N_ABS)
|
||||
Result |= SymbolRef::SF_Absolute;
|
||||
|
||||
@ -1293,7 +1296,11 @@ Triple::ArchType MachOObjectFile::getArch(uint32_t CPUType) {
|
||||
}
|
||||
}
|
||||
|
||||
Triple MachOObjectFile::getArch(uint32_t CPUType, uint32_t CPUSubType) {
|
||||
Triple MachOObjectFile::getArch(uint32_t CPUType, uint32_t CPUSubType,
|
||||
const char **McpuDefault) {
|
||||
if (McpuDefault)
|
||||
*McpuDefault = nullptr;
|
||||
|
||||
switch (CPUType) {
|
||||
case MachO::CPU_TYPE_I386:
|
||||
switch (CPUSubType & ~MachO::CPU_SUBTYPE_MASK) {
|
||||
@ -1322,14 +1329,20 @@ Triple MachOObjectFile::getArch(uint32_t CPUType, uint32_t CPUSubType) {
|
||||
case MachO::CPU_SUBTYPE_ARM_V6:
|
||||
return Triple("armv6-apple-darwin");
|
||||
case MachO::CPU_SUBTYPE_ARM_V6M:
|
||||
if (McpuDefault)
|
||||
*McpuDefault = "cortex-m0";
|
||||
return Triple("armv6m-apple-darwin");
|
||||
case MachO::CPU_SUBTYPE_ARM_V7:
|
||||
return Triple("armv7-apple-darwin");
|
||||
case MachO::CPU_SUBTYPE_ARM_V7EM:
|
||||
if (McpuDefault)
|
||||
*McpuDefault = "cortex-m4";
|
||||
return Triple("armv7em-apple-darwin");
|
||||
case MachO::CPU_SUBTYPE_ARM_V7K:
|
||||
return Triple("armv7k-apple-darwin");
|
||||
case MachO::CPU_SUBTYPE_ARM_V7M:
|
||||
if (McpuDefault)
|
||||
*McpuDefault = "cortex-m3";
|
||||
return Triple("armv7m-apple-darwin");
|
||||
case MachO::CPU_SUBTYPE_ARM_V7S:
|
||||
return Triple("armv7s-apple-darwin");
|
||||
@ -1362,6 +1375,57 @@ Triple MachOObjectFile::getArch(uint32_t CPUType, uint32_t CPUSubType) {
|
||||
}
|
||||
}
|
||||
|
||||
Triple MachOObjectFile::getThumbArch(uint32_t CPUType, uint32_t CPUSubType,
|
||||
const char **McpuDefault) {
|
||||
if (McpuDefault)
|
||||
*McpuDefault = nullptr;
|
||||
|
||||
switch (CPUType) {
|
||||
case MachO::CPU_TYPE_ARM:
|
||||
switch (CPUSubType & ~MachO::CPU_SUBTYPE_MASK) {
|
||||
case MachO::CPU_SUBTYPE_ARM_V4T:
|
||||
return Triple("thumbv4t-apple-darwin");
|
||||
case MachO::CPU_SUBTYPE_ARM_V5TEJ:
|
||||
return Triple("thumbv5e-apple-darwin");
|
||||
case MachO::CPU_SUBTYPE_ARM_XSCALE:
|
||||
return Triple("xscale-apple-darwin");
|
||||
case MachO::CPU_SUBTYPE_ARM_V6:
|
||||
return Triple("thumbv6-apple-darwin");
|
||||
case MachO::CPU_SUBTYPE_ARM_V6M:
|
||||
if (McpuDefault)
|
||||
*McpuDefault = "cortex-m0";
|
||||
return Triple("thumbv6m-apple-darwin");
|
||||
case MachO::CPU_SUBTYPE_ARM_V7:
|
||||
return Triple("thumbv7-apple-darwin");
|
||||
case MachO::CPU_SUBTYPE_ARM_V7EM:
|
||||
if (McpuDefault)
|
||||
*McpuDefault = "cortex-m4";
|
||||
return Triple("thumbv7em-apple-darwin");
|
||||
case MachO::CPU_SUBTYPE_ARM_V7K:
|
||||
return Triple("thumbv7k-apple-darwin");
|
||||
case MachO::CPU_SUBTYPE_ARM_V7M:
|
||||
if (McpuDefault)
|
||||
*McpuDefault = "cortex-m3";
|
||||
return Triple("thumbv7m-apple-darwin");
|
||||
case MachO::CPU_SUBTYPE_ARM_V7S:
|
||||
return Triple("thumbv7s-apple-darwin");
|
||||
default:
|
||||
return Triple();
|
||||
}
|
||||
default:
|
||||
return Triple();
|
||||
}
|
||||
}
|
||||
|
||||
Triple MachOObjectFile::getArch(uint32_t CPUType, uint32_t CPUSubType,
|
||||
const char **McpuDefault,
|
||||
Triple *ThumbTriple) {
|
||||
Triple T = MachOObjectFile::getArch(CPUType, CPUSubType, McpuDefault);
|
||||
*ThumbTriple = MachOObjectFile::getThumbArch(CPUType, CPUSubType,
|
||||
McpuDefault);
|
||||
return T;
|
||||
}
|
||||
|
||||
Triple MachOObjectFile::getHostArch() {
|
||||
return Triple(sys::getDefaultTargetTriple());
|
||||
}
|
||||
@ -1390,6 +1454,25 @@ unsigned MachOObjectFile::getArch() const {
|
||||
return getArch(getCPUType(this));
|
||||
}
|
||||
|
||||
Triple MachOObjectFile::getArch(const char **McpuDefault,
|
||||
Triple *ThumbTriple) const {
|
||||
Triple T;
|
||||
if (is64Bit()) {
|
||||
MachO::mach_header_64 H_64;
|
||||
H_64 = getHeader64();
|
||||
T = MachOObjectFile::getArch(H_64.cputype, H_64.cpusubtype, McpuDefault);
|
||||
*ThumbTriple = MachOObjectFile::getThumbArch(H_64.cputype, H_64.cpusubtype,
|
||||
McpuDefault);
|
||||
} else {
|
||||
MachO::mach_header H;
|
||||
H = getHeader();
|
||||
T = MachOObjectFile::getArch(H.cputype, H.cpusubtype, McpuDefault);
|
||||
*ThumbTriple = MachOObjectFile::getThumbArch(H.cputype, H.cpusubtype,
|
||||
McpuDefault);
|
||||
}
|
||||
return T;
|
||||
}
|
||||
|
||||
relocation_iterator MachOObjectFile::section_rel_begin(unsigned Index) const {
|
||||
DataRefImpl DRI;
|
||||
DRI.d.a = Index;
|
||||
|
Reference in New Issue
Block a user