clang: lib/Driver/ToolChains/Darwin.h Source File (original) (raw)

1

2

3

4

5

6

7

8

9#ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_DARWIN_H

10#define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_DARWIN_H

11

21

23namespace driver {

24

25namespace toolchains {

26class MachO;

27}

28

29namespace tools {

30

31namespace darwin {

34 const llvm::opt::ArgList &Args);

35

37 virtual void anchor();

38

39protected:

40 void AddMachOArch(const llvm::opt::ArgList &Args,

41 llvm::opt::ArgStringList &CmdArgs) const;

42

44 return reinterpret_cast<const toolchains::MachO &>(getToolChain());

45 }

46

47public:

50};

51

53public:

55 : MachOTool("darwin::Assembler", "assembler", TC) {}

56

58

61 const llvm::opt::ArgList &TCArgs,

62 const char *LinkingOutput) const override;

63};

64

66 bool NeedsTempPath(const InputInfoList &Inputs) const;

67 void AddLinkArgs(Compilation &C, const llvm::opt::ArgList &Args,

68 llvm::opt::ArgStringList &CmdArgs,

69 const InputInfoList &Inputs, VersionTuple Version,

70 bool LinkerIsLLD, bool UsePlatformVersion) const;

71

72public:

74

76 bool isLinkJob() const override { return true; }

77

80 const llvm::opt::ArgList &TCArgs,

81 const char *LinkingOutput) const override;

82};

83

85public:

87 : MachOTool("darwin::StaticLibTool", "static-lib-linker", TC) {}

88

90 bool isLinkJob() const override { return true; }

91

94 const llvm::opt::ArgList &TCArgs,

95 const char *LinkingOutput) const override;

96};

97

99public:

101

103

106 const llvm::opt::ArgList &TCArgs,

107 const char *LinkingOutput) const override;

108};

109

111public:

113 : MachOTool("darwin::Dsymutil", "dsymutil", TC) {}

114

117

120 const llvm::opt::ArgList &TCArgs,

121 const char *LinkingOutput) const override;

122};

123

125public:

127 : MachOTool("darwin::VerifyDebug", "dwarfdump", TC) {}

128

130

133 const llvm::opt::ArgList &TCArgs,

134 const char *LinkingOutput) const override;

135};

136}

137}

138

139namespace toolchains {

140

142protected:

143 Tool *buildAssembler() const override;

144 Tool *buildLinker() const override;

145 Tool *buildStaticLibTool() const override;

147

148private:

149 mutable std::unique_ptrtools::darwin::Lipo Lipo;

150 mutable std::unique_ptrtools::darwin::Dsymutil Dsymutil;

151 mutable std::unique_ptrtools::darwin::VerifyDebug VerifyDebug;

152

153

154 mutable std::optional LinkerVersion;

155

156public:

157 MachO(const Driver &D, const llvm::Triple &Triple,

158 const llvm::opt::ArgList &Args);

160

161

162

163

164

165

166 StringRef getMachOArchName(const llvm::opt::ArgList &Args) const;

167

168

169

170 VersionTuple getLinkerVersion(const llvm::opt::ArgList &Args) const;

171

172

174 llvm::opt::ArgStringList &CmdArgs) const {}

175

176

177

178

179

180 virtual void AddLinkRuntimeLibArgs(const llvm::opt::ArgList &Args,

181 llvm::opt::ArgStringList &CmdArgs,

182 bool ForceLinkBuiltinRT = false) const;

183

185 llvm::opt::ArgStringList &CmdArgs) const {

186 }

187

189 llvm::opt::ArgStringList &CmdArgs) const {}

190

192 llvm::opt::ArgStringList &CmdArgs) const {

193 }

194

195

196

198

199

201

202

204

205 RLO_AlwaysLink = 1 << 0,

206

207

208 RLO_IsEmbedded = 1 << 1,

209

210

211 RLO_AddRPath = 1 << 2,

212 };

213

214

215 void AddLinkRuntimeLib(const llvm::opt::ArgList &Args,

216 llvm::opt::ArgStringList &CmdArgs, StringRef Component,

217 RuntimeLinkOptions Opts = RuntimeLinkOptions(),

218 bool IsShared = false) const;

219

220

221

