Linkerscript now tracks RAM/ROM usage
This commit is contained in:
parent
12a64fecb4
commit
a0bf504bc1
6 changed files with 64 additions and 63 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -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*
|
||||||
|
|
9
Makefile
9
Makefile
|
@ -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)
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
|
@ -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
|
Loading…
Reference in a new issue