https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99217
huangpei at loongson dot cn <huangpei at loongson dot cn> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |huangpei at loongson dot cn
--- Comment #6 from huangpei at loongson dot cn <huangpei at loongson dot cn>
---
Created attachment 52005
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=52005&action=edit
fix -fpatch-function-entry on MIPS
Patch 0001 fix -fpatchable-function-entry on non-MIPS16, but it cause
compiling b.c (see previous comment) with duplicate __fn_stub_f* in asm output
in MIPS16
Patch 0002 remove the duplicate __fn_stub_f* by filter __fn_stub_ in
ASM_DECLARE_FUNCTION_NAME. However, implenmenting ASM_DECLARE_FUNCTION_NAME
cause asm generation of function f interleave with __fn_stub_f, which cause
error even without -fpatchable-function-entry on MIPS16. Patch 0002
separates asm generation of f from its stub by delay
"mips16_build_function_stub" till "mips_output_function_epilogue", and no error
on MIPS16 without -fpatchable-function-entry.
But it is not perfect.
+. without -fpatchable-function-entry, asm output of b.c like this
.file 1 "b.c"
.section .mdebug.abi32
.previous
.nan legacy
.module fp=32
.module oddspreg
.abicalls
.text
.align 2
.globl f
.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 should be here
# 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
.size f, .-f !!! .size should be not be here
.ident "GCC: (GNU) 8.3.0"
+. with -fpatchable-functione-entry=3, asm output of b.c like this,
.section .mdebug.abi32
.previous
.nan legacy
.module fp=32
.module oddspreg
.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
!!! f should not be patched with nop, since this is the first entry from
caller's point
$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
sw $4,8($17)
sw $5,12($17)
.set noreorder
nop
.set reorder
move $sp,$17
restore 8,$17
jr $31
.end f
# Stub function for f (float, float)
.section .mips16.fn.f,"ax",@progbits
.align 2
.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
.size f, .-f
.ident "GCC: (GNU) 8.3.0"