Source locations are opaque 32-bit entities that can be used to represent WebAssembly byte-code positions or some other source identifier.
63 lines
1.6 KiB
Rust
63 lines
1.6 KiB
Rust
//! Source locations.
|
|
//!
|
|
//! Cretonne tracks the original source location of each instruction, and preserves the source
|
|
//! location when instructions are transformed.
|
|
|
|
use std::fmt;
|
|
|
|
/// A source location.
|
|
///
|
|
/// This is an opaque 32-bit number attached to each Cretonne IL instruction. Cretonne does not
|
|
/// interpret source locations in any way, they are simply preserved from the input to the output.
|
|
///
|
|
/// The default source location uses the all-ones bit pattern `!0`. It is used for instructions
|
|
/// that can't be given a real source location.
|
|
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
|
pub struct SourceLoc(u32);
|
|
|
|
impl SourceLoc {
|
|
/// Create a new source location with the given bits.
|
|
pub fn new(bits: u32) -> SourceLoc {
|
|
SourceLoc(bits)
|
|
}
|
|
|
|
/// Is this the default source location?
|
|
pub fn is_default(self) -> bool {
|
|
self == Default::default()
|
|
}
|
|
|
|
/// Read the bits of this source location.
|
|
pub fn bits(self) -> u32 {
|
|
self.0
|
|
}
|
|
}
|
|
|
|
impl Default for SourceLoc {
|
|
fn default() -> SourceLoc {
|
|
SourceLoc(!0)
|
|
}
|
|
}
|
|
|
|
impl fmt::Display for SourceLoc {
|
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
|
if self.is_default() {
|
|
write!(f, "@-")
|
|
} else {
|
|
write!(f, "@{:04x}", self.0)
|
|
}
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use ir::SourceLoc;
|
|
|
|
#[test]
|
|
fn display() {
|
|
assert_eq!(SourceLoc::default().to_string(), "@-");
|
|
assert_eq!(SourceLoc::new(0).to_string(), "@0000");
|
|
assert_eq!(SourceLoc::new(16).to_string(), "@0010");
|
|
assert_eq!(SourceLoc::new(0xabcdef).to_string(), "@abcdef");
|
|
}
|
|
}
|