Commit Graph

3768 Commits

Author SHA1 Message Date
Seth Pellegrino
621be609b5 feat: riscv-interrupt-{m,s} calling conventions
Similar to prior support added for the mips430, avr, and x86 targets
this change implements the rough equivalent of clang's
[`__attribute__((interrupt))`][clang-attr] for riscv targets, enabling
e.g.

```rust
static mut CNT: usize = 0;

pub extern "riscv-interrupt-m" fn isr_m() {
    unsafe {
        CNT += 1;
    }
}
```

to produce highly effective assembly like:

```asm
pub extern "riscv-interrupt-m" fn isr_m() {
420003a0:       1141                    addi    sp,sp,-16
    unsafe {
        CNT += 1;
420003a2:       c62a                    sw      a0,12(sp)
420003a4:       c42e                    sw      a1,8(sp)
420003a6:       3fc80537                lui     a0,0x3fc80
420003aa:       63c52583                lw      a1,1596(a0) # 3fc8063c <_ZN12esp_riscv_rt3CNT17hcec3e3a214887d53E.0>
420003ae:       0585                    addi    a1,a1,1
420003b0:       62b52e23                sw      a1,1596(a0)
    }
}
420003b4:       4532                    lw      a0,12(sp)
420003b6:       45a2                    lw      a1,8(sp)
420003b8:       0141                    addi    sp,sp,16
420003ba:       30200073                mret
```

(disassembly via `riscv64-unknown-elf-objdump -C -S --disassemble ./esp32c3-hal/target/riscv32imc-unknown-none-elf/release/examples/gpio_interrupt`)

This outcome is superior to hand-coded interrupt routines which, lacking
visibility into any non-assembly body of the interrupt handler, have to
be very conservative and save the [entire CPU state to the stack
frame][full-frame-save]. By instead asking LLVM to only save the
registers that it uses, we defer the decision to the tool with the best
context: it can more accurately account for the cost of spills if it
knows that every additional register used is already at the cost of an
implicit spill.

At the LLVM level, this is apparently [implemented by] marking every
register as "[callee-save]," matching the semantics of an interrupt
handler nicely (it has to leave the CPU state just as it found it after
its `{m|s}ret`).

This approach is not suitable for every interrupt handler, as it makes
no attempt to e.g. save the state in a user-accessible stack frame. For
a full discussion of those challenges and tradeoffs, please refer to
[the interrupt calling conventions RFC][rfc].

Inside rustc, this implementation differs from prior art because LLVM
does not expose the "all-saved" function flavor as a calling convention
directly, instead preferring to use an attribute that allows for
differentiating between "machine-mode" and "superivsor-mode" interrupts.

Finally, some effort has been made to guide those who may not yet be
aware of the differences between machine-mode and supervisor-mode
interrupts as to why no `riscv-interrupt` calling convention is exposed
through rustc, and similarly for why `riscv-interrupt-u` makes no
appearance (as it would complicate future LLVM upgrades).

[clang-attr]: https://clang.llvm.org/docs/AttributeReference.html#interrupt-risc-v
[full-frame-save]: 9281af2ecf/src/lib.rs (L440-L469)
[implemented by]: b7fb2a3fec/llvm/lib/Target/RISCV/RISCVRegisterInfo.cpp (L61-L67)
[callee-save]: 973f1fe7a8/llvm/lib/Target/RISCV/RISCVCallingConv.td (L30-L37)
[rfc]: https://github.com/rust-lang/rfcs/pull/3246
2023-08-08 18:09:56 -07:00
bjorn3
82988111b9 Sync from rust 03a119b0b0 2023-08-08 17:12:20 +00:00
Matthias Krüger
5dd98a4eb1 Rollup merge of #114382 - scottmcm:compare-bytes-intrinsic, r=cjgillot
Add a new `compare_bytes` intrinsic instead of calling `memcmp` directly

As discussed in #113435, this lets the backends be the place that can have the "don't call the function if n == 0" logic, if it's needed for the target.  (I didn't actually *add* those checks, though, since as I understood it we didn't actually need them on known targets?)

Doing this also let me make it `const` (unstable), which I don't think `extern "C" fn memcmp` can be.

cc `@RalfJung` `@Amanieu`
2023-08-07 05:29:12 +02:00
scottmcm
659fabde50 Apply suggestions from code review
Co-authored-by: Ralf Jung <post@ralfj.de>
2023-08-06 15:47:40 -07:00
Scott McMurray
4e958a532b Add a new compare_bytes intrinsic instead of calling memcmp directly 2023-08-06 15:47:40 -07:00
David Tolnay
3f92261579 Generate better function argument names in global_allocator expansion 2023-08-06 07:36:05 -07:00
Matthias Krüger
88a79c6a76 Rollup merge of #114450 - chenyukang:yukang-fix-114435, r=compiler-errors
Fix ICE failed to get layout for ReferencesError

