clang: lib/Driver/ToolChains/MinGW.cpp Source File (original) (raw)

1

2

3

4

5

6

7

8

11#include "clang/Config/config.h"

18#include "llvm/Config/llvm-config.h"

19#include "llvm/Option/ArgList.h"

20#include "llvm/Support/FileSystem.h"

21#include "llvm/Support/Path.h"

22#include "llvm/Support/VirtualFileSystem.h"

23#include <system_error>

24

27using namespace clang;

29

30

34 const ArgList &Args,

35 const char *LinkingOutput) const {

37 ArgStringList CmdArgs;

38

39 if (getToolChain().getArch() == llvm::Triple::x86) {

40 CmdArgs.push_back("--32");

41 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {

42 CmdArgs.push_back("--64");

43 }

44

45 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);

46

47 CmdArgs.push_back("-o");

49

50 for (const auto &II : Inputs)

51 CmdArgs.push_back(II.getFilename());

52

53 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));

55 Exec, CmdArgs, Inputs, Output));

56

57 if (Args.hasArg(options::OPT_gsplit_dwarf))

60}

61

62void tools::MinGW::Linker::AddLibGCC(const ArgList &Args,

63 ArgStringList &CmdArgs) const {

64 if (Args.hasArg(options::OPT_mthreads))

65 CmdArgs.push_back("-lmingwthrd");

66 CmdArgs.push_back("-lmingw32");

67

68

71 bool Static = Args.hasArg(options::OPT_static_libgcc) ||

72 Args.hasArg(options::OPT_static);

73 bool Shared = Args.hasArg(options::OPT_shared);

74 bool CXX = getToolChain().getDriver().CCCIsCXX();

75

76 if (Static || (CXX && !Shared)) {

77 CmdArgs.push_back("-lgcc");

78 CmdArgs.push_back("-lgcc_eh");

79 } else {

80 CmdArgs.push_back("-lgcc_s");

81 CmdArgs.push_back("-lgcc");

82 }

83 } else {

84 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);

85 }

86

87 CmdArgs.push_back("-lmoldname");

88 CmdArgs.push_back("-lmingwex");

89 for (auto Lib : Args.getAllArgValues(options::OPT_l))

90 if (StringRef(Lib).starts_with("msvcr") ||

91 StringRef(Lib).starts_with("ucrt") ||

92 StringRef(Lib).starts_with("crtdll"))

93 return;

94 CmdArgs.push_back("-lmsvcrt");

95}

96

100 const ArgList &Args,

101 const char *LinkingOutput) const {

102 const ToolChain &TC = getToolChain();

105

106 ArgStringList CmdArgs;

107

108

109 Args.ClaimAllArgs(options::OPT_g_Group);

110

111 Args.ClaimAllArgs(options::OPT_emit_llvm);

112

113

114 Args.ClaimAllArgs(options::OPT_w);

115

116 if (D.SysRoot.empty())

117 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));

118

119 if (Args.hasArg(options::OPT_s))

120 CmdArgs.push_back("-s");

121

122 CmdArgs.push_back("-m");

124 case llvm::Triple::x86:

125 CmdArgs.push_back("i386pe");

126 break;

127 case llvm::Triple::x86_64:

128 CmdArgs.push_back("i386pep");

129 break;

130 case llvm::Triple::arm:

131 case llvm::Triple::thumb:

132

133 CmdArgs.push_back("thumb2pe");

134 break;

135 case llvm::Triple::aarch64:

137 CmdArgs.push_back("arm64ecpe");

138 else

139 CmdArgs.push_back("arm64pe");

140 break;

141 case llvm::Triple::mipsel:

142 CmdArgs.push_back("mipspe");

143 break;

144 default:

145 D.Diag(diag::err_target_unknown_triple) << TC.getEffectiveTriple().str();

146 }

147

148 Arg *SubsysArg =

