Skip to content

Commit ea0ad52

Browse files
committed
[yaml2obj][obj2yaml][objdump] Handle LoongArch COFF files
- handle IMAGE_FILE_MACHINE_LOONGARCH64 machine type - handle LOONGARCH COFF relocations This patch is inspired by Mips's pr llvm#112591.
1 parent a7555da commit ea0ad52

File tree

3 files changed

+67
-0
lines changed

3 files changed

+67
-0
lines changed

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::RelocationTypesLoongArch> {
183+
static void enumeration(IO &IO, COFF::RelocationTypesLoongArch &Value);
184+
};
185+
182186
template <> struct ScalarEnumerationTraits<COFF::RelocationTypesMips> {
183187
static void enumeration(IO &IO, COFF::RelocationTypesMips &Value);
184188
};

llvm/lib/ObjectYAML/COFFYAML.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ void ScalarEnumerationTraits<COFF::MachineTypes>::enumeration(
8080
ECase(IMAGE_FILE_MACHINE_RISCV32);
8181
ECase(IMAGE_FILE_MACHINE_RISCV64);
8282
ECase(IMAGE_FILE_MACHINE_RISCV128);
83+
ECase(IMAGE_FILE_MACHINE_LOONGARCH32);
84+
ECase(IMAGE_FILE_MACHINE_LOONGARCH64);
8385
ECase(IMAGE_FILE_MACHINE_SH3);
8486
ECase(IMAGE_FILE_MACHINE_SH3DSP);
8587
ECase(IMAGE_FILE_MACHINE_SH4);
@@ -183,6 +185,24 @@ void ScalarEnumerationTraits<COFF::RelocationTypeAMD64>::enumeration(
183185
ECase(IMAGE_REL_AMD64_SSPAN32);
184186
}
185187

188+
void ScalarEnumerationTraits<COFF::RelocationTypesLoongArch>::enumeration(
189+
IO &IO, COFF::RelocationTypesLoongArch &Value) {
190+
ECase(IMAGE_REL_LARCH_ABSOLUTE);
191+
ECase(IMAGE_REL_LARCH_ADDR32);
192+
ECase(IMAGE_REL_LARCH_ADDR32NB);
193+
ECase(IMAGE_REL_LARCH_BRANCH26);
194+
ECase(IMAGE_REL_LARCH_SECREL);
195+
ECase(IMAGE_REL_LARCH_SECTION);
196+
ECase(IMAGE_REL_LARCH_ADDR64);
197+
ECase(IMAGE_REL_LARCH_ADDR_HI20);
198+
ECase(IMAGE_REL_LARCH_ADDR_LO12);
199+
ECase(IMAGE_REL_LARCH_ADDR64_LO20);
200+
ECase(IMAGE_REL_LARCH_ADDR64_HI12);
201+
ECase(IMAGE_REL_LARCH_BRANCH21);
202+
ECase(IMAGE_REL_LARCH_BRANCH16);
203+
ECase(IMAGE_REL_LARCH_REL32);
204+
}
205+
186206
void ScalarEnumerationTraits<COFF::RelocationTypesMips>::enumeration(
187207
IO &IO, COFF::RelocationTypesMips &Value) {
188208
ECase(IMAGE_REL_MIPS_ABSOLUTE);
@@ -446,6 +466,10 @@ void MappingTraits<COFFYAML::Relocation>::mapping(IO &IO,
446466
MappingNormalization<NType<COFF::RelocationTypeAMD64>, uint16_t> NT(
447467
IO, Rel.Type);
448468
IO.mapRequired("Type", NT->Type);
469+
} else if (H.Machine == COFF::IMAGE_FILE_MACHINE_LOONGARCH64) {
470+
MappingNormalization<NType<COFF::RelocationTypesLoongArch>, uint16_t> NT(
471+
IO, Rel.Type);
472+
IO.mapRequired("Type", NT->Type);
449473
} else if (H.Machine == COFF::IMAGE_FILE_MACHINE_R4000) {
450474
MappingNormalization<NType<COFF::RelocationTypesMips>, uint16_t> NT(
451475
IO, Rel.Type);
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# RUN: yaml2obj %s -o %t
2+
# RUN: llvm-readobj --file-headers --relocs %t | FileCheck %s
3+
# RUN: obj2yaml %t | FileCheck %s --check-prefix=ROUNDTRIP
4+
5+
# CHECK: Format: COFF-LoongArch64
6+
# CHECK: Arch: loongarch64
7+
# CHECK: Machine: IMAGE_FILE_MACHINE_LOONGARCH64 (0x6264)
8+
# CHECK: Relocations [
9+
# CHECK: Section (1) .text {
10+
# CHECK: 0x4 IMAGE_REL_LARCH_BRANCH26 main (0)
11+
# CHECK: }
12+
# CHECK: ]
13+
14+
# ROUNDTRIP: Machine: IMAGE_FILE_MACHINE_LOONGARCH64
15+
# ROUNDTRIP: Relocations:
16+
# ROUNDTRIP-NEXT: - VirtualAddress: 4
17+
# ROUNDTRIP-NEXT: SymbolName: main
18+
# ROUNDTRIP-NEXT: Type: IMAGE_REL_LARCH_BRANCH26
19+
20+
--- !COFF
21+
header:
22+
Machine: IMAGE_FILE_MACHINE_LOONGARCH64
23+
sections:
24+
- Name: .text
25+
Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]
26+
VirtualSize: 12
27+
SectionData: 000000000000000C00000000
28+
Relocations:
29+
- VirtualAddress: 4
30+
SymbolName: main
31+
Type: IMAGE_REL_LARCH_BRANCH26
32+
symbols:
33+
- Name: main
34+
Value: 0
35+
SectionNumber: 1
36+
SimpleType: IMAGE_SYM_TYPE_NULL
37+
ComplexType: IMAGE_SYM_DTYPE_NULL
38+
StorageClass: IMAGE_SYM_CLASS_EXTERNAL
39+
...

0 commit comments

Comments
 (0)