@@ -27,6 +27,7 @@ public struct Driver {
2727 case unableToLoadOutputFileMap( String )
2828 case unableToDecodeFrontendTargetInfo
2929 case failedToRetrieveFrontendTargetInfo
30+ case missingProfilingData( String )
3031 // Explicit Module Build Failures
3132 case malformedModuleDependency( String , String )
3233 case missingPCMArguments( String )
@@ -55,6 +56,8 @@ public struct Driver {
5556 return " could not decode frontend target info; compiler driver and frontend executables may be incompatible "
5657 case . failedToRetrieveFrontendTargetInfo:
5758 return " failed to retrieve frontend target info "
59+ case . missingProfilingData( let arg) :
60+ return " no profdata file exists at ' \( arg) ' "
5861 // Explicit Module Build Failures
5962 case . malformedModuleDependency( let moduleName, let errorDescription) :
6063 return " Malformed Module Dependency: \( moduleName) , \( errorDescription) "
@@ -328,6 +331,9 @@ public struct Driver {
328331 self . numParallelJobs = Self . determineNumParallelJobs ( & parsedOptions, diagnosticsEngine: diagnosticEngine, env: env)
329332
330333 try Self . validateWarningControlArgs ( & parsedOptions)
334+ try Self . validateProfilingArgs ( & parsedOptions,
335+ fileSystem: fileSystem,
336+ workingDirectory: workingDirectory)
331337 Self . validateCoverageArgs ( & parsedOptions, diagnosticsEngine: diagnosticEngine)
332338 try toolchain. validateArgs ( & parsedOptions,
333339 targetTriple: self . frontendTargetInfo. target. triple,
@@ -1565,6 +1571,25 @@ extension Driver {
15651571 }
15661572 }
15671573
1574+ static func validateProfilingArgs( _ parsedOptions: inout ParsedOptions ,
1575+ fileSystem: FileSystem ,
1576+ workingDirectory: AbsolutePath ? ) throws {
1577+ if parsedOptions. hasArgument ( . profileGenerate) &&
1578+ parsedOptions. hasArgument ( . profileUse) {
1579+ throw Error . conflictingOptions ( . profileGenerate, . profileUse)
1580+ }
1581+
1582+ if let profileArgs = parsedOptions. getLastArgument ( . profileUse) ? . asMultiple,
1583+ let workingDirectory = workingDirectory ?? fileSystem. currentWorkingDirectory {
1584+ for profilingData in profileArgs {
1585+ guard fileSystem. exists ( AbsolutePath ( profilingData,
1586+ relativeTo: workingDirectory) ) else {
1587+ throw Error . missingProfilingData ( profilingData)
1588+ }
1589+ }
1590+ }
1591+ }
1592+
15681593 private static func validateCoverageArgs( _ parsedOptions: inout ParsedOptions , diagnosticsEngine: DiagnosticsEngine ) {
15691594 for coveragePrefixMap in parsedOptions. arguments ( for: . coveragePrefixMap) {
15701595 let value = coveragePrefixMap. argument. asSingle
0 commit comments