File: arm-cmse-diagnostics.s

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (281 lines) | stat: -rw-r--r-- 14,006 bytes parent folder | download | duplicates (8)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
// REQUIRES: arm
/// Test CMSE diagnostics.

// RUN: rm -rf %t && split-file %s %t && cd %t

/// Test diagnostics emitted during checks of the CMSE import library
// RUN: llvm-mc -arm-add-build-attributes -filetype=obj --triple=thumbv8m.base lib -o lib.o
// RUN: llvm-mc -arm-add-build-attributes -filetype=obj --triple=thumbv8m.base app -I %S/Inputs -o app.o
// RUN: llvm-objcopy --redefine-sym=entry7_duplicate=entry6_duplicate lib.o
// RUN: not ld.lld --cmse-implib --in-implib=lib.o app.o -o /dev/null 2>&1 | FileCheck %s --check-prefixes=ERR_IMPLIB
// RUN: not ld.lld --cmse-implib --in-implib=lib.o --in-implib=lib.o app.o -o /dev/null 2>&1 | FileCheck %s --check-prefixes=ERR_MULT_INIMPLIB
// RUN: not ld.lld --in-implib=lib.o app.o -o /dev/null 2>&1 | FileCheck %s --check-prefixes=ERR_IN_IMPLIB
// RUN: not ld.lld --out-implib=out.lib app.o -o /dev/null 2>&1 | FileCheck %s --check-prefixes=ERR_OUT_IMPLIB
// RUN: not ld.lld --out-implib=out.lib --in-implib=lib.o app.o -o /dev/null 2>&1 | FileCheck %s --check-prefixes=ERR_IN_IMPLIB,ERR_OUT_IMPLIB

// ERR_IMPLIB: error: CMSE symbol 'entry_not_external' in import library '{{.*}}' is not global
// ERR_IMPLIB: error: CMSE symbol 'entry_not_absolute' in import library '{{.*}}' is not absolute
// ERR_IMPLIB: error: CMSE symbol 'entry_not_function' in import library '{{.*}}' is not a Thumb function definition
// ERR_IMPLIB: error: CMSE symbol 'entry_not_thumb' in import library '{{.*}}' is not a Thumb function definition
// ERR_IMPLIB: warning: CMSE symbol 'entry5_incorrect_size' in import library '{{.*}}' does not have correct size of 8 bytes
// ERR_IMPLIB: error: CMSE symbol 'entry6_duplicate' is multiply defined in import library '{{.*}}'
// ERR_MULT_INIMPLIB: error: multiple CMSE import libraries not supported
// ERR_IN_IMPLIB: error: --in-implib may not be used without --cmse-implib
// ERR_OUT_IMPLIB: error: --out-implib may not be used without --cmse-implib

/// CMSE Only supported by ARMv8-M architecture or later.
// RUN: llvm-mc -arm-add-build-attributes -filetype=obj -triple=thumbv8m.base app -I %S/Inputs -o app1.o
// RUN: ld.lld --cmse-implib -Ttext=0x8000 --section-start .gnu.sgstubs=0x20000 -o app1 app1.o 2>&1 | FileCheck /dev/null --implicit-check-not=error:

// RUN: llvm-mc -arm-add-build-attributes -filetype=obj -triple=thumbv8m.main app -I %S/Inputs -o app2.o
// RUN: ld.lld --cmse-implib -Ttext=0x8000 --section-start .gnu.sgstubs=0x20000 -o app2 app2.o 2>&1 | FileCheck /dev/null --implicit-check-not=error:

// RUN: llvm-mc -arm-add-build-attributes -filetype=obj -triple=thumbv8.1m.main app -I %S/Inputs -o app3.o
// RUN: ld.lld --cmse-implib -Ttext=0x8000 --section-start .gnu.sgstubs=0x20000 -o app3 app3.o 2>&1 | FileCheck /dev/null --implicit-check-not=error:

/// Expect errors for other architectures.
// RUN: llvm-mc -arm-add-build-attributes -filetype=obj -triple=thumbv9a app -I %S/Inputs -o app4.o
// RUN: not ld.lld --cmse-implib -Ttext=0x8000 --section-start .gnu.sgstubs=0x20000 -o app4 app4.o 2>&1 | FileCheck %s --check-prefixes=ERR_ARCH

// RUN: llvm-mc -arm-add-build-attributes -filetype=obj -triple=armv7-m app -I %S/Inputs -o app5.o
// RUN: not ld.lld --cmse-implib -Ttext=0x8000 --section-start .gnu.sgstubs=0x20000 -o app5 app5.o 2>&1 | FileCheck %s --check-prefixes=ERR_ARCH

