# RUN: llvm-mc %s -filetype obj -triple x86_64-linux-elf -o %t.o
# RUN: llvm-cfi-verify %t.o 2>&1 --summarize | FileCheck %s
# This is the same file as protected-lineinfo.s, however contains a hand-
# assembled function (fake_function) that has no line table information
# associated with it. Because there is no LT info, the indirect call made in the
# function should not be reported at all by llvm-cfi-verify.
# We can test that this indirect call is ignored from the final statistics
# reporting of the cfi-verify program. It should only find a single indirect CF
# instruction at `tiny.cc:11` (see protected-lineinfo.s for the source).
# CHECK-NOT: Begin Instruction
# CHECK: Expected Protected: 1 (100.00%)
# CHECK: Unexpected Protected: 0 (0.00%)
# CHECK: Expected Unprotected: 0 (0.00%)
# CHECK: Unexpected Unprotected (BAD): 0 (0.00%)
.text
.file "ld-temp.o"
.p2align 4, 0x90
.type fake_function,@function
fake_function:
nop
nop
nop
nop
callq *%rax
nop
nop
nop
nop
.type _Z1av.cfi,@function
_Z1av.cfi:
.Lfunc_begin0:
.file 1 "tiny.cc"
.loc 1 3 0
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset %rbp, -16
movq %rsp, %rbp
.cfi_def_cfa_register %rbp
.Ltmp0:
.loc 1 3 11 prologue_end
popq %rbp
retq
.Ltmp1:
.Lfunc_end0:
.size _Z1av.cfi, .Lfunc_end0-_Z1av.cfi
.cfi_endproc
.p2align 4, 0x90
.type _Z1bv.cfi,@function
_Z1bv.cfi:
.Lfunc_begin1:
.loc 1 4 0
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset %rbp, -16
movq %rsp, %rbp
.cfi_def_cfa_register %rbp
.Ltmp2:
.loc 1 4 11 prologue_end
popq %rbp
retq
.Ltmp3:
.Lfunc_end1:
.size _Z1bv.cfi, .Lfunc_end1-_Z1bv.cfi
.cfi_endproc
.hidden main
.globl main
.p2align 4, 0x90
.type main,@function
main:
.Lfunc_begin2:
.loc 1 6 0
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset %rbp, -16
movq %rsp, %rbp
.cfi_def_cfa_register %rbp
subq $32, %rsp
movb $32, -1(%rbp)
movl $0, -12(%rbp)
movl %edi, -8(%rbp)
movq %rsi, -32(%rbp)
.Ltmp4:
.loc 1 8 12 prologue_end
cmpl $1, -8(%rbp)
.loc 1 8 7 is_stmt 0
jne .LBB2_2
.loc 1 0 7
leaq _Z1av(%rip), %rax
.loc 1 9 9 is_stmt 1
movq %rax, -24(%rbp)
.loc 1 9 5 is_stmt 0
jmp .LBB2_3
.LBB2_2:
.loc 1 0 5
leaq _Z1bv(%rip), %rax
.loc 1 11 9 is_stmt 1
movq %rax, -24(%rbp)
.LBB2_3:
.loc 1 0 9 is_stmt 0
leaq .L.cfi.jumptable(%rip), %rcx
.loc 1 13 3 is_stmt 1
movq -24(%rbp), %rax
movq %rax, %rdx
subq %rcx, %rdx
movq %rdx, %rcx
shrq $3, %rcx
shlq $61, %rdx
orq %rcx, %rdx
cmpq $1, %rdx
jbe .LBB2_5
ud2
.LBB2_5:
callq *%rax
.loc 1 14 11
movb $-1, -1(%rbp)
.loc 1 15 1
movl -12(%rbp), %eax
addq $32, %rsp
popq %rbp
retq
.Ltmp5:
.Lfunc_end2:
.size main, .Lfunc_end2-main
.cfi_endproc
.p2align 3, 0x90
.type .L.cfi.jumptable,@function
.L.cfi.jumptable:
.Lfunc_begin3:
.cfi_startproc
#APP
jmp _Z1av.cfi@PLT
int3
int3
int3
jmp _Z1bv.cfi@PLT
int3
int3
int3
#NO_APP
.Lfunc_end3:
.size .L.cfi.jumptable, .Lfunc_end3-.L.cfi.jumptable
.cfi_endproc
.section .debug_str,"MS",@progbits,1
.Linfo_string0:
.asciz "clang version 6.0.0 (trunk 316774)"
.Linfo_string1:
.asciz "tiny.cc"
.Linfo_string2:
.asciz "/tmp/a/b"
.section .debug_abbrev,"",@progbits
.byte 1
.byte 17
.byte 0
.byte 37
.byte 14
.byte 19
.byte 5
.byte 3
.byte 14
.byte 16
.byte 23
.byte 27
.byte 14
.byte 17
.byte 1
.byte 18
.byte 6
.byte 0
.byte 0
.byte 0
.section .debug_info,"",@progbits
.Lcu_begin0:
.long 38
.short 4
.long .debug_abbrev
.byte 8
.byte 1
.long .Linfo_string0
.short 4
.long .Linfo_string1
.long .Lline_table_start0
.long .Linfo_string2
.quad .Lfunc_begin0
.long .Lfunc_end2-.Lfunc_begin0
.section .debug_ranges,"",@progbits
.section .debug_macinfo,"",@progbits
.Lcu_macro_begin0:
.byte 0
.type _Z1av,@function
_Z1av = .L.cfi.jumptable
.type _Z1bv,@function
_Z1bv = .L.cfi.jumptable+8
.ident "clang version 6.0.0 (trunk 316774)"
.section ".note.GNU-stack","",@progbits
.section .debug_line,"",@progbits
.Lline_table_start0: