|
1 | | -from typing import Optional |
| 1 | +from typing import Optional, Union |
2 | 2 |
|
3 | 3 | from ...util import options, symbols, log |
4 | 4 |
|
|
10 | 10 |
|
11 | 11 |
|
12 | 12 | class CommonSegBss(CommonSegData): |
| 13 | + def __init__( |
| 14 | + self, |
| 15 | + rom_start: Optional[int], |
| 16 | + rom_end: Optional[int], |
| 17 | + type: str, |
| 18 | + name: str, |
| 19 | + vram_start: Optional[int], |
| 20 | + args: list, |
| 21 | + yaml: Union[dict, list], |
| 22 | + bss_size: Optional[int] = None, |
| 23 | + ): |
| 24 | + parsed_bss_size = self.parse_bss_size(yaml) |
| 25 | + if bss_size is not None: |
| 26 | + if parsed_bss_size is not None: |
| 27 | + log.error( |
| 28 | + f"Error: Passing bss_size attribute to bss section {self.name} (0x{vram_start:08X}) is not allowed when the size of the bss section can be inferred (was inferred to 0x{bss_size:X}).\n" |
| 29 | + " Setting this attribute is only allowed when the bss size can't be inferred." |
| 30 | + ) |
| 31 | + self.bss_size = bss_size |
| 32 | + else: |
| 33 | + self.bss_size = parsed_bss_size |
| 34 | + |
| 35 | + super().__init__( |
| 36 | + rom_start, |
| 37 | + rom_end, |
| 38 | + type, |
| 39 | + name, |
| 40 | + vram_start, |
| 41 | + args=args, |
| 42 | + yaml=yaml, |
| 43 | + bss_size=self.bss_size, |
| 44 | + ) |
| 45 | + |
13 | 46 | def get_linker_section(self) -> str: |
14 | 47 | return ".bss" |
15 | 48 |
|
@@ -60,8 +93,12 @@ def disassemble_data(self, rom_bytes: bytes): |
60 | 93 | f"Segment '{self.name}' (type '{self.type}') requires a vram address. Got '{self.vram_start}'" |
61 | 94 | ) |
62 | 95 |
|
63 | | - # Supposedly logic error, not user error |
64 | | - assert isinstance(self.bss_size, int), f"{self.name} {self.bss_size}" |
| 96 | + if self.bss_size is None: |
| 97 | + log.error( |
| 98 | + f"Unable to infer the size for segment '{self.name}' (type '{self.type}', vram 0x{self.vram_start:08X}).\n" |
| 99 | + " This may happen when this segment is followed by a segment that doesn't use a vram address.\n" |
| 100 | + " HINT: Try setting a vram address to the next segment in the yaml or set `bss_size=0xXXXX` for this segment." |
| 101 | + ) |
65 | 102 | bss_end = self.vram_start + self.bss_size |
66 | 103 |
|
67 | 104 | self.spim_section = make_bss_section( |
|
0 commit comments