aboutsummaryrefslogtreecommitdiff
path: root/lib/xixanta/src/assembler.rs
diff options
context:
space:
mode:
authorMiquel Sabaté Solà <mssola@mssola.com>2026-02-05 18:53:20 +0100
committerMiquel Sabaté Solà <mssola@mssola.com>2026-02-06 14:05:37 +0100
commit6894b01b22e848b5fdbb2fafae88e9459232ced2 (patch)
tree6bb08be6754e4d481489b7cb01d50c6e706d4ba9 /lib/xixanta/src/assembler.rs
parentd36e0de313aa65192eba108dd75135991a42685e (diff)
downloadtools.nes-6894b01b22e848b5fdbb2fafae88e9459232ced2.tar.gz
tools.nes-6894b01b22e848b5fdbb2fafae88e9459232ced2.zip
asan: don't complain on arithmetic with addresses
This was already the case for plain addresses, but it was not being considered in the case of an arithmetic operation. Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
Diffstat (limited to 'lib/xixanta/src/assembler.rs')
-rw-r--r--lib/xixanta/src/assembler.rs21
1 files changed, 17 insertions, 4 deletions
diff --git a/lib/xixanta/src/assembler.rs b/lib/xixanta/src/assembler.rs
index 96fdd01..507f5e1 100644
--- a/lib/xixanta/src/assembler.rs
+++ b/lib/xixanta/src/assembler.rs
@@ -2948,13 +2948,26 @@ impl<'a> Assembler<'a> {
}
NodeType::Operation(OperationType::Add) | NodeType::Operation(OperationType::Sub) => {
// Get the name of the variable involved.
- let left_name = &node.left.as_ref().unwrap().value.value;
- let right_name = &node.left.as_ref().unwrap().value.value;
- let name = if is_asan_friendly_name(left_name) {
+ let left_name = &node.left.as_ref().unwrap().value;
+ let right_name = &node.left.as_ref().unwrap().value;
+ let name = if is_asan_friendly_name(&left_name.value) {
node.left.as_ref().unwrap()
- } else if is_asan_friendly_name(right_name) {
+ } else if is_asan_friendly_name(&right_name.value) {
node.right.as_ref().unwrap()
} else {
+ // If everything failed but because it was an address
+ // (e.g. 'lda palettes + 1, x'), then return early.
+ if let Ok(var) = self.context.get_variable(left_name, &self.mappings) {
+ if matches!(var.object_type, ObjectType::Address) {
+ return Ok(());
+ }
+ }
+ if let Ok(var) = self.context.get_variable(right_name, &self.mappings) {
+ if matches!(var.object_type, ObjectType::Address) {
+ return Ok(());
+ }
+ }
+
self.warnings.push(Error {
line: node.value.line,
message: "accessing a memory region without a proper name".to_string(),