Files
swift-mirror/lib/Frontend/FrontendOptions.cpp
Huon Wilson dfa8501e59 [Frontend] Emit tbd as an extra output, not a frontend action.
This means it can be emitted during an -emit-module frontend job, which is the
most common place it will be used, so reusing work like this is important for
performance.

For now, this has to happen as part of a single frontend invocation, i.e. -wmo
or -force-single-frontend-invocation.
2017-07-31 11:05:29 -07:00

101 lines
2.3 KiB
C++

//===--- FrontendOptions.cpp ----------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
#include "swift/Frontend/FrontendOptions.h"
#include "llvm/Support/ErrorHandling.h"
using namespace swift;
bool FrontendOptions::actionHasOutput() const {
switch (RequestedAction) {
case NoneAction:
case Parse:
case Typecheck:
case DumpParse:
case DumpAST:
case EmitSyntax:
case DumpInterfaceHash:
case PrintAST:
case DumpScopeMaps:
case DumpTypeRefinementContexts:
return false;
case EmitPCH:
case EmitSILGen:
case EmitSIL:
case EmitSIBGen:
case EmitSIB:
case EmitModuleOnly:
return true;
case Immediate:
case REPL:
return false;
case EmitAssembly:
case EmitIR:
case EmitBC:
case EmitObject:
case EmitImportedModules:
return true;
}
llvm_unreachable("Unknown ActionType");
}
bool FrontendOptions::actionIsImmediate() const {
switch (RequestedAction) {
case NoneAction:
case Parse:
case Typecheck:
case DumpParse:
case DumpAST:
case EmitSyntax:
case DumpInterfaceHash:
case PrintAST:
case DumpScopeMaps:
case DumpTypeRefinementContexts:
case EmitPCH:
case EmitSILGen:
case EmitSIL:
case EmitSIBGen:
case EmitSIB:
case EmitModuleOnly:
return false;
case Immediate:
case REPL:
return true;
case EmitAssembly:
case EmitIR:
case EmitBC:
case EmitObject:
case EmitImportedModules:
return false;
}
llvm_unreachable("Unknown ActionType");
}
void FrontendOptions::forAllOutputPaths(
std::function<void(const std::string &)> fn) const {
if (RequestedAction != FrontendOptions::EmitModuleOnly) {
for (const std::string &OutputFileName : OutputFilenames) {
fn(OutputFileName);
}
}
const std::string *outputs[] = {
&ModuleOutputPath,
&ModuleDocOutputPath,
&ObjCHeaderOutputPath
};
for (const std::string *next : outputs) {
if (!next->empty())
fn(*next);
}
}