149 Args.getLastArg(options::OPT_mwindows, options::OPT_mconsole);

150 if (SubsysArg && SubsysArg->getOption().matches(options::OPT_mwindows)) {

151 CmdArgs.push_back("--subsystem");

152 CmdArgs.push_back("windows");

153 } else if (SubsysArg &&

154 SubsysArg->getOption().matches(options::OPT_mconsole)) {

155 CmdArgs.push_back("--subsystem");

156 CmdArgs.push_back("console");

157 }

158

159 if (Args.hasArg(options::OPT_mdll))

160 CmdArgs.push_back("--dll");

161 else if (Args.hasArg(options::OPT_shared))

162 CmdArgs.push_back("--shared");

163 if (Args.hasArg(options::OPT_static))

164 CmdArgs.push_back("-Bstatic");

165 else

166 CmdArgs.push_back("-Bdynamic");

167 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {

168 CmdArgs.push_back("-e");

169 if (TC.getArch() == llvm::Triple::x86)

170 CmdArgs.push_back("_DllMainCRTStartup@12");

171 else

172 CmdArgs.push_back("DllMainCRTStartup");

173 CmdArgs.push_back("--enable-auto-image-base");

174 }

175

176 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))

177 CmdArgs.push_back("--no-demangle");

178

179 if (!Args.hasFlag(options::OPT_fauto_import, options::OPT_fno_auto_import,

180 true))

181 CmdArgs.push_back("--disable-auto-import");

182

183 if (Arg *A = Args.getLastArg(options::OPT_mguard_EQ)) {

184 StringRef GuardArgs = A->getValue();

185 if (GuardArgs == "none")

186 CmdArgs.push_back("--no-guard-cf");

187 else if (GuardArgs == "cf" || GuardArgs == "cf-nochecks")

188 CmdArgs.push_back("--guard-cf");

189 else

190 D.Diag(diag::err_drv_unsupported_option_argument)

191 << A->getSpelling() << GuardArgs;

192 }

193

194 if (Args.hasArg(options::OPT_fms_hotpatch))

195 CmdArgs.push_back("--functionpadmin");

196

197 CmdArgs.push_back("-o");

198 const char *OutputFile = Output.getFilename();

199

200

201

202

203 if (!llvm::sys::path::has_extension(OutputFile)) {

204 CmdArgs.push_back(Args.MakeArgString(Twine(OutputFile) + ".exe"));

205 OutputFile = CmdArgs.back();

206 } else

207 CmdArgs.push_back(OutputFile);

208

209

210 Args.AddLastArg(CmdArgs, options::OPT_r);

211 Args.AddLastArg(CmdArgs, options::OPT_s);

212 Args.AddLastArg(CmdArgs, options::OPT_t);

213 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);

214

215

216

217

218 if (Sanitize.needsAsanRt() && !Args.hasArg(options::OPT_nostdlib) &&

219 !Args.hasArg(options::OPT_nodefaultlibs)) {

220

221 CmdArgs.push_back(

223 }

224

225 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {

226 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {

227 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));

228 } else {

229 if (Args.hasArg(options::OPT_municode))

230 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));

231 else

232 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));

233 }

234 if (Args.hasArg(options::OPT_pg))

235 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));

236 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));

237 }

238

239 Args.AddAllArgs(CmdArgs, options::OPT_L);

241

242

243

245 if (TC.getVFS().exists(LibPath))

246 CmdArgs.push_back(Args.MakeArgString("-L" + LibPath));

247 }

249 if (TC.getVFS().exists(CRTPath))

250 CmdArgs.push_back(Args.MakeArgString("-L" + CRTPath));

251

253

