@@ -270,45 +270,43 @@ pub(super) fn elf_os_abi(sess: &Session) -> u8 {
270
270
271
271
pub ( super ) fn elf_e_flags ( architecture : Architecture , sess : & Session ) -> u32 {
272
272
match architecture {
273
- Architecture :: Mips => {
274
- let arch = match sess. target . options . cpu . as_ref ( ) {
273
+ Architecture :: Mips | Architecture :: Mips64 | Architecture :: Mips64_N32 => {
274
+ let mut e_flags = match sess. target . options . cpu . as_ref ( ) {
275
275
"mips1" => elf:: EF_MIPS_ARCH_1 ,
276
276
"mips2" => elf:: EF_MIPS_ARCH_2 ,
277
277
"mips3" => elf:: EF_MIPS_ARCH_3 ,
278
278
"mips4" => elf:: EF_MIPS_ARCH_4 ,
279
279
"mips5" => elf:: EF_MIPS_ARCH_5 ,
280
- s if s. contains ( "r6" ) => elf:: EF_MIPS_ARCH_32R6 ,
280
+ "mips32r2" => elf:: EF_MIPS_ARCH_32R2 ,
281
+ "mips32r6" => elf:: EF_MIPS_ARCH_32R6 ,
282
+ "mips64r2" => elf:: EF_MIPS_ARCH_64R2 ,
283
+ "mips64r6" => elf:: EF_MIPS_ARCH_64R6 ,
281
284
_ => elf:: EF_MIPS_ARCH_32R2 ,
282
285
} ;
283
286
284
- let mut e_flags = elf:: EF_MIPS_CPIC | arch;
285
-
286
- // If the ABI is explicitly given, use it or default to O32.
287
+ // If the ABI is explicitly given, use it or default to O32 on 32-bit MIPS
288
+ // and N64 (which needs no extra flag) on 64-bit MIPS.
287
289
match sess. target . options . llvm_abiname . to_lowercase ( ) . as_str ( ) {
288
290
"n32" => e_flags |= elf:: EF_MIPS_ABI2 ,
289
291
"o32" => e_flags |= elf:: EF_MIPS_ABI_O32 ,
290
- _ => e_flags |= elf:: EF_MIPS_ABI_O32 ,
292
+ _ => {
293
+ if architecture == Architecture :: Mips {
294
+ e_flags |= elf:: EF_MIPS_ABI_O32
295
+ }
296
+ }
291
297
} ;
292
298
299
+ if !sess. target . options . features . contains ( "noabicalls" ) {
300
+ e_flags |= elf:: EF_MIPS_CPIC ;
301
+ }
293
302
if sess. target . options . relocation_model != RelocModel :: Static {
294
- e_flags |= elf:: EF_MIPS_PIC ;
303
+ e_flags |= elf:: EF_MIPS_PIC | elf :: EF_MIPS_CPIC ;
295
304
}
296
305
if sess. target . options . cpu . contains ( "r6" ) {
297
306
e_flags |= elf:: EF_MIPS_NAN2008 ;
298
307
}
299
308
e_flags
300
309
}
301
- Architecture :: Mips64 => {
302
- // copied from `mips64el-linux-gnuabi64-gcc foo.c -c`
303
- let e_flags = elf:: EF_MIPS_CPIC
304
- | elf:: EF_MIPS_PIC
305
- | if sess. target . options . cpu . contains ( "r6" ) {
306
- elf:: EF_MIPS_ARCH_64R6 | elf:: EF_MIPS_NAN2008
307
- } else {
308
- elf:: EF_MIPS_ARCH_64R2
309
- } ;
310
- e_flags
311
- }
312
310
Architecture :: Riscv32 | Architecture :: Riscv64 => {
313
311
// Source: https://github.com/riscv-non-isa/riscv-elf-psabi-doc/blob/079772828bd10933d34121117a222b4cc0ee2200/riscv-elf.adoc
314
312
let mut e_flags: u32 = 0x0 ;
0 commit comments