1 // REQUIRES: shell 2 // REQUIRES: x86-registered-target 3 4 // RUN: unset CLANG_NO_DEFAULT_CONFIG 5 // RUN: rm -rf %t && mkdir %t 6 7 //--- If config file is specified by relative path (workdir/cfg-s2), it is searched for by that path. 8 9 // RUN: mkdir -p %t/workdir/subdir 10 // RUN: echo "@subdir/cfg-s2" > %t/workdir/cfg-1 11 // RUN: echo "-Wundefined-var-template" > %t/workdir/subdir/cfg-s2 12 // 13 // RUN: ( cd %t && %clang --config=workdir/cfg-1 -c -### %s 2>&1 | FileCheck %s -check-prefix CHECK-REL ) 14 // 15 // CHECK-REL: Configuration file: {{.*}}/workdir/cfg-1 16 // CHECK-REL: -Wundefined-var-template 17 18 //--- Config files are searched for in binary directory as well. 19 // 20 // RUN: mkdir %t/testbin 21 // RUN: ln -s %clang %t/testbin/clang 22 // RUN: echo "-Werror" > %t/testbin/aaa.cfg 23 // RUN: %t/testbin/clang --config-system-dir= --config-user-dir= --config=aaa.cfg -c -no-canonical-prefixes -### %s 2>&1 | FileCheck %s -check-prefix CHECK-BIN 24 // 25 // CHECK-BIN: Configuration file: {{.*}}/testbin/aaa.cfg 26 // CHECK-BIN: -Werror 27 28 //--- Invocation x86_64-unknown-linux-gnu-clang-g++ tries x86_64-unknown-linux-gnu-clang++.cfg first. 29 // 30 // RUN: mkdir %t/testdmode 31 // RUN: ln -s %clang %t/testdmode/cheribsd-riscv64-hybrid-clang++ 32 // RUN: ln -s %clang %t/testdmode/qqq-clang-g++ 33 // RUN: ln -s %clang %t/testdmode/x86_64-clang 34 // RUN: ln -s %clang %t/testdmode/i386-unknown-linux-gnu-clang-g++ 35 // RUN: ln -s %clang %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ 36 // RUN: ln -s %clang %t/testdmode/x86_64-unknown-linux-gnu-clang 37 // RUN: touch %t/testdmode/cheribsd-riscv64-hybrid-clang++.cfg 38 // RUN: touch %t/testdmode/cheribsd-riscv64-hybrid.cfg 39 // RUN: touch %t/testdmode/qqq-clang-g++.cfg 40 // RUN: touch %t/testdmode/qqq.cfg 41 // RUN: touch %t/testdmode/x86_64-clang.cfg 42 // RUN: touch %t/testdmode/x86_64.cfg 43 // RUN: touch %t/testdmode/x86_64-unknown-linux-gnu-clang++.cfg 44 // RUN: touch %t/testdmode/x86_64-unknown-linux-gnu-clang-g++.cfg 45 // RUN: touch %t/testdmode/x86_64-unknown-linux-gnu-clang.cfg 46 // RUN: touch %t/testdmode/x86_64-unknown-linux-gnu.cfg 47 // RUN: touch %t/testdmode/i386-unknown-linux-gnu-clang++.cfg 48 // RUN: touch %t/testdmode/i386-unknown-linux-gnu-clang-g++.cfg 49 // RUN: touch %t/testdmode/i386-unknown-linux-gnu-clang.cfg 50 // RUN: touch %t/testdmode/i386-unknown-linux-gnu.cfg 51 // RUN: touch %t/testdmode/clang++.cfg 52 // RUN: touch %t/testdmode/clang-g++.cfg 53 // RUN: touch %t/testdmode/clang.cfg 54 // RUN: %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL1 --implicit-check-not 'Configuration file:' 55 // 56 // FULL1: Configuration file: {{.*}}/testdmode/x86_64-unknown-linux-gnu-clang++.cfg 57 58 //--- -m32 overrides triple. 59 // 60 // RUN: %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ -m32 --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL1-I386 --implicit-check-not 'Configuration file:' 61 // 62 // FULL1-I386: Configuration file: {{.*}}/testdmode/i386-unknown-linux-gnu-clang++.cfg 63 64 //--- --target= also works for overriding triple. 65 // 66 // RUN: %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ --target=i386-unknown-linux-gnu --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL1-I386 --implicit-check-not 'Configuration file:' 67 68 //--- With --target= + -m64, -m64 takes precedence. 69 // 70 // RUN: %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ --target=i386-unknown-linux-gnu -m64 --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL1 --implicit-check-not 'Configuration file:' 71 72 //--- i386 prefix also works for 32-bit. 73 // 74 // RUN: %t/testdmode/i386-unknown-linux-gnu-clang-g++ --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL1-I386 --implicit-check-not 'Configuration file:' 75 76 //--- i386 prefix + -m64 also works for 64-bit. 77 // 78 // RUN: %t/testdmode/i386-unknown-linux-gnu-clang-g++ -m64 --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL1 --implicit-check-not 'Configuration file:' 79 80 //--- File specified by --config= is loaded after the one inferred from the executable. 81 // 82 // RUN: %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ --config-system-dir=%S/Inputs/config --config-user-dir= --config=i386-qqq.cfg -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix EXPLICIT --implicit-check-not 'Configuration file:' 83 // 84 // EXPLICIT: Configuration file: {{.*}}/testdmode/x86_64-unknown-linux-gnu-clang++.cfg 85 // EXPLICIT-NEXT: Configuration file: {{.*}}/Inputs/config/i386-qqq.cfg 86 87 //--- --no-default-config --config= loads only specified file. 88 // 89 // RUN: %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ --config-system-dir=%S/Inputs/config --config-user-dir= --no-default-config --config=i386-qqq.cfg -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix EXPLICIT-ONLY --implicit-check-not 'Configuration file:' 90 // 91 // EXPLICIT-ONLY: Configuration file: {{.*}}/Inputs/config/i386-qqq.cfg 92 93 //--- --no-default-config disables default filenames. 94 // 95 // RUN: %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ --config-system-dir=%S/Inputs/config --config-user-dir= --no-default-config -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix NO-CONFIG 96 // 97 // NO-CONFIG-NOT: Configuration file: 98 99 //--- --driver-mode= is respected. 100 // 101 // RUN: %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ --driver-mode=gcc --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL1-GCC --implicit-check-not 'Configuration file:' 102 // 103 // FULL1-GCC: Configuration file: {{.*}}/testdmode/x86_64-unknown-linux-gnu-clang.cfg 104 105 //--- "clang" driver symlink should yield the "*-clang" configuration file. 106 // 107 // RUN: %t/testdmode/x86_64-unknown-linux-gnu-clang --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL1-GCC --implicit-check-not 'Configuration file:' 108 109 //--- "clang" + --driver-mode= should yield "*-clang++". 110 // 111 // RUN: %t/testdmode/x86_64-unknown-linux-gnu-clang --driver-mode=g++ --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL1 --implicit-check-not 'Configuration file:' 112 113 //--- Clang started via name prefix that is not valid is forcing that prefix instead of target triple. 114 // 115 // RUN: %t/testdmode/qqq-clang-g++ --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix QQQ --implicit-check-not 'Configuration file:' 116 // 117 // QQQ: Configuration file: {{.*}}/testdmode/qqq-clang-g++.cfg 118 119 //--- Explicit --target= overrides the triple even with non-standard name prefix. 120 // 121 // RUN: %t/testdmode/qqq-clang-g++ --target=x86_64-unknown-linux-gnu --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL1 --implicit-check-not 'Configuration file:' 122 123 //--- "x86_64" prefix does not form a valid triple either. 124 // 125 // RUN: %t/testdmode/x86_64-clang --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix X86_64 --implicit-check-not 'Configuration file:' 126 // 127 // X86_64: Configuration file: {{.*}}/testdmode/x86_64-clang.cfg 128 129 //--- Try cheribsd prefix using misordered triple components. 130 // 131 // RUN: %t/testdmode/cheribsd-riscv64-hybrid-clang++ --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix CHERIBSD --implicit-check-not 'Configuration file:' 132 // 133 // CHERIBSD: Configuration file: {{.*}}/testdmode/cheribsd-riscv64-hybrid-clang++.cfg 134 135 //--- Test fallback to x86_64-unknown-linux-gnu-clang-g++.cfg. 136 // 137 // RUN: rm %t/testdmode/x86_64-unknown-linux-gnu-clang++.cfg 138 // RUN: rm %t/testdmode/i386-unknown-linux-gnu-clang++.cfg 139 // RUN: %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL2 --implicit-check-not 'Configuration file:' 140 // 141 // FULL2: Configuration file: {{.*}}/testdmode/x86_64-unknown-linux-gnu-clang-g++.cfg 142 143 //--- FULL2 + -m32. 144 // 145 // RUN: %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ -m32 --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL2-I386 --implicit-check-not 'Configuration file:' 146 // 147 // FULL2-I386: Configuration file: {{.*}}/testdmode/i386-unknown-linux-gnu-clang-g++.cfg 148 149 //--- Test fallback to x86_64-unknown-linux-gnu-clang.cfg + clang++.cfg. 150 // 151 // RUN: rm %t/testdmode/cheribsd-riscv64-hybrid-clang++.cfg 152 // RUN: rm %t/testdmode/qqq-clang-g++.cfg 153 // RUN: rm %t/testdmode/x86_64-clang.cfg 154 // RUN: rm %t/testdmode/x86_64-unknown-linux-gnu-clang-g++.cfg 155 // RUN: rm %t/testdmode/i386-unknown-linux-gnu-clang-g++.cfg 156 // RUN: rm %t/testdmode/x86_64-unknown-linux-gnu-clang.cfg 157 // RUN: rm %t/testdmode/i386-unknown-linux-gnu-clang.cfg 158 // RUN: %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL3 --implicit-check-not 'Configuration file:' 159 // 160 // FULL3: Configuration file: {{.*}}/testdmode/clang++.cfg 161 // FULL3: Configuration file: {{.*}}/testdmode/x86_64-unknown-linux-gnu.cfg 162 163 //--- FULL3 + -m32. 164 // 165 // RUN: %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ -m32 --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL3-I386 --implicit-check-not 'Configuration file:' 166 // 167 // FULL3-I386: Configuration file: {{.*}}/testdmode/clang++.cfg 168 // FULL3-I386: Configuration file: {{.*}}/testdmode/i386-unknown-linux-gnu.cfg 169 170 //--- FULL3 + --driver-mode=. 171 // 172 // RUN: %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ --driver-mode=gcc --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL3-GCC --implicit-check-not 'Configuration file:' 173 // 174 // FULL3-GCC: Configuration file: {{.*}}/testdmode/clang.cfg 175 // FULL3-GCC: Configuration file: {{.*}}/testdmode/x86_64-unknown-linux-gnu.cfg 176 177 //--- QQQ fallback. 178 // 179 // RUN: %t/testdmode/qqq-clang-g++ --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix QQQ-FALLBACK --implicit-check-not 'Configuration file:' 180 // 181 // QQQ-FALLBACK: Configuration file: {{.*}}/testdmode/clang++.cfg 182 // QQQ-FALLBACK: Configuration file: {{.*}}/testdmode/qqq.cfg 183 184 //--- "x86_64" falback. 185 // 186 // RUN: %t/testdmode/x86_64-clang --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix X86_64-FALLBACK --implicit-check-not 'Configuration file:' 187 // 188 // X86_64-FALLBACK: Configuration file: {{.*}}/testdmode/clang.cfg 189 // X86_64-FALLBACK: Configuration file: {{.*}}/testdmode/x86_64.cfg 190 191 //--- cheribsd fallback. 192 // 193 // RUN: %t/testdmode/cheribsd-riscv64-hybrid-clang++ --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix CHERIBSD-FALLBACK --implicit-check-not 'Configuration file:' 194 // 195 // CHERIBSD-FALLBACK: Configuration file: {{.*}}/testdmode/clang++.cfg 196 // CHERIBSD-FALLBACK: Configuration file: {{.*}}/testdmode/cheribsd-riscv64-hybrid.cfg 197 198 //--- Test fallback to x86_64-unknown-linux-gnu.cfg + clang-g++.cfg. 199 // 200 // RUN: rm %t/testdmode/clang++.cfg 201 // RUN: %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL4 --implicit-check-not 'Configuration file:' 202 // 203 // FULL4: Configuration file: {{.*}}/testdmode/clang-g++.cfg 204 // FULL4: Configuration file: {{.*}}/testdmode/x86_64-unknown-linux-gnu.cfg 205 206 //--- Test fallback to clang-g++.cfg if x86_64-unknown-linux-gnu-clang.cfg does not exist. 207 // 208 // RUN: rm %t/testdmode/x86_64-unknown-linux-gnu.cfg 209 // RUN: rm %t/testdmode/i386-unknown-linux-gnu.cfg 210 // RUN: %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL5 --implicit-check-not 'Configuration file:' 211 // 212 // FULL5: Configuration file: {{.*}}/testdmode/clang-g++.cfg 213 214 //--- FULL5 + -m32. 215 // 216 // RUN: %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ -m32 --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL5-I386 --implicit-check-not 'Configuration file:' 217 // 218 // FULL5-I386: Configuration file: {{.*}}/testdmode/clang-g++.cfg 219 220 //--- Test that incorrect driver mode config file is not used. 221 // 222 // RUN: rm %t/testdmode/clang-g++.cfg 223 // RUN: %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix NO-CONFIG 224 225 //--- Tilde expansion in user configuration file directory 226 // 227 // RUN: HOME=%S/Inputs/config %clang -### --config-user-dir=~ -v 2>&1 | FileCheck %s --check-prefix=CHECK-TILDE 228 // CHECK-TILDE: User configuration file directory: {{.*}}/Inputs/config 229 230 //--- Fallback to stripping OS versions 231 // 232 // RUN: touch %t/testdmode/x86_64-apple-darwin23.6.0-clang.cfg 233 // RUN: touch %t/testdmode/x86_64-apple-darwin23-clang.cfg 234 // RUN: touch %t/testdmode/x86_64-apple-darwin-clang.cfg 235 // RUN: %clang -target x86_64-apple-darwin23.6.0 --config-system-dir=%t/testdmode --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix DARWIN --implicit-check-not 'Configuration file:' 236 // 237 // DARWIN: Configuration file: {{.*}}/testdmode/x86_64-apple-darwin23.6.0-clang.cfg 238 239 //--- DARWIN + no full version 240 // 241 // RUN: rm %t/testdmode/x86_64-apple-darwin23.6.0-clang.cfg 242 // RUN: %clang -target x86_64-apple-darwin23.6.0 --config-system-dir=%t/testdmode --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix DARWIN-MAJOR --implicit-check-not 'Configuration file:' 243 // 244 // DARWIN-MAJOR: Configuration file: {{.*}}/testdmode/x86_64-apple-darwin23-clang.cfg 245 246 //--- DARWIN + no version 247 // 248 // RUN: rm %t/testdmode/x86_64-apple-darwin23-clang.cfg 249 // RUN: %clang -target x86_64-apple-darwin23.6.0 --config-system-dir=%t/testdmode --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix DARWIN-VERSIONLESS --implicit-check-not 'Configuration file:' 250 // 251 // DARWIN-VERSIONLESS: Configuration file: {{.*}}/testdmode/x86_64-apple-darwin-clang.cfg 252