https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99217
--- Comment #5 from huangpei at loongson dot cn <huangpei at loongson dot cn> --- Hi, with this fix and bug 93242 fixed, a.c with mips16 is OK, ambrosehua@3A1000-800M:~$ gcc -fpatchable-function-entry=3 -mips16 -mabi=32 -c a.c -S -o a.1.s ambrosehua@3A1000-800M:~$ cat a.1.s .file 1 "a.c" .section .mdebug.abi32 .previous .nan legacy .module fp=xx .module nooddspreg .abicalls .text .align 2 .globl f .set mips16 .set nomicromips .ent f .type f, @function f: .section __patchable_function_entries,"a",@progbits .4byte $LPFE1 .text $LPFE1: .set noreorder nop .set reorder .set noreorder nop .set reorder .set noreorder nop .set reorder .frame $17,8,$31 # vars= 0, regs= 1/0, args= 0, gp= 0 .mask 0x00020000,-4 .fmask 0x00000000,0 save 8,$17 move $17,$sp .set noreorder nop .set reorder move $sp,$17 restore 8,$17 jr $31 .end f .size f, .-f .ident "GCC: (Debian 8.3.0-8.lnd.4) 8.3.0" ambrosehua@3A1000-800M:~$ objdump -tdr a.1.o a.1.o: file format elf32-tradlittlemips SYMBOL TABLE: 00000000 l df *ABS* 00000000 a.c 00000000 l d .text 00000000 .text 00000000 l d .data 00000000 .data 00000000 l d .bss 00000000 .bss 00000000 l d .mdebug.abi32 00000000 .mdebug.abi32 00000000 l d __patchable_function_entries 00000000 __patchable_function_entries 00000000 l .text 00000000 0xf0 $LPFE1 00000000 l d .reginfo 00000000 .reginfo 00000000 l d .MIPS.abiflags 00000000 .MIPS.abiflags 00000000 l d .pdr 00000000 .pdr 00000000 l d .comment 00000000 .comment 00000000 l d .gnu.attributes 00000000 .gnu.attributes 00000000 g F .text 00000012 f Disassembly of section .text: 00000000 <f>: 0: 6500 nop 2: 6500 nop 4: 6500 nop 6: 6491 save 8,s1 8: 673d move s1,sp a: 6500 nop c: 65b9 move sp,s1 e: 6411 restore 8,s1 10: e8a0 jrc ra 12: 6500 nop 14: 6500 nop 16: 6500 nop 18: 6500 nop 1a: 6500 nop 1c: 6500 nop 1e: 6500 nop but, with b.c, ambrosehua@3A1000-800M:~$ cat b.c void f(float a, float b) { } it is much more complicated. ambrosehua@3A1000-800M:~$ gcc -fpatchable-function-entry=3 -mips16 -mabi=32 -c b.c -S -o b.1.s ambrosehua@3A1000-800M:~$ cat b.1.s .section .mdebug.abi32 .previous .nan legacy .module fp=xx .module nooddspreg .abicalls .text .align 2 .globl f .set mips16 .set nomicromips .ent f .type f, @function f: .section __patchable_function_entries,"a",@progbits .4byte $LPFE1 .text $LPFE1: .set noreorder nop .set reorder .set noreorder nop .set reorder .set noreorder nop .set reorder # Stub function for f (float, float) .section .mips16.fn.f,"ax",@progbits .align 2 .set mips16 .set nomicromips .ent __fn_stub_f .type __fn_stub_f, @function __fn_stub_f: .section __patchable_function_entries .4byte $LPFE2 .section .mips16.fn.f $LPFE2: .set noreorder nop .set reorder .set noreorder nop .set reorder .set noreorder nop .set reorder .set nomips16 .set nomicromips .ent __fn_stub_f .type __fn_stub_f, @function __fn_stub_f: .set noreorder .cpload $25 .set reorder .reloc 0,R_MIPS_NONE,f la $25,__fn_local_f mfc1 $4,$f12 mfc1 $5,$f14 jr $25 .end __fn_stub_f __fn_local_f = f .text .frame $17,8,$31 # vars= 0, regs= 1/0, args= 0, gp= 0 .mask 0x00020000,-4 .fmask 0x00000000,0 save 8,$17 move $17,$sp sw $4,8($17) sw $5,12($17) .set noreorder nop .set reorder move $sp,$17 restore 8,$17 jr $31 .end f .size f, .-f .ident "GCC: (Debian 8.3.0-8.lnd.4) 8.3.0" for comparison, without -fpatchable-function-entry=3 ambrosehua@3A1000-800M:~$ gcc -mips16 -mabi=32 -c b.c -S -o b.2.s ambrosehua@3A1000-800M:~$ cat b.2.s .file 1 "b.c" .section .mdebug.abi32 .previous .nan legacy .module fp=xx .module nooddspreg .abicalls .text .align 2 .globl f .set mips16 .set nomicromips .ent f .type f, @function f: # Stub function for f (float, float) .section .mips16.fn.f,"ax",@progbits .align 2 .set mips16 .set nomicromips .ent __fn_stub_f .type __fn_stub_f, @function __fn_stub_f: .set nomips16 .set nomicromips .ent __fn_stub_f .type __fn_stub_f, @function __fn_stub_f: .set noreorder .cpload $25 .set reorder .reloc 0,R_MIPS_NONE,f la $25,__fn_local_f mfc1 $4,$f12 mfc1 $5,$f14 jr $25 .end __fn_stub_f __fn_local_f = f .text .frame $17,8,$31 # vars= 0, regs= 1/0, args= 0, gp= 0 .mask 0x00020000,-4 .fmask 0x00000000,0 save 8,$17 move $17,$sp sw $4,8($17) sw $5,12($17) .set noreorder nop .set reorder move $sp,$17 restore 8,$17 jr $31 .end f .size f, .-f .ident "GCC: (Debian 8.3.0-8.lnd.4) 8.3.0" with original gcc 8.3 in Debian10, depaulose@3A1000-800M:/home/ambrosehua$ gcc -mabi=32 -c b.c -S -o b.3.s -mips16 depaulose@3A1000-800M:/home/ambrosehua$ cat b.3.s .file 1 "b.c" .section .mdebug.abi32 .previous .nan legacy .module fp=xx .module nooddspreg .abicalls .text .align 2 .globl f # Stub function for f (float, float) .section .mips16.fn.f,"ax",@progbits .align 2 .set nomips16 .set nomicromips .ent __fn_stub_f .type __fn_stub_f, @function __fn_stub_f: .set noreorder .cpload $25 .set reorder .reloc 0,R_MIPS_NONE,f la $25,__fn_local_f mfc1 $4,$f12 mfc1 $5,$f14 jr $25 .end __fn_stub_f __fn_local_f = f .text .set mips16 .set nomicromips .ent f .type f, @function f: .frame $17,8,$31 # vars= 0, regs= 1/0, args= 0, gp= 0 .mask 0x00020000,-4 .fmask 0x00000000,0 save 8,$17 move $17,$sp sw $4,8($17) sw $5,12($17) .set noreorder nop .set reorder move $sp,$17 restore 8,$17 jr $31 .end f .size f, .-f .ident "GCC: (Debian 8.3.0-6) 8.3.0" I think there is somthing wrong here with handling stub for O32 MIPS16 floating parameter. +. Point 1, with b.3.s, the func entry should be __fn_stub_f instead of f, which I mean the f in symbol table should point to the __fn_stub_f in the b.3.s , and __fn_local_f in symbol table should point to the f in the b.3.s ; +. Point 2, if Point 1 is right, the b.2.s should be just like Point 1, but it is not right now, and we need fix this at first; +. Point 3, if Point 1 is right, b.1.s should has only 3 nops in the mip32 32 stub code, instead of both in mips32 stub code and mip16 code. Did I get it right?