diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2023-01-13 19:16:45 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-01-13 19:16:45 +0100 |
| commit | 278e02a5b614d8a50a6549bbeb5b10ed4a42b6f8 (patch) | |
| tree | f40babed7e7ee98d89d07b1eb4eb7dbc9c6beec6 | |
| parent | e0f6840bb663e68064cd4737e6dded2cc91f8fce (diff) | |
| parent | 138a1d26b53cab16066b0faa3846722358a2c09f (diff) | |
| download | rust-278e02a5b614d8a50a6549bbeb5b10ed4a42b6f8.tar.gz rust-278e02a5b614d8a50a6549bbeb5b10ed4a42b6f8.zip | |
Rollup merge of #106797 - FawazTirmizi:dev/issues/104284, r=bjorn3
riscv: Fix ELF header flags The previous version added both `EF_RISCV_FLOAT_ABI_DOUBLE` and `EF_RISCV_RVC` if the "D" extension was enabled on riscv64 targets. riscv32 targets were not accounted for. This patch changes this so that: - Only add `EF_RISCV_RVC` if the "C" extension is enabled - Add `EF_RISCV_FLOAT_ABI_SINGLE` if the "F" extension is enabled and the "D" extension is not - Add these ELF flags for riscv32 as well Fixes #104284 r? rust-lang/risc-v
| -rw-r--r-- | compiler/rustc_codegen_ssa/src/back/metadata.rs | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/compiler/rustc_codegen_ssa/src/back/metadata.rs b/compiler/rustc_codegen_ssa/src/back/metadata.rs index 51c5c375d51..5ad2744f61d 100644 --- a/compiler/rustc_codegen_ssa/src/back/metadata.rs +++ b/compiler/rustc_codegen_ssa/src/back/metadata.rs @@ -165,11 +165,23 @@ pub(crate) fn create_object_file(sess: &Session) -> Option<write::Object<'static }; e_flags } - Architecture::Riscv64 if sess.target.options.features.contains("+d") => { - // copied from `riscv64-linux-gnu-gcc foo.c -c`, note though - // that the `+d` target feature represents whether the double - // float abi is enabled. - let e_flags = elf::EF_RISCV_RVC | elf::EF_RISCV_FLOAT_ABI_DOUBLE; + Architecture::Riscv32 | Architecture::Riscv64 => { + // Source: https://github.com/riscv-non-isa/riscv-elf-psabi-doc/blob/079772828bd10933d34121117a222b4cc0ee2200/riscv-elf.adoc + let mut e_flags: u32 = 0x0; + let features = &sess.target.options.features; + // Check if compressed is enabled + if features.contains("+c") { + e_flags |= elf::EF_RISCV_RVC; + } + + // Select the appropriate floating-point ABI + if features.contains("+d") { + e_flags |= elf::EF_RISCV_FLOAT_ABI_DOUBLE; + } else if features.contains("+f") { + e_flags |= elf::EF_RISCV_FLOAT_ABI_SINGLE; + } else { + e_flags |= elf::EF_RISCV_FLOAT_ABI_SOFT; + } e_flags } _ => 0, |
