Skip to content

Commit a29b043

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 a29b043

File tree

8 files changed

+209
-0
lines changed

8 files changed

+209
-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: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
!COFF
2+
header: !Header
3+
Machine: IMAGE_FILE_MACHINE_R4000 # (0x166)
4+
Characteristics: [ IMAGE_FILE_DEBUG_STRIPPED ]
5+
6+
sections:
7+
- !Section
8+
Name: .text
9+
Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]
10+
Alignment: 4
11+
SectionData: E8FFBD271400BFAF0000013C0000000C000024240000000C00000000000002241400BF8F0800E0031800BD27
12+
13+
Relocations:
14+
- !Relocation
15+
VirtualAddress: 8
16+
SymbolName: str
17+
Type: IMAGE_REL_MIPS_REFHI
18+
19+
- !Relocation
20+
VirtualAddress: 8
21+
SymbolName: .text
22+
Type: IMAGE_REL_MIPS_PAIR
23+
24+
- !Relocation
25+
VirtualAddress: 12
26+
SymbolName: puts
27+
Type: IMAGE_REL_MIPS_JMPADDR
28+
29+
- !Relocation
30+
VirtualAddress: 16
31+
SymbolName: str
32+
Type: IMAGE_REL_MIPS_REFLO
33+
34+
- !Relocation
35+
VirtualAddress: 20
36+
SymbolName: SomeOtherFunction
37+
Type: IMAGE_REL_MIPS_JMPADDR
38+
39+
- !Section
40+
Name: .rdata
41+
Alignment: 1
42+
Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ] # 0xc0100040
43+
SectionData: !hex "48656C6C6F20576F726C642100" # |Hello World!.|
44+
45+
symbols:
46+
- !Symbol
47+
Name: main
48+
Value: 0
49+
SectionNumber: 0
50+
SimpleType: IMAGE_SYM_TYPE_NULL
51+
ComplexType: IMAGE_SYM_DTYPE_NULL
52+
StorageClass: IMAGE_SYM_CLASS_EXTERNAL
53+
54+
- !Symbol
55+
Name: str
56+
Value: 0
57+
SectionNumber: 1
58+
SimpleType: IMAGE_SYM_TYPE_NULL
59+
ComplexType: IMAGE_SYM_DTYPE_NULL
60+
StorageClass: IMAGE_SYM_CLASS_EXTERNAL
61+
62+
- !Symbol
63+
Name: puts
64+
Value: 0
65+
SectionNumber: 0
66+
SimpleType: IMAGE_SYM_TYPE_NULL
67+
ComplexType: IMAGE_SYM_DTYPE_NULL
68+
StorageClass: IMAGE_SYM_CLASS_EXTERNAL
69+
70+
- !Symbol
71+
Name: SomeOtherFunction
72+
Value: 0
73+
SectionNumber: 0
74+
SimpleType: IMAGE_SYM_TYPE_NULL
75+
ComplexType: IMAGE_SYM_DTYPE_NULL
76+
StorageClass: IMAGE_SYM_CLASS_EXTERNAL
Binary file not shown.

llvm/test/Object/obj2yaml.test

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,98 @@
343343
# COFF-ARM64-NEXT: ComplexType: IMAGE_SYM_DTYPE_NULL
344344
# COFF-ARM64-NEXT: StorageClass: IMAGE_SYM_CLASS_EXTERNAL
345345