254 if (D.isUsingLTO()) {

255 assert(!Inputs.empty() && "Must have at least one input.");

256 addLTOOptions(TC, Args, CmdArgs, Output, Inputs[0],

258 }

259

260 if (C.getDriver().IsFlangMode() &&

261 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {

264 }

265

266

267

269 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&

270 !Args.hasArg(options::OPT_static);

271 if (OnlyLibstdcxxStatic)

272 CmdArgs.push_back("-Bstatic");

274 if (OnlyLibstdcxxStatic)

275 CmdArgs.push_back("-Bdynamic");

276 }

277

278 bool HasWindowsApp = false;

279 for (auto Lib : Args.getAllArgValues(options::OPT_l)) {

280 if (Lib == "windowsapp") {

281 HasWindowsApp = true;

282 break;

283 }

284 }

285

286 if (!Args.hasArg(options::OPT_nostdlib)) {

287 if (!Args.hasArg(options::OPT_nodefaultlibs)) {

288 if (Args.hasArg(options::OPT_static))

289 CmdArgs.push_back("--start-group");

290

291 if (Args.hasArg(options::OPT_fstack_protector) ||

292 Args.hasArg(options::OPT_fstack_protector_strong) ||

293 Args.hasArg(options::OPT_fstack_protector_all)) {

294 CmdArgs.push_back("-lssp_nonshared");

295 CmdArgs.push_back("-lssp");

296 }

297

298 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,

299 options::OPT_fno_openmp, false)) {

302 CmdArgs.push_back("-lomp");

303 break;

305 CmdArgs.push_back("-liomp5md");

306 break;

308 CmdArgs.push_back("-lgomp");

309 break;

311

312 break;

313 }

314 }

315

316 AddLibGCC(Args, CmdArgs);

317

318 if (Args.hasArg(options::OPT_pg))

319 CmdArgs.push_back("-lgmon");

320

321 if (Args.hasArg(options::OPT_pthread))

322 CmdArgs.push_back("-lpthread");

323

325

328 CmdArgs.push_back(

330 CmdArgs.push_back("--require-defined");

331 CmdArgs.push_back(TC.getArch() == llvm::Triple::x86

332 ? "___asan_seh_interceptor"

333 : "__asan_seh_interceptor");

334

335

336 CmdArgs.push_back("--whole-archive");

337 CmdArgs.push_back(

339 CmdArgs.push_back("--no-whole-archive");

340 }

341

343

344 if (!HasWindowsApp) {

345

346

347

348 if (Args.hasArg(options::OPT_mwindows)) {

349 CmdArgs.push_back("-lgdi32");

350 CmdArgs.push_back("-lcomdlg32");

351 }

352 CmdArgs.push_back("-ladvapi32");

353 CmdArgs.push_back("-lshell32");

354 CmdArgs.push_back("-luser32");

355 CmdArgs.push_back("-lkernel32");

356 }

357

358 if (Args.hasArg(options::OPT_static)) {

359 CmdArgs.push_back("--end-group");

360 } else {

361 AddLibGCC(Args, CmdArgs);

362 if (!HasWindowsApp)

363 CmdArgs.push_back("-lkernel32");

364 }

365 }

366

367 if (!Args.hasArg(options::OPT_nostartfiles)) {

368

370

371 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));

372 }

373 }

374 const char *Exec = Args.MakeArgString(TC.GetLinkerPath());

375 C.addCommand(std::make_unique(JA, *this,

377 Exec, CmdArgs, Inputs, Output));

378}

379

381 llvm::Triple HostTriple(llvm::Triple::normalize(LLVM_HOST_TRIPLE));

382 if (HostTriple.getOS() != llvm::Triple::Win32)

383 return true;

384 if (RequireArchMatch && HostTriple.getArch() != T.getArch())

385 return true;

386 return false;

387}

388

389

