Linkerscript now tracks RAM/ROM usage

This commit is contained in:
Icedude907 2023-11-12 15:19:50 +13:00
parent 12a64fecb4
commit a0bf504bc1
6 changed files with 64 additions and 63 deletions

1
.gitignore vendored
View file

@ -21,7 +21,6 @@ sound/**/*.bin
sound/songs/midi/*.s sound/songs/midi/*.s
tools/agbcc tools/agbcc
*.map *.map
*.ld
*.bat *.bat
*.dump *.dump
*.sa* *.sa*

View file

@ -119,8 +119,6 @@ ifneq ($(MODERN),1)
CPPFLAGS += -I tools/agbcc/include -I tools/agbcc -nostdinc -undef CPPFLAGS += -I tools/agbcc/include -I tools/agbcc -nostdinc -undef
endif endif
LDFLAGS = -Map ../../$(MAP)
SHA1 := $(shell { command -v sha1sum || command -v shasum; } 2>/dev/null) -c SHA1 := $(shell { command -v sha1sum || command -v shasum; } 2>/dev/null) -c
GFX := tools/gbagfx/gbagfx$(EXE) GFX := tools/gbagfx/gbagfx$(EXE)
AIF := tools/aif2pcm/aif2pcm$(EXE) AIF := tools/aif2pcm/aif2pcm$(EXE)
@ -406,19 +404,20 @@ $(OBJ_DIR)/sym_ewram.ld: sym_ewram.txt
$(RAMSCRGEN) ewram_data $< ENGLISH > $@ $(RAMSCRGEN) ewram_data $< ENGLISH > $@
ifeq ($(MODERN),0) ifeq ($(MODERN),0)
LD_SCRIPT := ld_script.txt LD_SCRIPT := ld_script.ld
LD_SCRIPT_DEPS := $(OBJ_DIR)/sym_bss.ld $(OBJ_DIR)/sym_common.ld $(OBJ_DIR)/sym_ewram.ld LD_SCRIPT_DEPS := $(OBJ_DIR)/sym_bss.ld $(OBJ_DIR)/sym_common.ld $(OBJ_DIR)/sym_ewram.ld
else else
LD_SCRIPT := ld_script_modern.txt LD_SCRIPT := ld_script_modern.ld
LD_SCRIPT_DEPS := LD_SCRIPT_DEPS :=
endif endif
$(OBJ_DIR)/ld_script.ld: $(LD_SCRIPT) $(LD_SCRIPT_DEPS) $(OBJ_DIR)/ld_script.ld: $(LD_SCRIPT) $(LD_SCRIPT_DEPS)
cd $(OBJ_DIR) && sed "s#tools/#../../tools/#g" ../../$(LD_SCRIPT) > ld_script.ld cd $(OBJ_DIR) && sed "s#tools/#../../tools/#g" ../../$(LD_SCRIPT) > ld_script.ld
LDFLAGS = -Map ../../$(MAP)
$(ELF): $(OBJ_DIR)/ld_script.ld $(OBJS) libagbsyscall $(ELF): $(OBJ_DIR)/ld_script.ld $(OBJS) libagbsyscall
@echo "cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -T ld_script.ld -o ../../$@ <objects> <lib>" @echo "cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -T ld_script.ld -o ../../$@ <objects> <lib>"
@cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -T ld_script.ld -o ../../$@ $(OBJS_REL) $(LIB) @cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -T ld_script.ld --print-memory-usage -o ../../$@ $(OBJS_REL) $(LIB) | cat
$(FIX) $@ -t"$(TITLE)" -c$(GAME_CODE) -m$(MAKER_CODE) -r$(REVISION) --silent $(FIX) $@ -t"$(TITLE)" -c$(GAME_CODE) -m$(MAKER_CODE) -r$(REVISION) --silent
$(ROM): $(ELF) $(ROM): $(ELF)

View file

@ -1,8 +1,11 @@
#include "global.h" #include "global.h"
#include "malloc.h"
static void *sHeapStart; static void *sHeapStart;
static u32 sHeapSize; static u32 sHeapSize;
__attribute__((section("__EWRAM_HEAP"))) u8 gHeap[HEAP_SIZE] = {0};
#define MALLOC_SYSTEM_ID 0xA3A3 #define MALLOC_SYSTEM_ID 0xA3A3
struct MemBlock { struct MemBlock {

View file

@ -1,7 +1,6 @@
#ifndef GUARD_ALLOC_H #ifndef GUARD_ALLOC_H
#define GUARD_ALLOC_H #define GUARD_ALLOC_H
#define HEAP_SIZE 0x1C000
#define FREE_AND_SET_NULL(ptr) \ #define FREE_AND_SET_NULL(ptr) \
{ \ { \
@ -11,6 +10,8 @@
#define TRY_FREE_AND_SET_NULL(ptr) if (ptr != NULL) FREE_AND_SET_NULL(ptr) #define TRY_FREE_AND_SET_NULL(ptr) if (ptr != NULL) FREE_AND_SET_NULL(ptr)
// 122 KB. Max size of the heap without running into other data
#define HEAP_SIZE 0x1C000
extern u8 gHeap[]; extern u8 gHeap[];
void *Alloc(u32 size); void *Alloc(u32 size);

View file

@ -3,6 +3,13 @@ ENTRY(Start)
gNumMusicPlayers = 4; gNumMusicPlayers = 4;
gMaxLines = 0; gMaxLines = 0;
MEMORY
{
EWRAM (rwx) : ORIGIN = 0x2000000, LENGTH = 256K
IWRAM (rwx) : ORIGIN = 0x3000000, LENGTH = 32K
ROM (rx) : ORIGIN = 0x8000000, LENGTH = 16M
}
/* Modify the following load addresses as needed to make more room. Alternately, delete both the /* Modify the following load addresses as needed to make more room. Alternately, delete both the
declarations below and their references further down to get rid of the gaps. */ declarations below and their references further down to get rid of the gaps. */
@ -10,28 +17,22 @@ __anim_mon_load_address = 0x8b00000;
__gfx_load_address = 0x8c00000; __gfx_load_address = 0x8c00000;
SECTIONS { SECTIONS {
. = 0x2000000;
ewram (NOLOAD) : ewram 0x2000000 (NOLOAD) :
ALIGN(4) ALIGN(4)
{ {
gHeap = .; *(__EWRAM_HEAP);
. = 0x1C000;
INCLUDE "sym_ewram.ld" INCLUDE "sym_ewram.ld"
src/*.o(ewram_data); src/*.o(ewram_data); /**/
gflib/*.o(ewram_data); gflib/*.o(ewram_data); /**/
*libc.a:impure.o(.data); *libc.a:impure.o(.data);
*libc.a:locale.o(.data); *libc.a:locale.o(.data);
*libc.a:mallocr.o(.data); *libc.a:mallocr.o(.data);
. = 0x40000; } > EWRAM
}
. = 0x3000000; iwram 0x3000000 (NOLOAD) :
iwram (NOLOAD) :
ALIGN(4) ALIGN(4)
{ {
/* .bss starts at 0x3000000 */ /* .bss starts at 0x3000000 */
@ -46,10 +47,9 @@ SECTIONS {
/* COMMON starts at 0x30022A8 */ /* COMMON starts at 0x30022A8 */
INCLUDE "sym_common.ld" INCLUDE "sym_common.ld"
*libc.a:sbrkr.o(COMMON); *libc.a:sbrkr.o(COMMON);
end = .; } > IWRAM
. = 0x8000;
}
/* BEGIN ROM DATA */
. = 0x8000000; . = 0x8000000;
.text : .text :
@ -343,7 +343,7 @@ SECTIONS {
src/gym_leader_rematch.o(.text); src/gym_leader_rematch.o(.text);
src/battle_transition_frontier.o(.text); src/battle_transition_frontier.o(.text);
src/international_string_util.o(.text); src/international_string_util.o(.text);
} =0 } > ROM =0
script_data : script_data :
ALIGN(4) ALIGN(4)
@ -356,7 +356,7 @@ SECTIONS {
data/battle_ai_scripts.o(script_data); data/battle_ai_scripts.o(script_data);
data/contest_ai_scripts.o(script_data); data/contest_ai_scripts.o(script_data);
data/mystery_event_script_cmd_table.o(script_data); data/mystery_event_script_cmd_table.o(script_data);
} =0 } > ROM =0
lib_text : lib_text :
ALIGN(4) ALIGN(4)
@ -440,7 +440,7 @@ SECTIONS {
*libc.a:libcfunc.o(.text); *libc.a:libcfunc.o(.text);
*libc.a:lseekr.o(.text); *libc.a:lseekr.o(.text);
*libc.a:readr.o(.text); *libc.a:readr.o(.text);
} =0 } > ROM =0
.rodata : .rodata :
ALIGN(4) ALIGN(4)
@ -705,7 +705,7 @@ SECTIONS {
data/mystery_gift.o(.rodata); data/mystery_gift.o(.rodata);
src/m4a_tables.o(.rodata); src/m4a_tables.o(.rodata);
data/sound_data.o(.rodata); data/sound_data.o(.rodata);
} =0 } > ROM =0
song_data : song_data :
ALIGN(4) ALIGN(4)
@ -1240,7 +1240,7 @@ SECTIONS {
sound/songs/midi/ph_nurse_blend.o(.rodata); sound/songs/midi/ph_nurse_blend.o(.rodata);
sound/songs/midi/ph_nurse_held.o(.rodata); sound/songs/midi/ph_nurse_held.o(.rodata);
sound/songs/midi/ph_nurse_solo.o(.rodata); sound/songs/midi/ph_nurse_solo.o(.rodata);
} =0 } > ROM =0
lib_rodata : lib_rodata :
SUBALIGN(4) SUBALIGN(4)
@ -1293,7 +1293,7 @@ SECTIONS {
*libc.a:lseekr.o(.rodata); *libc.a:lseekr.o(.rodata);
*libc.a:readr.o(.rodata); *libc.a:readr.o(.rodata);
src/libisagbprn.o(.rodata); src/libisagbprn.o(.rodata);
} =0 } > ROM =0
multiboot_data : multiboot_data :
ALIGN(4) ALIGN(4)
@ -1301,19 +1301,19 @@ SECTIONS {
data/multiboot_ereader.o(.rodata); data/multiboot_ereader.o(.rodata);
data/multiboot_berry_glitch_fix.o(.rodata); data/multiboot_berry_glitch_fix.o(.rodata);
data/multiboot_pokemon_colosseum.o(.rodata); data/multiboot_pokemon_colosseum.o(.rodata);
} =0 } > ROM =0
anim_mon_front_pic_data __anim_mon_load_address : anim_mon_front_pic_data __anim_mon_load_address :
ALIGN(4) ALIGN(4)
{ {
src/anim_mon_front_pics.o(.rodata); src/anim_mon_front_pics.o(.rodata);
} =0 } > ROM =0
gfx_data __gfx_load_address : gfx_data __gfx_load_address :
ALIGN(4) ALIGN(4)
{ {
src/graphics.o(.rodata); src/graphics.o(.rodata);
} =0 } > ROM =0
extra : extra :
ALIGN(4) ALIGN(4)
@ -1323,7 +1323,7 @@ SECTIONS {
src/*.o(.rodata); src/*.o(.rodata);
gflib/*.o(.rodata); gflib/*.o(.rodata);
data/*.o(.rodata); data/*.o(.rodata);
} = 0 } > ROM = 0
/* DWARF debug sections. /* DWARF debug sections.
Symbols in the DWARF debugging sections are relative to the beginning Symbols in the DWARF debugging sections are relative to the beginning

View file

@ -3,28 +3,28 @@ ENTRY(Start)
gNumMusicPlayers = 4; gNumMusicPlayers = 4;
gMaxLines = 0; gMaxLines = 0;
SECTIONS { /* Memory Spaces */
. = 0x2000000; MEMORY
{
ewram (NOLOAD) : EWRAM (rwx) : ORIGIN = 0x2000000, LENGTH = 256K
ALIGN(4) IWRAM (rwx) : ORIGIN = 0x3000000, LENGTH = 32K
{ ROM (rx) : ORIGIN = 0x8000000, LENGTH = 16M
gHeap = .;
. = 0x1C000;
src/*.o(ewram_data);
gflib/*.o(ewram_data);
. = 0x40000;
} }
. = 0x3000000; SECTIONS {
iwram (NOLOAD) : ewram 0x2000000 (NOLOAD) :
ALIGN(4)
{
*(__EWRAM_HEAP);
src/*.o(ewram_data); /**/
gflib/*.o(ewram_data); /**/
} > EWRAM
iwram 0x3000000 (NOLOAD) :
ALIGN(4) ALIGN(4)
{ {
/* .bss starts at 0x3000000 */
src/*.o(.bss); src/*.o(.bss);
gflib/*.o(.bss); gflib/*.o(.bss);
data/*.o(.bss); data/*.o(.bss);
@ -35,14 +35,13 @@ SECTIONS {
src/m4a.o(.bss.code); src/m4a.o(.bss.code);
/* COMMON starts at 0x30022A8 */ /* COMMON starts at 0x30022A8 */
src/*.o(COMMON); src/*.o(COMMON); /**/
gflib/*.o(COMMON); gflib/*.o(COMMON); /**/
*libc.a:*.o(COMMON); *libc.a:*.o(COMMON);
*libnosys.a:*.o(COMMON); *libnosys.a:*.o(COMMON);
end = .; } > IWRAM
. = 0x8000;
}
/* BEGIN ROM DATA */
. = 0x8000000; . = 0x8000000;
.text : .text :
@ -55,13 +54,13 @@ SECTIONS {
gflib/*.o(.text*); gflib/*.o(.text*);
src/*.o(.text*); src/*.o(.text*);
asm/*.o(.text*); asm/*.o(.text*);
} =0 } > ROM =0
script_data : script_data :
ALIGN(4) ALIGN(4)
{ {
data/*.o(script_data); data/*.o(script_data);
} =0 } > ROM =0
lib_text : lib_text :
ALIGN(4) ALIGN(4)
@ -82,7 +81,7 @@ SECTIONS {
*libc.a:*.o(.text*); *libc.a:*.o(.text*);
*libnosys.a:*.o(.text*); *libnosys.a:*.o(.text*);
src/libisagbprn.o(.text); src/libisagbprn.o(.text);
} =0 } > ROM =0
.rodata : .rodata :
ALIGN(4) ALIGN(4)
@ -90,13 +89,13 @@ SECTIONS {
src/*.o(.rodata*); src/*.o(.rodata*);
gflib/*.o(.rodata*); gflib/*.o(.rodata*);
data/*.o(.rodata*); data/*.o(.rodata*);
} =0 } > ROM =0
song_data : song_data :
ALIGN(4) ALIGN(4)
{ {
sound/songs/*.o(.rodata); sound/songs/*.o(.rodata);
} =0 } > ROM =0
lib_rodata : lib_rodata :
SUBALIGN(4) SUBALIGN(4)
@ -121,19 +120,19 @@ SECTIONS {
data/multiboot_ereader.o(.rodata); data/multiboot_ereader.o(.rodata);
data/multiboot_berry_glitch_fix.o(.rodata); data/multiboot_berry_glitch_fix.o(.rodata);
data/multiboot_pokemon_colosseum.o(.rodata); data/multiboot_pokemon_colosseum.o(.rodata);
} =0 } > ROM =0
anim_mon_front_pic_data : anim_mon_front_pic_data :
ALIGN(4) ALIGN(4)
{ {
src/anim_mon_front_pics.o(.rodata); src/anim_mon_front_pics.o(.rodata);
} =0 } > ROM =0
gfx_data : gfx_data :
ALIGN(4) ALIGN(4)
{ {
src/graphics.o(.rodata); src/graphics.o(.rodata);
} =0 } > ROM =0
/* DWARF debug sections. /* DWARF debug sections.
Symbols in the DWARF debugging sections are relative to the beginning Symbols in the DWARF debugging sections are relative to the beginning