Fixes #114435

r? `@compiler-errors`
2023-08-04 21:31:57 +02:00
yukang
80f2b018c6 Fix ICE failed to get layout for ReferencesError 2023-08-05 01:38:14 +08:00
Oli Scherer
2876bb8481 Forbid old-style simd_shuffleN intrinsics 2023-08-03 09:29:00 +00:00
bjorn3
68f7b826be Use CARGO_ENCODED_RUSTFLAGS to support paths with spaces
Fixes #1391
2023-08-02 11:06:51 +02:00
bjorn3
85a99b35c1
Merge pull request #1388 from Kobzol/preserve-frame-pointer
Pass `preserve_frame_pointers` to Cranelift
2023-07-29 19:05:29 +02:00
Jakub Beránek
92fb9c6626
Pass preserve_frame_pointers to Cranelift 2023-07-29 18:40:00 +02:00
bjorn3
6641b3a548 Update requirements section of build_system/usage.txt 2023-07-24 13:27:51 +00:00
bjorn3
e5197cf1de Switch the build system from super:: to crate::
This was a left over from when build_system/main.rs was at ./y.rs.
2023-07-24 13:27:17 +00:00
bjorn3
0b1a9d735b Speed up audit workflow 2023-07-24 12:30:04 +00:00
bjorn3
9a0c174dfd Add weekly cargo-audit CI run 2023-07-24 12:20:14 +00:00
bjorn3
3f533f4631 Merge branch 'sync_from_rust' 2023-07-22 13:36:29 +00:00
bjorn3
e8168ce8a3 Merge commit '1eded3619d0e55d57521a259bf27a03906fdfad0' into sync_cg_clif-2023-07-22 2023-07-22 13:32:34 +00:00
bjorn3
1eded3619d Update to Cranelift 0.98 2023-07-22 11:32:25 +00:00
bjorn3
ebe2825966 Fix rustc test suite 2023-07-22 11:27:49 +00:00
bjorn3
4eabaf331f Rustup to rustc 1.73.0-nightly (0308df23e 2023-07-21) 2023-07-22 11:11:45 +00:00
bjorn3
a8a722f211 Sync from rust 0308df23e6 2023-07-22 10:54:06 +00:00
chenx97
648f5e4208 support for mips64r6 as a target_arch value 2023-07-18 18:58:18 +08:00
Nicholas Nethercote
46f74fb4d2 Introduce MonoItemData.
It replaces `(Linkage, Visibility)`, making the code nicer. Plus the
next commit will add another field.
2023-07-17 08:44:48 +10:00
bjorn3
84afcee743 Improve benchmarking step summary format 2023-07-16 12:54:48 +00:00
bjorn3
448b7a3a12 Record GHA step summaries for benchmarking 2023-07-16 12:33:39 +00:00
bors
4f16abdff6 Auto merge of #112157 - erikdesjardins:align, r=nikic
Resurrect: rustc_target: Add alignment to indirectly-passed by-value types, correcting the alignment of byval on x86 in the process.

Same as #111551, which I [accidentally closed](https://github.com/rust-lang/rust/pull/111551#issuecomment-1571222612) :/

---

This resurrects PR #103830, which has sat idle for a while.

Beyond #103830, this also:
- fixes byval alignment for types containing vectors on Darwin (see `tests/codegen/align-byval-vector.rs`)
- fixes byval alignment for overaligned types on x86 Windows (see `tests/codegen/align-byval.rs`)
- fixes ABI for types with 128bit requested alignment on ARM64 Linux (see `tests/codegen/aarch64-struct-align-128.rs`)

r? `@nikic`

---

`@pcwalton's` original PR description is reproduced below:

Commit 88e4d2c from five years ago removed
support for alignment on indirectly-passed arguments because of problems with
the `i686-pc-windows-msvc` target. Unfortunately, the `memcpy` optimizations I
recently added to LLVM 16 depend on this to forward `memcpy`s. This commit
attempts to fix the problems with `byval` parameters on that target and now
correctly adds the `align` attribute.

