Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Build System Rewrite] Linkerscript now tracks RAM/ROM usage #1952

Merged
merged 2 commits into from
Nov 23, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ sound/**/*.bin
sound/songs/midi/*.s
tools/agbcc
*.map
*.ld
*.bat
*.dump
*.sa*
Expand Down
9 changes: 4 additions & 5 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -119,8 +119,6 @@ ifneq ($(MODERN),1)
CPPFLAGS += -I tools/agbcc/include -I tools/agbcc -nostdinc -undef
endif

LDFLAGS = -Map ../../$(MAP)

SHA1 := $(shell { command -v sha1sum || command -v shasum; } 2>/dev/null) -c
GFX := tools/gbagfx/gbagfx$(EXE)
AIF := tools/aif2pcm/aif2pcm$(EXE)
Expand Down Expand Up @@ -406,19 +404,20 @@ $(OBJ_DIR)/sym_ewram.ld: sym_ewram.txt
$(RAMSCRGEN) ewram_data $< ENGLISH > $@

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
else
LD_SCRIPT := ld_script_modern.txt
LD_SCRIPT := ld_script_modern.ld
LD_SCRIPT_DEPS :=
endif

$(OBJ_DIR)/ld_script.ld: $(LD_SCRIPT) $(LD_SCRIPT_DEPS)
cd $(OBJ_DIR) && sed "s#tools/#../../tools/#g" ../../$(LD_SCRIPT) > ld_script.ld

LDFLAGS = -Map ../../$(MAP)
$(ELF): $(OBJ_DIR)/ld_script.ld $(OBJS) libagbsyscall
@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

$(ROM): $(ELF)
Expand Down
3 changes: 3 additions & 0 deletions gflib/malloc.c
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
#include "global.h"
#include "malloc.h"

static void *sHeapStart;
static u32 sHeapSize;

__attribute__((section("__EWRAM_HEAP"))) u8 gHeap[HEAP_SIZE] = {0};
Icedude907 marked this conversation as resolved.
Show resolved Hide resolved

#define MALLOC_SYSTEM_ID 0xA3A3

struct MemBlock {
Expand Down
3 changes: 2 additions & 1 deletion gflib/malloc.h
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
#ifndef GUARD_ALLOC_H
#define GUARD_ALLOC_H

#define HEAP_SIZE 0x1C000

#define FREE_AND_SET_NULL(ptr) \
{ \
Expand All @@ -11,6 +10,8 @@

#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
Icedude907 marked this conversation as resolved.
Show resolved Hide resolved
#define HEAP_SIZE 0x1C000
extern u8 gHeap[];

void *Alloc(u32 size);
Expand Down
50 changes: 25 additions & 25 deletions ld_script.txt → ld_script.ld
Original file line number Diff line number Diff line change
Expand Up @@ -3,35 +3,36 @@ ENTRY(Start)
gNumMusicPlayers = 4;
gMaxLines = 0;

MEMORY
{
EWRAM (rwx) : ORIGIN = 0x2000000, LENGTH = 256K
IWRAM (rwx) : ORIGIN = 0x3000000, LENGTH = 32K
ROM (rx) : ORIGIN = 0x8000000, LENGTH = 16M
Icedude907 marked this conversation as resolved.
Show resolved Hide resolved
}

/* 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. */

__anim_mon_load_address = 0x8b00000;
__gfx_load_address = 0x8c00000;

SECTIONS {
. = 0x2000000;

ewram (NOLOAD) :
ewram 0x2000000 (NOLOAD) :
ALIGN(4)
{
gHeap = .;

. = 0x1C000;
*(__EWRAM_HEAP);

INCLUDE "sym_ewram.ld"
src/*.o(ewram_data);
gflib/*.o(ewram_data);
src/*.o(ewram_data); /**/
gflib/*.o(ewram_data); /**/

*libc.a:impure.o(.data);
*libc.a:locale.o(.data);
*libc.a:mallocr.o(.data);
. = 0x40000;
}

. = 0x3000000;
} > EWRAM

iwram (NOLOAD) :
iwram 0x3000000 (NOLOAD) :
ALIGN(4)
{
/* .bss starts at 0x3000000 */
Expand All @@ -46,10 +47,9 @@ SECTIONS {
/* COMMON starts at 0x30022A8 */
INCLUDE "sym_common.ld"
*libc.a:sbrkr.o(COMMON);
end = .;
. = 0x8000;
}
} > IWRAM

/* BEGIN ROM DATA */
. = 0x8000000;

.text :
Expand Down Expand Up @@ -343,7 +343,7 @@ SECTIONS {
src/gym_leader_rematch.o(.text);
src/battle_transition_frontier.o(.text);
src/international_string_util.o(.text);
} =0
} > ROM =0

script_data :
ALIGN(4)
Expand All @@ -356,7 +356,7 @@ SECTIONS {
data/battle_ai_scripts.o(script_data);
data/contest_ai_scripts.o(script_data);
data/mystery_event_script_cmd_table.o(script_data);
} =0
} > ROM =0

lib_text :
ALIGN(4)
Expand Down Expand Up @@ -440,7 +440,7 @@ SECTIONS {
*libc.a:libcfunc.o(.text);
*libc.a:lseekr.o(.text);
*libc.a:readr.o(.text);
} =0
} > ROM =0

