mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-12-13 19:24:21 +00:00
Split GenerateModuleAction into its own action, which will start
differing from GeneratePCHAction fairly soon. llvm-svn: 144703
This commit is contained in:
parent
b4db660cff
commit
86b6f74217
@ -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.
|
||||
///
|
||||
|
@ -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.
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
|
Loading…
Reference in New Issue
Block a user