Skip to content

Commit 142c6ae

Browse files
committed
Fix Z80 ELF defines.
1 parent ba4e437 commit 142c6ae

File tree

6 files changed

+75
-9
lines changed

6 files changed

+75
-9
lines changed

llvm/include/llvm/BinaryFormat/ELF.h

+13-1
Original file line numberDiff line numberDiff line change
@@ -908,7 +908,19 @@ enum {
908908

909909
// Z80 specific e_flags
910910
enum : unsigned {
911-
EF_Z80_EZ80 = 0x1,
911+
EF_Z80_MACH_Z80 = 0x01,
912+
EF_Z80_MACH_Z180 = 0x02,
913+
EF_Z80_MACH_R800 = 0x03,
914+
EF_Z80_MACH_EZ80_Z80 = 0x04,
915+
EF_Z80_MACH_EZ80_ADL = 0x84,
916+
EF_Z80_MACH_GBZ80 = 0x05,
917+
EF_Z80_MACH_Z80N = 0x06,
918+
EF_Z80_MACH_MSK = 0xff,
919+
};
920+
921+
// Z80 relocations.
922+
enum {
923+
#include "ELFRelocs/z80.def"
912924
};
913925

914926
#undef ELF_RELOC
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
2+
#ifndef ELF_RELOC
3+
#error "ELF_RELOC must be defined"
4+
#endif
5+
6+
ELF_RELOC(R_Z80_NONE, 0)
7+
ELF_RELOC(R_Z80_8, 1)
8+
ELF_RELOC(R_Z80_8_DIS, 2)
9+
ELF_RELOC(R_Z80_8_PCREL, 3)
10+
ELF_RELOC(R_Z80_16, 4)
11+
ELF_RELOC(R_Z80_24, 5)
12+
ELF_RELOC(R_Z80_32, 6)
13+
ELF_RELOC(R_Z80_BYTE0, 7)
14+
ELF_RELOC(R_Z80_BYTE1, 8)
15+
ELF_RELOC(R_Z80_BYTE2, 9)
16+
ELF_RELOC(R_Z80_BYTE3, 10)
17+
ELF_RELOC(R_Z80_WORD0, 11)
18+
ELF_RELOC(R_Z80_WORD1, 12)
19+
ELF_RELOC(R_Z80_16_BE, 13)

llvm/include/llvm/Object/ELFObjectFile.h

+26-7
Original file line numberDiff line numberDiff line change
@@ -1212,8 +1212,24 @@ StringRef ELFObjectFile<ELFT>::getFileFormatName() const {
12121212
case ELF::EM_LOONGARCH:
12131213
return "elf32-loongarch";
12141214
case ELF::EM_Z80:
1215-
return (EF.getHeader().e_flags & ELF::EF_Z80_EZ80 ? "elf32-ez80"
1216-
: "elf32-z80");
1215+
switch (EF.getHeader().e_flags & ELF::EF_Z80_MACH_MSK) {
1216+
default:
1217+
return "elf32-z80-unknown";
1218+
case ELF::EF_Z80_MACH_Z80:
1219+
return "elf32-z80";
1220+
case ELF::EF_Z80_MACH_Z180:
1221+
return "elf32-z180";
1222+
case ELF::EF_Z80_MACH_R800:
1223+
return "elf32-r800";
1224+
case ELF::EF_Z80_MACH_EZ80_Z80:
1225+
return "elf32-ez80-code16";
1226+
case ELF::EF_Z80_MACH_EZ80_ADL:
1227+
return "elf32-ez80";
1228+
case ELF::EF_Z80_MACH_GBZ80:
1229+
return "elf32-gbz80";
1230+
case ELF::EF_Z80_MACH_Z80N:
1231+
return "elf32-z80n";
1232+
}
12171233
default:
12181234
return "elf32-unknown";
12191235
}
@@ -1339,13 +1355,16 @@ template <class ELFT> Triple::ArchType ELFObjectFile<ELFT>::getArch() const {
13391355
}
13401356

13411357
case ELF::EM_Z80:
1342-
if (!IsLittleEndian)
1358+
if (!IsLittleEndian ||
1359+
EF.getHeader().e_ident[ELF::EI_CLASS] != ELF::ELFCLASS32)
13431360
return Triple::UnknownArch;
1344-
1345-
if (EF.getHeader().e_flags & ELF::EF_Z80_EZ80)
1361+
switch (EF.getHeader().e_flags & ELF::EF_Z80_MACH_MSK) {
1362+
default:
1363+
return Triple::z80;
1364+
case ELF::EF_Z80_MACH_EZ80_Z80:
1365+
case ELF::EF_Z80_MACH_EZ80_ADL:
13461366
return Triple::ez80;
1347-
1348-
return Triple::z80;
1367+
}
13491368

13501369
default:
13511370
return Triple::UnknownArch;

llvm/include/llvm/module.modulemap

+1
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ module LLVM_BinaryFormat {
8383
textual header "BinaryFormat/ELFRelocs/SystemZ.def"
8484
textual header "BinaryFormat/ELFRelocs/VE.def"
8585
textual header "BinaryFormat/ELFRelocs/x86_64.def"
86+
textual header "BinaryFormat/ELFRelocs/Z80.def"
8687
textual header "BinaryFormat/WasmRelocs.def"
8788
textual header "BinaryFormat/MsgPack.def"
8889
}

llvm/lib/Object/ELF.cpp

+9
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,13 @@ StringRef llvm::object::getELFRelocationTypeName(uint32_t Machine,
173173
break;
174174
}
175175
break;
176+
case ELF::EM_Z80:
177+
switch (Type) {
178+
#include "llvm/BinaryFormat/ELFRelocs/z80.def"
179+
default:
180+
break;
181+
}
182+
break;
176183
default:
177184
break;
178185
}
@@ -223,6 +230,8 @@ uint32_t llvm::object::getELFRelativeRelocationType(uint32_t Machine) {
223230
break;
224231
case ELF::EM_BPF:
225232
break;
233+
case ELF::EM_Z80:
234+
break;
226235
default:
227236
break;
228237
}

llvm/tools/llvm-readobj/ELFDumper.cpp

+7-1
Original file line numberDiff line numberDiff line change
@@ -1644,7 +1644,13 @@ const EnumEntry<unsigned> ElfHeaderAVRFlags[] = {
16441644
};
16451645

16461646
static const EnumEntry<unsigned> ElfHeaderZ80Flags[] = {
1647-
ENUM_ENT(EF_Z80_EZ80, "eZ80")
1647+
ENUM_ENT(EF_Z80_MACH_Z80, "Z80"),
1648+
ENUM_ENT(EF_Z80_MACH_Z180, "Z180"),
1649+
ENUM_ENT(EF_Z80_MACH_R800, "R800"),
1650+
ENUM_ENT(EF_Z80_MACH_EZ80_Z80, "eZ80-Z80"),
1651+
ENUM_ENT(EF_Z80_MACH_EZ80_ADL, "eZ80-ADL"),
1652+
ENUM_ENT(EF_Z80_MACH_GBZ80, "gbZ80"),
1653+
ENUM_ENT(EF_Z80_MACH_Z80N, "Z80N"),
16481654
};
16491655

16501656

0 commit comments

Comments
 (0)