Make rlib metadata strip works with MIPSr6 architecture

Because MIPSr6 has many differences with previous MIPSr2 arch, the previous rlib metadata stripping code in `rustc_codegen_ssa` is only for MIPSr2/r3/r5 (which share the same elf e_flags).
This commit fixed this problem. It makes `rustc_codegen_ssa` happy when compiling rustc for MIPSr6 target or hosts.
This commit is contained in:
Lain Yang 2022-01-07 10:47:27 +08:00
parent e012a191d7
commit 579e8bce7d
2 changed files with 15 additions and 3 deletions

View File

@ -41,6 +41,6 @@ rustc_target = { path = "../rustc_target" }
rustc_session = { path = "../rustc_session" } rustc_session = { path = "../rustc_session" }
[dependencies.object] [dependencies.object]
version = "0.26.2" version = "0.27.0"
default-features = false default-features = false
features = ["read_core", "elf", "macho", "pe", "unaligned", "archive", "write"] features = ["read_core", "elf", "macho", "pe", "unaligned", "archive", "write"]

View File

@ -135,12 +135,24 @@ fn create_object_file(sess: &Session) -> Option<write::Object> {
Architecture::Mips => { Architecture::Mips => {
// copied from `mipsel-linux-gnu-gcc foo.c -c` and // copied from `mipsel-linux-gnu-gcc foo.c -c` and
// inspecting the resulting `e_flags` field. // inspecting the resulting `e_flags` field.
let e_flags = elf::EF_MIPS_ARCH_32R2 | elf::EF_MIPS_CPIC | elf::EF_MIPS_PIC; let e_flags = elf::EF_MIPS_CPIC
| elf::EF_MIPS_PIC
| if sess.target.options.cpu.contains("r6") {
elf::EF_MIPS_ARCH_32R6 | elf::EF_MIPS_NAN2008
} else {
elf::EF_MIPS_ARCH_32R2
};
file.flags = FileFlags::Elf { e_flags }; file.flags = FileFlags::Elf { e_flags };
} }
Architecture::Mips64 => { Architecture::Mips64 => {
// copied from `mips64el-linux-gnuabi64-gcc foo.c -c` // copied from `mips64el-linux-gnuabi64-gcc foo.c -c`
let e_flags = elf::EF_MIPS_ARCH_64R2 | elf::EF_MIPS_CPIC | elf::EF_MIPS_PIC; let e_flags = elf::EF_MIPS_CPIC
| elf::EF_MIPS_PIC
| if sess.target.options.cpu.contains("r6") {
elf::EF_MIPS_ARCH_64R6 | elf::EF_MIPS_NAN2008
} else {
elf::EF_MIPS_ARCH_64R2
};
file.flags = FileFlags::Elf { e_flags }; file.flags = FileFlags::Elf { e_flags };
} }
Architecture::Riscv64 if sess.target.options.features.contains("+d") => { Architecture::Riscv64 if sess.target.options.features.contains("+d") => {