.rodata :
ALIGN(4)
Expand Down Expand Up @@ -705,7 +705,7 @@ SECTIONS {
data/mystery_gift.o(.rodata);
src/m4a_tables.o(.rodata);
data/sound_data.o(.rodata);
} =0
} > ROM =0

song_data :
ALIGN(4)
Expand Down Expand Up @@ -1240,7 +1240,7 @@ SECTIONS {
sound/songs/midi/ph_nurse_blend.o(.rodata);
sound/songs/midi/ph_nurse_held.o(.rodata);
sound/songs/midi/ph_nurse_solo.o(.rodata);
} =0
} > ROM =0

lib_rodata :
SUBALIGN(4)
Expand Down Expand Up @@ -1293,27 +1293,27 @@ SECTIONS {
*libc.a:lseekr.o(.rodata);
*libc.a:readr.o(.rodata);
src/libisagbprn.o(.rodata);
} =0
} > ROM =0

multiboot_data :
ALIGN(4)
{
data/multiboot_ereader.o(.rodata);
data/multiboot_berry_glitch_fix.o(.rodata);
data/multiboot_pokemon_colosseum.o(.rodata);
} =0
} > ROM =0

anim_mon_front_pic_data __anim_mon_load_address :
ALIGN(4)
{
src/anim_mon_front_pics.o(.rodata);
} =0
} > ROM =0

gfx_data __gfx_load_address :
ALIGN(4)
{
src/graphics.o(.rodata);
} =0
} > ROM =0

extra :
ALIGN(4)
Expand All @@ -1323,7 +1323,7 @@ SECTIONS {
src/*.o(.rodata);
gflib/*.o(.rodata);
data/*.o(.rodata);
} = 0
} > ROM = 0

/* DWARF debug sections.
Symbols in the DWARF debugging sections are relative to the beginning
Expand Down
55 changes: 27 additions & 28 deletions ld_script_modern.txt → ld_script_modern.ld
Original file line number Diff line number Diff line change
Expand Up @@ -3,28 +3,28 @@ ENTRY(Start)
gNumMusicPlayers = 4;
gMaxLines = 0;

/* Memory Spaces */
MEMORY
Icedude907 marked this conversation as resolved.
Show resolved Hide resolved
{
EWRAM (rwx) : ORIGIN = 0x2000000, LENGTH = 256K
IWRAM (rwx) : ORIGIN = 0x3000000, LENGTH = 32K
ROM (rx) : ORIGIN = 0x8000000, LENGTH = 16M
}

SECTIONS {
. = 0x2000000;

ewram (NOLOAD) :
ewram 0x2000000 (NOLOAD) :
ALIGN(4)
{
gHeap = .;

. = 0x1C000;

src/*.o(ewram_data);
gflib/*.o(ewram_data);
*(__EWRAM_HEAP);

. = 0x40000;
}

. = 0x3000000;
src/*.o(ewram_data); /**/
gflib/*.o(ewram_data); /**/
} > EWRAM

iwram (NOLOAD) :
iwram 0x3000000 (NOLOAD) :
ALIGN(4)
{
/* .bss starts at 0x3000000 */
src/*.o(.bss);
gflib/*.o(.bss);
data/*.o(.bss);
Expand All @@ -35,14 +35,13 @@ SECTIONS {
src/m4a.o(.bss.code);

/* COMMON starts at 0x30022A8 */
src/*.o(COMMON);
gflib/*.o(COMMON);
*libc.a:*.o(COMMON);
src/*.o(COMMON); /**/
gflib/*.o(COMMON); /**/
*libc.a:*.o(COMMON);
Icedude907 marked this conversation as resolved.
Show resolved Hide resolved
*libnosys.a:*.o(COMMON);
end = .;
. = 0x8000;
}
} > IWRAM

/* BEGIN ROM DATA */
. = 0x8000000;

.text :
Expand All @@ -55,13 +54,13 @@ SECTIONS {
gflib/*.o(.text*);
src/*.o(.text*);
asm/*.o(.text*);
} =0
} > ROM =0

script_data :
ALIGN(4)
{
data/*.o(script_data);
} =0
} > ROM =0

lib_text :
ALIGN(4)
Expand All @@ -82,21 +81,21 @@ SECTIONS {
*libc.a:*.o(.text*);
*libnosys.a:*.o(.text*);
src/libisagbprn.o(.text);
} =0
} > ROM =0

.rodata :
ALIGN(4)
{
src/*.o(.rodata*);
gflib/*.o(.rodata*);
data/*.o(.rodata*);
} =0
} > ROM =0

song_data :
ALIGN(4)
{
sound/songs/*.o(.rodata);
} =0
} > ROM =0

lib_rodata :
SUBALIGN(4)
Expand All @@ -121,19 +120,19 @@ SECTIONS {
data/multiboot_ereader.o(.rodata);
data/multiboot_berry_glitch_fix.o(.rodata);
data/multiboot_pokemon_colosseum.o(.rodata);
} =0
} > ROM =0

anim_mon_front_pic_data :
ALIGN(4)
{
src/anim_mon_front_pics.o(.rodata);
} =0
} > ROM =0

gfx_data :
ALIGN(4)
{
src/graphics.o(.rodata);
} =0
} > ROM =0

/* DWARF debug sections.
Symbols in the DWARF debugging sections are relative to the beginning
Expand Down