<feed xmlns='http://www.w3.org/2005/Atom'>
<title>rust/compiler/rustc_codegen_cranelift/src/driver, branch stable</title>
<subtitle>https://github.com/rust-lang/rust
</subtitle>
<id>http://git.dreamy.place/mirrors/rust/atom?h=stable</id>
<link rel='self' href='http://git.dreamy.place/mirrors/rust/atom?h=stable'/>
<link rel='alternate' type='text/html' href='http://git.dreamy.place/mirrors/rust/'/>
<updated>2025-07-16T21:24:32+00:00</updated>
<entry>
<title>use `codegen_instance_attrs` where an instance is (easily) available</title>
<updated>2025-07-16T21:24:32+00:00</updated>
<author>
<name>Folkert de Vries</name>
<email>folkert@folkertdev.nl</email>
</author>
<published>2025-07-02T09:12:54+00:00</published>
<link rel='alternate' type='text/html' href='http://git.dreamy.place/mirrors/rust/commit/?id=9c8ab891876b37aac458a7461d904fe593856745'/>
<id>urn:sha1:9c8ab891876b37aac458a7461d904fe593856745</id>
<content type='text'>
</content>
</entry>
<entry>
<title>add `codegen_instance_attrs` query</title>
<updated>2025-07-16T19:38:58+00:00</updated>
<author>
<name>Folkert de Vries</name>
<email>folkert@folkertdev.nl</email>
</author>
<published>2025-07-02T08:46:15+00:00</published>
<link rel='alternate' type='text/html' href='http://git.dreamy.place/mirrors/rust/commit/?id=ec0ff720d1a89cb51edd90116c6e70051affa95f'/>
<id>urn:sha1:ec0ff720d1a89cb51edd90116c6e70051affa95f</id>
<content type='text'>
and use it for naked functions
</content>
</entry>
<entry>
<title>fix `-Zsanitizer=kcfi` on `#[naked]` functions</title>
<updated>2025-07-16T19:38:48+00:00</updated>
<author>
<name>Folkert de Vries</name>
<email>folkert@folkertdev.nl</email>
</author>
<published>2025-07-01T18:02:31+00:00</published>
<link rel='alternate' type='text/html' href='http://git.dreamy.place/mirrors/rust/commit/?id=f100767dce1fcc0287047053cc29659ac5321a6b'/>
<id>urn:sha1:f100767dce1fcc0287047053cc29659ac5321a6b</id>
<content type='text'>
And more broadly only codegen `InstanceKind::Item` using the naked
function codegen code. Other instance kinds should follow the normal
path.
</content>
</entry>
<entry>
<title>Move metadata object generation for dylibs to the linker code</title>
<updated>2025-06-03T10:04:34+00:00</updated>
<author>
<name>bjorn3</name>
<email>17426603+bjorn3@users.noreply.github.com</email>
</author>
<published>2025-05-30T12:51:15+00:00</published>
<link rel='alternate' type='text/html' href='http://git.dreamy.place/mirrors/rust/commit/?id=0bd7aa1116c42a96d1c692065ae500a3d2d75484'/>
<id>urn:sha1:0bd7aa1116c42a96d1c692065ae500a3d2d75484</id>
<content type='text'>
This deduplicates some code between codegen backends and may in the
future allow adding extra metadata that is only known at link time.
</content>
</entry>
<entry>
<title>Only borrow EncodedMetadata in codegen_crate</title>
<updated>2025-06-03T10:04:34+00:00</updated>
<author>
<name>bjorn3</name>
<email>17426603+bjorn3@users.noreply.github.com</email>
</author>
<published>2025-05-30T11:55:06+00:00</published>
<link rel='alternate' type='text/html' href='http://git.dreamy.place/mirrors/rust/commit/?id=badabab01f15f156dbb6ce39df4a339006fbfae1'/>
<id>urn:sha1:badabab01f15f156dbb6ce39df4a339006fbfae1</id>
<content type='text'>
And move passing it to the linker to the driver code.
</content>
</entry>
<entry>
<title>Merge commit '979dcf8e2f213e4f4b645cb62e7fe9f4f2c0c785' into sync_cg_clif-2025-05-25</title>
<updated>2025-05-25T18:51:16+00:00</updated>
<author>
<name>bjorn3</name>
<email>17426603+bjorn3@users.noreply.github.com</email>
</author>
<published>2025-05-25T18:51:16+00:00</published>
<link rel='alternate' type='text/html' href='http://git.dreamy.place/mirrors/rust/commit/?id=3816385b09db445ab580043ed45218df8c1198ad'/>
<id>urn:sha1:3816385b09db445ab580043ed45218df8c1198ad</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Share part of the global_asm!() implementation between cg_ssa and cg_clif</title>
<updated>2025-04-14T09:38:04+00:00</updated>
<author>
<name>bjorn3</name>
<email>17426603+bjorn3@users.noreply.github.com</email>
</author>
<published>2024-12-13T10:01:09+00:00</published>
<link rel='alternate' type='text/html' href='http://git.dreamy.place/mirrors/rust/commit/?id=3066da813b66ffe46bbe5ea62c56bd079b158cf8'/>
<id>urn:sha1:3066da813b66ffe46bbe5ea62c56bd079b158cf8</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Use cg_ssa's version of codegen_naked_asm in cg_clif</title>
<updated>2025-04-14T09:38:04+00:00</updated>
<author>
<name>bjorn3</name>
<email>17426603+bjorn3@users.noreply.github.com</email>
</author>
<published>2024-12-12T20:31:20+00:00</published>
<link rel='alternate' type='text/html' href='http://git.dreamy.place/mirrors/rust/commit/?id=f5c93fa3feb29b1161acf07191ff2684776b9abf'/>
<id>urn:sha1:f5c93fa3feb29b1161acf07191ff2684776b9abf</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Auto merge of #139453 - compiler-errors:incr, r=jieyouxu</title>
<updated>2025-04-11T13:59:33+00:00</updated>
<author>
<name>bors</name>
<email>bors@rust-lang.org</email>
</author>
<published>2025-04-11T13:59:33+00:00</published>
<link rel='alternate' type='text/html' href='http://git.dreamy.place/mirrors/rust/commit/?id=e1b06f773063140263558b858cb6e4c99755a763'/>
<id>urn:sha1:e1b06f773063140263558b858cb6e4c99755a763</id>
<content type='text'>
Prepend temp files with per-invocation random string to avoid temp filename conflicts

