[llvm] [yaml2obj][obj2yaml][objdump] Handle MIPS COFF files (PR #112591)

Hervé Poussineau via llvm-commits llvm-commits at lists.llvm.org
Fri Nov 1 07:00:31 PDT 2024


https://github.com/hpoussin updated https://github.com/llvm/llvm-project/pull/112591

>From 6f4b38e1c5b86647dbd6ef05902c56ca2c5d0d12 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Herv=C3=A9=20Poussineau?= <hpoussin at reactos.org>
Date: Tue, 15 Oct 2024 22:40:46 +0200
Subject: [PATCH 1/3] [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.
---
 llvm/include/llvm/Object/WindowsMachineFlag.h |  2 +
 llvm/include/llvm/ObjectYAML/COFFYAML.h       |  4 +
 llvm/lib/Object/COFFObjectFile.cpp            |  2 +
 llvm/lib/ObjectYAML/COFFYAML.cpp              | 23 +++++
 llvm/test/tools/yaml2obj/COFF/basic-mips.yaml | 96 +++++++++++++++++++
 5 files changed, 127 insertions(+)
 create mode 100644 llvm/test/tools/yaml2obj/COFF/basic-mips.yaml

diff --git a/llvm/include/llvm/Object/WindowsMachineFlag.h b/llvm/include/llvm/Object/WindowsMachineFlag.h
index 1cb408ed13d420..ce5b356f8bfeed 100644
--- a/llvm/include/llvm/Object/WindowsMachineFlag.h
+++ b/llvm/include/llvm/Object/WindowsMachineFlag.h
@@ -43,6 +43,8 @@ template <typename T> Triple::ArchType getMachineArchType(T machine) {
   case COFF::IMAGE_FILE_MACHINE_ARM64EC:
   case COFF::IMAGE_FILE_MACHINE_ARM64X:
     return llvm::Triple::ArchType::aarch64;
+  case COFF::IMAGE_FILE_MACHINE_R4000:
+    return llvm::Triple::ArchType::mipsel;
   default:
     return llvm::Triple::ArchType::UnknownArch;
   }
diff --git a/llvm/include/llvm/ObjectYAML/COFFYAML.h b/llvm/include/llvm/ObjectYAML/COFFYAML.h
index 2f9a1aae0eb05a..c22d4e7f0b29d3 100644
--- a/llvm/include/llvm/ObjectYAML/COFFYAML.h
+++ b/llvm/include/llvm/ObjectYAML/COFFYAML.h
@@ -179,6 +179,10 @@ struct ScalarEnumerationTraits<COFF::RelocationTypeAMD64> {
   static void enumeration(IO &IO, COFF::RelocationTypeAMD64 &Value);
 };
 
+template <> struct ScalarEnumerationTraits<COFF::RelocationTypesMips> {
+  static void enumeration(IO &IO, COFF::RelocationTypesMips &Value);
+};
+
 template <>
 struct ScalarEnumerationTraits<COFF::RelocationTypesARM> {
   static void enumeration(IO &IO, COFF::RelocationTypesARM &Value);
diff --git a/llvm/lib/Object/COFFObjectFile.cpp b/llvm/lib/Object/COFFObjectFile.cpp
index 7f21be25b68c84..242c123665f763 100644
--- a/llvm/lib/Object/COFFObjectFile.cpp
+++ b/llvm/lib/Object/COFFObjectFile.cpp
@@ -1132,6 +1132,8 @@ StringRef COFFObjectFile::getFileFormatName() const {
     return "COFF-ARM64EC";
   case COFF::IMAGE_FILE_MACHINE_ARM64X:
     return "COFF-ARM64X";
+  case COFF::IMAGE_FILE_MACHINE_R4000:
+    return "COFF-MIPS";
   default:
     return "COFF-<unknown arch>";
   }
diff --git a/llvm/lib/ObjectYAML/COFFYAML.cpp b/llvm/lib/ObjectYAML/COFFYAML.cpp
index e14e1b5e467b41..53ea40a0354cea 100644
--- a/llvm/lib/ObjectYAML/COFFYAML.cpp
+++ b/llvm/lib/ObjectYAML/COFFYAML.cpp
@@ -183,6 +183,25 @@ void ScalarEnumerationTraits<COFF::RelocationTypeAMD64>::enumeration(
   ECase(IMAGE_REL_AMD64_SSPAN32);
 }
 
+void ScalarEnumerationTraits<COFF::RelocationTypesMips>::enumeration(
+    IO &IO, COFF::RelocationTypesMips &Value) {
+  ECase(IMAGE_REL_MIPS_ABSOLUTE);
+  ECase(IMAGE_REL_MIPS_REFHALF);
+  ECase(IMAGE_REL_MIPS_REFWORD);
+  ECase(IMAGE_REL_MIPS_JMPADDR);
+  ECase(IMAGE_REL_MIPS_REFHI);
+  ECase(IMAGE_REL_MIPS_REFLO);
+  ECase(IMAGE_REL_MIPS_GPREL);
+  ECase(IMAGE_REL_MIPS_LITERAL);
+  ECase(IMAGE_REL_MIPS_SECTION);
+  ECase(IMAGE_REL_MIPS_SECREL);
+  ECase(IMAGE_REL_MIPS_SECRELLO);
+  ECase(IMAGE_REL_MIPS_SECRELHI);
+  ECase(IMAGE_REL_MIPS_JMPADDR16);
+  ECase(IMAGE_REL_MIPS_REFWORDNB);
+  ECase(IMAGE_REL_MIPS_PAIR);
+}
+
 void ScalarEnumerationTraits<COFF::RelocationTypesARM>::enumeration(
     IO &IO, COFF::RelocationTypesARM &Value) {
   ECase(IMAGE_REL_ARM_ABSOLUTE);
@@ -427,6 +446,10 @@ void MappingTraits<COFFYAML::Relocation>::mapping(IO &IO,
     MappingNormalization<NType<COFF::RelocationTypeAMD64>, uint16_t> NT(
         IO, Rel.Type);
     IO.mapRequired("Type", NT->Type);
+  } else if (H.Machine == COFF::IMAGE_FILE_MACHINE_R4000) {
+    MappingNormalization<NType<COFF::RelocationTypesMips>, uint16_t> NT(
+        IO, Rel.Type);
+    IO.mapRequired("Type", NT->Type);
   } else if (H.Machine == COFF::IMAGE_FILE_MACHINE_ARMNT) {
     MappingNormalization<NType<COFF::RelocationTypesARM>, uint16_t> NT(
         IO, Rel.Type);
diff --git a/llvm/test/tools/yaml2obj/COFF/basic-mips.yaml b/llvm/test/tools/yaml2obj/COFF/basic-mips.yaml
new file mode 100644
index 00000000000000..7ec677727265cb
--- /dev/null
+++ b/llvm/test/tools/yaml2obj/COFF/basic-mips.yaml
@@ -0,0 +1,96 @@
+# RUN: yaml2obj %s -o %t
+# RUN: llvm-readobj --file-headers %t | FileCheck %s
+# RUN: obj2yaml %t | FileCheck %s --check-prefix=ROUNDTRIP
+
+# CHECK: OptionalHeaderSize: 224
+# CHECK: ImageBase: 0x40000000
+
+# ROUNDTRIP: ImageBase: 1073741824
+# ROUNDTRIP: VirtualAddress:  4096
+# ROUNDTRIP: VirtualAddress:  8192
+# ROUNDTRIP: VirtualAddress:  12288
+
+--- !COFF
+OptionalHeader:
+  AddressOfEntryPoint: 4096
+  ImageBase:       1073741824
+  SectionAlignment: 4096
+  FileAlignment:   512
+  MajorOperatingSystemVersion: 6
+  MinorOperatingSystemVersion: 0
+  MajorImageVersion: 0
+  MinorImageVersion: 0
+  MajorSubsystemVersion: 6
+  MinorSubsystemVersion: 0
+  Subsystem:       IMAGE_SUBSYSTEM_WINDOWS_CUI
+  DLLCharacteristics: [ IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA, IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE, IMAGE_DLL_CHARACTERISTICS_NX_COMPAT, IMAGE_DLL_CHARACTERISTICS_TERMINAL_SERVER_AWARE ]
+  SizeOfStackReserve: 1048576
+  SizeOfStackCommit: 4096
+  SizeOfHeapReserve: 1048576
+  SizeOfHeapCommit: 4096
+  ExportTable:
+    RelativeVirtualAddress: 0
+    Size:            0
+  ImportTable:
+    RelativeVirtualAddress: 0
+    Size:            0
+  ResourceTable:
+    RelativeVirtualAddress: 0
+    Size:            0
+  ExceptionTable:
+    RelativeVirtualAddress: 12288
+    Size:            8
+  CertificateTable:
+    RelativeVirtualAddress: 0
+    Size:            0
+  BaseRelocationTable:
+    RelativeVirtualAddress: 0
+    Size:            0
+  Debug:
+    RelativeVirtualAddress: 0
+    Size:            0
+  Architecture:
+    RelativeVirtualAddress: 0
+    Size:            0
+  GlobalPtr:
+    RelativeVirtualAddress: 0
+    Size:            0
+  TlsTable:
+    RelativeVirtualAddress: 0
+    Size:            0
+  LoadConfigTable:
+    RelativeVirtualAddress: 0
+    Size:            0
+  BoundImport:
+    RelativeVirtualAddress: 0
+    Size:            0
+  IAT:
+    RelativeVirtualAddress: 0
+    Size:            0
+  DelayImportDescriptor:
+    RelativeVirtualAddress: 0
+    Size:            0
+  ClrRuntimeHeader:
+    RelativeVirtualAddress: 0
+    Size:            0
+header:
+  Machine:         IMAGE_FILE_MACHINE_R4000
+  Characteristics: [ IMAGE_FILE_EXECUTABLE_IMAGE ]
+sections:
+  - Name:            .text
+    Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]
+    VirtualAddress:  4096
+    VirtualSize:     4
+    SectionData:     C0035FD6
+  - Name:            .rdata
+    Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ]
+    VirtualAddress:  8192
+    VirtualSize:     12
+    SectionData:     0100400800000000E4E3E3E3
+  - Name:            .pdata
+    Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ]
+    VirtualAddress:  12288
+    VirtualSize:     8
+    SectionData:     '0010000000200000'
+symbols:         []
+...

>From 014e0ab8f588c4945f11d6e095c3d9498280626a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Herv=C3=A9=20Poussineau?= <hpoussin at reactos.org>
Date: Fri, 18 Oct 2024 21:57:14 +0200
Subject: [PATCH 2/3] Check MIPS relocations and remove useless fields

---
 llvm/test/tools/yaml2obj/COFF/basic-mips.yaml | 107 ++++--------------
 1 file changed, 25 insertions(+), 82 deletions(-)

diff --git a/llvm/test/tools/yaml2obj/COFF/basic-mips.yaml b/llvm/test/tools/yaml2obj/COFF/basic-mips.yaml
index 7ec677727265cb..661e6c77a6d35e 100644
--- a/llvm/test/tools/yaml2obj/COFF/basic-mips.yaml
+++ b/llvm/test/tools/yaml2obj/COFF/basic-mips.yaml
@@ -2,95 +2,38 @@
 # RUN: llvm-readobj --file-headers %t | FileCheck %s
 # RUN: obj2yaml %t | FileCheck %s --check-prefix=ROUNDTRIP
 
-# CHECK: OptionalHeaderSize: 224
-# CHECK: ImageBase: 0x40000000
+# CHECK: Format: COFF-MIPS
+# CHECK: Arch: mipsel
+# CHECK: Machine: IMAGE_FILE_MACHINE_R4000 (0x166)
+# CHECK: Relocations [
+# CHECK:  Section (1) .text {
+# CHECK:    0x4 IMAGE_REL_MIPS_JMPADDR main (0)
+# CHECK:  }
+# CHECK: ]
 
-# ROUNDTRIP: ImageBase: 1073741824
-# ROUNDTRIP: VirtualAddress:  4096
-# ROUNDTRIP: VirtualAddress:  8192
-# ROUNDTRIP: VirtualAddress:  12288
+# ROUNDTRIP:      Machine: IMAGE_FILE_MACHINE_R4000
+# ROUNDTRIP:      Relocations:
+# ROUNDTRIP-NEXT: - VirtualAddress: 4
+# ROUNDTRIP-NEXT:   SymbolName:     main
+# ROUNDTRIP-NEXT:   Type:           IMAGE_REL_MIPS_JMPADDR
 
 --- !COFF
-OptionalHeader:
-  AddressOfEntryPoint: 4096
-  ImageBase:       1073741824
-  SectionAlignment: 4096
-  FileAlignment:   512
-  MajorOperatingSystemVersion: 6
-  MinorOperatingSystemVersion: 0
-  MajorImageVersion: 0
-  MinorImageVersion: 0
-  MajorSubsystemVersion: 6
-  MinorSubsystemVersion: 0
-  Subsystem:       IMAGE_SUBSYSTEM_WINDOWS_CUI
-  DLLCharacteristics: [ IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA, IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE, IMAGE_DLL_CHARACTERISTICS_NX_COMPAT, IMAGE_DLL_CHARACTERISTICS_TERMINAL_SERVER_AWARE ]
-  SizeOfStackReserve: 1048576
-  SizeOfStackCommit: 4096
-  SizeOfHeapReserve: 1048576
-  SizeOfHeapCommit: 4096
-  ExportTable:
-    RelativeVirtualAddress: 0
-    Size:            0
-  ImportTable:
-    RelativeVirtualAddress: 0
-    Size:            0
-  ResourceTable:
-    RelativeVirtualAddress: 0
-    Size:            0
-  ExceptionTable:
-    RelativeVirtualAddress: 12288
-    Size:            8
-  CertificateTable:
-    RelativeVirtualAddress: 0
-    Size:            0
-  BaseRelocationTable:
-    RelativeVirtualAddress: 0
-    Size:            0
-  Debug:
-    RelativeVirtualAddress: 0
-    Size:            0
-  Architecture:
-    RelativeVirtualAddress: 0
-    Size:            0
-  GlobalPtr:
-    RelativeVirtualAddress: 0
-    Size:            0
-  TlsTable:
-    RelativeVirtualAddress: 0
-    Size:            0
-  LoadConfigTable:
-    RelativeVirtualAddress: 0
-    Size:            0
-  BoundImport:
-    RelativeVirtualAddress: 0
-    Size:            0
-  IAT:
-    RelativeVirtualAddress: 0
-    Size:            0
-  DelayImportDescriptor:
-    RelativeVirtualAddress: 0
-    Size:            0
-  ClrRuntimeHeader:
-    RelativeVirtualAddress: 0
-    Size:            0
 header:
   Machine:         IMAGE_FILE_MACHINE_R4000
-  Characteristics: [ IMAGE_FILE_EXECUTABLE_IMAGE ]
 sections:
   - Name:            .text
     Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]
-    VirtualAddress:  4096
-    VirtualSize:     4
-    SectionData:     C0035FD6
-  - Name:            .rdata
-    Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ]
-    VirtualAddress:  8192
     VirtualSize:     12
