# Functions that cannot be carved into their own delink object, by symbol name.
# tools/enroll.py skips these; their address ranges stay inside the module's gap
# object, so the ROM build still covers them - just not from a separate file.
# Lines starting with '#' are comments.

# --- main: the 0x0206d9dc / 0x0206da28 secondary-entry-point cluster ---
# func_0206ce90, func_0206cee0 and func_0206d868 arm_call 0x0206d9dc and 0x0206da28.
# Neither address has a symbol: they are secondary entry points 0x10 bytes inside
# func_0206d9cc and func_0206da18. dsd names such a target with a local label
# (.L_0206d9dc), and a local label cannot be referenced from outside the object that
# defines it:
#   "Imported symbol .L_0206d9dc ... is local, it cannot be used in relocation"
# So the callers and the targets must stay in one object. Excluding just the three
# callers is not enough - carving any function between them splits the span - so the
# whole run from the first caller to the last target stays in the gap.
# Giving 0x0206d9dc and 0x0206da28 real symbols in config/arm9/symbols.txt would
# recover all twelve.
func_0206ce90
func_0206cec0
func_0206cee0
func_0206cf7c
func_0206cf98
func_0206d32c
func_0206d868
func_0206d890
func_0206d8c4
func_0206d940
func_0206d9cc
func_0206da18

# --- rejected by mwldarm despite passing eligibility ---
# _ZN17dExtShadowModel_c10InitCuboidEv / _ZN17dExtShadowModel_c12InitCylinderEv CAME OFF
# THIS LIST. Their SetFile calls name the model-file globals at
# 0x020ad524/0x020ad560 -- addresses past arm9's .bss that only the ov000/ov001
# symbols.txt rows define (data_ov000_*). Spelling the references by their
# overlay names lets the link resolve them; both now live folded in
# src/engine/model/dExtShadowModel_c.cpp, which also keeps their old arm9
# data_020ad524/data_020ad560 spellings out of the source.

# --- linked cleanly but produced the wrong bytes (dsd check modules) ---
# Eligibility proves an object is the right shape to drop in, never that it is
# the right content. Mostly C++ destructors differing by a single byte, where a
# deleting/complete variant resolves differently in a real relink than it does
# when linkcheck verifies the match in isolation.
#
# _ZN13daObjCloset_cD1Ev / D0Ev CAME OFF THIS LIST. They were here because the
# hand-written source wrote ((dActor_c *)c)->~dActor_c(), for which the compiler
# emits the D1 complete-object destructor where the ROM calls the D2 base-object
# one. include/daObjCloset_c.h now derives the class properly and both files are
# an empty daObjCloset_c::~daObjCloset_c(); the compiler picks D2 itself and
# the ROM build carries both. Cast-and-call is the shape to look for in whatever
# is still listed here.
CleanCommonModelDataArr
func_020313d8

# --- itcm: two unreferenced argument-swap entries that fall THROUGH into their successor ---
# 0x01ff8df8 (0x18) xor-swaps both double argument pairs and falls into func_01ff8e10
# (soft-double subtract); 0x01ffa588 (0xc) xor-swaps the single pair and falls into
# func_01ffa594. Neither has a caller anywhere: zero relocs, zero intra-ITCM branches. They
# are the library's "reverse operand" entries, correct only while they sit immediately before
# the routine they fall into. Carving them into their own delink objects would let the linker
# separate them from that successor and silently change behaviour, so they must stay inside
# the module's gap object.
#
# They carry `kind:label`, not `kind:function`, in config/arm9/itcm/symbols.txt. Declaring
# them as functions -- which an earlier revision of this branch did, purely to leave no
# unattributed gap -- fails the build outright: `dsd delink` analyses every function symbol
# and refuses an entry point that is not a prologue, exiting with
#     function func_01ff8df8 could not be analyzed: InvalidStart { ins: Eor }
# because the first instruction is `eor r1, r1, r3`. A label makes no such claim, so dsd
# leaves the bytes in the gap object -- which is exactly where this file wants them. Full
# address coverage is not worth a broken delink, and `.L_01ffadf8` (an alternate entry inside
# __aeabi_uidiv, further down the same file) already sets the precedent.
#
# No symbol names are listed below: a label can never be enrolled, so there is nothing for
# enroll.py to exclude. This block is here so the reasoning is not lost.

# --- itcm: func_01ffa440 branches into func_01ffa4bc's interior ---
# Same shape as the 0x0206d9dc cluster at the top of this file, reached from the other
# direction. func_01ffa440 (unsigned int -> float) is the twin of func_01ffa4bc (int ->
# float) immediately below it, and the assembler laid its two out-of-line tails INSIDE
# its twin's address range:
#     0x01ffa488  bne 0x01ffa558   (func_01ffa4bc + 0x9c, the enabled-trap exit)
#     0x01ffa4a0  bne 0x01ffa538   (func_01ffa4bc + 0x7c, the round-up tail)
# Both are real - they are in the ROM, and neither is reachable from func_01ffa4bc's own
# entry, because the word before each is a `bx lr`. They are one hand-written assembly
# unit: the literal pool at 0x01ffa580 that closes func_01ffa4bc's range holds 0x40000308,
# the exception code only func_01ffa440's tail loads.
#
# Neither target has a symbol, and none can be given one. src/unnamed/arm9/01ff/func_01ffa4bc.c is enrolled
# `complete`, so its compiled object - not a gap object - supplies 0x01ffa4bc..0x01ffa588,
# and mwccarm 2004/b56 cannot export a second symbol from one asm block. Measured against
# the pinned compiler, every spelling is rejected at the mnemonic:
#     entry <decl>   .global <name>   export <name>   -- "unknown assembler instruction
#                                                        mnemonic"
#     <name>:        -- assembles, but emits no symbol at all; the label stays local
#     bne <sym>+0x9c -- "end of line expected" / "illegal operand"
# So a config/arm9/itcm/symbols.txt row for either address would be a name nothing in the
# link defines - the shape the "rejected by mwldarm despite passing eligibility" block
# above already records. Carving func_01ffa440 into its own object is what would need
# those names, so it stays in the gap object, where the ROM build takes it from today.
#
# Nothing is lost by this and nothing else has to move. dsd records no relocation for
# either branch (config/arm9/itcm/relocs.txt has entries only for the arm_calls out to
# main), so _dsd_gap@itcm_2.o carries both as raw unrelocated words and the linker places
# it at its ROM address; the branch into func_01ffa4bc.o's interior already resolves by
# arithmetic. func_01ffa4bc therefore keeps its own enrollment - unlike the 0x0206d9dc
# cluster, the target does NOT have to join the caller in the gap.
#
# src/unnamed/arm9/01ff/func_01ffa440.c records the routine and declares the two targets as
# func_01ffa538 / func_01ffa558, the same way src/unnamed/arm9/0206/func_0206cee0.c declares 0x0206d9dc and
# 0x0206da28 for the cluster above.
func_01ffa440