390static bool findGccVersion(StringRef LibDir, std::string &GccLibDir,

391 std::string &Ver,

394 std::error_code EC;

395 for (llvm::sys::fs::directory_iterator LI(LibDir, EC), LE; !EC && LI != LE;

396 LI = LI.increment(EC)) {

397 StringRef VersionText = llvm::sys::path::filename(LI->path());

398 auto CandidateVersion =

400 if (CandidateVersion.Major == -1)

401 continue;

402 if (CandidateVersion <= Version)

403 continue;

404 Version = CandidateVersion;

405 Ver = std::string(VersionText);

406 GccLibDir = LI->path();

407 }

408 return Ver.size();

409}

410

412 llvm::Triple LiteralTriple(D.getTargetTriple());

413

414 LiteralTriple.setArchName(T.getArchName());

415 return LiteralTriple;

416}

417

418void toolchains::MinGW::findGccLibDir(const llvm::Triple &LiteralTriple) {

420 SubdirNames.emplace_back(LiteralTriple.str());

421 SubdirNames.emplace_back(getTriple().str());

422 SubdirNames.emplace_back(getTriple().getArchName());

423 SubdirNames.back() += "-w64-mingw32";

424 SubdirNames.emplace_back(getTriple().getArchName());

425 SubdirNames.back() += "-w64-mingw32ucrt";

426 SubdirNames.emplace_back("mingw32");

427 if (SubdirName.empty()) {

428 SubdirName = getTriple().getArchName();

429 SubdirName += "-w64-mingw32";

430 }

431

432

433 for (StringRef CandidateLib : {"lib", "lib64"}) {

434 for (StringRef CandidateSysroot : SubdirNames) {

436 llvm::sys::path::append(LibDir, CandidateLib, "gcc", CandidateSysroot);

437 if (findGccVersion(LibDir, GccLibDir, Ver, GccVer)) {

438 SubdirName = std::string(CandidateSysroot);

439 return;

440 }

441 }

442 }

443}

444

445static llvm::ErrorOrstd::string findGcc(const llvm::Triple &LiteralTriple,

446 const llvm::Triple &T) {

448 Gccs.emplace_back(LiteralTriple.str());

449 Gccs.back() += "-gcc";

450 Gccs.emplace_back(T.str());

451 Gccs.back() += "-gcc";

452 Gccs.emplace_back(T.getArchName());

453 Gccs.back() += "-w64-mingw32-gcc";

454 Gccs.emplace_back(T.getArchName());

455 Gccs.back() += "-w64-mingw32ucrt-gcc";

456 Gccs.emplace_back("mingw32-gcc");

457

458 for (StringRef CandidateGcc : Gccs)

459 if (llvm::ErrorOrstd::string GPPName = llvm::sys::findProgramByName(CandidateGcc))

460 return GPPName;

461 return make_error_code(std::errc::no_such_file_or_directory);

462}

463

464static llvm::ErrorOrstd::string

466 const llvm::Triple &T, std::string &SubdirName) {

468 Subdirs.emplace_back(LiteralTriple.str());

469 Subdirs.emplace_back(T.str());

470 Subdirs.emplace_back(T.getArchName());

471 Subdirs.back() += "-w64-mingw32";

472 Subdirs.emplace_back(T.getArchName());

473 Subdirs.back() += "-w64-mingw32ucrt";

474 StringRef ClangRoot = llvm::sys::path::parent_path(D.Dir);

475 StringRef Sep = llvm::sys::path::get_separator();

476 for (StringRef CandidateSubdir : Subdirs) {

477 if (llvm::sys::fs::is_directory(ClangRoot + Sep + CandidateSubdir)) {

478 SubdirName = std::string(CandidateSubdir);

479 return (ClangRoot + Sep + CandidateSubdir).str();

480 }

481 }

482 return make_error_code(std::errc::no_such_file_or_directory);

483}

484

486 StringRef Sep = llvm::sys::path::get_separator();

487 if (!llvm::sys::fs::exists(Directory + Sep + "include" + Sep + "_mingw.h"))

488 return false;

489 if (!llvm::sys::fs::exists(Directory + Sep + "lib" + Sep + "libkernel32.a"))

