|
188 | 188 | #include "llvm/Support/CodeGen.h" |
189 | 189 | #include "llvm/Support/CommandLine.h" |
190 | 190 | #include "llvm/Support/Debug.h" |
| 191 | +#include "llvm/Support/Error.h" |
191 | 192 | #include "llvm/Support/ErrorHandling.h" |
192 | 193 | #include "llvm/Support/FormatVariadic.h" |
193 | 194 | #include "llvm/Support/Regex.h" |
@@ -529,96 +530,100 @@ PassBuilder::PassBuilder(TargetMachine *TM, PipelineTuningOptions PTO, |
529 | 530 | }); |
530 | 531 | } |
531 | 532 | auto parseLevelParam = [](StringRef P) -> Expected<OptimizationLevel> { |
532 | | - if (P == "O0") return OptimizationLevel::O0; |
533 | | - if (P == "O1") return OptimizationLevel::O1; |
534 | | - if (P == "O2") return OptimizationLevel::O2; |
535 | | - if (P == "O3") return OptimizationLevel::O3; |
536 | | - if (P == "Os") return OptimizationLevel::Os; |
537 | | - if (P == "Oz") return OptimizationLevel::Oz; |
538 | | - return make_error<StringError>( |
539 | | - formatv("invalid optimization level '{}'", P).str(), |
540 | | - inconvertibleErrorCode()); |
| 533 | + auto OptLevel = llvm::StringSwitch<std::optional<OptimizationLevel>>(P) |
| 534 | + .Case("O0", OptimizationLevel::O0) |
| 535 | + .Case("O1", OptimizationLevel::O1) |
| 536 | + .Case("O2", OptimizationLevel::O2) |
| 537 | + .Case("O3", OptimizationLevel::O3) |
| 538 | + .Case("Os", OptimizationLevel::Os) |
| 539 | + .Case("Oz", OptimizationLevel::Oz) |
| 540 | + .Default(std::nullopt); |
| 541 | + if (!OptLevel) |
| 542 | + return llvm::createStringError(llvm::inconvertibleErrorCode(), |
| 543 | + "invalid optimization level '%s'", |
| 544 | + P.str().c_str()); |
| 545 | + return *OptLevel; |
541 | 546 | }; |
542 | 547 |
|
543 | 548 | // Module-level callbacks without LTO phase |
544 | | - this->registerPipelineParsingCallback( |
| 549 | + registerPipelineParsingCallback( |
545 | 550 | [this, parseLevelParam](StringRef Name, ModulePassManager &PM, |
546 | | - ArrayRef<PassBuilder::PipelineElement>) { |
547 | | -#define MODULE_CALLBACK(NAME, INVOKE) \ |
548 | | - if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \ |
549 | | - auto L = PassBuilder::parsePassParameters(parseLevelParam, Name, NAME); \ |
550 | | - if (!L) \ |
551 | | - return (errs() << NAME ": " << toString(L.takeError()) << '\n', false); \ |
552 | | - this->INVOKE(PM, L.get()); \ |
553 | | - return true; \ |
| 551 | + ArrayRef<PassBuilder::PipelineElement>) { |
| 552 | +#define MODULE_CALLBACK(NAME, INVOKE) \ |
| 553 | + if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \ |
| 554 | + auto L = PassBuilder::parsePassParameters(parseLevelParam, Name, NAME); \ |
| 555 | + if (!L) \ |
| 556 | + return (errs() << NAME ": " << toString(L.takeError()) << '\n', false); \ |
| 557 | + INVOKE(PM, L.get()); \ |
| 558 | + return true; \ |
554 | 559 | } |
555 | 560 | #include "PassRegistry.def" |
556 | 561 | #undef MODULE_CALLBACK |
557 | 562 | return false; |
558 | 563 | }); |
559 | 564 |
|
560 | 565 | // Module-level callbacks with LTO phase (use Phase::None for string API) |
561 | | - this->registerPipelineParsingCallback( |
| 566 | + registerPipelineParsingCallback( |
562 | 567 | [this, parseLevelParam](StringRef Name, ModulePassManager &PM, |
563 | | - ArrayRef<PassBuilder::PipelineElement>) { |
564 | | -#define MODULE_LTO_CALLBACK(NAME, INVOKE) \ |
565 | | - if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \ |
566 | | - auto L = PassBuilder::parsePassParameters(parseLevelParam, Name, NAME); \ |
567 | | - if (!L) \ |
568 | | - return (errs() << NAME ": " << toString(L.takeError()) << '\n', false); \ |
569 | | - this->INVOKE(PM, L.get(), ThinOrFullLTOPhase::None); \ |
570 | | - return true; \ |
| 568 | + ArrayRef<PassBuilder::PipelineElement>) { |
| 569 | +#define MODULE_LTO_CALLBACK(NAME, INVOKE) \ |
| 570 | + if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \ |
| 571 | + auto L = PassBuilder::parsePassParameters(parseLevelParam, Name, NAME); \ |
| 572 | + if (!L) \ |
| 573 | + return (errs() << NAME ": " << toString(L.takeError()) << '\n', false); \ |
| 574 | + INVOKE(PM, L.get(), ThinOrFullLTOPhase::None); \ |
| 575 | + return true; \ |
571 | 576 | } |
572 | 577 | #include "PassRegistry.def" |
573 | 578 | #undef MODULE_LTO_CALLBACK |
574 | 579 | return false; |
575 | 580 | }); |
576 | 581 |
|
577 | 582 | // Function-level callbacks |
578 | | - this->registerPipelineParsingCallback( |
| 583 | + registerPipelineParsingCallback( |
579 | 584 | [this, parseLevelParam](StringRef Name, FunctionPassManager &PM, |
580 | | - ArrayRef<PassBuilder::PipelineElement>) { |
581 | | -#define FUNCTION_CALLBACK(NAME, INVOKE) \ |
582 | | - if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \ |
583 | | - auto L = PassBuilder::parsePassParameters(parseLevelParam, Name, NAME); \ |
584 | | - if (!L) \ |
585 | | - return (errs() << NAME ": " << toString(L.takeError()) << '\n', false); \ |
586 | | - this->INVOKE(PM, L.get()); \ |
587 | | - return true; \ |
| 585 | + ArrayRef<PassBuilder::PipelineElement>) { |
| 586 | +#define FUNCTION_CALLBACK(NAME, INVOKE) \ |
| 587 | + if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \ |
| 588 | + auto L = PassBuilder::parsePassParameters(parseLevelParam, Name, NAME); \ |
| 589 | + if (!L) \ |
| 590 | + return (errs() << NAME ": " << toString(L.takeError()) << '\n', false); \ |
| 591 | + INVOKE(PM, L.get()); \ |
| 592 | + return true; \ |
588 | 593 | } |
589 | 594 | #include "PassRegistry.def" |
590 | 595 | #undef FUNCTION_CALLBACK |
591 | 596 | return false; |
592 | 597 | }); |
593 | 598 |
|
594 | 599 | // CGSCC-level callbacks |
595 | | - this->registerPipelineParsingCallback( |
| 600 | + registerPipelineParsingCallback( |
596 | 601 | [this, parseLevelParam](StringRef Name, CGSCCPassManager &PM, |
597 | | - ArrayRef<PassBuilder::PipelineElement>) { |
598 | | -#define CGSCC_CALLBACK(NAME, INVOKE) \ |
599 | | - if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \ |
600 | | - auto L = PassBuilder::parsePassParameters(parseLevelParam, Name, NAME); \ |
601 | | - if (!L) \ |
602 | | - return (errs() << NAME ": " << toString(L.takeError()) << '\n', false); \ |
603 | | - this->INVOKE(PM, L.get()); \ |
604 | | - return true; \ |
| 602 | + ArrayRef<PassBuilder::PipelineElement>) { |
| 603 | +#define CGSCC_CALLBACK(NAME, INVOKE) \ |
| 604 | + if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \ |
| 605 | + auto L = PassBuilder::parsePassParameters(parseLevelParam, Name, NAME); \ |
| 606 | + if (!L) \ |
| 607 | + return (errs() << NAME ": " << toString(L.takeError()) << '\n', false); \ |
| 608 | + INVOKE(PM, L.get()); \ |
| 609 | + return true; \ |
605 | 610 | } |
606 | 611 | #include "PassRegistry.def" |
607 | 612 | #undef CGSCC_CALLBACK |
608 | 613 | return false; |
609 | 614 | }); |
610 | 615 |
|
611 | 616 | // Loop-level callbacks |
612 | | - this->registerPipelineParsingCallback( |
| 617 | + registerPipelineParsingCallback( |
613 | 618 | [this, parseLevelParam](StringRef Name, LoopPassManager &PM, |
614 | | - ArrayRef<PassBuilder::PipelineElement>) { |
615 | | -#define LOOP_CALLBACK(NAME, INVOKE) \ |
616 | | - if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \ |
617 | | - auto L = PassBuilder::parsePassParameters(parseLevelParam, Name, NAME); \ |
618 | | - if (!L) \ |
619 | | - return (errs() << NAME ": " << toString(L.takeError()) << '\n', false); \ |
620 | | - this->INVOKE(PM, L.get()); \ |
621 | | - return true; \ |
| 619 | + ArrayRef<PassBuilder::PipelineElement>) { |
| 620 | +#define LOOP_CALLBACK(NAME, INVOKE) \ |
| 621 | + if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \ |
| 622 | + auto L = PassBuilder::parsePassParameters(parseLevelParam, Name, NAME); \ |
| 623 | + if (!L) \ |
| 624 | + return (errs() << NAME ": " << toString(L.takeError()) << '\n', false); \ |
| 625 | + INVOKE(PM, L.get()); \ |
| 626 | + return true; \ |
622 | 627 | } |
623 | 628 | #include "PassRegistry.def" |
624 | 629 | #undef LOOP_CALLBACK |
|
0 commit comments