// RUN: llvm-mc -arm-add-build-attributes -filetype=obj -triple=armv8-m app -I %S/Inputs -o app6.o
// RUN: not ld.lld --cmse-implib -Ttext=0x8000 --section-start .gnu.sgstubs=0x20000 -o app6 app6.o 2>&1 | FileCheck %s --check-prefixes=ERR_ARCH

/// Invalid triple defaults to v4T. Error.
// RUN: llvm-mc -arm-add-build-attributes -filetype=obj -triple=thumb app -I %S/Inputs -o app7.o
// RUN: not ld.lld --cmse-implib -Ttext=0x8000 --section-start .gnu.sgstubs=0x20000 -o app7 app7.o  2>&1 | FileCheck %s --check-prefixes=ERR_ARCH

/// No build attributes. Error.
// RUN: llvm-mc -filetype=obj -triple=thumb app -I %S/Inputs -o app8.o
// RUN: not ld.lld --cmse-implib -Ttext=0x8000 --section-start .gnu.sgstubs=0x20000 -o app8 app8.o  2>&1 | FileCheck %s --check-prefixes=ERR_ARCH

// ERR_ARCH: CMSE is only supported by ARMv8-M architecture or later

/// Test that the linker diagnoses cases where the linker synthesized veneer addresses
/// specified by the CMSE input library cannot be placed at the .gnu.sgstubs section address.

// RUN: llvm-mc -arm-add-build-attributes -filetype=obj --triple=thumbv8m.main app -I %S/Inputs -o 1.o
/// Create a CMSE import library with a secure gateway veneer at 0x10000
// RUN: ld.lld --cmse-implib --section-start .gnu.sgstubs=0x10000 1.o -o 1 --out-implib=1.lib 2>&1 | FileCheck /dev/null --implicit-check-not=error:
/// Create a new import library with the secure gateway veneer and .gnu.sgstubs specified at the same address
// RUN: ld.lld --cmse-implib --section-start .gnu.sgstubs=0x10000 1.o -o 2 --out-implib=2.lib --in-implib=1.lib 2>&1 | FileCheck /dev/null --implicit-check-not=error:
/// Create a new import library with the secure gateway veneer specified at a same address but .gnu.sgstubs at a higher address.
// RUN: not ld.lld --cmse-implib --section-start .gnu.sgstubs=0x11000 1.o -o 3 --out-implib=3.lib --in-implib=1.lib 2>&1 | FileCheck %s --check-prefixes=ERR_ADDR
/// Create a new import library with the secure gateway veneer specified at a same address but .gnu.sgstubs at a lower address.
// RUN: not ld.lld --cmse-implib --section-start .gnu.sgstubs=0x9000 1.o -o 4 --out-implib=4.lib --in-implib=1.lib 2>&1 | FileCheck %s --check-prefixes=ERR_ADDR

// ERR_ADDR: error: start address of '.gnu.sgstubs' is different from previous link

/// Test that the address of .gnu.sgstubs can be specified via command line or linker script.
/// Test that the linker errors when the address of .gnu.sgstubs is not specified using either method.

// RUN: ld.lld --cmse-implib -Ttext=0x8000 --section-start .gnu.sgstubs=0x20000 --script with_sgstubs.script 1.o -o 1 2>&1 | FileCheck /dev/null --implicit-check-not=error:
// RUN: ld.lld --cmse-implib -Ttext=0x8000 --section-start .gnu.sgstubs=0x20000 --script wout_sgstubs.script 1.o -o 2 2>&1 | FileCheck /dev/null --implicit-check-not=error:
// RUN: ld.lld --cmse-implib -Ttext=0x8000 --section-start .gnu.sgstubs=0x20000 1.o -o 3 2>&1 | FileCheck /dev/null --implicit-check-not=error:
// RUN: ld.lld --cmse-implib -Ttext=0x8000 --script with_sgstubs.script 1.o -o 4 2>&1 | FileCheck /dev/null --implicit-check-not=error:
// RUN: not ld.lld --cmse-implib -Ttext=0x8000 --script wout_sgstubs.script 1.o -o 5 2>&1 | FileCheck %s --check-prefixes=ERR_NOADDR

