Split GenerateModuleAction into its own action, which will start

differing from GeneratePCHAction fairly soon.

llvm-svn: 144703
This commit is contained in:
Douglas Gregor 2011-11-15 21:49:36 +00:00
parent b4db660cff
commit 86b6f74217
4 changed files with 70 additions and 13 deletions

View File

@ -67,22 +67,40 @@ protected:
};
class GeneratePCHAction : public ASTFrontendAction {
bool MakeModule;
protected:
virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI,
StringRef InFile);
virtual TranslationUnitKind getTranslationUnitKind() {
return MakeModule? TU_Module : TU_Prefix;
return TU_Prefix;
}
virtual bool hasASTFileSupport() const { return false; }
public:
/// \brief Create a new action
explicit GeneratePCHAction(bool MakeModule) : MakeModule(MakeModule) { }
/// \brief Compute the AST consumer arguments that will be used to
/// create the PCHGenerator instance returned by CreateASTConsumer.
///
/// \returns true if an error occurred, false otherwise.
static bool ComputeASTConsumerArguments(CompilerInstance &CI,
StringRef InFile,
std::string &Sysroot,
std::string &OutputFile,
raw_ostream *&OS);
};
class GenerateModuleAction : public ASTFrontendAction {
protected:
virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI,
StringRef InFile);
virtual TranslationUnitKind getTranslationUnitKind() {
return TU_Module;
}
virtual bool hasASTFileSupport() const { return false; }
public:
/// \brief Compute the AST consumer arguments that will be used to
/// create the PCHGenerator instance returned by CreateASTConsumer.
///

View File

@ -647,13 +647,14 @@ bool CompilerInstance::ExecuteAction(FrontendAction &Act) {
llvm::EnableStatistics();
for (unsigned i = 0, e = getFrontendOpts().Inputs.size(); i != e; ++i) {
const std::string &InFile = getFrontendOpts().Inputs[i].second;
InputKind InKind = getFrontendOpts().Inputs[i].first;
std::string InFile = getFrontendOpts().Inputs[i].second;
// Reset the ID tables if we are reusing the SourceManager.
if (hasSourceManager())
getSourceManager().clearIDTables();
if (Act.BeginSourceFile(*this, InFile, getFrontendOpts().Inputs[i].first)) {
if (Act.BeginSourceFile(*this, InFile, InKind)) {
Act.Execute();
Act.EndSourceFile();
}
@ -698,7 +699,7 @@ static InputKind getSourceInputKindFromOptions(const LangOptions &LangOpts) {
namespace {
struct CompileModuleData {
CompilerInstance &Instance;
GeneratePCHAction &CreateModuleAction;
GenerateModuleAction &CreateModuleAction;
};
}
@ -1023,7 +1024,7 @@ static void compileModule(CompilerInstance &ImportingInstance,
/*ShouldCloneClient=*/true);
// Construct a module-generating action.
GeneratePCHAction CreateModuleAction(true);
GenerateModuleAction CreateModuleAction;
// Execute the action to actually build the module in-place. Use a separate
// thread so that we get a stack large enough.

View File

@ -85,7 +85,7 @@ ASTConsumer *GeneratePCHAction::CreateASTConsumer(CompilerInstance &CI,
if (!CI.getFrontendOpts().RelocatablePCH)
Sysroot.clear();
return new PCHGenerator(CI.getPreprocessor(), OutputFile, MakeModule,
return new PCHGenerator(CI.getPreprocessor(), OutputFile, /*Module=*/false,
Sysroot, OS);
}
@ -113,6 +113,44 @@ bool GeneratePCHAction::ComputeASTConsumerArguments(CompilerInstance &CI,
return false;
}
ASTConsumer *GenerateModuleAction::CreateASTConsumer(CompilerInstance &CI,
StringRef InFile) {
std::string Sysroot;
std::string OutputFile;
raw_ostream *OS = 0;
if (ComputeASTConsumerArguments(CI, InFile, Sysroot, OutputFile, OS))
return 0;
if (!CI.getFrontendOpts().RelocatablePCH)
Sysroot.clear();
return new PCHGenerator(CI.getPreprocessor(), OutputFile, /*Module=*/true,
Sysroot, OS);
}
bool GenerateModuleAction::ComputeASTConsumerArguments(CompilerInstance &CI,
StringRef InFile,
std::string &Sysroot,
std::string &OutputFile,
raw_ostream *&OS) {
Sysroot = CI.getHeaderSearchOpts().Sysroot;
if (CI.getFrontendOpts().RelocatablePCH && Sysroot.empty()) {
CI.getDiagnostics().Report(diag::err_relocatable_without_isysroot);
return true;
}
// We use createOutputFile here because this is exposed via libclang, and we
// must disable the RemoveFileOnSignal behavior.
// We use a temporary to avoid race conditions.
OS = CI.createOutputFile(CI.getFrontendOpts().OutputFile, /*Binary=*/true,
/*RemoveFileOnSignal=*/false, InFile,
/*Extension=*/"", /*useTemporary=*/true);
if (!OS)
return true;
OutputFile = CI.getFrontendOpts().OutputFile;
return false;
}
ASTConsumer *SyntaxOnlyAction::CreateASTConsumer(CompilerInstance &CI,
StringRef InFile) {
return new ASTConsumer();

View File

@ -49,8 +49,8 @@ static FrontendAction *CreateFrontendBaseAction(CompilerInstance &CI) {
case EmitCodeGenOnly: return new EmitCodeGenOnlyAction();
case EmitObj: return new EmitObjAction();
case FixIt: return new FixItAction();
case GenerateModule: return new GeneratePCHAction(true);
case GeneratePCH: return new GeneratePCHAction(false);
case GenerateModule: return new GenerateModuleAction();
case GeneratePCH: return new GeneratePCHAction();
case GeneratePTH: return new GeneratePTHAction();
case InitOnly: return new InitOnlyAction();
case ParseSyntaxOnly: return new SyntaxOnlyAction();