summaryrefslogtreecommitdiffstats
path: root/llvm/test/CodeGen/Mips
diff options
context:
space:
mode:
authorMirko Brkusanin <Mirko.Brkusanin@rt-rk.com>2019-10-08 14:32:03 +0000
committerMirko Brkusanin <Mirko.Brkusanin@rt-rk.com>2019-10-08 14:32:03 +0000
commit45e0f2437327e753b0cd20fbe6fa25c8e1b226c7 (patch)
tree49e56d81f3c915f761557fcea0fc61a08c0a53ce /llvm/test/CodeGen/Mips
parent2cd0f2895946de546d066f67c88ff365d3210017 (diff)
downloadbcm5719-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.ll117
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" }
OpenPOWER on IntegriCloud