490 return false;

491 return true;

492}

493

495 const ArgList &Args)

496 : ToolChain(D, Triple, Args), CudaInstallation(D, Triple, Args),

497 RocmInstallation(D, Triple, Args) {

499

500 std::string InstallBase =

501 std::string(llvm::sys::path::parent_path(getDriver().Dir));

502

503

507

508

511 Base = std::string(llvm::sys::path::parent_path(TargetSubdir.get()));

512

513

514

516 Base = InstallBase;

517 else if (llvm::ErrorOrstd::string GPPName =

519 Base = std::string(llvm::sys::path::parent_path(

520 llvm::sys::path::parent_path(GPPName.get())));

521 else

522 Base = InstallBase;

523

524 Base += llvm::sys::path::get_separator();

525 findGccLibDir(LiteralTriple);

526 TripleDirName = SubdirName;

527

528

530

531

532 std::string CandidateSubdir = SubdirName + "/sys-root/mingw";

534 SubdirName = CandidateSubdir;

535

537 (Base + SubdirName + llvm::sys::path::get_separator() + "lib").str());

538

539

541 (Base + SubdirName + llvm::sys::path::get_separator() + "mingw/lib").str());

542

543

544

545

546

550

551 NativeLLVMSupport =

552 Args.getLastArgValue(options::OPT_fuse_ld_EQ, CLANG_DEFAULT_LINKER)

553 .equals_insensitive("lld");

554}

555

557 switch (AC) {

563 if (!Compiler)

565 return Compiler.get();

566 default:

568 }

569}

570

573}

574

577}

578

580 return NativeLLVMSupport;

581}

582

585 Arg *ExceptionArg = Args.getLastArg(options::OPT_fsjlj_exceptions,

586 options::OPT_fseh_exceptions,

587 options::OPT_fdwarf_exceptions);

588 if (ExceptionArg &&

589 ExceptionArg->getOption().matches(options::OPT_fseh_exceptions))

590 return UnwindTableLevel::Asynchronous;

591

592 if (getArch() == llvm::Triple::x86_64 || getArch() == llvm::Triple::arm ||

593 getArch() == llvm::Triple::thumb || getArch() == llvm::Triple::aarch64)

594 return UnwindTableLevel::Asynchronous;

595 return UnwindTableLevel::None;

596}

597

599 return getArch() == llvm::Triple::x86_64 ||

600 getArch() == llvm::Triple::aarch64;

601}

602

604 return false;

605}

606

608

609llvm::ExceptionHandling

611 if (getArch() == llvm::Triple::x86_64 || getArch() == llvm::Triple::aarch64 ||

612 getArch() == llvm::Triple::arm || getArch() == llvm::Triple::thumb)

613 return llvm::ExceptionHandling::WinEH;

614 return llvm::ExceptionHandling::DwarfCFI;

615}

616

619 Res |= SanitizerKind::Address;

620 Res |= SanitizerKind::PointerCompare;

621 Res |= SanitizerKind::PointerSubtract;

622 Res |= SanitizerKind::Vptr;

623 return Res;

624}

625

627 ArgStringList &CC1Args) const {

628 CudaInstallation->AddCudaIncludeArgs(DriverArgs, CC1Args);

629}

630

632 ArgStringList &CC1Args) const {

633 RocmInstallation->AddHIPIncludeArgs(DriverArgs, CC1Args);

634}

635

637 CudaInstallation->print(OS);

638 RocmInstallation->print(OS);

639}

640

641

642

643

644

645

646

647

648

649

650

651

652

653

654

655

656

657

658

659

660

661

662

663

664

665

666

667

668

669

670

671

672

673

674

675

676

677

678

679

680

681

682

683

684

685

686