// RUN: llvm-readelf -S 1 | FileCheck %s --check-prefixes=ADDRCMDLINE
// RUN: llvm-readelf -S 2 | FileCheck %s --check-prefixes=ADDRCMDLINE
// RUN: llvm-readelf -S 3 | FileCheck %s --check-prefixes=ADDRCMDLINE
// RUN: llvm-readelf -S 4 | FileCheck %s --check-prefixes=ADDRLNKSCRIPT

// ERR_NOADDR: error: no address assigned to the veneers output section .gnu.sgstubs

///                       Name          Type         Address    Off   Size ES Flg Lk Inf Al
// ADDRCMDLINE:   .gnu.sgstubs      PROGBITS        00020000 020000 000008 08  AX  0   0 32
// ADDRLNKSCRIPT: .gnu.sgstubs      PROGBITS        00040000 040000 000008 08  AX  0   0 32

/// Test diagnostics emitted during symbol attribute checks.

// RUN: llvm-mc -arm-add-build-attributes -filetype=obj -I %S/Inputs --triple=thumbv8m.base symattr -o symattr.o
// RUN: not ld.lld --cmse-implib symattr.o -o /dev/null 2>&1 | FileCheck %s --check-prefixes=ERR_SYMATTR

// ERR_SYMATTR-NOT: __acle_se_valid_{{.*}}
// ERR_SYMATTR: error: {{.*}}: cmse special symbol '__acle_se_invalid_1' is not a Thumb function definition
// ERR_SYMATTR: error: {{.*}}: cmse special symbol '__acle_se_invalid_2' is not a Thumb function definition
// ERR_SYMATTR: error: {{.*}}: cmse entry symbol 'invalid_3' is not a Thumb function definition
// ERR_SYMATTR: error: {{.*}}: cmse entry symbol 'invalid_4' is not a Thumb function definition
// ERR_SYMATTR: error: {{.*}}: cmse special symbol '__acle_se_invalid_5' detected, but no associated entry function definition 'invalid_5' with external linkage found
// ERR_SYMATTR: error: {{.*}}: cmse special symbol '__acle_se_invalid_6' detected, but no associated entry function definition 'invalid_6' with external linkage found
// ERR_SYMATTR: error: {{.*}}: cmse special symbol '__acle_se_invalid_7' is not a Thumb function definition
// ERR_SYMATTR: error: {{.*}}: cmse special symbol '__acle_se_invalid_8' detected, but no associated entry function definition 'invalid_8' with external linkage found
// ERR_SYMATTR: error: {{.*}}: cmse special symbol '__acle_se_invalid_9' cannot be an absolute symbol
// ERR_SYMATTR: error: {{.*}}: cmse special symbol '__acle_se_invalid_10' cannot be an absolute symbol
// ERR_SYMATTR: error: {{.*}}: cmse special symbol '__acle_se_invalid_11' is not a Thumb function definition
// ERR_SYMATTR: error: {{.*}}: cmse entry symbol 'invalid_12' is not a Thumb function definition

/// Test diagnostics emitted when a symbol is removed from a later version of the import library.
// RUN: llvm-mc -arm-add-build-attributes -filetype=obj -I %S/Inputs --triple=thumbv8m.base libv1 -o libv1.o
// RUN: llvm-mc -arm-add-build-attributes -filetype=obj -I %S/Inputs --triple=thumbv8m.base libv2 -o libv2.o
// RUN: ld.lld -Ttext=0x8000 --section-start .gnu.sgstubs=0x20000 --cmse-implib libv1.o --out-implib=libv1.lib -o /dev/null
// RUN: ld.lld -Ttext=0x8000 --section-start .gnu.sgstubs=0x20000 --cmse-implib libv2.o --in-implib=libv1.lib --out-implib=libv2.lib -o /dev/null 2>&1 | FileCheck %s --check-prefixes=WARN_MISSING
// RUN: ld.lld -Ttext=0x8000 --section-start .gnu.sgstubs=0x20000 --cmse-implib libv1.o --in-implib=libv2.lib -o /dev/null 2>&1 | FileCheck %s --check-prefixes=WARN_NEWENTRY

// WARN_MISSING: warning: entry function 'bar' from CMSE import library is not present in secure application
// WARN_NEWENTRY: warning: new entry function 'bar' introduced but no output import library specified

//--- with_sgstubs.script
SECTIONS {
  .text : { *(.text) }
  .gnu.sgstubs 0x40000 : { *(.gnu.sgstubs*) }
}

//--- wout_sgstubs.script
SECTIONS {
  .text : { *(.text) }
}