https://github.com/rust-lang/rust/issues/139407 uncovered a very subtle unsoundness with incremental codegen, failing compilation sessions (due to assembler errors), and the "prefer hard linking over copying files" strategy we use in the compiler for file management.

Specifically, imagine we're building a single file 3 times, all with `-Csave-temps -Cincremental=...`. Let's call the object file we're building for the codegen unit for `main` "`XXX.o`" just for clarity since it's probably some gigantic hash name:

```
#[inline(never)]
#[cfg(any(rpass1, rpass3))]
fn a() -&gt; i32 {
    0
}

#[cfg(any(cfail2))]
fn a() -&gt; i32 {
    1
}

fn main() {
    evil::evil();
    assert_eq!(a(), 0);
}

mod evil {
    #[cfg(any(rpass1, rpass3))]
    pub fn evil() {
        unsafe {
            std::arch::asm!("/*  */");
        }
    }

    #[cfg(any(cfail2))]
    pub fn evil() {
        unsafe {
            std::arch::asm!("missing");
        }
    }
}
```

Session 1 (`rpass1`):
* Type-check, borrow-check, etc.
* Serialize the dep graph to the incremental working directory `.../s-...-working/`.
* Codegen object file to a temp file `XXX.rcgu.o` which is spit out in the cwd.
* Hard-link[^1] `XXX.rcgu.o` to the incremental working directory `.../s-...-working/XXX.o`.
* Save-temps option means we don't delete `XXX.rgcu.o`.
* Link the binary and stuff.
* Finalize[^2] the working incremental session by renaming `.../s-...-working` to ` s-...-asjkdhsjakd` (some other finalized incr comp session dir name).

Session 2 (`cfail2`):
* Load artifacts from the previous *finalized* incremental session, namely the dep graph.
* Type-check, borrow-check, etc. since the file has changed, so most dep graph nodes are red.
* Serialize the dep graph to the incremental working directory `.../s-...-working/`.
* Codegen object file to a temp file `XXX.rcgu.o`. **HERE IS THE PROBLEM**: The hard-link is still set up to point to the inode from `XXX.o` from the first session, so this also modifies the `XXX.o` in the previous finalized session directory.
* Codegen emits an error b/c `missing` is not an instruction, so we abort before finalizing the incremental session. Specifically, this means that the *previous* session is the last finalized session.

Session 3 (`rpass3`):
* Load artifacts from the previous *finalized* incremental session, namely the dep graph. NOTE that this is from session 1.
* All the dep graph nodes are green since we are basically replaying session 1.
* codegen object file `XXX.o`, which is detected as *reused* from session 1 since dep nodes were green. That means we **reuse** `XXX.o` which had been dirtied from session 2.
* Link the binary and stuff.

This results in a binary which reuses some of the build artifacts from session 2, but thinks it's from session 1.

At this point, I hope it's clear to see that the incremental results from session 1 were dirtied from session 2, but we reuse them as if session 1 was the previous (finalized) incremental session we ran. This is at best really buggy, and at worst **unsound**.

This isn't limited to `-C save-temps`, since there are other combinations of flags that may keep around temporary files (hard linked) in the working directory (like `-C debuginfo=1 -C split-debuginfo=unpacked` on darwin, for example).

---

This PR implements a fix which is to prepend temp filenames with a random string that is generated per invocation of rustc. This string is not *deterministic*, but temporary files are transient anyways, so I don't believe this is a problem.

That means that temp files are now something like... `{crate-name}.{cgu}.{invocation_temp}.rcgu.o`, where `{invocation_temp}` is the new temporary string we generate per invocation of rustc.

Fixes https://github.com/rust-lang/rust/issues/139407

[^1]: https://github.com/rust-lang/rust/blob/175dcc7773d65c1b1542c351392080f48c05799f/compiler/rustc_fs_util/src/lib.rs#L60
[^2]: https://github.com/rust-lang/rust/blob/175dcc7773d65c1b1542c351392080f48c05799f/compiler/rustc_incremental/src/persist/fs.rs#L1-L40
</content>
</entry>
<entry>
<title>Remove the use of Rayon iterators</title>
<updated>2025-04-10T20:05:06+00:00</updated>
<author>
<name>John Kåre Alsaker</name>
<email>john.kare.alsaker@gmail.com</email>
</author>
<published>2025-03-26T23:19:52+00:00</published>
<link rel='alternate' type='text/html' href='http://git.dreamy.place/mirrors/rust/commit/?id=02f10d9bfe41c6c6650f72965d74f27e92dc3986'/>
<id>urn:sha1:02f10d9bfe41c6c6650f72965d74f27e92dc3986</id>
<content type='text'>
</content>
</entry>
</feed>
