• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# RUN: llvm-mc %s -filetype obj -triple aarch64-- -o %t.o
2# RUN: llvm-cfi-verify %t.o | FileCheck %s
3
4# CHECK-LABEL: {{^Instruction: .* \(FAIL_BAD_CONDITIONAL_BRANCH\)}}
5# CHECK-NEXT: tiny.cc:9
6
7# CHECK: Expected Protected: 0 (0.00%)
8# CHECK: Unexpected Protected: 0 (0.00%)
9# CHECK: Expected Unprotected: 0 (0.00%)
10# CHECK: Unexpected Unprotected (BAD): 1 (100.00%)
11
12# Source (tiny.cc):
13#   int a() { return 42; }
14#   int b() { return 137; }
15#   int main(int argc, char** argv) {
16#     int(*ptr)();
17#     if (argc == 1)
18#       ptr = &a;
19#     else
20#       ptr = &b;
21#     return ptr();
22#   }
23# Compile with:
24#    clang++ -target aarch64-- -gmlt tiny.cc -S -o tiny.s
25	.text
26	.file	"tiny.cc"
27	.globl	_Z1av
28	.p2align	2
29	.type	_Z1av,@function
30_Z1av:                                  // @_Z1av
31.Lfunc_begin0:
32	.file	1 "tiny.cc"
33	.loc	1 1 0                   // tiny.cc:1:0
34	.cfi_startproc
35// BB#0:
36	mov	w0, #42
37.Ltmp0:
38	.loc	1 1 11 prologue_end     // tiny.cc:1:11
39	ret
40.Ltmp1:
41.Lfunc_end0:
42	.size	_Z1av, .Lfunc_end0-_Z1av
43	.cfi_endproc
44
45	.globl	_Z1bv
46	.p2align	2
47	.type	_Z1bv,@function
48_Z1bv:                                  // @_Z1bv
49.Lfunc_begin1:
50	.loc	1 2 0                   // tiny.cc:2:0
51	.cfi_startproc
52// BB#0:
53	mov	w0, #137
54.Ltmp2:
55	.loc	1 2 11 prologue_end     // tiny.cc:2:11
56	ret
57.Ltmp3:
58.Lfunc_end1:
59	.size	_Z1bv, .Lfunc_end1-_Z1bv
60	.cfi_endproc
61
62	.globl	main
63	.p2align	2
64	.type	main,@function
65main:                                   // @main
66.Lfunc_begin2:
67	.loc	1 3 0                   // tiny.cc:3:0
68	.cfi_startproc
69// BB#0:
70	sub	sp, sp, #48             // =48
71	stp	x29, x30, [sp, #32]     // 8-byte Folded Spill
72	add	x29, sp, #32            // =32
73.Lcfi0:
74	.cfi_def_cfa w29, 16
75.Lcfi1:
76	.cfi_offset w30, -8
77.Lcfi2:
78	.cfi_offset w29, -16
79	stur	wzr, [x29, #-4]
80	stur	w0, [x29, #-8]
81	str	x1, [sp, #16]
82.Ltmp4:
83	.loc	1 5 7 prologue_end      // tiny.cc:5:7
84	ldur	w0, [x29, #-8]
85	cmp		w0, #1          // =1
86	b.ne	.LBB2_2
87// BB#1:
88	.loc	1 0 7 is_stmt 0         // tiny.cc:0:7
89	adrp	x8, _Z1av
90	add	x8, x8, :lo12:_Z1av
91	.loc	1 6 9 is_stmt 1         // tiny.cc:6:9
92	str	x8, [sp, #8]
93	.loc	1 6 5 is_stmt 0         // tiny.cc:6:5
94	b	.LBB2_3
95.LBB2_2:
96	.loc	1 0 5                   // tiny.cc:0:5
97	adrp	x8, _Z1bv
98	add	x8, x8, :lo12:_Z1bv
99	.loc	1 8 9 is_stmt 1         // tiny.cc:8:9
100	str	x8, [sp, #8]
101.LBB2_3:
102	.loc	1 9 10                  // tiny.cc:9:10
103	ldr	x8, [sp, #8]
104	blr	x8
105	.loc	1 9 3 is_stmt 0         // tiny.cc:9:3
106	ldp	x29, x30, [sp, #32]     // 8-byte Folded Reload
107	add	sp, sp, #48             // =48
108	ret
109.Ltmp5:
110.Lfunc_end2:
111	.size	main, .Lfunc_end2-main
112	.cfi_endproc
113
114	.section	.debug_str,"MS",@progbits,1
115.Linfo_string0:
116	.asciz	"clang version 4.0.1-10 (tags/RELEASE_401/final)" // string offset=0
117.Linfo_string1:
118	.asciz	"tiny.cc"               // string offset=48
119.Linfo_string2:
120	.asciz	"/tmp"                  // string offset=56
121	.section	.debug_loc,"",@progbits
122	.section	.debug_abbrev,"",@progbits
123.Lsection_abbrev:
124	.byte	1                       // Abbreviation Code
125	.byte	17                      // DW_TAG_compile_unit
126	.byte	0                       // DW_CHILDREN_no
127	.byte	37                      // DW_AT_producer
128	.byte	14                      // DW_FORM_strp
129	.byte	19                      // DW_AT_language
130	.byte	5                       // DW_FORM_data2
131	.byte	3                       // DW_AT_name
132	.byte	14                      // DW_FORM_strp
133	.byte	16                      // DW_AT_stmt_list
134	.byte	23                      // DW_FORM_sec_offset
135	.byte	27                      // DW_AT_comp_dir
136	.byte	14                      // DW_FORM_strp
137	.byte	17                      // DW_AT_low_pc
138	.byte	1                       // DW_FORM_addr
139	.byte	18                      // DW_AT_high_pc
140	.byte	6                       // DW_FORM_data4
141	.byte	0                       // EOM(1)
142	.byte	0                       // EOM(2)
143	.byte	0                       // EOM(3)
144	.section	.debug_info,"",@progbits
145.Lsection_info:
146.Lcu_begin0:
147	.word	38                      // Length of Unit
148	.hword	4                       // DWARF version number
149	.word	.Lsection_abbrev        // Offset Into Abbrev. Section
150	.byte	8                       // Address Size (in bytes)
151	.byte	1                       // Abbrev [1] 0xb:0x1f DW_TAG_compile_unit
152	.word	.Linfo_string0          // DW_AT_producer
153	.hword	4                       // DW_AT_language
154	.word	.Linfo_string1          // DW_AT_name
155	.word	.Lline_table_start0     // DW_AT_stmt_list
156	.word	.Linfo_string2          // DW_AT_comp_dir
157	.xword	.Lfunc_begin0           // DW_AT_low_pc
158	.word	.Lfunc_end2-.Lfunc_begin0 // DW_AT_high_pc
159	.section	.debug_ranges,"",@progbits
160.Ldebug_range:
161	.section	.debug_macinfo,"",@progbits
162.Ldebug_macinfo:
163.Lcu_macro_begin0:
164	.byte	0                       // End Of Macro List Mark
165
166	.ident	"clang version 4.0.1-10 (tags/RELEASE_401/final)"
167	.section	".note.GNU-stack","",@progbits
168	.section	.debug_line,"",@progbits
169.Lline_table_start0:
170