170 lines
4.8 KiB
ArmAsm
170 lines
4.8 KiB
ArmAsm
# 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:
|