|
32 | 32 | #include "clang/Driver/DriverDiagnostic.h" |
33 | 33 | #include "clang/Frontend/CompilerInstance.h" |
34 | 34 | #include "clang/Frontend/FrontendDiagnostic.h" |
| 35 | +#include "clang/Frontend/MultiplexConsumer.h" |
35 | 36 | #include "clang/Lex/Preprocessor.h" |
36 | 37 | #include "llvm/Bitcode/BitcodeReader.h" |
37 | 38 | #include "llvm/IR/DebugInfo.h" |
@@ -439,6 +440,7 @@ void CIRGenAction::ExecuteAction() { |
439 | 440 | llvmModule->print(*outstream, nullptr); |
440 | 441 | } |
441 | 442 |
|
| 443 | +namespace cir { |
442 | 444 | void EmitAssemblyAction::anchor() {} |
443 | 445 | EmitAssemblyAction::EmitAssemblyAction(mlir::MLIRContext *_MLIRContext) |
444 | 446 | : CIRGenAction(OutputType::EmitAssembly, _MLIRContext) {} |
@@ -470,3 +472,52 @@ EmitBCAction::EmitBCAction(mlir::MLIRContext *_MLIRContext) |
470 | 472 | void EmitObjAction::anchor() {} |
471 | 473 | EmitObjAction::EmitObjAction(mlir::MLIRContext *_MLIRContext) |
472 | 474 | : CIRGenAction(OutputType::EmitObj, _MLIRContext) {} |
| 475 | +} // namespace cir |
| 476 | + |
| 477 | +// Used for -fclangir-analysis-only: use CIR analysis but still use original LLVM codegen path |
| 478 | +void AnalysisOnlyActionBase::anchor() {} |
| 479 | +AnalysisOnlyActionBase::AnalysisOnlyActionBase(unsigned _Act, |
| 480 | + llvm::LLVMContext *_VMContext) |
| 481 | + : clang::CodeGenAction(_Act, _VMContext) {} |
| 482 | + |
| 483 | +std::unique_ptr<ASTConsumer> |
| 484 | +AnalysisOnlyActionBase::CreateASTConsumer(clang::CompilerInstance &ci, |
| 485 | + llvm::StringRef inFile) { |
| 486 | + std::vector<std::unique_ptr<ASTConsumer>> Consumers; |
| 487 | + Consumers.push_back(clang::CodeGenAction::CreateASTConsumer(ci, inFile)); |
| 488 | + Consumers.push_back(std::make_unique<cir::CIRGenConsumer>( |
| 489 | + CIRGenAction::OutputType::None, ci.getDiagnostics(), |
| 490 | + &ci.getVirtualFileSystem(), ci.getHeaderSearchOpts(), ci.getCodeGenOpts(), |
| 491 | + ci.getTargetOpts(), ci.getLangOpts(), ci.getFrontendOpts(), nullptr)); |
| 492 | + return std::make_unique<MultiplexConsumer>(std::move(Consumers)); |
| 493 | +} |
| 494 | + |
| 495 | +void AnalysisOnlyAndEmitAssemblyAction::anchor() {} |
| 496 | +AnalysisOnlyAndEmitAssemblyAction::AnalysisOnlyAndEmitAssemblyAction( |
| 497 | + llvm::LLVMContext *_VMContext) |
| 498 | + : AnalysisOnlyActionBase(Backend_EmitAssembly, _VMContext) {} |
| 499 | + |
| 500 | +void AnalysisOnlyAndEmitBCAction::anchor() {} |
| 501 | +AnalysisOnlyAndEmitBCAction::AnalysisOnlyAndEmitBCAction( |
| 502 | + llvm::LLVMContext *_VMContext) |
| 503 | + : AnalysisOnlyActionBase(Backend_EmitBC, _VMContext) {} |
| 504 | + |
| 505 | +void AnalysisOnlyAndEmitLLVMAction::anchor() {} |
| 506 | +AnalysisOnlyAndEmitLLVMAction::AnalysisOnlyAndEmitLLVMAction( |
| 507 | + llvm::LLVMContext *_VMContext) |
| 508 | + : AnalysisOnlyActionBase(Backend_EmitLL, _VMContext) {} |
| 509 | + |
| 510 | +void AnalysisOnlyAndEmitLLVMOnlyAction::anchor() {} |
| 511 | +AnalysisOnlyAndEmitLLVMOnlyAction::AnalysisOnlyAndEmitLLVMOnlyAction( |
| 512 | + llvm::LLVMContext *_VMContext) |
| 513 | + : AnalysisOnlyActionBase(Backend_EmitNothing, _VMContext) {} |
| 514 | + |
| 515 | +void AnalysisOnlyAndEmitCodeGenOnlyAction::anchor() {} |
| 516 | +AnalysisOnlyAndEmitCodeGenOnlyAction::AnalysisOnlyAndEmitCodeGenOnlyAction( |
| 517 | + llvm::LLVMContext *_VMContext) |
| 518 | + : AnalysisOnlyActionBase(Backend_EmitMCNull, _VMContext) {} |
| 519 | + |
| 520 | +void AnalysisOnlyAndEmitObjAction::anchor() {} |
| 521 | +AnalysisOnlyAndEmitObjAction::AnalysisOnlyAndEmitObjAction( |
| 522 | + llvm::LLVMContext *_VMContext) |
| 523 | + : AnalysisOnlyActionBase(Backend_EmitObj, _VMContext) {} |
0 commit comments