aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/xixanta/src/assembler.rs28
-rw-r--r--lib/xixanta/src/object.rs22
2 files changed, 28 insertions, 22 deletions
diff --git a/lib/xixanta/src/assembler.rs b/lib/xixanta/src/assembler.rs
index c53f143..e8ecd06 100644
--- a/lib/xixanta/src/assembler.rs
+++ b/lib/xixanta/src/assembler.rs
@@ -495,7 +495,16 @@ impl<'a> Assembler<'a> {
if let Err(message) = self.context.set_variable(
&node.value,
- &Object::new(self.current_mapping, self.current_segment, object_type),
+ &Object {
+ bundle: Bundle::default(),
+ node: Some(node.clone()),
+ mapping: self.current_mapping,
+ segment: self.current_segment,
+ object_type,
+ asan_ignore: false,
+ asan_reserve: 1,
+ accessed: 0,
+ },
false,
) {
return Err(Error {
@@ -619,7 +628,7 @@ impl<'a> Assembler<'a> {
&node.value,
&Object {
bundle: value,
- node: None,
+ node: Some(node.clone()),
mapping: self.current_mapping,
segment: self.current_segment,
object_type: ObjectType::Value,
@@ -1199,13 +1208,24 @@ impl<'a> Assembler<'a> {
// (e.g. nasm's '--allow-unused' flag), or the magic
// 'asan:ignore' comment is given.
if !self.allow_unused && !bundle.asan_ignore && bundle.accessed == 0 {
+ // For unused stuff we need to point to the source of the
+ // definition, not the current context. This is usually
+ // provided on the 'bundle.node' member, but we can always
+ // pick the first source if that's not provided for some
+ // unknown reason.
+ let source = self.sources[match &bundle.node {
+ Some(node) => node.source,
+ None => 0,
+ }]
+ .clone();
+
// If this was a .proc definition then we are certain that
// this is dead code, which is a really crappy situation.
if matches!(bundle.object_type, ObjectType::Proc) {
errors.push(Error {
line: 0,
message: format!("proc '{full_name}' is unused"),
- source: self.sources[0].clone(),
+ source,
expanded_from: self.macro_context.clone(),
global: true,
});
@@ -1216,7 +1236,7 @@ impl<'a> Assembler<'a> {
self.warnings.push(Error {
line: 0,
message: format!("{} '{full_name}' is unused", bundle.object_type),
- source: self.sources[0].clone(),
+ source,
expanded_from: self.macro_context.clone(),
global: true,
});
diff --git a/lib/xixanta/src/object.rs b/lib/xixanta/src/object.rs
index 1887b77..36b15dc 100644
--- a/lib/xixanta/src/object.rs
+++ b/lib/xixanta/src/object.rs
@@ -142,8 +142,10 @@ pub struct Object {
pub bundle: Bundle,
/// Node which marks the source of the computed `bundle` attribute. This is
- /// only provided in cases like macro calls where at the crunching stage we
- /// might need to fetch previous context for the current `bundle` value.
+ /// provided in cases like macro calls where at the crunching stage we might
+ /// need to fetch previous context for the current `bundle` value. It is
+ /// also provided in variable definitions, as an indirect way to fetch the
+ /// original source containing the definition.
pub node: Option<PNode>,
/// The mapping index where the object was found. Note that this index
@@ -169,22 +171,6 @@ pub struct Object {
pub accessed: usize,
}
-impl Object {
- /// Create a default bundle with the given metadata parameters.
- pub fn new(mapping: usize, segment: usize, object_type: ObjectType) -> Self {
- Self {
- bundle: Bundle::default(),
- node: None,
- mapping,
- segment,
- object_type,
- asan_ignore: false,
- asan_reserve: 1,
- accessed: 0,
- }
- }
-}
-
/// Context holds information about the different scopes being defined, the
/// current scope, and has a map of all the variables defined for each scope.
#[derive(Debug)]