diff options
| author | Julgodis <> | 2021-03-31 23:22:32 +0200 |
|---|---|---|
| committer | Julgodis <> | 2021-03-31 23:22:38 +0200 |
| commit | b999714187d934636004d3d93e1ed1da792d6f80 (patch) | |
| tree | b89ce29aafb588cc0d191343c915ae1447d1c7a6 /tools/libdol2asm/data/function/asm.py | |
| parent | a868b6ae56e5d586f31a445f47b45f5ac039c74a (diff) | |
.dead section fix
Diffstat (limited to 'tools/libdol2asm/data/function/asm.py')
| -rw-r--r-- | tools/libdol2asm/data/function/asm.py | 57 |
1 files changed, 29 insertions, 28 deletions
diff --git a/tools/libdol2asm/data/function/asm.py b/tools/libdol2asm/data/function/asm.py index e19ebbda03..c4e50a83a2 100644 --- a/tools/libdol2asm/data/function/asm.py +++ b/tools/libdol2asm/data/function/asm.py @@ -7,33 +7,11 @@ from pathlib import Path from ...builder import AsyncBuilder from ...disassemble import AccessCollector from ... import util +from .. import static_analyze from ..base import * from ..symbol import * from .base import * -""" -@dataclass(eq=False) -class Block(ArbitraryData): - sda_hack_references: Set[int] = field(default=None, repr=False) - - def _get_internal_references(self, context, symbol_table): - collector = AccessCollector([]) - for x in collector.execute_generator(self.addr, self.data, self.size): - pass - sda_hack_symbols = [symbol_table[self._module, x] - for x in collector.sda_hack_references] - self.sda_hack_references = set([ - (x._module, x.addr) - for x in sda_hack_symbols - if x - ]) - symbols = [ - symbol_table[self._module, x.addr] - for x in collector.accesses.values() - ] - return set([(x._module, x.addr) for x in symbols if x]) -""" - @dataclass class Block(): identifier: Identifier @@ -53,7 +31,6 @@ class Block(): return None return self.identifier.label -from .. import static_analyze @dataclass(eq=False) class ASMFunction(Function): @@ -63,6 +40,7 @@ class ASMFunction(Function): data: bytearray = None def gather_references(self, context, valid_range): + """ addrs = static_analyze.function(self.data, self.addr, self.size) function_range = AddressRange(self.start, self.end) self.references = [ @@ -70,7 +48,25 @@ class ASMFunction(Function): for addr in addrs.values() if addr in valid_range and not addr in function_range ] + """ + collector = AccessCollector([]) + for i, addr in collector.execute_generator(self.addr, self.data, self.size): + pass + + function_range = AddressRange(self.start, self.end) + self.references = [ + access.addr + for access in collector.accesses.values() + if access.addr in valid_range and not access.addr in function_range + ] + + self.test_references = [ + (access.at, access.addr) + for access in collector.accesses.values() + if access.addr in valid_range and not access.addr in function_range + ] + async def export_function_body(self, exporter, builder: AsyncBuilder): await builder.write(f" {{") await builder.write(f"\tnofralloc") @@ -80,6 +76,15 @@ class ASMFunction(Function): async def export_declaration(self, exporter, builder: AsyncBuilder): assert self.padding == 0 + + for k,v in self.test_references: + symbol_name = "???" + symbol = exporter.gst[-1, v] + if symbol: + symbol_name = symbol.label + await builder.write(f"//\t{k:08X}: {v:08X} ({symbol_name})") + + await builder.write("#pragma push") await builder.write("#pragma optimization_level 0") await builder.write("#pragma optimizewithasm off") @@ -101,10 +106,6 @@ class ASMFunction(Function): blocks = [] for symbol in group: - #block = Block( - # Identifier("lbl", symbol.addr, None), - # symbol.addr, symbol.size, - # data=section.data_for_symbol(symbol)) block = Block( Identifier("lbl", symbol.addr, None), symbol.addr, symbol.size, |
