diff options
| author | Ralf Jung <post@ralfj.de> | 2023-05-07 23:05:40 +0200 |
|---|---|---|
| committer | Ralf Jung <post@ralfj.de> | 2023-05-07 23:05:40 +0200 |
| commit | e476f7ac36e4c77acc158aa7f7d2edc18b5b16fa (patch) | |
| tree | 2ba1f523436ad377f806a1ba2f131277deac45e0 /compiler/rustc_span/src/lib.rs | |
| parent | ce3a2e5eb9ffe89f5d73d43b32d1108b55325d84 (diff) | |
| parent | e61bb8810b26de043d3b4ba2560e78af71121a0e (diff) | |
| download | rust-e476f7ac36e4c77acc158aa7f7d2edc18b5b16fa.tar.gz rust-e476f7ac36e4c77acc158aa7f7d2edc18b5b16fa.zip | |
Merge from rustc
Diffstat (limited to 'compiler/rustc_span/src/lib.rs')
| -rw-r--r-- | compiler/rustc_span/src/lib.rs | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/compiler/rustc_span/src/lib.rs b/compiler/rustc_span/src/lib.rs index 341cc61fd1c..7bbab34c69a 100644 --- a/compiler/rustc_span/src/lib.rs +++ b/compiler/rustc_span/src/lib.rs @@ -1744,6 +1744,28 @@ impl SourceFile { BytePos::from_u32(pos.0 - self.start_pos.0 + diff) } + /// Calculates a normalized byte position from a byte offset relative to the + /// start of the file. + /// + /// When we get an inline assembler error from LLVM during codegen, we + /// import the expanded assembly code as a new `SourceFile`, which can then + /// be used for error reporting with spans. However the byte offsets given + /// to us by LLVM are relative to the start of the original buffer, not the + /// normalized one. Hence we need to convert those offsets to the normalized + /// form when constructing spans. + pub fn normalized_byte_pos(&self, offset: u32) -> BytePos { + let diff = match self + .normalized_pos + .binary_search_by(|np| (np.pos.0 + np.diff).cmp(&(self.start_pos.0 + offset))) + { + Ok(i) => self.normalized_pos[i].diff, + Err(i) if i == 0 => 0, + Err(i) => self.normalized_pos[i - 1].diff, + }; + + BytePos::from_u32(self.start_pos.0 + offset - diff) + } + /// Converts an absolute `BytePos` to a `CharPos` relative to the `SourceFile`. pub fn bytepos_to_file_charpos(&self, bpos: BytePos) -> CharPos { // The number of extra bytes due to multibyte chars in the `SourceFile`. @@ -2199,6 +2221,7 @@ pub struct ErrorGuaranteed(()); impl ErrorGuaranteed { /// To be used only if you really know what you are doing... ideally, we would find a way to /// eliminate all calls to this method. + #[deprecated = "`Session::delay_span_bug` should be preferred over this function"] pub fn unchecked_claim_error_was_emitted() -> Self { ErrorGuaranteed(()) } |