223 llvm::opt::ArgStringList &CmdArgs) const override {

224

225 }

226

227

228

229

230 std::string

231 getCompilerRT(const llvm::opt::ArgList &Args, StringRef Component,

232 FileType Type = ToolChain::FT_Static) const override;

233

234

235

236

237

238 types::ID LookupTypeForExtension(StringRef Ext) const override;

239

240 bool HasNativeLLVMSupport() const override;

241

242 llvm::opt::DerivedArgList *

243 TranslateArgs(const llvm::opt::DerivedArgList &Args, StringRef BoundArch,

245

247

248

249 return true;

250 }

251

253

255

257

258 return getTriple().getArch() != llvm::Triple::x86;

259 }

260

262

263 UnwindTableLevel

264 getDefaultUnwindTableLevel(const llvm::opt::ArgList &Args) const override;

265

267 return ToolChain::RLT_CompilerRT;

268 }

269

270 bool isPICDefault() const override;

271 bool isPIEDefault(const llvm::opt::ArgList &Args) const override;

272 bool isPICDefaultForced() const override;

273

274 bool SupportsProfiling() const override;

275

276 bool UseDwarfDebugFlags() const override;

277 std::string GetGlobalDebugPathRemapping() const override;

278

279 llvm::ExceptionHandling

281 return llvm::ExceptionHandling::None;

282 }

283

285 return "";

286 }

287

288

289

291

292};

293

294

296public:

298 const llvm::opt::ArgList &Args);

300

301

302

303

304 void

305 AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,

306 llvm::opt::ArgStringList &CC1Args) const override;

307

308 void AddCudaIncludeArgs(const llvm::opt::ArgList &DriverArgs,

309 llvm::opt::ArgStringList &CC1Args) const override;

310 void AddHIPIncludeArgs(const llvm::opt::ArgList &DriverArgs,

311 llvm::opt::ArgStringList &CC1Args) const override;

312 void addSYCLIncludeArgs(const llvm::opt::ArgList &DriverArgs,

313 llvm::opt::ArgStringList &CC1Args) const override;

314

315 void AddClangCXXStdlibIncludeArgs(

316 const llvm::opt::ArgList &DriverArgs,

317 llvm::opt::ArgStringList &CC1Args) const override;

318 void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args,

319 llvm::opt::ArgStringList &CmdArgs) const override;

320

321 void printVerboseInfo(raw_ostream &OS) const override;

322

323

327

328protected:

330 GetEffectiveSysroot(const llvm::opt::ArgList &DriverArgs) const;

331

332private:

333 virtual void

334 AddGnuCPlusPlusIncludePaths(const llvm::opt::ArgList &DriverArgs,

335 llvm::opt::ArgStringList &CC1Args) const;

336};

337

338

340public:

341

342

343

344

345

347

355 LastDarwinPlatform = XROS

361 };

362

365

366

368

370

371

372 mutable std::optional SDKInfo;

373

374

376

377private:

378 void AddDeploymentTarget(llvm::opt::DerivedArgList &Args) const;

379

380public:

381 Darwin(const Driver &D, const llvm::Triple &Triple,

382 const llvm::opt::ArgList &Args);

384

385 std::string ComputeEffectiveClangTriple(const llvm::opt::ArgList &Args,

386 types::ID InputType) const override;

387

388

389

390

391 void addMinVersionArgs(const llvm::opt::ArgList &Args,

392 llvm::opt::ArgStringList &CmdArgs) const override;

393

394 void addPlatformVersionArgs(const llvm::opt::ArgList &Args,

395 llvm::opt::ArgStringList &CmdArgs) const override;

396

397 void addStartObjectFileArgs(const llvm::opt::ArgList &Args,

398 llvm::opt::ArgStringList &CmdArgs) const override;

399

401 return (!(isTargetIPhoneOS() && !isIPhoneOSVersionLT(6, 0)) &&

402 !isTargetWatchOS() && !isTargetDriverKit());

403 }

404

405 void addProfileRTLibs(const llvm::opt::ArgList &Args,

406 llvm::opt::ArgStringList &CmdArgs) const override;

407

408

409

410 std::string

411 getCompilerRT(const llvm::opt::ArgList &Args, StringRef Component,

412 FileType Type = ToolChain::FT_Static) const override;