-    SectionData:     0100400800000000E4E3E3E3
-  - Name:            .pdata
-    Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ]
-    VirtualAddress:  12288
-    VirtualSize:     8
-    SectionData:     '0010000000200000'
-symbols:         []
+    SectionData:     000000000000000C00000000
+    Relocations:
+      - VirtualAddress:  4
+        SymbolName:      main
+        Type:            IMAGE_REL_MIPS_JMPADDR
+symbols:
+  - Name: main
+    Value: 0
+    SectionNumber: 1
+    SimpleType: IMAGE_SYM_TYPE_NULL
+    ComplexType: IMAGE_SYM_DTYPE_NULL
+    StorageClass: IMAGE_SYM_CLASS_EXTERNAL
 ...

>From f48c3e909b973ba91c49f2bbc5aa8f25d610d032 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Herv=C3=A9=20Poussineau?= <hpoussin at reactos.org>
Date: Fri, 1 Nov 2024 14:57:32 +0100
Subject: [PATCH 3/3] Don't forget to dump relocations

---
 llvm/test/tools/yaml2obj/COFF/basic-mips.yaml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/test/tools/yaml2obj/COFF/basic-mips.yaml b/llvm/test/tools/yaml2obj/COFF/basic-mips.yaml
index 661e6c77a6d35e..4c5afd500f7148 100644
--- a/llvm/test/tools/yaml2obj/COFF/basic-mips.yaml
+++ b/llvm/test/tools/yaml2obj/COFF/basic-mips.yaml
@@ -1,5 +1,5 @@
 # RUN: yaml2obj %s -o %t
-# RUN: llvm-readobj --file-headers %t | FileCheck %s
+# RUN: llvm-readobj --file-headers --relocs %t | FileCheck %s
 # RUN: obj2yaml %t | FileCheck %s --check-prefix=ROUNDTRIP
 
 # CHECK: Format: COFF-MIPS



More information about the llvm-commits mailing list