diff options
| author | Mirko Brkusanin <Mirko.Brkusanin@rt-rk.com> | 2019-10-08 14:32:03 +0000 |
|---|---|---|
| committer | Mirko Brkusanin <Mirko.Brkusanin@rt-rk.com> | 2019-10-08 14:32:03 +0000 |
| commit | 45e0f2437327e753b0cd20fbe6fa25c8e1b226c7 (patch) | |
| tree | 49e56d81f3c915f761557fcea0fc61a08c0a53ce /llvm/test/CodeGen/Mips | |
| parent | 2cd0f2895946de546d066f67c88ff365d3210017 (diff) | |
| download | bcm5719-llvm-45e0f2437327e753b0cd20fbe6fa25c8e1b226c7.tar.gz bcm5719-llvm-45e0f2437327e753b0cd20fbe6fa25c8e1b226c7.zip | |
[Mips] Emit proper ABI for _mcount calls
When -pg option is present than a call to _mcount is inserted into every
function. However since the proper ABI was not followed then the generated
gmon.out did not give proper results. By inserting needed instructions
before every _mcount we can fix this.
Differential Revision: https://reviews.llvm.org/D68390
llvm-svn: 374055
Diffstat (limited to 'llvm/test/CodeGen/Mips')
| -rw-r--r-- | llvm/test/CodeGen/Mips/mcount.ll | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/Mips/mcount.ll b/llvm/test/CodeGen/Mips/mcount.ll new file mode 100644 index 00000000000..e136ae03da5 --- /dev/null +++ b/llvm/test/CodeGen/Mips/mcount.ll @@ -0,0 +1,117 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py + +; RUN: llc -march=mips < %s | FileCheck %s -check-prefix=MIPS32 +; RUN: llc -march=mips -relocation-model=pic < %s | FileCheck %s -check-prefix=MIPS32-PIC +; RUN: llc -march=mips64 < %s | FileCheck %s -check-prefix=MIPS64 +; RUN: llc -march=mips64 -relocation-model=pic < %s | FileCheck %s -check-prefix=MIPS64-PIC +; RUN: llc -march=mips -mattr=+micromips < %s | FileCheck %s -check-prefix=MIPS32-MM +; RUN: llc -march=mips -relocation-model=pic -mattr=+micromips < %s | FileCheck %s -check-prefix=MIPS32-MM-PIC + +; Test that checks ABI for _mcount calls. + +; Function Attrs: noinline nounwind optnone +define void @foo() #0 { +; MIPS32-LABEL: foo: +; MIPS32: # %bb.0: # %entry +; MIPS32-NEXT: addiu $sp, $sp, -24 +; MIPS32-NEXT: .cfi_def_cfa_offset 24 +; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill +; MIPS32-NEXT: .cfi_offset 31, -4 +; MIPS32-NEXT: move $1, $ra +; MIPS32-NEXT: jal _mcount +; MIPS32-NEXT: addiu $sp, $sp, -8 +; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload +; MIPS32-NEXT: jr $ra +; MIPS32-NEXT: addiu $sp, $sp, 24 +; +; MIPS32-PIC-LABEL: foo: +; MIPS32-PIC: # %bb.0: # %entry +; MIPS32-PIC-NEXT: lui $2, %hi(_gp_disp) +; MIPS32-PIC-NEXT: addiu $2, $2, %lo(_gp_disp) +; MIPS32-PIC-NEXT: addiu $sp, $sp, -24 +; MIPS32-PIC-NEXT: .cfi_def_cfa_offset 24 +; MIPS32-PIC-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill +; MIPS32-PIC-NEXT: .cfi_offset 31, -4 +; MIPS32-PIC-NEXT: addu $gp, $2, $25 +; MIPS32-PIC-NEXT: lw $25, %call16(_mcount)($gp) +; MIPS32-PIC-NEXT: move $1, $ra +; MIPS32-PIC-NEXT: .reloc ($tmp0), R_MIPS_JALR, _mcount +; MIPS32-PIC-NEXT: $tmp0: +; MIPS32-PIC-NEXT: jalr $25 +; MIPS32-PIC-NEXT: addiu $sp, $sp, -8 +; MIPS32-PIC-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload +; MIPS32-PIC-NEXT: jr $ra +; MIPS32-PIC-NEXT: addiu $sp, $sp, 24 +; +; MIPS64-LABEL: foo: +; MIPS64: # %bb.0: # %entry +; MIPS64-NEXT: daddiu $sp, $sp, -16 +; MIPS64-NEXT: .cfi_def_cfa_offset 16 +; MIPS64-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill +; MIPS64-NEXT: .cfi_offset 31, -8 +; MIPS64-NEXT: or $1, $ra, $zero +; MIPS64-NEXT: jal _mcount +; MIPS64-NEXT: nop +; MIPS64-NEXT: ld $ra, 8($sp) # 8-byte Folded Reload +; MIPS64-NEXT: jr $ra +; MIPS64-NEXT: daddiu $sp, $sp, 16 +; +; MIPS64-PIC-LABEL: foo: +; MIPS64-PIC: # %bb.0: # %entry +; MIPS64-PIC-NEXT: daddiu $sp, $sp, -16 +; MIPS64-PIC-NEXT: .cfi_def_cfa_offset 16 +; MIPS64-PIC-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill +; MIPS64-PIC-NEXT: sd $gp, 0($sp) # 8-byte Folded Spill +; MIPS64-PIC-NEXT: .cfi_offset 31, -8 +; MIPS64-PIC-NEXT: .cfi_offset 28, -16 +; MIPS64-PIC-NEXT: lui $1, %hi(%neg(%gp_rel(foo))) +; MIPS64-PIC-NEXT: daddu $1, $1, $25 +; MIPS64-PIC-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(foo))) +; MIPS64-PIC-NEXT: ld $25, %call16(_mcount)($gp) +; MIPS64-PIC-NEXT: or $1, $ra, $zero +; MIPS64-PIC-NEXT: .reloc .Ltmp0, R_MIPS_JALR, _mcount +; MIPS64-PIC-NEXT: .Ltmp0: +; MIPS64-PIC-NEXT: jalr $25 +; MIPS64-PIC-NEXT: nop +; MIPS64-PIC-NEXT: ld $gp, 0($sp) # 8-byte Folded Reload +; MIPS64-PIC-NEXT: ld $ra, 8($sp) # 8-byte Folded Reload +; MIPS64-PIC-NEXT: jr $ra +; MIPS64-PIC-NEXT: daddiu $sp, $sp, 16 +; +; MIPS32-MM-LABEL: foo: +; MIPS32-MM: # %bb.0: # %entry +; MIPS32-MM-NEXT: addiu $sp, $sp, -24 +; MIPS32-MM-NEXT: .cfi_def_cfa_offset 24 +; MIPS32-MM-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill +; MIPS32-MM-NEXT: .cfi_offset 31, -4 +; MIPS32-MM-NEXT: move $1, $ra +; MIPS32-MM-NEXT: jal _mcount +; MIPS32-MM-NEXT: addiu $sp, $sp, -8 +; MIPS32-MM-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload +; MIPS32-MM-NEXT: jr $ra +; MIPS32-MM-NEXT: addiu $sp, $sp, 24 +; +; MIPS32-MM-PIC-LABEL: foo: +; MIPS32-MM-PIC: # %bb.0: # %entry +; MIPS32-MM-PIC-NEXT: lui $2, %hi(_gp_disp) +; MIPS32-MM-PIC-NEXT: addiu $2, $2, %lo(_gp_disp) +; MIPS32-MM-PIC-NEXT: addiu $sp, $sp, -24 +; MIPS32-MM-PIC-NEXT: .cfi_def_cfa_offset 24 +; MIPS32-MM-PIC-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill +; MIPS32-MM-PIC-NEXT: .cfi_offset 31, -4 +; MIPS32-MM-PIC-NEXT: addu $2, $2, $25 +; MIPS32-MM-PIC-NEXT: lw $25, %call16(_mcount)($2) +; MIPS32-MM-PIC-NEXT: move $gp, $2 +; MIPS32-MM-PIC-NEXT: move $1, $ra +; MIPS32-MM-PIC-NEXT: .reloc ($tmp0), R_MICROMIPS_JALR, _mcount +; MIPS32-MM-PIC-NEXT: $tmp0: +; MIPS32-MM-PIC-NEXT: jalr $25 +; MIPS32-MM-PIC-NEXT: addiu $sp, $sp, -8 +; MIPS32-MM-PIC-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload +; MIPS32-MM-PIC-NEXT: jr $ra +; MIPS32-MM-PIC-NEXT: addiu $sp, $sp, 24 +entry: + ret void +} + +attributes #0 = { "instrument-function-entry-inlined"="_mcount" } |