413

414protected:

415

416

417

418

419

420

422 unsigned Major, unsigned Minor, unsigned Micro,

423 VersionTuple NativeTargetVersion) const {

424

425

426 if (TargetInitialized && TargetPlatform == Platform &&

427 TargetEnvironment == Environment &&

428 (Environment == MacCatalyst ? OSTargetVersion : TargetVersion) ==

429 VersionTuple(Major, Minor, Micro))

430 return;

431

432 assert(!TargetInitialized && "Target already initialized!");

433 TargetInitialized = true;

434 TargetPlatform = Platform;

435 TargetEnvironment = Environment;

436 TargetVersion = VersionTuple(Major, Minor, Micro);

437 if (Environment == Simulator)

438 const_cast<Darwin *>(this)->setTripleEnvironment(llvm::Triple::Simulator);

439 else if (Environment == MacCatalyst) {

440 const_cast<Darwin *>(this)->setTripleEnvironment(llvm::Triple::MacABI);

442 OSTargetVersion = VersionTuple(Major, Minor, Micro);

443 }

444 }

445

446public:

448 assert(TargetInitialized && "Target not initialized!");

449 return (TargetPlatform == IPhoneOS || TargetPlatform == TvOS) &&

450 TargetEnvironment == NativeEnvironment;

451 }

452

454 assert(TargetInitialized && "Target not initialized!");

455 return (TargetPlatform == IPhoneOS || TargetPlatform == TvOS) &&

456 TargetEnvironment == Simulator;

457 }

458

460 assert(TargetInitialized && "Target not initialized!");

461 return isTargetIPhoneOS() || isTargetIOSSimulator();

462 }

463

465 return TargetPlatform == XROS && TargetEnvironment == NativeEnvironment;

466 }

467

469 return TargetPlatform == XROS && TargetEnvironment == Simulator;

470 }

471

472 bool isTargetXROS() const { return TargetPlatform == XROS; }

473

475 assert(TargetInitialized && "Target not initialized!");

476 return TargetPlatform == TvOS && TargetEnvironment == NativeEnvironment;

477 }

478

480 assert(TargetInitialized && "Target not initialized!");

481 return TargetPlatform == TvOS && TargetEnvironment == Simulator;

482 }

483

485 assert(TargetInitialized && "Target not initialized!");

486 return TargetPlatform == TvOS;

487 }

488

490 assert(TargetInitialized && "Target not initialized!");

491 return TargetPlatform == WatchOS && TargetEnvironment == NativeEnvironment;

492 }

493

495 assert(TargetInitialized && "Target not initialized!");

496 return TargetPlatform == WatchOS && TargetEnvironment == Simulator;

497 }

498

500 assert(TargetInitialized && "Target not initialized!");

501 return TargetPlatform == WatchOS;

502 }

503

505 assert(TargetInitialized && "Target not initialized!");

506 return TargetPlatform == DriverKit;

507 }

508

510 return TargetPlatform == IPhoneOS && TargetEnvironment == MacCatalyst;

511 }

512

514 assert(TargetInitialized && "Target not initialized!");

515 return TargetPlatform == MacOS;

516 }

517

519 assert(TargetInitialized && "Target not initialized!");

520 return TargetPlatform == MacOS || isTargetMacCatalyst();

521 }

522

524 assert(TargetInitialized && "Target not initialized!");

525 return isTargetMacOSBased() && getArch() == llvm::Triple::aarch64;

526 }

527

529

530

531

532

533

535 assert(TargetInitialized && "Target not initialized!");

536 return isTargetMacCatalyst() ? OSTargetVersion : TargetVersion;

537 }

538

540 unsigned V2 = 0) const {

541 assert(isTargetIOSBased() && "Unexpected call for non iOS target!");

543 }

544

545

546

547

548

