зеркало из https://github.com/microsoft/clang-1.git
Driver/Frontend: Add -emit-codegen-only, for running irgen + codegen but not the
.s printer or .o writer. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@104623 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
a46325e7b9
Коммит
32148cef25
|
@ -314,6 +314,8 @@ def emit_llvm_bc : Flag<"-emit-llvm-bc">,
|
|||
HelpText<"Build ASTs then convert to LLVM, emit .bc file">;
|
||||
def emit_llvm_only : Flag<"-emit-llvm-only">,
|
||||
HelpText<"Build ASTs and convert to LLVM, discarding output">;
|
||||
def emit_codegen_only : Flag<"-emit-codegen-only">,
|
||||
HelpText<"Generate machine code, but discard output">;
|
||||
def emit_obj : Flag<"-emit-obj">,
|
||||
HelpText<"Emit native object files">;
|
||||
def rewrite_test : Flag<"-rewrite-test">,
|
||||
|
|
|
@ -57,6 +57,11 @@ public:
|
|||
EmitLLVMOnlyAction();
|
||||
};
|
||||
|
||||
class EmitCodeGenOnlyAction : public CodeGenAction {
|
||||
public:
|
||||
EmitCodeGenOnlyAction();
|
||||
};
|
||||
|
||||
class EmitObjAction : public CodeGenAction {
|
||||
public:
|
||||
EmitObjAction();
|
||||
|
|
|
@ -30,7 +30,8 @@ namespace frontend {
|
|||
EmitBC, ///< Emit a .bc file.
|
||||
EmitHTML, ///< Translate input source into HTML.
|
||||
EmitLLVM, ///< Emit a .ll file.
|
||||
EmitLLVMOnly, ///< Generate LLVM IR, but do not
|
||||
EmitLLVMOnly, ///< Generate LLVM IR, but do not emit anything.
|
||||
EmitCodeGenOnly, ///< Generate machine code, but don't emit anything.
|
||||
EmitObj, ///< Emit a .o file.
|
||||
FixIt, ///< Parse and apply any fixits to the source.
|
||||
GeneratePCH, ///< Generate pre-compiled header.
|
||||
|
|
|
@ -48,6 +48,7 @@ namespace {
|
|||
Backend_EmitBC, ///< Emit LLVM bitcode files
|
||||
Backend_EmitLL, ///< Emit human-readable LLVM assembly
|
||||
Backend_EmitNothing, ///< Don't emit anything (benchmarking mode)
|
||||
Backend_EmitMCNull, ///< Run CodeGen, but don't emit anything
|
||||
Backend_EmitObj ///< Emit native object files
|
||||
};
|
||||
|
||||
|
@ -340,6 +341,10 @@ bool BackendConsumer::AddEmitPasses() {
|
|||
TargetMachine::CodeGenFileType CGFT = TargetMachine::CGFT_AssemblyFile;
|
||||
if (Action == Backend_EmitObj)
|
||||
CGFT = TargetMachine::CGFT_ObjectFile;
|
||||
else if (Action == Backend_EmitMCNull)
|
||||
CGFT = TargetMachine::CGFT_Null;
|
||||
else
|
||||
assert(Action == Backend_EmitAssembly && "Invalid action!");
|
||||
if (TM->addPassesToEmitFile(*PM, FormattedOutStream, CGFT, OptLevel,
|
||||
/*DisableVerify=*/!CodeGenOpts.VerifyModule)) {
|
||||
Diags.Report(diag::err_fe_unable_to_interface_with_target);
|
||||
|
@ -557,6 +562,7 @@ ASTConsumer *CodeGenAction::CreateASTConsumer(CompilerInstance &CI,
|
|||
break;
|
||||
case Backend_EmitNothing:
|
||||
break;
|
||||
case Backend_EmitMCNull:
|
||||
case Backend_EmitObj:
|
||||
OS.reset(CI.createDefaultOutputFile(true, InFile, "o"));
|
||||
break;
|
||||
|
@ -579,4 +585,6 @@ EmitLLVMAction::EmitLLVMAction() : CodeGenAction(Backend_EmitLL) {}
|
|||
|
||||
EmitLLVMOnlyAction::EmitLLVMOnlyAction() : CodeGenAction(Backend_EmitNothing) {}
|
||||
|
||||
EmitCodeGenOnlyAction::EmitCodeGenOnlyAction() : CodeGenAction(Backend_EmitMCNull) {}
|
||||
|
||||
EmitObjAction::EmitObjAction() : CodeGenAction(Backend_EmitObj) {}
|
||||
|
|
|
@ -316,6 +316,7 @@ static const char *getActionName(frontend::ActionKind Kind) {
|
|||
case frontend::EmitHTML: return "-emit-html";
|
||||
case frontend::EmitLLVM: return "-emit-llvm";
|
||||
case frontend::EmitLLVMOnly: return "-emit-llvm-only";
|
||||
case frontend::EmitCodeGenOnly: return "-emit-codegen-only";
|
||||
case frontend::EmitObj: return "-emit-obj";
|
||||
case frontend::FixIt: return "-fixit";
|
||||
case frontend::GeneratePCH: return "-emit-pch";
|
||||
|
@ -927,6 +928,8 @@ ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args, Diagnostic &Diags) {
|
|||
Opts.ProgramAction = frontend::EmitLLVM; break;
|
||||
case OPT_emit_llvm_only:
|
||||
Opts.ProgramAction = frontend::EmitLLVMOnly; break;
|
||||
case OPT_emit_codegen_only:
|
||||
Opts.ProgramAction = frontend::EmitCodeGenOnly; break;
|
||||
case OPT_emit_obj:
|
||||
Opts.ProgramAction = frontend::EmitObj; break;
|
||||
case OPT_fixit_EQ:
|
||||
|
|
|
@ -71,6 +71,7 @@ static FrontendAction *CreateFrontendBaseAction(CompilerInstance &CI) {
|
|||
case EmitHTML: return new HTMLPrintAction();
|
||||
case EmitLLVM: return new EmitLLVMAction();
|
||||
case EmitLLVMOnly: return new EmitLLVMOnlyAction();
|
||||
case EmitCodeGenOnly: return new EmitCodeGenOnlyAction();
|
||||
case EmitObj: return new EmitObjAction();
|
||||
case FixIt: return new FixItAction();
|
||||
case GeneratePCH: return new GeneratePCHAction();
|
||||
|
|
Загрузка…
Ссылка в новой задаче