688 ArgStringList &CC1Args) const {

689 if (DriverArgs.hasArg(options::OPT_nostdinc))

690 return;

691

692 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {

694 llvm::sys::path::append(P, "include");

695 addSystemInclude(DriverArgs, CC1Args, P.str());

696 }

697

698 if (DriverArgs.hasArg(options::OPT_nostdlibinc))

699 return;

700

701 addSystemInclude(DriverArgs, CC1Args,

702 Base + SubdirName + llvm::sys::path::get_separator() +

703 "include");

704

705

706 addSystemInclude(DriverArgs, CC1Args,

707 Base + SubdirName + llvm::sys::path::get_separator() + "usr/include");

708

709

710

711

712

714 getDriver().SysRoot.size())

715 addSystemInclude(DriverArgs, CC1Args, Base + "include");

716}

717

719 const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,

721 if (Arg *A = DriverArgs.getLastArg(options::OPT_mguard_EQ)) {

722 StringRef GuardArgs = A->getValue();

723 if (GuardArgs == "none") {

724

725 } else if (GuardArgs == "cf") {

726

727 CC1Args.push_back("-cfguard");

728 } else if (GuardArgs == "cf-nochecks") {

729

730 CC1Args.push_back("-cfguard-no-checks");

731 } else {

732 getDriver().Diag(diag::err_drv_unsupported_option_argument)

733 << A->getSpelling() << GuardArgs;

734 }

735 }

736

737

738

739

740

741

742

743

744

745

746

747

748

749

750

751

752

753

754

755

756

757 if (!DriverArgs.hasArgNoClaim(options::OPT_fsized_deallocation,

758 options::OPT_fno_sized_deallocation))

759 CC1Args.push_back("-fno-sized-deallocation");

760

761 CC1Args.push_back("-fno-use-init-array");

762

763 for (auto Opt : {options::OPT_mthreads, options::OPT_mwindows,

764 options::OPT_mconsole, options::OPT_mdll}) {

765 if (Arg *A = DriverArgs.getLastArgNoClaim(Opt))

766 A->ignoreTargetSpecific();

767 }

768}

769

771 const ArgList &DriverArgs, ArgStringList &CC1Args) const {

772 if (DriverArgs.hasArg(options::OPT_nostdinc, options::OPT_nostdlibinc,

773 options::OPT_nostdincxx))

774 return;

775

776 StringRef Slash = llvm::sys::path::get_separator();

777

778 switch (GetCXXStdlibType(DriverArgs)) {

780 std::string TargetDir = (Base + "include" + Slash + getTripleString() +

781 Slash + "c++" + Slash + "v1")

782 .str();

783 if (getDriver().getVFS().exists(TargetDir))

784 addSystemInclude(DriverArgs, CC1Args, TargetDir);

785 addSystemInclude(DriverArgs, CC1Args,

786 Base + SubdirName + Slash + "include" + Slash + "c++" +

787 Slash + "v1");

788 addSystemInclude(DriverArgs, CC1Args,

789 Base + "include" + Slash + "c++" + Slash + "v1");

790 break;

791 }

792

795 CppIncludeBases.emplace_back(Base);

796 llvm::sys::path::append(CppIncludeBases[0], SubdirName, "include", "c++");

797 CppIncludeBases.emplace_back(Base);

798 llvm::sys::path::append(CppIncludeBases[1], SubdirName, "include", "c++",

799 Ver);

800 CppIncludeBases.emplace_back(Base);

801 llvm::sys::path::append(CppIncludeBases[2], "include", "c++", Ver);

802 CppIncludeBases.emplace_back(GccLibDir);

803 llvm::sys::path::append(CppIncludeBases[3], "include", "c++");

804 CppIncludeBases.emplace_back(GccLibDir);

805 llvm::sys::path::append(CppIncludeBases[4], "include",

806 "g++-v" + GccVer.Text);

807 CppIncludeBases.emplace_back(GccLibDir);

808 llvm::sys::path::append(CppIncludeBases[5], "include",

809 "g++-v" + GccVer.MajorStr + "." + GccVer.MinorStr);

810 CppIncludeBases.emplace_back(GccLibDir);

811 llvm::sys::path::append(CppIncludeBases[6], "include",

812 "g++-v" + GccVer.MajorStr);

813 for (auto &CppIncludeBase : CppIncludeBases) {

814 addSystemInclude(DriverArgs, CC1Args, CppIncludeBase);

815 CppIncludeBase += Slash;

816 addSystemInclude(DriverArgs, CC1Args, CppIncludeBase + TripleDirName);

817 addSystemInclude(DriverArgs, CC1Args, CppIncludeBase + "backward");

818 }

819 break;

820 }

821}

822

824 const ArgList &Args) {

825

826

827 std::string SubdirName;

828 if (D.SysRoot.size())

829 return true;

831 std::string InstallBase = std::string(llvm::sys::path::parent_path(D.Dir));

832 if (llvm::ErrorOrstd::string TargetSubdir =

834 return true;

835

836

838 return false;

839 if (llvm::ErrorOrstd::string GPPName = findGcc(LiteralTriple, Triple))

840 return true;

841

842

843 return false;

844}

845

847 const ArgList &Args) {

848

849

851 return Triple;

853

854

855 if (Triple.getArch() == llvm::Triple::x86) {

856 Archs.emplace_back("i386");

857 Archs.emplace_back("i586");

858 Archs.emplace_back("i686");

859 } else if (Triple.getArch() == llvm::Triple::arm ||

860 Triple.getArch() == llvm::Triple::thumb) {

861 Archs.emplace_back("armv7");

862 }

863 for (auto A : Archs) {

864 llvm::Triple TestTriple(Triple);

865 TestTriple.setArchName(A);

867 return TestTriple;

868 }

869

870 return Triple;

871}

872

874 const ArgList &Args) {

875 if (Triple.getArch() == llvm::Triple::x86 ||

876 Triple.getArch() == llvm::Triple::arm ||

877 Triple.getArch() == llvm::Triple::thumb)

879}

static llvm::Triple getLiteralTriple(const Driver &D, const llvm::Triple &T)

static bool looksLikeMinGWSysroot(const std::string &Directory)

static bool findGccVersion(StringRef LibDir, std::string &GccLibDir, std::string &Ver, toolchains::Generic_GCC::GCCVersion &Version)

static bool testTriple(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)

static llvm::Triple adjustTriple(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)

static llvm::ErrorOr< std::string > findGcc(const llvm::Triple &LiteralTriple, const llvm::Triple &T)

static llvm::ErrorOr< std::string > findClangRelativeSysroot(const Driver &D, const llvm::Triple &LiteralTriple, const llvm::Triple &T, std::string &SubdirName)

static bool isCrossCompiling(const llvm::Triple &T, bool RequireArchMatch)

Engages in a tight little dance with the lexer to efficiently preprocess tokens.

Compilation - A set of tasks to perform for a single driver invocation.

Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...

std::string SysRoot

sysroot, if present

OpenMPRuntimeKind getOpenMPRuntime(const llvm::opt::ArgList &Args) const

Compute the desired OpenMP runtime from the flags provided.

@ OMPRT_IOMP5

The legacy name for the LLVM OpenMP runtime from when it was the Intel OpenMP runtime.

@ OMPRT_OMP

The LLVM OpenMP runtime.

@ OMPRT_Unknown

An unknown OpenMP runtime.

@ OMPRT_GOMP

The GNU OpenMP runtime.

InputInfo - Wrapper for information about an input source.

const char * getFilename() const

The JSON file list parser is used to communicate input to InstallAPI.

std::error_code make_error_code(BuildPreambleError Error)

const FunctionProtoType * T

static constexpr ResponseFileSupport None()

Returns a ResponseFileSupport indicating that response files are not supported.

static constexpr ResponseFileSupport AtFileUTF8()