Skip to content

Commit 094f2e2

Browse files
authored
Merge branch 'main' into bitfield-improvements
2 parents 0e81df7 + 689a296 commit 094f2e2

File tree

1 file changed

+41
-5
lines changed

1 file changed

+41
-5
lines changed

tools/psyq-obj-parser/psyq-obj-parser.cc

Lines changed: 41 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,9 @@ enum class PsyqOpcode : uint8_t {
7070

7171
enum class PsyqRelocType : uint8_t {
7272
REL32_BE = 8,
73+
GPREL16_BE = 12,
7374
REL32 = 16,
75+
GPREL16_LE = 30,
7476
REL26 = 74,
7577
HI16 = 82,
7678
LO16 = 84,
@@ -339,6 +341,14 @@ std::unique_ptr<PsyqLnkFile> PsyqLnkFile::parse(PCSX::IO<PCSX::File> file, bool
339341
vprint("(GPREL16), ");
340342
break;
341343
}
344+
case (uint8_t)PsyqRelocType::GPREL16_LE: {
345+
vprint("(GPREL16 LE), ");
346+
break;
347+
}
348+
case (uint8_t)PsyqRelocType::GPREL16_BE: {
349+
vprint("(GPREL16 BE), ");
350+
break;
351+
}
342352
case (uint8_t)PsyqRelocType::HI16_BE: {
343353
vprint("(HI16 BE), ");
344354
break;
@@ -764,10 +774,11 @@ void PsyqLnkFile::Section::displayRelocs(PsyqLnkFile* lnk) {
764774

765775
void PsyqLnkFile::Relocation::display(PsyqLnkFile* lnk, PsyqLnkFile::Section* sec) {
766776
static const std::map<PsyqRelocType, std::string> typeStr = {
767-
{PsyqRelocType::REL32, "REL32"}, {PsyqRelocType::REL26, "REL26"},
768-
{PsyqRelocType::HI16, "HI16"}, {PsyqRelocType::LO16, "LO16"},
769-
{PsyqRelocType::GPREL16, "GPREL16"}, {PsyqRelocType::REL32_BE, "REL32 BE"},
770-
{PsyqRelocType::REL26_BE, "REL26 BE"}, {PsyqRelocType::HI16_BE, "HI16 BE"},
777+
{PsyqRelocType::REL32, "REL32"}, {PsyqRelocType::REL26, "REL26"},
778+
{PsyqRelocType::HI16, "HI16"}, {PsyqRelocType::LO16, "LO16"},
779+
{PsyqRelocType::GPREL16, "GPREL16"}, {PsyqRelocType::GPREL16_LE, "GPREL16 LE"},
780+
{PsyqRelocType::GPREL16_BE, "GPREL16 BE"}, {PsyqRelocType::REL32_BE, "REL32 BE"},
781+
{PsyqRelocType::REL26_BE, "REL26 BE"}, {PsyqRelocType::HI16_BE, "HI16 BE"},
771782
{PsyqRelocType::LO16_BE, "LO16 BE"},
772783
};
773784
fmt::print(" {:8} {:>12}::{:08x} ", typeStr.find(type)->second, sec->name, offset);
@@ -994,6 +1005,8 @@ static const std::map<PsyqRelocType, elf_mips_reloc_type> typeMap = {
9941005
{PsyqRelocType::HI16, elf_mips_reloc_type::R_MIPS_HI16},
9951006
{PsyqRelocType::LO16, elf_mips_reloc_type::R_MIPS_LO16},
9961007
{PsyqRelocType::GPREL16, elf_mips_reloc_type::R_MIPS_GPREL16},
1008+
{PsyqRelocType::GPREL16_LE, elf_mips_reloc_type::R_MIPS_GPREL16},
1009+
{PsyqRelocType::GPREL16_BE, elf_mips_reloc_type::R_MIPS_GPREL16},
9971010
{PsyqRelocType::REL26_BE, elf_mips_reloc_type::R_MIPS_26},
9981011
{PsyqRelocType::HI16_BE, elf_mips_reloc_type::R_MIPS_HI16},
9991012
{PsyqRelocType::LO16_BE, elf_mips_reloc_type::R_MIPS_LO16},
@@ -1182,7 +1195,7 @@ bool PsyqLnkFile::Relocation::generateElf(ElfRelocationPass pass, const std::str
11821195
}
11831196
elfSym = symbol->elfSym;
11841197
}
1185-
if (type == PsyqRelocType::HI16_BE || type == PsyqRelocType::LO16_BE) {
1198+
if (type == PsyqRelocType::HI16_BE || type == PsyqRelocType::LO16_BE || type == PsyqRelocType::GPREL16_BE) {
11861199
offset -= 0x2;
11871200
}
11881201
auto elfType = typeMap.find(type);
@@ -1230,6 +1243,18 @@ bool PsyqLnkFile::Relocation::generateElf(ElfRelocationPass pass, const std::str
12301243
sectionData[offset + 1] = 0;
12311244
break;
12321245
}
1246+
case PsyqRelocType::GPREL16_LE: {
1247+
uint16_t lo = symbolOffset & 0xFFFF;
1248+
sectionData[offset + 0] = (uint8_t)(lo >> 0);
1249+
sectionData[offset + 1] = (uint8_t)(lo >> 8);
1250+
break;
1251+
}
1252+
case PsyqRelocType::GPREL16_BE: {
1253+
uint16_t lo = symbolOffset & 0xFFFF;
1254+
sectionData[offset + 3] = (uint8_t)(lo >> 0);
1255+
sectionData[offset + 2] = (uint8_t)(lo >> 8);
1256+
break;
1257+
}
12331258
case PsyqRelocType::REL32_BE: {
12341259
sectionData[offset + 3] = (uint8_t)(symbolOffset >> 0x00);
12351260
sectionData[offset + 2] = (uint8_t)(symbolOffset >> 0x08);
@@ -1300,6 +1325,7 @@ bool PsyqLnkFile::Relocation::generateElf(ElfRelocationPass pass, const std::str
13001325
case PsyqExprOpcode::SECTION_BASE: {
13011326
return localSymbolReloc(expr->sectionIndex, 0);
13021327
}
1328+
case PsyqExprOpcode::SECTION_START:
13031329
case PsyqExprOpcode::SYMBOL: {
13041330
if (pass == ElfRelocationPass::PASS1) {
13051331
skipped.skipped = true;
@@ -1425,6 +1451,16 @@ bool PsyqLnkFile::Relocation::generateElf(ElfRelocationPass pass, const std::str
14251451
} else {
14261452
return check(expression->left.get(), -((int32_t)expression->right->value));
14271453
}
1454+
} else if (expression->right->type == PsyqExprOpcode::SECTION_START) {
1455+
// Why
1456+
if (expression->left->type == PsyqExprOpcode::ADD) {
1457+
if (expression->left->left->type == PsyqExprOpcode::VALUE) {
1458+
return check(expression->left->right.get(),
1459+
expression->left->left->value - expression->right->value);
1460+
}
1461+
} else {
1462+
return checkZero(expression->left.get());
1463+
}
14281464
} else {
14291465
psyq->setElfConversionError("Unsupported SUB operation in relocation");
14301466
return false;

0 commit comments

Comments
 (0)