549 bool isMacosxVersionLT(unsigned V0, unsigned V1 = 0, unsigned V2 = 0) const {

550 assert(isTargetMacOSBased() &&

551 (getTriple().isMacOSX() || getTriple().isMacCatalystEnvironment()) &&

552 "Unexpected call for non OS X target!");

553

554

555 VersionTuple MinVers =

556 llvm::Triple(getTriple().getArchName(), "apple", "macos")

557 .getMinimumSupportedOSVersion();

558 return (!MinVers.empty() && MinVers > TargetVersion

559 ? MinVers

561 }

562

563protected:

564

565

566

567 bool isAlignedAllocationUnavailable() const;

568

569

570

571 bool isSizedDeallocationUnavailable() const;

572

573 void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,

574 llvm::opt::ArgStringList &CC1Args,

576

577 void addClangCC1ASTargetOptions(

578 const llvm::opt::ArgList &Args,

579 llvm::opt::ArgStringList &CC1ASArgs) const override;

580

581 StringRef getPlatformFamily() const;

582 StringRef getOSLibraryNameSuffix(bool IgnoreSim = false) const override;

583

584public:

585 static StringRef getSDKName(StringRef isysroot);

586

587

588

589

590

591

592

593

595

596 llvm::opt::DerivedArgList *

597 TranslateArgs(const llvm::opt::DerivedArgList &Args, StringRef BoundArch,

599

600 CXXStdlibType GetDefaultCXXStdlibType() const override;

601 ObjCRuntime getDefaultObjCRuntime(bool isNonFragile) const override;

602 bool hasBlocksRuntime() const override;

603

605

606

607

608 return !(isTargetMacOSBased() && isMacosxVersionLT(10, 6));

609 }

610

613

614

615 if (isTargetIOSBased() || isTargetWatchOSBased() || isTargetDriverKit() ||

616 isTargetXROS())

617 return LangOptions::SSPOn;

618 else if (isTargetMacOSBased() && !isMacosxVersionLT(10, 6))

619 return LangOptions::SSPOn;

620 else if (isTargetMacOSBased() && !isMacosxVersionLT(10, 5) && !KernelOrKext)

621 return LangOptions::SSPOn;

622

623 return LangOptions::SSPOff;

624 }

625

626 void CheckObjCARC() const override;

627

628 llvm::ExceptionHandling GetExceptionModel(

629 const llvm::opt::ArgList &Args) const override;

630

631 bool SupportsEmbeddedBitcode() const override;

632

633 SanitizerMask getSupportedSanitizers() const override;

634};

635

636

638public:

640 const llvm::opt::ArgList &Args);

641

642

643

644

645 RuntimeLibType GetRuntimeLibType(const llvm::opt::ArgList &Args) const override;

646

647 void AddLinkRuntimeLibArgs(const llvm::opt::ArgList &Args,

648 llvm::opt::ArgStringList &CmdArgs,

649 bool ForceLinkBuiltinRT = false) const override;

650

651 void AddCCKextLibArgs(const llvm::opt::ArgList &Args,

652 llvm::opt::ArgStringList &CmdArgs) const override;

653

654 void addClangWarningOptions(llvm::opt::ArgStringList &CC1Args) const override;

655

656 void AddLinkARCArgs(const llvm::opt::ArgList &Args,

657 llvm::opt::ArgStringList &CmdArgs) const override;

658

659 unsigned GetDefaultDwarfVersion() const override;

660

661

664 return llvm::DebuggerKind::LLDB;

665 }

666

667

668

669private:

670 void AddLinkSanitizerLibArgs(const llvm::opt::ArgList &Args,

671 llvm::opt::ArgStringList &CmdArgs,

672 StringRef Sanitizer,

673 bool shared = true) const;

674

675 void

676 AddGnuCPlusPlusIncludePaths(const llvm::opt::ArgList &DriverArgs,

677 llvm::opt::ArgStringList &CC1Args) const override;

678

679 bool AddGnuCPlusPlusIncludePaths(const llvm::opt::ArgList &DriverArgs,

680 llvm::opt::ArgStringList &CC1Args,

682 llvm::StringRef Version,

683 llvm::StringRef ArchDir,

684 llvm::StringRef BitDir) const;

685};

686

687}

688}

689}

690

691#endif

Defines the clang::LangOptions interface.

llvm::MachO::FileType FileType

Simple wrapper for toolchain detector with costly initialization.

The basic abstraction for the target Objective-C runtime.

The base class of the type hierarchy.

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...

InputInfo - Wrapper for information about an input source.

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

const FunctionProtoType * T