Skip to content

Commit db61c91

Browse files
committed
[yaml2obj][objdump] Handle IMAGE_FILE_MACHINE_R4000 machine type and MIPS COFF relocations
llvm-objdump can now parse MIPS COFF files.
1 parent f99b2ea commit db61c91

File tree

9 files changed

+52
-0
lines changed

9 files changed

+52
-0
lines changed

lld/COFF/Config.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ static const auto ARM64EC = llvm::COFF::IMAGE_FILE_MACHINE_ARM64EC;
4040
static const auto ARM64X = llvm::COFF::IMAGE_FILE_MACHINE_ARM64X;
4141
static const auto ARMNT = llvm::COFF::IMAGE_FILE_MACHINE_ARMNT;
4242
static const auto I386 = llvm::COFF::IMAGE_FILE_MACHINE_I386;
43+
static const auto MIPS = llvm::COFF::IMAGE_FILE_MACHINE_R4000;
4344

4445
enum class ExportSource {
4546
Unset,

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: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,11 @@ struct ScalarEnumerationTraits<COFF::RelocationTypeAMD64> {
179179
static void enumeration(IO &IO, COFF::RelocationTypeAMD64 &Value);
180180
};
181181

182+
template <>
183+
struct ScalarEnumerationTraits<COFF::RelocationTypesMips> {
184+
static void enumeration(IO &IO, COFF::RelocationTypesMips &Value);
185+
};
186+
182187
template <>
183188
struct ScalarEnumerationTraits<COFF::RelocationTypesARM> {
184189
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-R4000";
11351137
default:
11361138
return "COFF-<unknown arch>";
11371139
}

llvm/lib/Object/WindowsMachineFlag.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ COFF::MachineTypes llvm::getMachineType(StringRef S) {
2828
.Case("arm64", COFF::IMAGE_FILE_MACHINE_ARM64)
2929
.Case("arm64ec", COFF::IMAGE_FILE_MACHINE_ARM64EC)
3030
.Case("arm64x", COFF::IMAGE_FILE_MACHINE_ARM64X)
31+
.Case("mips", COFF::IMAGE_FILE_MACHINE_R4000) // also handle mips (big-endian) because we want to support '/machine:MIPS'
32+
.Case("mipsel", COFF::IMAGE_FILE_MACHINE_R4000)
3133
.Default(COFF::IMAGE_FILE_MACHINE_UNKNOWN);
3234
}
3335

@@ -45,6 +47,8 @@ StringRef llvm::machineToStr(COFF::MachineTypes MT) {
4547
return "x64";
4648
case COFF::IMAGE_FILE_MACHINE_I386:
4749
return "x86";
50+
case COFF::IMAGE_FILE_MACHINE_R4000:
51+
return "mipsel";
4852
default:
4953
llvm_unreachable("unknown machine type");
5054
}

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);

llvm/lib/ObjectYAML/CodeViewYAMLSymbols.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,9 @@ void ScalarEnumerationTraits<RegisterId>::enumeration(IO &io, RegisterId &Reg) {
171171
case COFF::IMAGE_FILE_MACHINE_ARM64X:
172172
CpuType = CPUType::ARM64;
173173
break;
174+
case COFF::IMAGE_FILE_MACHINE_R4000:
175+
CpuType = CPUType::MIPSIII;
176+
break;
174177
}
175178

176179
if (CpuType)
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
!COFF
2+
header: !Header
3+
Machine: IMAGE_FILE_MACHINE_R4000 # (0x166)
4+
Characteristics: [ IMAGE_FILE_DEBUG_STRIPPED ]
5+
6+
sections:
7+
8+
symbols:

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,7 @@ 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/mipsel.yaml | llvm-objdump -s - | FileCheck %s --check-prefix=COFF-R4000
44+
45+
# COFF-R4000: <stdin>: file format coff-r4000

0 commit comments

Comments
 (0)