346+
# RUN: obj2yaml %p/Inputs/trivial-object-test.coff-mips | FileCheck %s --check-prefix COFF-MIPS
347+
348+
# COFF-MIPS: header:
349+
# COFF-MIPS-NEXT: Machine: IMAGE_FILE_MACHINE_R4000
350+
351+
# COFF-MIPS: sections:
352+
# COFF-MIPS-NEXT: - Name: .text
353+
# COFF-MIPS-NEXT: Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]
354+
# COFF-MIPS-NEXT: Alignment: 4
355+
# COFF-MIPS-NEXT: SectionData: E8FFBD271400BFAF0000013C0000000C000024240000000C00000000000002241400BF8F0800E0031800BD27
356+
357+
# COFF-MIPS: Relocations:
358+
# COFF-MIPS-NEXT: - VirtualAddress: 8
359+
# COFF-MIPS-NEXT: SymbolName: str
360+
# COFF-MIPS-NEXT: Type: IMAGE_REL_MIPS_REFHI
361+
362+
# COFF-MIPS: - VirtualAddress: 8
363+
# COFF-MIPS-NEXT: SymbolName: .text
364+
# COFF-MIPS-NEXT: Type: IMAGE_REL_MIPS_PAIR
365+
366+
# COFF-MIPS: - VirtualAddress: 12
367+
# COFF-MIPS-NEXT: SymbolName: puts
368+
# COFF-MIPS-NEXT: Type: IMAGE_REL_MIPS_JMPADDR
369+
370+
# COFF-MIPS: - VirtualAddress: 16
371+
# COFF-MIPS-NEXT: SymbolName: str
372+
# COFF-MIPS-NEXT: Type: IMAGE_REL_MIPS_REFLO
373+
374+
# COFF-MIPS: - VirtualAddress: 20
375+
# COFF-MIPS-NEXT: SymbolName: SomeOtherFunction
376+
# COFF-MIPS-NEXT: Type: IMAGE_REL_MIPS_JMPADDR
377+
378+
# COFF-MIPS: - Name: .rdata
379+
# COFF-MIPS-NEXT: Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ]
380+
# COFF-MIPS-NEXT: Alignment: 4
381+
# COFF-MIPS-NEXT: SectionData: 48656C6C6F20576F726C642100
382+
383+
# COFF-MIPS: symbols:
384+
# COFF-MIPS-NEXT: - Name: .text
385+
# COFF-MIPS-NEXT: Value: 0
386+
# COFF-MIPS-NEXT: SectionNumber: 1
387+
# COFF-MIPS-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL
388+
# COFF-MIPS-NEXT: ComplexType: IMAGE_SYM_DTYPE_NULL
389+
# COFF-MIPS-NEXT: StorageClass: IMAGE_SYM_CLASS_STATIC
390+
# COFF-MIPS-NEXT: SectionDefinition:
391+
# COFF-MIPS-NEXT: Length: 44
392+
# COFF-MIPS-NEXT: NumberOfRelocations: 5
393+
# COFF-MIPS-NEXT: NumberOfLinenumbers: 0
394+
# COFF-MIPS-NEXT: CheckSum: 3518661474
395+
# COFF-MIPS-NEXT: Number: 1
396+
397+
# COFF-MIPS: - Name: .rdata
398+
# COFF-MIPS-NEXT: Value: 0
399+
# COFF-MIPS-NEXT: SectionNumber: 4
400+
# COFF-MIPS-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL
401+
# COFF-MIPS-NEXT: ComplexType: IMAGE_SYM_DTYPE_NULL
402+
# COFF-MIPS-NEXT: StorageClass: IMAGE_SYM_CLASS_STATIC
403+
# COFF-MIPS-NEXT: SectionDefinition:
404+
# COFF-MIPS-NEXT: Length: 13
405+
# COFF-MIPS-NEXT: NumberOfRelocations: 0
406+
# COFF-MIPS-NEXT: NumberOfLinenumbers: 0
407+
# COFF-MIPS-NEXT: CheckSum: 2461364801
408+
# COFF-MIPS-NEXT: Number: 4
409+
410+
# COFF-MIPS: - Name: main
411+
# COFF-MIPS-NEXT: Value: 0
412+
# COFF-MIPS-NEXT: SectionNumber: 1
413+
# COFF-MIPS-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL
414+
# COFF-MIPS-NEXT: ComplexType: IMAGE_SYM_DTYPE_NULL
415+
# COFF-MIPS-NEXT: StorageClass: IMAGE_SYM_CLASS_EXTERNAL
416+
417+
# COFF-MIPS: - Name: str
418+
# COFF-MIPS-NEXT: Value: 0
419+
# COFF-MIPS-NEXT: SectionNumber: 4
420+
# COFF-MIPS-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL
421+
# COFF-MIPS-NEXT: ComplexType: IMAGE_SYM_DTYPE_NULL
422+
# COFF-MIPS-NEXT: StorageClass: IMAGE_SYM_CLASS_EXTERNAL
423+
424+
# COFF-MIPS: - Name: puts
425+
# COFF-MIPS-NEXT: Value: 0
426+
# COFF-MIPS-NEXT: SectionNumber: 0
427+
# COFF-MIPS-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL
428+
# COFF-MIPS-NEXT: ComplexType: IMAGE_SYM_DTYPE_NULL
429+
# COFF-MIPS-NEXT: StorageClass: IMAGE_SYM_CLASS_EXTERNAL
430+
431+
# COFF-MIPS: - Name: SomeOtherFunction
432+
# COFF-MIPS-NEXT: Value: 0
433+
# COFF-MIPS-NEXT: SectionNumber: 0
434+
# COFF-MIPS-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL
435+
# COFF-MIPS-NEXT: ComplexType: IMAGE_SYM_DTYPE_NULL
436+
# COFF-MIPS-NEXT: StorageClass: IMAGE_SYM_CLASS_EXTERNAL
437+
346438
# RUN: obj2yaml %p/Inputs/trivial-object-test.elf-mipsel | FileCheck %s --check-prefix ELF-MIPSEL
347439

348440
# ELF-MIPSEL: FileHeader:

llvm/test/Object/objdump-section-content.test

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,13 @@ Sections:
3939

4040
# BSS: Contents of section .bss:
4141
# BSS-NEXT: <skipping contents of bss section at [12c8, 12cc)>
42+
43+
# RUN: yaml2obj %p/Inputs/COFF/mips.yaml | llvm-objdump -s - | FileCheck %s --check-prefix=COFF-MIPS
44+
45+
# COFF-MIPS: <stdin>: file format coff-mips
46+
# COFF-MIPS: Contents of section .text:
47+
# COFF-MIPS: 0000 e8ffbd27 1400bfaf 0000013c 0000000c ...'.......<....
48+
# COFF-MIPS: 0010 00002424 0000000c 00000000 00000224 ..$$...........$
49+
# COFF-MIPS: 0020 1400bf8f 0800e003 1800bd27 ...........'
50+
# COFF-MIPS: Contents of section .rdata:
51+
# COFF-MIPS: 0000 48656c6c 6f20576f 726c6421 00 Hello World!.

0 commit comments

Comments
 (0)