xref: /llvm-project/clang/test/Driver/baremetal-multilib.yaml (revision f9e11501841fc602488fea78b88910eab7d4d396)
1# REQUIRES: shell
2# UNSUPPORTED: system-windows
3
4# RUN: %clang --multi-lib-config=%s -no-canonical-prefixes -x c++ %s -### -o %t.out 2>&1 \
5# RUN:     --target=thumbv8m.main-none-eabihf --sysroot= \
6# RUN:   | FileCheck %s
7# CHECK:      "-cc1" "-triple" "thumbv8m.main-unknown-none-eabihf"
8# CHECK-SAME: "-internal-isystem" "[[SYSROOT:[^"]*]]/bin/../lib/clang-runtimes/arm-none-eabi/thumb/v8-m.main/fp/include/c++/v1"
9# CHECK-SAME: "-internal-isystem" "[[SYSROOT]]/bin/../lib/clang-runtimes/arm-none-eabi/thumb/v8-m.main/fp/include"
10# CHECK-SAME: "-x" "c++" "{{.*}}baremetal-multilib.yaml"
11# CHECK-NEXT: ld{{(.exe)?}}" "{{.*}}.o" "-Bstatic"
12# CHECK-SAME: "-L[[SYSROOT]]/bin/../lib/clang-runtimes/arm-none-eabi/thumb/v8-m.main/fp/lib"
13# CHECK-SAME: "{{[^"]*}}libclang_rt.builtins.a"
14# CHECK-SAME: "-lc"
15# CHECK-SAME: "-o" "{{.*}}.tmp.out"
16
17# RUN: %clang --multi-lib-config=%s -no-canonical-prefixes -x c++ %s -### -o %t.out 2>&1 \
18# RUN:     --target=thumbv7em-none-eabi -mfpu=fpv4-sp-d16 --sysroot= \
19# RUN:   | FileCheck --check-prefix=CHECK-NO-MATCH %s
20# CHECK-NO-MATCH: warning: no multilib found matching flags:
21# CHECK-NO-MATCH-SAME: --target=thumbv7em-unknown-none-eabi
22# CHECK-NO-MATCH: note: available multilibs are:
23# CHECK-NO-MATCH: --target=thumbv6m-unknown-none-eabi -mfpu=none
24# CHECK-NO-MATCH: --target=thumbv7m-unknown-none-eabi -mfpu=none
25# CHECK-NO-MATCH: --target=thumbv7em-unknown-none-eabi -mfpu=none
26
27# RUN: %clang --multi-lib-config=%s -no-canonical-prefixes -print-multi-directory 2>&1 \
28# RUN:     --target=thumbv8m.main-none-eabihf --sysroot= \
29# RUN:   | FileCheck --check-prefix=CHECK-PRINT-MULTI-DIRECTORY %s
30# CHECK-PRINT-MULTI-DIRECTORY: arm-none-eabi/thumb/v8-m.main/fp
31
32# RUN: %clang --multi-lib-config=%s -no-canonical-prefixes -print-multi-lib 2>&1 \
33# RUN:     --target=arm-none-eabi --sysroot= \
34# RUN:   | FileCheck --check-prefix=CHECK-PRINT-MULTI-LIB %s
35# CHECK-PRINT-MULTI-LIB: arm-none-eabi/thumb/v6-m/nofp;@-target=thumbv6m-unknown-none-eabi@mfpu=none
36# CHECK-PRINT-MULTI-LIB: arm-none-eabi/thumb/v7-m/nofp;@-target=thumbv7m-unknown-none-eabi@mfpu=none
37# CHECK-PRINT-MULTI-LIB: arm-none-eabi/thumb/v7e-m/nofp;@-target=thumbv7em-unknown-none-eabi@mfpu=none
38# CHECK-PRINT-MULTI-LIB: arm-none-eabi/thumb/v8-m.main/nofp;@-target=thumbv8m.main-unknown-none-eabi@mfpu=none
39# CHECK-PRINT-MULTI-LIB: arm-none-eabi/thumb/v8.1-m.main/nofp/nomve;@-target=thumbv8.1m.main-unknown-none-eabi@mfpu=none
40# CHECK-PRINT-MULTI-LIB: arm-none-eabi/thumb/v7e-m/fpv4_sp_d16;@-target=thumbv7em-unknown-none-eabihf@mfpu=fpv4-sp-d16
41# CHECK-PRINT-MULTI-LIB: arm-none-eabi/thumb/v7e-m/fpv5_d16;@-target=thumbv7em-unknown-none-eabihf@mfpu=fpv5-d16
42# CHECK-PRINT-MULTI-LIB: arm-none-eabi/thumb/v8-m.main/fp;@-target=thumbv8m.main-unknown-none-eabihf@mfpu=fpv5-d16
43# CHECK-PRINT-MULTI-LIB: arm-none-eabi/thumb/v8.1-m.main/fp;@-target=thumbv8.1m.main-unknown-none-eabihf@mfpu=fp-armv8-fullfp16-sp-d16
44# CHECK-PRINT-MULTI-LIB: arm-none-eabi/thumb/v8.1-m.main/nofp/mve;@-target=thumbv8.1m.main-unknown-none-eabihf@march=thumbv8.1m.main+mve@mfpu=none
45
46# RUN: %clang --multi-lib-config=%s -no-canonical-prefixes -x assembler -mexecute-only \
47# RUN:     --target=arm-none-eabi --sysroot= %s -c -### 2>&1 \
48# RUN:    | FileCheck %s --check-prefix=CHECK-NO-EXECUTE-ONLY-ASM
49# CHECK-NO-EXECUTE-ONLY-ASM: warning: argument unused during compilation: '-mexecute-only'
50
51---
52# This file is in two parts:
53# 1. A list of library variants.
54# 2. A mapping from flags generated from command line arguments to further
55#    flags.
56
57# How does clang use this file?
58# 1. If the ToolChain class for the architecture supports this form of
59#    multilib it then it loads the file if present in sysroot.
60# 2. Generate flags from the user provided arguments.
61#    (Use `clang -print-multi-flags-experimental` to see which flags are
62#    generated).
63# 3. Compare the arguments against each regular expression and store
64#    associated flags if there's a match.
65# 4. Find the last library variant whose flags are a subset of the
66#    flags derived from the user provided arguments.
67# 5. Use the directory for the library variant as the sysroot.
68
69# Clang will emit an error if this number is greater than its current multilib
70# version or if its major version differs, but will accept lesser minor
71# versions.
72MultilibVersion: 1.0
73
74# The first section of the file is the list of library variants.
75# A library is considered compatible if the are a subset of the flags derived
76# from the arguments provided by the user.
77# If multiple libraries are deemed compatible then the one that appears
78# last in the list wins. A ToolChain may instead opt to use more than one
79# multilib, layered on top of each other.
80
81Variants:
82- Dir: arm-none-eabi/arm/v4t
83  Flags: [--target=armv4t-unknown-none-eabi]
84
85- Dir: arm-none-eabi/thumb/v6-m/nofp
86  Flags: [--target=thumbv6m-unknown-none-eabi, -mfpu=none]
87
88- Dir: arm-none-eabi/thumb/v7-m/nofp
89  Flags: [--target=thumbv7m-unknown-none-eabi, -mfpu=none]
90
91- Dir: arm-none-eabi/thumb/v7e-m/nofp
92  Flags: [--target=thumbv7em-unknown-none-eabi, -mfpu=none]
93
94- Dir: arm-none-eabi/thumb/v8-m.main/nofp
95  Flags: [--target=thumbv8m.main-unknown-none-eabi, -mfpu=none]
96
97- Dir: arm-none-eabi/thumb/v8.1-m.main/nofp/nomve
98  Flags: [--target=thumbv8.1m.main-unknown-none-eabi, -mfpu=none]
99
100- Dir: arm-none-eabi/thumb/v7e-m/fpv4_sp_d16
101  Flags: [--target=thumbv7em-unknown-none-eabihf, -mfpu=fpv4-sp-d16]
102
103- Dir: arm-none-eabi/thumb/v7e-m/fpv5_d16
104  Flags: [--target=thumbv7em-unknown-none-eabihf, -mfpu=fpv5-d16]
105
106- Dir: arm-none-eabi/thumb/v8-m.main/fp
107  Flags: [--target=thumbv8m.main-unknown-none-eabihf, -mfpu=fpv5-d16]
108
109- Dir: arm-none-eabi/thumb/v8.1-m.main/fp
110  Flags: [--target=thumbv8.1m.main-unknown-none-eabihf, -mfpu=fp-armv8-fullfp16-sp-d16]
111
112- Dir: arm-none-eabi/thumb/v8.1-m.main/nofp/mve
113  Flags: [--target=thumbv8.1m.main-unknown-none-eabihf, -march=thumbv8.1m.main+mve, -mfpu=none]
114
115
116# The second section of the file is a map from auto-detected flags
117# to custom flags. The auto-detected flags can be printed out
118# by running clang with `-print-multi-flags-experimental`.
119# The regex must match a whole flag string.
120# All flags in the "Flags" list will be added if an argument matches.
121Mappings:
122# For v8m.base (and potential later v8m baseline versions) use v6m
123- Match: --target=thumbv8(\.[0-9]+)?m\.base-unknown-none-eabi
124  Flags: [--target=thumbv6m-unknown-none-eabi]
125# Match versions after v8.1m.main. We assume that v8.2m (if/when it exists) will
126# be backwards compatible with v8.1m.
127# The alternative is to not recognise later versions, and require that
128# this multilib spec is updated before it can be used with newer
129# architecture versions.
130- Match: --target=thumbv8\.[1-9]m\.main-unknown-none-eabi
131  Flags: [--target=thumbv8.1m.main-unknown-none-eabi]
132- Match: --target=thumbv8\.[1-9]m\.main-unknown-none-eabihf
133  Flags: [--target=thumbv8.1m.main-unknown-none-eabihf]
134
135- Match: -march=thumbv8\.[1-9]m\.main.*\+mve($|\+).*
136  Flags: [-march=thumbv8.1m.main+mve]
137
138# Hierarchy among FPUs: fpvN-d16 is a superset of fpvN-sp-d16, and
139# fpvN-d16 is a superset of fpv[N-1]-d16, for all N.
140- Match: -mfpu=fpv5-d16
141  Flags:
142  - -mfpu=fpv4-d16
143  - -mfpu=fpv5-sp-d16
144  - -mfpu=fpv4-sp-d16
145- Match: -mfpu=fpv5-sp-d16
146  Flags:
147  - -mfpu=fpv4-sp-d16
148- Match: -mfpu=fpv4-d16
149  Flags:
150  - -mfpu=fpv4-sp-d16
151
152...
153