//--- app
  .include "arm-cmse-macros.s"
  .text
  .thumb

cmse_veneer entry, function, global, function, global

//--- lib
    .text
    .thumb

/// Symbol not absolute.
    .global entry_not_absolute
    .type entry_not_absolute, STT_FUNC
    .thumb_func
entry_not_absolute:
    .size entry_not_absolute, 8

/// Symbol not global or weak.
    .local entry_not_external
    .type entry_not_external, STT_FUNC
entry_not_external=0x1001
    .size entry_not_external, 8

/// Symbol not the function type.
    .global entry_not_function
    .type entry_not_function, STT_NOTYPE
entry_not_function=0x1001
    .size entry_not_function, 8

/// Symbol not a Thumb code symbol.
    .global entry_not_thumb
    .type entry_not_thumb, STT_FUNC
entry_not_thumb=0x1000
    .size entry_not_thumb, 8

/// Symbol with incorrect size.
    .global entry5_incorrect_size
    .type entry5_incorrect_size, STT_FUNC
entry5_incorrect_size=0x1009
    .size entry5_incorrect_size, 6

/// Duplicate symbols.
    .global entry6_duplicate
    .type entry6_duplicate, STT_FUNC
entry6_duplicate=0x1001
    .size entry6_duplicate, 8

/// entry7_duplicate gets renamed to entry6_duplicate by llvm-objcopy.
    .global entry7_duplicate
    .type entry7_duplicate, STT_FUNC
entry7_duplicate=0x1009
    .size entry7_duplicate, 8

//--- symattr
.include "arm-cmse-macros.s"

  .text
  .thumb

/// Valid sequences
/// both sym and __acle_se_sym should be global or weak Thumb code symbols.
  cmse_veneer valid_1, function, global, function, global
  cmse_veneer valid_2, function,   weak, function,   weak
  cmse_veneer valid_3, function,   weak, function, global
  cmse_veneer valid_4, function, global, function,   weak

/// Invalid sequences
/// __acle_se_sym is an object
  cmse_veneer invalid_1, function, global,   object, global
  cmse_veneer invalid_2, function, global,   object,   weak
/// sym is an object
  cmse_veneer invalid_3,   object, global, function, global
  cmse_veneer invalid_4,   object, global, function,   weak
/// sym is local
  cmse_veneer invalid_5, function,  local, function, global
  cmse_veneer invalid_6, function,  local, function,   weak

/// __acle_se_invalid_7 not defined.
  .global invalid_7
	.type	invalid_7, %function
  .global __acle_se_invalid_7
  .thumb_func
invalid_7:

/// invalid_8 not defined.
  .global __acle_se_invalid_8
  .thumb_func
__acle_se_invalid_8:

// Absolute symbols with same values
  .global invalid_9
  .global __acle_se_invalid_9
	.type	__acle_se_invalid_9, %function
	.type	invalid_9, %function
__acle_se_invalid_9=0x1001
invalid_9=0x1001
	.size	invalid_9, 0
  .size __acle_se_invalid_9, 0

// Absolute symbols with different values
	.align 2
	.global	__acle_se_invalid_10
	.global	invalid_10
	.type	__acle_se_invalid_10, %function
	.type	invalid_10, %function
__acle_se_invalid_10 = 0x10001
invalid_10 = 0x10005
	.size	invalid_10, 0
  .size __acle_se_invalid_10, 0

  .section nonthumb
  .thumb
  .align  2
  .global  invalid_11
  .global  __acle_se_invalid_11
  .type  invalid_11, %function
  .type  __acle_se_invalid_11, %function
invalid_11:
  .size  invalid_11, .-invalid_11
/// Invalid non-thumb function symbol __acle_se_invalid_11
__acle_se_invalid_11=0x1000

  .global  invalid_12
  .global  __acle_se_invalid_12
  .type  invalid_12, %function
  .type  __acle_se_invalid_12, %function
/// Invalid non-thumb function symbol invalid_12
invalid_12=0x1000
  .thumb
__acle_se_invalid_12:
  .size  __acle_se_invalid_12, .-__acle_se_invalid_12

//--- libv1
.include "arm-cmse-macros.s"

  .text
  .thumb

/// Import library version 1 with foo and bar
  cmse_veneer foo, function, global, function, global
  cmse_veneer bar, function,   weak, function,   weak

//--- libv2
.include "arm-cmse-macros.s"

  .text
  .thumb

/// Import library version 2 with bar missing.
  cmse_veneer foo, function, global, function, global