aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2011-11-15 22:58:25 +0000
committerDouglas Gregor <dgregor@apple.com>2011-11-15 22:58:25 +0000
commitd2536a604f59a3cca491f175bf1e49eeca49163b (patch)
tree0030af96483fedda86d5fcdae114f4bddf75f6b0
parent3bc451593fa44bfc45753e44e37cb4242e714f82 (diff)
Revert r144703. It was a dumb idea anyway; will add the new bits more
incrementally with a new frontend action. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@144723 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/clang/Frontend/FrontendActions.h28
-rw-r--r--lib/Frontend/CompilerInstance.cpp11
-rw-r--r--lib/Frontend/FrontendActions.cpp40
-rw-r--r--lib/FrontendTool/ExecuteCompilerInvocation.cpp4
4 files changed, 13 insertions, 70 deletions
diff --git a/include/clang/Frontend/FrontendActions.h b/include/clang/Frontend/FrontendActions.h
index ba1dbb8f23..72a3d90847 100644
--- a/include/clang/Frontend/FrontendActions.h
+++ b/include/clang/Frontend/FrontendActions.h
@@ -67,40 +67,22 @@ protected:
};
class GeneratePCHAction : public ASTFrontendAction {
+ bool MakeModule;
+
protected:
virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI,
StringRef InFile);
virtual TranslationUnitKind getTranslationUnitKind() {
- return TU_Prefix;
+ return MakeModule? TU_Module : TU_Prefix;
}
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.
- ///
- /// \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;
- }
+ /// \brief Create a new action
+ explicit GeneratePCHAction(bool MakeModule) : MakeModule(MakeModule) { }
- 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.
///
diff --git a/lib/Frontend/CompilerInstance.cpp b/lib/Frontend/CompilerInstance.cpp
index 0a32cb96f7..ea2c3bd6c6 100644
--- a/lib/Frontend/CompilerInstance.cpp
+++ b/lib/Frontend/CompilerInstance.cpp
@@ -647,14 +647,13 @@ bool CompilerInstance::ExecuteAction(FrontendAction &Act) {
llvm::EnableStatistics();
for (unsigned i = 0, e = getFrontendOpts().Inputs.size(); i != e; ++i) {
- InputKind InKind = getFrontendOpts().Inputs[i].first;
- std::string InFile = getFrontendOpts().Inputs[i].second;
-
+ const 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, InKind)) {
+ if (Act.BeginSourceFile(*this, InFile, getFrontendOpts().Inputs[i].first)) {
Act.Execute();
Act.EndSourceFile();
}
@@ -699,7 +698,7 @@ static InputKind getSourceInputKindFromOptions(const LangOptions &LangOpts) {
namespace {
struct CompileModuleData {
CompilerInstance &Instance;
- GenerateModuleAction &CreateModuleAction;
+ GeneratePCHAction &CreateModuleAction;
};
}
@@ -1024,7 +1023,7 @@ static void compileModule(CompilerInstance &ImportingInstance,
/*ShouldCloneClient=*/true);
// Construct a module-generating action.
- GenerateModuleAction CreateModuleAction;
+ GeneratePCHAction CreateModuleAction(true);
// Execute the action to actually build the module in-place. Use a separate
// thread so that we get a stack large enough.
diff --git a/lib/Frontend/FrontendActions.cpp b/lib/Frontend/FrontendActions.cpp
index 2fcbc67ef1..6f84da9630 100644
--- a/lib/Frontend/FrontendActions.cpp
+++ b/lib/Frontend/FrontendActions.cpp
@@ -85,7 +85,7 @@ ASTConsumer *GeneratePCHAction::CreateASTConsumer(CompilerInstance &CI,
if (!CI.getFrontendOpts().RelocatablePCH)
Sysroot.clear();
- return new PCHGenerator(CI.getPreprocessor(), OutputFile, /*Module=*/false,
+ return new PCHGenerator(CI.getPreprocessor(), OutputFile, MakeModule,
Sysroot, OS);
}
@@ -113,44 +113,6 @@ 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();
diff --git a/lib/FrontendTool/ExecuteCompilerInvocation.cpp b/lib/FrontendTool/ExecuteCompilerInvocation.cpp
index ea50a76a39..c9af3cc3ff 100644
--- a/lib/FrontendTool/ExecuteCompilerInvocation.cpp
+++ b/lib/FrontendTool/ExecuteCompilerInvocation.cpp
@@ -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 GenerateModuleAction();
- case GeneratePCH: return new GeneratePCHAction();
+ case GenerateModule: return new GeneratePCHAction(true);
+ case GeneratePCH: return new GeneratePCHAction(false);
case GeneratePTH: return new GeneratePTHAction();
case InitOnly: return new InitOnlyAction();
case ParseSyntaxOnly: return new SyntaxOnlyAction();