The problem is summarized in [this comment] by `@eddyb.` Briefly, 32-bit x86 has
special alignment rules for `byval` parameters: for the most part, their
alignment is forced to 4. This is not well-documented anywhere but in the Clang
source. I looked at the logic in Clang `TargetInfo.cpp` and tried to replicate
it here. The relevant methods in that file are
`X86_32ABIInfo::getIndirectResult()` and
`X86_32ABIInfo::getTypeStackAlignInBytes()`. The `align` parameter attribute
for `byval` parameters in LLVM must match the platform ABI, or miscompilations
will occur. Note that this doesn't use the approach suggested by eddyb, because
I felt it was overkill to store the alignment in `on_stack` when special
handling is really only needed for 32-bit x86.

As a side effect, this should fix #80127, because it will make the `align`
parameter attribute for `byval` parameters match the platform ABI on LLVM
x86-64.

[this comment]: #80822 (comment)
2023-07-15 15:39:53 +00:00
Mahdi Dibaiee
d45c8c3e7c refactor(rustc_middle): Substs -> GenericArg 2023-07-14 13:27:35 +01:00
bjorn3
fae8935e3d Avoid installing rustc-dev in the rustfmt CI job 2023-07-13 11:39:04 +00:00
bjorn3
aa6916bd01 Use correct lang item for AssertKind::MisalignedPointerDereference
cc #1381
2023-07-12 19:03:27 +00:00
bjorn3
c3a0431731 Avoid recursive cargo calls when doing cargo clif instead of cargo-clif
Fixes #1383
2023-07-12 17:24:46 +00:00
bjorn3
c137418bde Explicitly disable git gpg signing
Otherwise building fails if the user has globally enabled gpg signing.

Fixes #1384
2023-07-12 17:21:14 +00:00
bjorn3
34d63e4c1d Use GHA log grouping 2023-07-12 16:45:42 +00:00
bjorn3
8b9187dfec Fix rustc test suite 2023-07-12 14:47:23 +00:00
bjorn3
c28878d8f2 Rustup to rustc 1.73.0-nightly (993deaa0b 2023-07-11) 2023-07-12 14:31:00 +00:00
bjorn3
2922d41fa5 Sync from rust 993deaa0bf 2023-07-12 13:42:45 +00:00
Erik Desjardins
388a6b5835 cg_clif: just ignore all the unused LayoutS fields 2023-07-10 19:19:41 -04:00
Erik Desjardins
6f16da3ee7 repr(align) <= 4 should still be byval 2023-07-10 19:19:40 -04:00
Erik Desjardins
d2d76ef358 cg_clif: add has_repr_align 2023-07-10 19:19:40 -04:00
Nilstrieb
1cae70145c Rename adjustment::PointerCast and variants using it to PointerCoercion
It makes it sound like the `ExprKind` and `Rvalue` are supposed to represent all pointer related
casts, when in reality their just used to share a some enum variants. Make it clear there these
are only coercion to make it clear why only some pointer related "casts" are in the enum.
2023-07-07 18:17:16 +02:00
Boxy
40de0c2765 Move TyCtxt::mk_x to Ty::new_x where applicable 2023-07-05 20:27:07 +01:00
Boxy
b5b1c0eddc Deal with fallout 2023-07-05 09:46:30 +01:00
bors
b51f778846 Auto merge of #113116 - nnethercote:codegen-opts, r=oli-obk
A mish-mash of micro-optimizations

These were aimed at speeding up LLVM codegen, but ended up affecting other places as well.

r? `@bjorn3`
2023-06-30 00:35:19 +00:00
Nicholas Nethercote
9db001dfbb Avoid unnecessary line lookup.
`lookup_debug_loc` calls `SourceMap::lookup_line`, which does a binary
search over the files, and then a binary search over the lines within
the found file. It then calls `SourceFile::line_begin_pos`, which redoes
the binary search over the lines within the found file.

This commit removes the second binary search over the lines, instead
getting the line starting pos directly using the result of the first
binary search over the lines.

(And likewise for `get_span_loc`, in the cranelift backend.)
2023-06-29 11:26:39 +10:00
bjorn3
d3e9e424a1 Update setup_rust_fork.sh for cg_clif build layout changes 2023-06-28 16:52:02 +00:00
bjorn3
ab12203187 Rustup to rustc 1.72.0-nightly (5ea666864 2023-06-27) 2023-06-28 16:45:15 +00:00
许杰友 Jieyou Xu (Joe)
2cdf8a4c3f Provide more context for rustc +nightly -Zunstable-options on stable 2023-06-27 23:23:33 +08:00
bjorn3
85b5253806
Merge pull request #1382 from cuviper/indexmap-2
Upgrade to indexmap v2
2023-06-25 14:13:43 +02:00
Josh Stone
814f46c39d Minor cleanup around IndexSet 2023-06-24 17:43:35 -07:00
Josh Stone
ff10c0f037 Upgrade to indexmap v2 2023-06-24 17:42:48 -07:00