@@ -463,6 +463,13 @@ static void checkOptions() {
463463 error (" -z bti-report only supported on AArch64" );
464464 }
465465
466+ if (config->emachine != EM_RISCV) {
467+ if (config->zZicfilpReport != " none" )
468+ error (" -z zicfilip-report only support on RISCV32/RISCV64" );
469+ if (config->zZicfissReport != " none" )
470+ error (" -z zicfiss-report only support on RISCV32/RISCV64" );
471+ }
472+
466473 if (config->emachine != EM_386 && config->emachine != EM_X86_64 &&
467474 config->zCetReport != " none" )
468475 error (" -z cet-report only supported on X86 and X86_64" );
@@ -1455,6 +1462,8 @@ static void readConfigs(opt::InputArgList &args) {
14551462 config->zWxneeded = hasZOption (args, " wxneeded" );
14561463 setUnresolvedSymbolPolicy (args);
14571464 config->power10Stubs = args.getLastArgValue (OPT_power10_stubs_eq) != " no" ;
1465+ config->zForceZicfilp = hasZOption (args, " force-zicfilp" );
1466+ config->zForceZicfiss = hasZOption (args, " force-zicfiss" );
14581467
14591468 if (opt::Arg *arg = args.getLastArg (OPT_eb, OPT_el)) {
14601469 if (arg->getOption ().matches (OPT_eb))
@@ -1497,7 +1506,9 @@ static void readConfigs(opt::InputArgList &args) {
14971506 }
14981507
14991508 auto reports = {std::make_pair (" bti-report" , &config->zBtiReport ),
1500- std::make_pair (" cet-report" , &config->zCetReport )};
1509+ std::make_pair (" cet-report" , &config->zCetReport ),
1510+ std::make_pair (" zicfilp-report" , &config->zZicfilpReport ),
1511+ std::make_pair (" zicfiss-report" , &config->zZicfissReport )};
15011512 for (opt::Arg *arg : args.filtered (OPT_z)) {
15021513 std::pair<StringRef, StringRef> option =
15031514 StringRef (arg->getValue ()).split (' =' );
@@ -2592,6 +2603,16 @@ static uint32_t getAndFeatures() {
25922603 toString (f) + " : -z cet-report: file does not have "
25932604 " GNU_PROPERTY_X86_FEATURE_1_SHSTK property" );
25942605
2606+ checkAndReportMissingFeature (
2607+ config->zZicfilpReport , features, GNU_PROPERTY_RISCV_FEATURE_1_ZICFILP,
2608+ toString (f) + " : -z zicfilp-report: file does not have "
2609+ " GNU_PROPERTY_RISCV_FEATURE_1_ZICFILP property" );
2610+
2611+ checkAndReportMissingFeature (
2612+ config->zZicfissReport , features, GNU_PROPERTY_RISCV_FEATURE_1_ZICFISS,
2613+ toString (f) + " : -z zicfiss-report: file does not have "
2614+ " GNU_PROPERTY_RISCV_FEATURE_1_ZICFISS property" );
2615+
25952616 if (config->zForceBti && !(features & GNU_PROPERTY_AARCH64_FEATURE_1_BTI)) {
25962617 features |= GNU_PROPERTY_AARCH64_FEATURE_1_BTI;
25972618 if (config->zBtiReport == " none" )
@@ -2604,6 +2625,23 @@ static uint32_t getAndFeatures() {
26042625 " GNU_PROPERTY_X86_FEATURE_1_IBT property" );
26052626 features |= GNU_PROPERTY_X86_FEATURE_1_IBT;
26062627 }
2628+
2629+ if (config->zForceZicfilp &&
2630+ !(features & GNU_PROPERTY_RISCV_FEATURE_1_ZICFILP)) {
2631+ features |= GNU_PROPERTY_RISCV_FEATURE_1_ZICFILP;
2632+ if (config->zZicfilpReport == " none" )
2633+ warn (toString (f) + " : -z force-zicfilp: file does not have "
2634+ " GNU_PROPERTY_RISCV_FEATURE_1_ZICFILP property" );
2635+ }
2636+
2637+ if (config->zForceZicfiss &&
2638+ !(features & GNU_PROPERTY_RISCV_FEATURE_1_ZICFISS)) {
2639+ features |= GNU_PROPERTY_RISCV_FEATURE_1_ZICFISS;
2640+ if (config->zZicfissReport == " none" )
2641+ warn (toString (f) + " : -z force-zicfiss: file does not have "
2642+ " GNU_PROPERTY_RISCV_FEATURE_1_ZICFISS property" );
2643+ }
2644+
26072645 if (config->zPacPlt && !(features & GNU_PROPERTY_AARCH64_FEATURE_1_PAC)) {
26082646 warn (toString (f) + " : -z pac-plt: file does not have "
26092647 " GNU_PROPERTY_AARCH64_FEATURE_1_PAC property" );
0 commit comments