summaryrefslogtreecommitdiff
path: root/tools/libdol2asm/data/function/asm.py
diff options
context:
space:
mode:
authorJulgodis <>2021-03-31 23:22:32 +0200
committerJulgodis <>2021-03-31 23:22:38 +0200
commitb999714187d934636004d3d93e1ed1da792d6f80 (patch)
treeb89ce29aafb588cc0d191343c915ae1447d1c7a6 /tools/libdol2asm/data/function/asm.py
parenta868b6ae56e5d586f31a445f47b45f5ac039c74a (diff)
.dead section fix
Diffstat (limited to 'tools/libdol2asm/data/function/asm.py')
-rw-r--r--tools/libdol2asm/data/function/asm.py57
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,