1
0
Fork 0
mirror of https://github.com/zeldaret/oot.git synced 2025-04-08 07:36:47 +00:00

Add pad_text to mkldscript and update progress.py (#1024)

* Add pad_text to mkldscript and update progress.py

Implements `pad_text` from MM and uses it instead of asm nops for the padding in ucode_disas.
Also updates `progress.py` to account for the change (RIP 1000000 code size), and to have a green badge for 100%.

* Remove 1.00mb comment in progress.py

Co-authored-by: Anghelo Carvajal <angheloalf95@gmail.com>

Co-authored-by: Anghelo Carvajal <angheloalf95@gmail.com>
This commit is contained in:
Roman971 2021-11-23 19:31:44 +01:00 committed by GitHub
parent a497f33bda
commit 8d4828a3be
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 46 additions and 37 deletions

View file

@ -1,5 +0,0 @@
glabel pad_800DACB0
/* B51E50 800DACB0 00000000 */ nop
/* B51E54 800DACB4 00000000 */ nop
/* B51E58 800DACB8 00000000 */ nop
/* B51E5C 800DACBC 00000000 */ nop

View file

@ -95,7 +95,7 @@ boot -= nonMatchingASMBoot
ovl -= nonMatchingASMOvl ovl -= nonMatchingASMOvl
bootSize = 31408 # decompilable code only bootSize = 31408 # decompilable code only
codeSize = 1000000 # decompilable code only (1.00mb) codeSize = 999984 # decompilable code only
ovlSize = 2812000 # .text sections ovlSize = 2812000 # .text sections
total = src + nonMatchingASM total = src + nonMatchingASM
@ -119,7 +119,7 @@ elif args.format == 'shield-json':
"schemaVersion": 1, "schemaVersion": 1,
"label": "progress", "label": "progress",
"message": f"{srcPct:.3g}%", "message": f"{srcPct:.3g}%",
"color": 'yellow', "color": 'yellow' if srcPct < 100 else 'brightgreen',
})) }))
elif args.format == 'text': elif args.format == 'text':
adjective = "decompiled" if not args.matching else "matched" adjective = "decompiled" if not args.matching else "matched"

1
spec
View file

@ -406,6 +406,7 @@ beginseg
include "build/src/code/fault_drawer.o" include "build/src/code/fault_drawer.o"
include "build/asm/code_800D71F0.o" include "build/asm/code_800D71F0.o"
include "build/src/code/ucode_disas.o" include "build/src/code/ucode_disas.o"
pad_text // audio library aligned to 32 bytes?
include "build/src/code/audio_data.o" include "build/src/code/audio_data.o"
include "build/src/code/audio_synthesis.o" include "build/src/code/audio_synthesis.o"
include "build/src/code/audio_heap.o" include "build/src/code/audio_heap.o"

View file

