| # 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: |