Skip to content

Commit 6f4b38e

Browse files
committed
[yaml2obj][obj2yaml][objdump] Handle MIPS COFF files
- handle IMAGE_FILE_MACHINE_R4000 machine type - handle MIPS COFF relocations llvm-objdump can now parse MIPS COFF files.
1 parent 08ddbab commit 6f4b38e

File tree

5 files changed

+127
-0
lines changed

5 files changed

+127
-0
lines changed

llvm/include/llvm/Object/WindowsMachineFlag.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ template <typename T> Triple::ArchType getMachineArchType(T machine) {
4343
case COFF::IMAGE_FILE_MACHINE_ARM64EC:
4444
case COFF::IMAGE_FILE_MACHINE_ARM64X:
4545
return llvm::Triple::ArchType::aarch64;
46+
case COFF::IMAGE_FILE_MACHINE_R4000:
47+
return llvm::Triple::ArchType::mipsel;
4648
default:
4749
return llvm::Triple::ArchType::UnknownArch;
4850
}

llvm/include/llvm/ObjectYAML/COFFYAML.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,10 @@ struct ScalarEnumerationTraits<COFF::RelocationTypeAMD64> {
179179
static void enumeration(IO &IO, COFF::RelocationTypeAMD64 &Value);
180180
};
181181

182+
template <> struct ScalarEnumerationTraits<COFF::RelocationTypesMips> {
183+
static void enumeration(IO &IO, COFF::RelocationTypesMips &Value);
184+
};
185+
182186
template <>
183187
struct ScalarEnumerationTraits<COFF::RelocationTypesARM> {
184188
static void enumeration(IO &IO, COFF::RelocationTypesARM &Value);

llvm/lib/Object/COFFObjectFile.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1132,6 +1132,8 @@ StringRef COFFObjectFile::getFileFormatName() const {
11321132
return "COFF-ARM64EC";
11331133
case COFF::IMAGE_FILE_MACHINE_ARM64X:
11341134
return "COFF-ARM64X";
1135+
case COFF::IMAGE_FILE_MACHINE_R4000:
1136+
return "COFF-MIPS";
11351137
default:
11361138
return "COFF-<unknown arch>";
11371139
}

llvm/lib/ObjectYAML/COFFYAML.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,25 @@ void ScalarEnumerationTraits<COFF::RelocationTypeAMD64>::enumeration(
183183
ECase(IMAGE_REL_AMD64_SSPAN32);
184184
}
185185

186+
void ScalarEnumerationTraits<COFF::RelocationTypesMips>::enumeration(
187+
IO &IO, COFF::RelocationTypesMips &Value) {
188+
ECase(IMAGE_REL_MIPS_ABSOLUTE);
189+
ECase(IMAGE_REL_MIPS_REFHALF);
190+
ECase(IMAGE_REL_MIPS_REFWORD);
191+
ECase(IMAGE_REL_MIPS_JMPADDR);
192+
ECase(IMAGE_REL_MIPS_REFHI);
193+
ECase(IMAGE_REL_MIPS_REFLO);
194+
ECase(IMAGE_REL_MIPS_GPREL);
195+
ECase(IMAGE_REL_MIPS_LITERAL);
196+
ECase(IMAGE_REL_MIPS_SECTION);
197+
ECase(IMAGE_REL_MIPS_SECREL);
198+
ECase(IMAGE_REL_MIPS_SECRELLO);
199+
ECase(IMAGE_REL_MIPS_SECRELHI);
200+
ECase(IMAGE_REL_MIPS_JMPADDR16);
201+
ECase(IMAGE_REL_MIPS_REFWORDNB);
202+
ECase(IMAGE_REL_MIPS_PAIR);
203+
}
204+
186205
void ScalarEnumerationTraits<COFF::RelocationTypesARM>::enumeration(
187206
IO &IO, COFF::RelocationTypesARM &Value) {
188207
ECase(IMAGE_REL_ARM_ABSOLUTE);
@@ -427,6 +446,10 @@ void MappingTraits<COFFYAML::Relocation>::mapping(IO &IO,
427446
MappingNormalization<NType<COFF::RelocationTypeAMD64>, uint16_t> NT(
428447
IO, Rel.Type);
429448
IO.mapRequired("Type", NT->Type);
449+
} else if (H.Machine == COFF::IMAGE_FILE_MACHINE_R4000) {
450+
MappingNormalization<NType<COFF::RelocationTypesMips>, uint16_t> NT(
451+
IO, Rel.Type);
452+
IO.mapRequired("Type", NT->Type);
430453
} else if (H.Machine == COFF::IMAGE_FILE_MACHINE_ARMNT) {
431454
MappingNormalization<NType<COFF::RelocationTypesARM>, uint16_t> NT(
432455
IO, Rel.Type);
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
# RUN: yaml2obj %s -o %t
2+
# RUN: llvm-readobj --file-headers %t | FileCheck %s
3+
# RUN: obj2yaml %t | FileCheck %s --check-prefix=ROUNDTRIP
4+
5+
# CHECK: OptionalHeaderSize: 224
6+
# CHECK: ImageBase: 0x40000000
7+
8+
# ROUNDTRIP: ImageBase: 1073741824
9+
# ROUNDTRIP: VirtualAddress: 4096
10+
# ROUNDTRIP: VirtualAddress: 8192
11+
# ROUNDTRIP: VirtualAddress: 12288
12+
13+
--- !COFF
14+
OptionalHeader:
15+
AddressOfEntryPoint: 4096
16+
ImageBase: 1073741824
17+
SectionAlignment: 4096
18+
FileAlignment: 512
19+
MajorOperatingSystemVersion: 6
20+
MinorOperatingSystemVersion: 0
21+
MajorImageVersion: 0
22+
MinorImageVersion: 0
23+
MajorSubsystemVersion: 6
24+
MinorSubsystemVersion: 0
25+
Subsystem: IMAGE_SUBSYSTEM_WINDOWS_CUI
26+
DLLCharacteristics: [ IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA, IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE, IMAGE_DLL_CHARACTERISTICS_NX_COMPAT, IMAGE_DLL_CHARACTERISTICS_TERMINAL_SERVER_AWARE ]
27+
SizeOfStackReserve: 1048576
28+
SizeOfStackCommit: 4096
29+
SizeOfHeapReserve: 1048576
30+
SizeOfHeapCommit: 4096
31+
ExportTable:
32+
RelativeVirtualAddress: 0
33+
Size: 0
34+
ImportTable:
35+
RelativeVirtualAddress: 0
36+
Size: 0
37+
ResourceTable:
38+
RelativeVirtualAddress: 0
39+
Size: 0
40+
ExceptionTable:
41+
RelativeVirtualAddress: 12288
42+
Size: 8
43+
CertificateTable:
44+
RelativeVirtualAddress: 0
45+
Size: 0
46+
BaseRelocationTable:
47+
RelativeVirtualAddress: 0
48+
Size: 0
49+
Debug:
50+
RelativeVirtualAddress: 0
51+
Size: 0
52+
Architecture:
53+
RelativeVirtualAddress: 0
54+
Size: 0
55+
GlobalPtr:
56+
RelativeVirtualAddress: 0
57+
Size: 0
58+
TlsTable:
59+
RelativeVirtualAddress: 0
60+
Size: 0
61+
LoadConfigTable:
62+
RelativeVirtualAddress: 0
63+
Size: 0
64+
BoundImport:
65+
RelativeVirtualAddress: 0
66+
Size: 0
67+
IAT:
68+
RelativeVirtualAddress: 0
69+
Size: 0
70+
DelayImportDescriptor:
71+
RelativeVirtualAddress: 0
72+
Size: 0
73+
ClrRuntimeHeader:
74+
RelativeVirtualAddress: 0
75+
Size: 0
76+
header:
77+
Machine: IMAGE_FILE_MACHINE_R4000
78+
Characteristics: [ IMAGE_FILE_EXECUTABLE_IMAGE ]
79+
sections:
80+
- Name: .text
81+
Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]
82+
VirtualAddress: 4096
83+
VirtualSize: 4
84+
SectionData: C0035FD6
85+
- Name: .rdata
86+
Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ]
87+
VirtualAddress: 8192
88+
VirtualSize: 12
89+
SectionData: 0100400800000000E4E3E3E3
90+
- Name: .pdata
91+
Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ]
92+
VirtualAddress: 12288
93+
VirtualSize: 8
94+
SectionData: '0010000000200000'
95+
symbols: []
96+
...

0 commit comments

Comments
 (0)