# RUN: llvm-mc %s -filetype obj -triple aarch64-- -o %t.o # RUN: llvm-cfi-verify %t.o | FileCheck %s # CHECK-LABEL: {{^Instruction: .* \(FAIL_BAD_CONDITIONAL_BRANCH\)}} # CHECK-NEXT: tiny.cc:9 # CHECK: Expected Protected: 0 (0.00%) # CHECK: Unexpected Protected: 0 (0.00%) # CHECK: Expected Unprotected: 0 (0.00%) # CHECK: Unexpected Unprotected (BAD): 1 (100.00%) # Source (tiny.cc): # int a() { return 42; } # int b() { return 137; } # int main(int argc, char** argv) { # int(*ptr)(); # if (argc == 1) # ptr = &a; # else # ptr = &b; # return ptr(); # } # Compile with: # clang++ -target aarch64-- -gmlt tiny.cc -S -o tiny.s .text .file "tiny.cc" .globl _Z1av .p2align 2 .type _Z1av,@function _Z1av: // @_Z1av .Lfunc_begin0: .file 1 "tiny.cc" .loc 1 1 0 // tiny.cc:1:0 .cfi_startproc // BB#0: mov w0, #42 .Ltmp0: .loc 1 1 11 prologue_end // tiny.cc:1:11 ret .Ltmp1: .Lfunc_end0: .size _Z1av, .Lfunc_end0-_Z1av .cfi_endproc .globl _Z1bv .p2align 2 .type _Z1bv,@function _Z1bv: // @_Z1bv .Lfunc_begin1: .loc 1 2 0 // tiny.cc:2:0 .cfi_startproc // BB#0: mov w0, #137 .Ltmp2: .loc 1 2 11 prologue_end // tiny.cc:2:11 ret .Ltmp3: .Lfunc_end1: .size _Z1bv, .Lfunc_end1-_Z1bv .cfi_endproc .globl main .p2align 2 .type main,@function main: // @main .Lfunc_begin2: .loc 1 3 0 // tiny.cc:3:0 .cfi_startproc // BB#0: sub sp, sp, #48 // =48 stp x29, x30, [sp, #32] // 8-byte Folded Spill add x29, sp, #32 // =32 .Lcfi0: .cfi_def_cfa w29, 16 .Lcfi1: .cfi_offset w30, -8 .Lcfi2: .cfi_offset w29, -16 stur wzr, [x29, #-4] stur w0, [x29, #-8] str x1, [sp, #16] .Ltmp4: .loc 1 5 7 prologue_end // tiny.cc:5:7 ldur w0, [x29, #-8] cmp w0, #1 // =1 b.ne .LBB2_2 // BB#1: .loc 1 0 7 is_stmt 0 // tiny.cc:0:7 adrp x8, _Z1av add x8, x8, :lo12:_Z1av .loc 1 6 9 is_stmt 1 // tiny.cc:6:9 str x8, [sp, #8] .loc 1 6 5 is_stmt 0 // tiny.cc:6:5 b .LBB2_3 .LBB2_2: .loc 1 0 5 // tiny.cc:0:5 adrp x8, _Z1bv add x8, x8, :lo12:_Z1bv .loc 1 8 9 is_stmt 1 // tiny.cc:8:9 str x8, [sp, #8] .LBB2_3: .loc 1 9 10 // tiny.cc:9:10 ldr x8, [sp, #8] blr x8 .loc 1 9 3 is_stmt 0 // tiny.cc:9:3 ldp x29, x30, [sp, #32] // 8-byte Folded Reload add sp, sp, #48 // =48 ret .Ltmp5: .Lfunc_end2: .size main, .Lfunc_end2-main .cfi_endproc .section .debug_str,"MS",@progbits,1 .Linfo_string0: .asciz "clang version 4.0.1-10 (tags/RELEASE_401/final)" // string offset=0 .Linfo_string1: .asciz "tiny.cc" // string offset=48 .Linfo_string2: .asciz "/tmp" // string offset=56 .section .debug_loc,"",@progbits .section .debug_abbrev,"",@progbits .Lsection_abbrev: .byte 1 // Abbreviation Code .byte 17 // DW_TAG_compile_unit .byte 0 // DW_CHILDREN_no .byte 37 // DW_AT_producer .byte 14 // DW_FORM_strp .byte 19 // DW_AT_language .byte 5 // DW_FORM_data2 .byte 3 // DW_AT_name .byte 14 // DW_FORM_strp .byte 16 // DW_AT_stmt_list .byte 23 // DW_FORM_sec_offset .byte 27 // DW_AT_comp_dir .byte 14 // DW_FORM_strp .byte 17 // DW_AT_low_pc .byte 1 // DW_FORM_addr .byte 18 // DW_AT_high_pc .byte 6 // DW_FORM_data4 .byte 0 // EOM(1) .byte 0 // EOM(2) .byte 0 // EOM(3) .section .debug_info,"",@progbits .Lsection_info: .Lcu_begin0: .word 38 // Length of Unit .hword 4 // DWARF version number .word .Lsection_abbrev // Offset Into Abbrev. Section .byte 8 // Address Size (in bytes) .byte 1 // Abbrev [1] 0xb:0x1f DW_TAG_compile_unit .word .Linfo_string0 // DW_AT_producer .hword 4 // DW_AT_language .word .Linfo_string1 // DW_AT_name .word .Lline_table_start0 // DW_AT_stmt_list .word .Linfo_string2 // DW_AT_comp_dir .xword .Lfunc_begin0 // DW_AT_low_pc .word .Lfunc_end2-.Lfunc_begin0 // DW_AT_high_pc .section .debug_ranges,"",@progbits .Ldebug_range: .section .debug_macinfo,"",@progbits .Ldebug_macinfo: .Lcu_macro_begin0: .byte 0 // End Of Macro List Mark .ident "clang version 4.0.1-10 (tags/RELEASE_401/final)" .section ".note.GNU-stack","",@progbits .section .debug_line,"",@progbits .Lline_table_start0: