@@ -44,6 +44,7 @@ namespace patchestry::passes {
4444 {
4545 ArgumentSourceType source;
4646 std::string name; // Descriptive name for the argument
47+ bool is_reference = false ; // Whether the argument is a reference
4748 std::optional< unsigned > index; // Operand/argument index (required for OPERAND type)
4849 std::optional< std::string > symbol; // Symbol name (required for VARIABLE/SYMBOL type)
4950 std::optional< std::string > value; // Constant value (required for CONSTANT type)
@@ -381,6 +382,7 @@ namespace llvm::yaml {
381382 io.mapOptional (" index" , arg.index );
382383 io.mapOptional (" symbol" , arg.symbol );
383384 io.mapOptional (" value" , arg.value );
385+ io.mapOptional (" is_reference" , arg.is_reference );
384386 }
385387 };
386388
@@ -410,7 +412,7 @@ namespace llvm::yaml {
410412 struct MappingTraits < patchestry::passes::Metadata >
411413 {
412414 static void mapping (IO &io, patchestry::passes::Metadata &metadata) {
413- io.mapOptional (" name" , metadata.name );
415+ io.mapRequired (" name" , metadata.name );
414416 io.mapOptional (" description" , metadata.description );
415417 io.mapOptional (" version" , metadata.version );
416418 io.mapOptional (" author" , metadata.author );
@@ -424,8 +426,8 @@ namespace llvm::yaml {
424426 struct MappingTraits < patchestry::passes::Parameter >
425427 {
426428 static void mapping (IO &io, patchestry::passes::Parameter ¶m) {
427- io.mapOptional (" name" , param.name );
428- io.mapOptional (" type" , param.type );
429+ io.mapRequired (" name" , param.name );
430+ io.mapRequired (" type" , param.type );
429431 io.mapOptional (" description" , param.description );
430432 }
431433 };
@@ -436,8 +438,8 @@ namespace llvm::yaml {
436438 {
437439 static void mapping (IO &io, patchestry::passes::Implementation &impl) {
438440 io.mapOptional (" language" , impl.language );
439- io.mapOptional (" code_file" , impl.code_file );
440- io.mapOptional (" function_name" , impl.function_name );
441+ io.mapRequired (" code_file" , impl.code_file );
442+ io.mapRequired (" function_name" , impl.function_name );
441443 io.mapOptional (" parameters" , impl.parameters );
442444 io.mapOptional (" dependencies" , impl.dependencies );
443445 }
@@ -453,7 +455,7 @@ namespace llvm::yaml {
453455 io.mapOptional (" description" , spec.description );
454456 io.mapOptional (" category" , spec.category );
455457 io.mapOptional (" severity" , spec.severity );
456- io.mapOptional (" implementation" , spec.implementation );
458+ io.mapRequired (" implementation" , spec.implementation );
457459 }
458460 };
459461
@@ -473,7 +475,7 @@ namespace llvm::yaml {
473475 struct MappingTraits < patchestry::passes::Action >
474476 {
475477 static void mapping (IO &io, patchestry::passes::Action &action) {
476- io.mapOptional (" patch_id" , action.patch_id );
478+ io.mapRequired (" patch_id" , action.patch_id );
477479 io.mapOptional (" description" , action.description );
478480 io.mapOptional (" arguments" , action.arguments );
479481
@@ -496,7 +498,7 @@ namespace llvm::yaml {
496498 struct MappingTraits < patchestry::passes::MatchConfig >
497499 {
498500 static void mapping (IO &io, patchestry::passes::MatchConfig &match) {
499- io.mapOptional (" name" , match.name );
501+ io.mapRequired (" name" , match.name );
500502 io.mapOptional (" function_context" , match.function_context );
501503 io.mapOptional (" argument_matches" , match.argument_matches );
502504 io.mapOptional (" variable_matches" , match.variable_matches );
@@ -520,7 +522,7 @@ namespace llvm::yaml {
520522 struct MappingTraits < patchestry::passes::ContractAction >
521523 {
522524 static void mapping (IO &io, patchestry::passes::ContractAction &contract_action) {
523- io.mapOptional (" id" , contract_action.action_id );
525+ io.mapRequired (" id" , contract_action.action_id );
524526 io.mapOptional (" description" , contract_action.description );
525527 }
526528 };
@@ -530,10 +532,14 @@ namespace llvm::yaml {
530532 struct MappingTraits < patchestry::passes::PatchAction >
531533 {
532534 static void mapping (IO &io, patchestry::passes::PatchAction &patch_action) {
533- io.mapOptional (" id" , patch_action.action_id );
535+ io.mapRequired (" id" , patch_action.action_id );
534536 io.mapOptional (" description" , patch_action.description );
535- io.mapOptional (" match" , patch_action.match );
536- io.mapOptional (" action" , patch_action.action );
537+ io.mapRequired (" match" , patch_action.match );
538+ io.mapRequired (" action" , patch_action.action );
539+ if (patch_action.match .empty () || patch_action.action .empty ()) {
540+ LOG (ERROR ) << " Patch action has no match or action" ;
541+ return ;
542+ }
537543 }
538544 };
539545
@@ -552,9 +558,9 @@ namespace llvm::yaml {
552558 struct MappingTraits < patchestry::passes::PatchLibrary >
553559 {
554560 static void mapping (IO &io, patchestry::passes::PatchLibrary &library) {
555- io.mapOptional (" apiVersion" , library.api_version );
556- io.mapOptional (" metadata" , library.metadata );
557- io.mapOptional (" patches" , library.patches );
561+ io.mapRequired (" apiVersion" , library.api_version );
562+ io.mapRequired (" metadata" , library.metadata );
563+ io.mapRequired (" patches" , library.patches );
558564 }
559565 };
560566
@@ -563,9 +569,9 @@ namespace llvm::yaml {
563569 struct MappingTraits < patchestry::passes::ContractLibrary >
564570 {
565571 static void mapping (IO &io, patchestry::passes::ContractLibrary &library) {
566- io.mapOptional (" apiVersion" , library.api_version );
567- io.mapOptional (" metadata" , library.metadata );
568- io.mapOptional (" contracts" , library.contracts );
572+ io.mapRequired (" apiVersion" , library.api_version );
573+ io.mapRequired (" metadata" , library.metadata );
574+ io.mapRequired (" contracts" , library.contracts );
569575 }
570576 };
571577
@@ -596,6 +602,10 @@ namespace llvm::yaml {
596602 }
597603 libraries.contracts = contracts_config.value ();
598604 }
605+ if (libraries.patches .patches .empty () && libraries.contracts .contracts .empty ()) {
606+ LOG (ERROR ) << " Libraries has no patches or contracts" ;
607+ return ;
608+ }
599609 }
600610 };
601611
@@ -604,7 +614,7 @@ namespace llvm::yaml {
604614 struct MappingTraits < patchestry::passes::MetaPatchConfig >
605615 {
606616 static void mapping (IO &io, patchestry::passes::MetaPatchConfig &meta_patch) {
607- io.mapOptional (" name" , meta_patch.name );
617+ io.mapRequired (" name" , meta_patch.name );
608618 io.mapOptional (" id" , meta_patch.id );
609619 io.mapOptional (" description" , meta_patch.description );
610620
@@ -613,7 +623,11 @@ namespace llvm::yaml {
613623 for (const auto &opt : optimization) {
614624 meta_patch.optimization .insert (opt);
615625 }
616- io.mapOptional (" patch_actions" , meta_patch.patch_actions );
626+ io.mapRequired (" patch_actions" , meta_patch.patch_actions );
627+ if (meta_patch.patch_actions .empty ()) {
628+ LOG (ERROR ) << " Meta patch has no patch actions" ;
629+ return ;
630+ }
617631 }
618632 };
619633
@@ -622,7 +636,7 @@ namespace llvm::yaml {
622636 struct MappingTraits < patchestry::passes::MetaContractConfig >
623637 {
624638 static void mapping (IO &io, patchestry::passes::MetaContractConfig &meta_contract) {
625- io.mapOptional (" name" , meta_contract.name );
639+ io.mapRequired (" name" , meta_contract.name );
626640 io.mapOptional (" id" , meta_contract.id );
627641 io.mapOptional (" description" , meta_contract.description );
628642 }
@@ -633,13 +647,18 @@ namespace llvm::yaml {
633647 struct MappingTraits < patchestry::passes::PatchConfiguration >
634648 {
635649 static void mapping (IO &io, patchestry::passes::PatchConfiguration &config) {
636- io.mapOptional (" apiVersion" , config.api_version );
637- io.mapOptional (" metadata" , config.metadata );
638- io.mapOptional (" target" , config.target );
639- io.mapOptional (" libraries" , config.libraries );
650+ io.mapRequired (" apiVersion" , config.api_version );
651+ io.mapRequired (" metadata" , config.metadata );
652+ io.mapRequired (" target" , config.target );
653+ io.mapRequired (" libraries" , config.libraries );
640654 io.mapOptional (" execution_order" , config.execution_order );
641655 io.mapOptional (" meta_patches" , config.meta_patches );
642656 io.mapOptional (" meta_contracts" , config.meta_contracts );
657+
658+ if (config.meta_patches .empty () && config.meta_contracts .empty ()) {
659+ LOG (ERROR ) << " Patch configuration has no meta patches or meta contracts" ;
660+ return ;
661+ }
643662 }
644663 };
645664
0 commit comments