@ -1356,8 +1356,3 @@ void UCodeDisas_RegisterUCode(UCodeDisas* this, s32 count, UCodeInfo* ucodeArray
void UCodeDisas_SetCurUCode(UCodeDisas* this, void* ptr) { void UCodeDisas_SetCurUCode(UCodeDisas* this, void* ptr) {
UCodeDisas_SetCurUCodeImpl(this, ptr); UCodeDisas_SetCurUCodeImpl(this, ptr);
} }
// 4 bytes of nops, separating this file from audio_synthesis and padding .text
// to a 32-byte boundary. Unclear what this comes from... maybe the audio
// library was built separately and aligned to 32 bytes?
#pragma GLOBAL_ASM("asm/non_matchings/code/ucode_disas/pad_800DACB0.s")

View file

@ -28,6 +28,7 @@ enum
STMT_romalign, STMT_romalign,
STMT_stack, STMT_stack,
STMT_increment, STMT_increment,
STMT_pad_text,
}; };
enum enum
@ -37,6 +38,13 @@ enum
FLAG_RAW = (1 << 2), FLAG_RAW = (1 << 2),
}; };
struct Include
{
char *fpath;
int linkerPadding;
uint8_t dataWithRodata;
};
struct Segment struct Segment
{ {
uint32_t fields; uint32_t fields;
@ -50,8 +58,7 @@ struct Segment
uint32_t increment; uint32_t increment;
uint32_t entry; uint32_t entry;
uint32_t number; uint32_t number;
char **includes; struct Include *includes;
uint8_t *data_with_rodata;
int includesCount; int includesCount;
}; };
@ -184,6 +191,7 @@ static const char *const stmtNames[] =
[STMT_romalign] = "romalign", [STMT_romalign] = "romalign",
[STMT_stack] = "stack", [STMT_stack] = "stack",
[STMT_increment] = "increment", [STMT_increment] = "increment",
[STMT_pad_text] = "pad_text",
}; };
static void parse_rom_spec(char *spec) static void parse_rom_spec(char *spec)
@ -217,8 +225,9 @@ static void parse_rom_spec(char *spec)
if (currSeg != NULL) if (currSeg != NULL)
{ {
// ensure no duplicates (except for 'include') // ensure no duplicates (except for 'include' or 'pad_text')
if (stmt != STMT_include && stmt != STMT_include_data_with_rodata && (currSeg->fields & (1 << stmt))) if (stmt != STMT_include && stmt != STMT_include_data_with_rodata && stmt != STMT_pad_text &&
(currSeg->fields & (1 << stmt)))
util_fatal_error("line %i: duplicate '%s' statement", lineNum, stmtName); util_fatal_error("line %i: duplicate '%s' statement", lineNum, stmtName);
currSeg->fields |= 1 << stmt; currSeg->fields |= 1 << stmt;
@ -273,15 +282,20 @@ static void parse_rom_spec(char *spec)
case STMT_include_data_with_rodata: case STMT_include_data_with_rodata:
currSeg->includesCount++; currSeg->includesCount++;
currSeg->includes = realloc(currSeg->includes, currSeg->includesCount * sizeof(*currSeg->includes)); currSeg->includes = realloc(currSeg->includes, currSeg->includesCount * sizeof(*currSeg->includes));
currSeg->data_with_rodata = realloc(currSeg->data_with_rodata, currSeg->includesCount * sizeof(*currSeg->data_with_rodata));
currSeg->data_with_rodata[currSeg->includesCount - 1] = (stmt == STMT_include_data_with_rodata); if (!parse_quoted_string(args, &currSeg->includes[currSeg->includesCount - 1].fpath))
if (!parse_quoted_string(args, &currSeg->includes[currSeg->includesCount - 1]))
util_fatal_error("line %i: invalid filename", lineNum); util_fatal_error("line %i: invalid filename", lineNum);
currSeg->includes[currSeg->includesCount - 1].linkerPadding = 0;
currSeg->includes[currSeg->includesCount - 1].dataWithRodata = (stmt == STMT_include_data_with_rodata);
break; break;
case STMT_increment: case STMT_increment:
if (!parse_number(args, &currSeg->increment)) if (!parse_number(args, &currSeg->increment))
util_fatal_error("line %i: expected number after 'increment'", lineNum); util_fatal_error("line %i: expected number after 'increment'", lineNum);
break; break;
case STMT_pad_text:
currSeg->includes[currSeg->includesCount - 1].linkerPadding += 0x10;
break;
default: default:
fprintf(stderr, "warning: '%s' is not implemented\n", stmtName); fprintf(stderr, "warning: '%s' is not implemented\n", stmtName);
break; break;
@ -356,7 +370,11 @@ static void write_ld_script(void)
fprintf(fout, " . = ALIGN(0x%X);\n", seg->align); fprintf(fout, " . = ALIGN(0x%X);\n", seg->align);
for (j = 0; j < seg->includesCount; j++) for (j = 0; j < seg->includesCount; j++)
fprintf(fout, " %s (.text)\n", seg->includes[j]); {
fprintf(fout, " %s (.text)\n", seg->includes[j].fpath);
if (seg->includes[j].linkerPadding != 0)
fprintf(fout, " . += 0x%X;\n", seg->includes[j].linkerPadding);
}
fprintf(fout, " _%sSegmentTextEnd = .;\n", seg->name); fprintf(fout, " _%sSegmentTextEnd = .;\n", seg->name);
@ -366,16 +384,16 @@ static void write_ld_script(void)
for (j = 0; j < seg->includesCount; j++) for (j = 0; j < seg->includesCount; j++)
{ {
if (!seg->data_with_rodata[j]) if (!seg->includes[j].dataWithRodata)
fprintf(fout, " %s (.data)\n", seg->includes[j]); fprintf(fout, " %s (.data)\n", seg->includes[j].fpath);
} }
/* /*
for (j = 0; j < seg->includesCount; j++) for (j = 0; j < seg->includesCount; j++)
fprintf(fout, " %s (.rodata)\n", seg->includes[j]); fprintf(fout, " %s (.rodata)\n", seg->includes[j].fpath);
for (j = 0; j < seg->includesCount; j++) for (j = 0; j < seg->includesCount; j++)
fprintf(fout, " %s (.sdata)\n", seg->includes[j]); fprintf(fout, " %s (.sdata)\n", seg->includes[j].fpath);
*/ */
//fprintf(fout, " . = ALIGN(0x10);\n"); //fprintf(fout, " . = ALIGN(0x10);\n");
@ -387,9 +405,9 @@ static void write_ld_script(void)
for (j = 0; j < seg->includesCount; j++) for (j = 0; j < seg->includesCount; j++)
{ {
if (seg->data_with_rodata[j]) if (seg->includes[j].dataWithRodata)
fprintf(fout, " %s (.data)\n", seg->includes[j]); fprintf(fout, " %s (.data)\n", seg->includes[j].fpath);
fprintf(fout, " %s (.rodata)\n", seg->includes[j]); fprintf(fout, " %s (.rodata)\n", seg->includes[j].fpath);
// Compilers other than IDO, such as GCC, produce different sections such as // Compilers other than IDO, such as GCC, produce different sections such as
// the ones named directly below. These sections do not contain values that // the ones named directly below. These sections do not contain values that
// need relocating, but we need to ensure that the base .rodata section // need relocating, but we need to ensure that the base .rodata section
@ -398,9 +416,9 @@ static void write_ld_script(void)
// the beginning of the entire rodata area in order to remain consistent. // the beginning of the entire rodata area in order to remain consistent.
// Inconsistencies will lead to various .rodata reloc crashes as a result of // Inconsistencies will lead to various .rodata reloc crashes as a result of
// either missing relocs or wrong relocs. // either missing relocs or wrong relocs.
fprintf(fout, " %s (.rodata.str1.4)\n", seg->includes[j]); fprintf(fout, " %s (.rodata.str1.4)\n", seg->includes[j].fpath);
fprintf(fout, " %s (.rodata.cst4)\n", seg->includes[j]); fprintf(fout, " %s (.rodata.cst4)\n", seg->includes[j].fpath);
fprintf(fout, " %s (.rodata.cst8)\n", seg->includes[j]); fprintf(fout, " %s (.rodata.cst8)\n", seg->includes[j].fpath);
} }
//fprintf(fout, " . = ALIGN(0x10);\n"); //fprintf(fout, " . = ALIGN(0x10);\n");
@ -412,7 +430,7 @@ static void write_ld_script(void)
fprintf(fout, " _%sSegmentSDataStart = .;\n", seg->name); fprintf(fout, " _%sSegmentSDataStart = .;\n", seg->name);
for (j = 0; j < seg->includesCount; j++) for (j = 0; j < seg->includesCount; j++)
fprintf(fout, " %s (.sdata)\n", seg->includes[j]); fprintf(fout, " %s (.sdata)\n", seg->includes[j].fpath);
fprintf(fout, " . = ALIGN(0x10);\n"); fprintf(fout, " . = ALIGN(0x10);\n");
@ -421,7 +439,7 @@ static void write_ld_script(void)
fprintf(fout, " _%sSegmentOvlStart = .;\n", seg->name); fprintf(fout, " _%sSegmentOvlStart = .;\n", seg->name);
for (j = 0; j < seg->includesCount; j++) for (j = 0; j < seg->includesCount; j++)
fprintf(fout, " %s (.ovl)\n", seg->includes[j]); fprintf(fout, " %s (.ovl)\n", seg->includes[j].fpath);
fprintf(fout, " . = ALIGN(0x10);\n"); fprintf(fout, " . = ALIGN(0x10);\n");
@ -453,13 +471,13 @@ static void write_ld_script(void)
if (seg->fields & (1 << STMT_align)) if (seg->fields & (1 << STMT_align))
fprintf(fout, " . = ALIGN(0x%X);\n", seg->align); fprintf(fout, " . = ALIGN(0x%X);\n", seg->align);
for (j = 0; j < seg->includesCount; j++) for (j = 0; j < seg->includesCount; j++)
fprintf(fout, " %s (.sbss)\n", seg->includes[j]); fprintf(fout, " %s (.sbss)\n", seg->includes[j].fpath);
for (j = 0; j < seg->includesCount; j++) for (j = 0; j < seg->includesCount; j++)
fprintf(fout, " %s (.scommon)\n", seg->includes[j]); fprintf(fout, " %s (.scommon)\n", seg->includes[j].fpath);
for (j = 0; j < seg->includesCount; j++) for (j = 0; j < seg->includesCount; j++)
fprintf(fout, " %s (.bss)\n", seg->includes[j]); fprintf(fout, " %s (.bss)\n", seg->includes[j].fpath);
for (j = 0; j < seg->includesCount; j++) for (j = 0; j < seg->includesCount; j++)
fprintf(fout, " %s (COMMON)\n", seg->includes[j]); fprintf(fout, " %s (COMMON)\n", seg->includes[j].fpath);
fprintf(fout, " . = ALIGN(0x10);\n" fprintf(fout, " . = ALIGN(0x10);\n"
" _%sSegmentBssEnd = .;\n" " _%sSegmentBssEnd = .;\n"
" _%sSegmentEnd = .;\n" " _%sSegmentEnd = .;\n"
@ -478,7 +496,7 @@ static void write_ld_script(void)
//fprintf(fout, " _%sSegmentOvlStart = .;\n", seg->name); //fprintf(fout, " _%sSegmentOvlStart = .;\n", seg->name);
//for (j = 0; j < seg->includesCount; j++) //for (j = 0; j < seg->includesCount; j++)
// fprintf(fout, " %s (.ovl)\n", seg->includes[j]); // fprintf(fout, " %s (.ovl)\n", seg->includes[j].fpath);
////fprintf(fout, " . = ALIGN(0x10);\n"); ////fprintf(fout, " . = ALIGN(0x10);\n");