diff --git a/lld/ELF/Config.h b/lld/ELF/Config.h index a2f7759fb7d37..2b72d54ba410d 100644 --- a/lld/ELF/Config.h +++ b/lld/ELF/Config.h @@ -136,6 +136,12 @@ enum LtoKind : uint8_t {UnifiedThin, UnifiedRegular, Default}; // For -z gcs= enum class GcsPolicy { Implicit, Never, Always }; +// For -z zicfilp= +enum class ZicfilpPolicy { Implicit, Never, Unlabeled, FuncSig }; + +// For -z zicfiss= +enum class ZicfissPolicy { Implicit, Never, Always }; + // For some options that resemble -z bti-report={none,warning,error} enum class ReportPolicy { None, Warning, Error }; @@ -411,6 +417,8 @@ struct Config { bool zText; bool zRetpolineplt; bool zWxneeded; + ZicfilpPolicy zZicfilp; + ZicfissPolicy zZicfiss; DiscardPolicy discard; GnuStackKind zGnustack; ICFLevel icf; diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp index c9ac71f7236f8..7e132a387a04d 100644 --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -430,6 +430,10 @@ static void checkOptions(Ctx &ctx) { "RISC-V targets"; if (ctx.arg.zZicfissReport != ReportPolicy::None) ErrAlways(ctx) << "-z zicfiss-report is only supported on RISC-V targets"; + if (ctx.arg.zZicfilp != ZicfilpPolicy::Implicit) + ErrAlways(ctx) << "-z zicfilp is only supported on RISC-V targets"; + if (ctx.arg.zZicfiss != ZicfissPolicy::Implicit) + ErrAlways(ctx) << "-z zicfiss is only supported on RISC-V targets"; } if (ctx.arg.emachine != EM_386 && ctx.arg.emachine != EM_X86_64 && @@ -584,6 +588,46 @@ static GcsPolicy getZGcs(Ctx &ctx, opt::InputArgList &args) { return ret; } +static ZicfilpPolicy getZZicfilp(Ctx &ctx, opt::InputArgList &args) { + auto ret = ZicfilpPolicy::Implicit; + for (auto *arg : args.filtered(OPT_z)) { + std::pair kv = StringRef(arg->getValue()).split('='); + if (kv.first == "zicfilp") { + arg->claim(); + if (kv.second == "unlabeled") + ret = ZicfilpPolicy::Unlabeled; + else if (kv.second == "func-sig") + ret = ZicfilpPolicy::FuncSig; + else if (kv.second == "never") + ret = ZicfilpPolicy::Never; + else if (kv.second == "implicit") + ret = ZicfilpPolicy::Implicit; + else + ErrAlways(ctx) << "unknown -z zicfilp= value: " << kv.second; + } + } + return ret; +} + +static ZicfissPolicy getZZicfiss(Ctx &ctx, opt::InputArgList &args) { + auto ret = ZicfissPolicy::Implicit; + for (auto *arg : args.filtered(OPT_z)) { + std::pair kv = StringRef(arg->getValue()).split('='); + if (kv.first == "zicfiss") { + arg->claim(); + if (kv.second == "always") + ret = ZicfissPolicy::Always; + else if (kv.second == "never") + ret = ZicfissPolicy::Never; + else if (kv.second == "implicit") + ret = ZicfissPolicy::Implicit; + else + ErrAlways(ctx) << "unknown -z zicfiss= value: " << kv.second; + } + } + return ret; +} + // Report a warning for an unknown -z option. static void checkZOptions(Ctx &ctx, opt::InputArgList &args) { // This function is called before getTarget(), when certain options are not @@ -1567,6 +1611,8 @@ static void readConfigs(Ctx &ctx, opt::InputArgList &args) { ctx.arg.zCopyreloc = getZFlag(args, "copyreloc", "nocopyreloc", true); ctx.arg.zForceBti = hasZOption(args, "force-bti"); ctx.arg.zForceIbt = hasZOption(args, "force-ibt"); + ctx.arg.zZicfilp = getZZicfilp(ctx, args); + ctx.arg.zZicfiss = getZZicfiss(ctx, args); ctx.arg.zGcs = getZGcs(ctx, args); ctx.arg.zGlobal = hasZOption(args, "global"); ctx.arg.zGnustack = getZGnuStack(args); @@ -2926,6 +2972,18 @@ static void readSecurityNotes(Ctx &ctx) { << f << ": -z zicfiss-report: file does not have " "GNU_PROPERTY_RISCV_FEATURE_1_CFI_SS property"; + + if (ctx.arg.zZicfilp == ZicfilpPolicy::Unlabeled && + (features & GNU_PROPERTY_RISCV_FEATURE_1_CFI_LP_FUNC_SIG)) + Warn(ctx) << f + << ": -z zicfilp=unlabeled: file has conflicting property: " + "GNU_PROPERTY_RISCV_FEATURE_1_CFI_LP_FUNC_SIG"; + + if (ctx.arg.zZicfilp == ZicfilpPolicy::FuncSig && + (features & GNU_PROPERTY_RISCV_FEATURE_1_CFI_LP_UNLABELED)) + Warn(ctx) << f + << ": -z zicfilp=func-sig: file has conflicting property: " + "GNU_PROPERTY_RISCV_FEATURE_1_CFI_LP_UNLABELED"; } if (ctx.arg.zForceBti && !(features & GNU_PROPERTY_AARCH64_FEATURE_1_BTI)) { @@ -2989,6 +3047,25 @@ static void readSecurityNotes(Ctx &ctx) { else if (ctx.arg.zGcs == GcsPolicy::Never) ctx.arg.andFeatures &= ~GNU_PROPERTY_AARCH64_FEATURE_1_GCS; + if (ctx.arg.emachine == EM_RISCV) { + // Force enable/disable Zicfilp. + if (ctx.arg.zZicfilp == ZicfilpPolicy::Unlabeled) { + ctx.arg.andFeatures |= GNU_PROPERTY_RISCV_FEATURE_1_CFI_LP_UNLABELED; + ctx.arg.andFeatures &= ~GNU_PROPERTY_RISCV_FEATURE_1_CFI_LP_FUNC_SIG; + } else if (ctx.arg.zZicfilp == ZicfilpPolicy::FuncSig) { + ctx.arg.andFeatures |= GNU_PROPERTY_RISCV_FEATURE_1_CFI_LP_FUNC_SIG; + ctx.arg.andFeatures &= ~GNU_PROPERTY_RISCV_FEATURE_1_CFI_LP_UNLABELED; + } else if (ctx.arg.zZicfilp == ZicfilpPolicy::Never) + ctx.arg.andFeatures &= ~(GNU_PROPERTY_RISCV_FEATURE_1_CFI_LP_UNLABELED | + GNU_PROPERTY_RISCV_FEATURE_1_CFI_LP_FUNC_SIG); + + // Force enable/disable Zicfiss. + if (ctx.arg.zZicfiss == ZicfissPolicy::Always) + ctx.arg.andFeatures |= GNU_PROPERTY_RISCV_FEATURE_1_CFI_SS; + else if (ctx.arg.zZicfiss == ZicfissPolicy::Never) + ctx.arg.andFeatures &= ~GNU_PROPERTY_RISCV_FEATURE_1_CFI_SS; + } + // If we are utilising GCS at any stage, the sharedFiles should be checked to // ensure they also support this feature. The gcs-report-dynamic option is // used to indicate if the user wants information relating to this, and will diff --git a/lld/test/ELF/riscv-feature-zicfilp-func-sig.s b/lld/test/ELF/riscv-feature-zicfilp-func-sig.s index f68fbddfa6026..c5818dd33978f 100644 --- a/lld/test/ELF/riscv-feature-zicfilp-func-sig.s +++ b/lld/test/ELF/riscv-feature-zicfilp-func-sig.s @@ -2,6 +2,7 @@ ## Test the ZICFILP func-sig feature. ## To lift maintenance burden, most tests are conducted only with 64-bit RISC-V ## Naming convention: *-s.s files enables ZICFILP func-sig. +## Naming convention: *-u.s files enables ZICFILP unlabeled. # RUN: rm -rf %t && split-file %s %t && cd %t # RUN: llvm-mc --filetype=obj --triple=riscv32 rv32-f1-s.s -o rv32-f1-s.o # RUN: llvm-mc --filetype=obj --triple=riscv32 rv32-f2-s.s -o rv32-f2-s.o @@ -12,14 +13,20 @@ # RUN: llvm-mc --filetype=obj --triple=riscv64 f2-s.s -o f2-s.o # RUN: llvm-mc --filetype=obj --triple=riscv64 f3.s -o f3.o # RUN: llvm-mc --filetype=obj --triple=riscv64 f3-s.s -o f3-s.o +# RUN: llvm-mc --filetype=obj --triple=riscv64 f3-u.s -o f3-u.o -## ZICFILP-func-sig should be enabled when it's enabled in all inputs +## ZICFILP-func-sig should be enabled when it's enabled in all inputs or when +## it's forced on. # RUN: ld.lld rv32-f1-s.o rv32-f2-s.o rv32-f3-s.o -o out.rv32 --fatal-warnings # RUN: llvm-readelf -n out.rv32 | FileCheck --check-prefix=ZICFILP %s # RUN: ld.lld f1-s.o f2-s.o f3-s.o -o out --fatal-warnings # RUN: llvm-readelf -n out | FileCheck --check-prefix=ZICFILP %s # RUN: ld.lld f1-s.o f3-s.o --shared -o out.so --fatal-warnings # RUN: llvm-readelf -n out.so | FileCheck --check-prefix=ZICFILP %s +# RUN: ld.lld f1-s.o f2.o f3-s.o -o out.force -z zicfilp=func-sig --fatal-warnings +# RUN: llvm-readelf -n out.force | FileCheck --check-prefix=ZICFILP %s +# RUN: ld.lld f2-s.o f3.o --shared -o out.force.so -z zicfilp=never -z zicfilp=func-sig --fatal-warnings +# RUN: llvm-readelf -n out.force.so | FileCheck --check-prefix=ZICFILP %s # ZICFILP: Properties: RISC-V feature: ZICFILP-func-sig ## ZICFILP-func-sig should not be enabled if it's not enabled in at least one @@ -29,11 +36,18 @@ # RUN: ld.lld f2-s.o f3.o --shared -o out.no.so --fatal-warnings # RUN: llvm-readelf -n out.no.so | count 0 +## ZICFILP-func-sig should be disabled with zicfilp=never, even if +## ZICFILP-func-sig is present in all inputs. +# RUN: ld.lld f1-s.o f2-s.o f3-s.o -z zicfilp=func-sig -z zicfilp=never -o out.never --fatal-warnings +# RUN: llvm-readelf -n out.never | count 0 + ## zicfilp-func-sig-report should report any input files that don't have the ## ZICFILP-func-sig property # RUN: ld.lld f1-s.o f2.o f3-s.o -z zicfilp-func-sig-report=warning 2>&1 | FileCheck --check-prefix=REPORT-WARN %s +# RUN: ld.lld f1-s.o f2.o f3-s.o -z zicfilp-func-sig-report=warning -z zicfilp=func-sig 2>&1 | FileCheck --check-prefix=REPORT-WARN %s +# RUN: ld.lld f1-s.o f2.o f3-s.o -z zicfilp-func-sig-report=warning -z zicfilp=never 2>&1 | FileCheck --check-prefix=REPORT-WARN %s # RUN: not ld.lld f2-s.o f3.o --shared -z zicfilp-func-sig-report=error 2>&1 | FileCheck --check-prefix=REPORT-ERROR %s -# RUN: ld.lld f1-s.o f2-s.o f3-s.o -z zicfilp-func-sig-report=warning 2>&1 | count 0 +# RUN: ld.lld f1-s.o f2-s.o f3-s.o -z zicfilp-func-sig-report=warning -z zicfilp=func-sig 2>&1 | count 0 # REPORT-WARN: warning: f2.o: -z zicfilp-func-sig-report: file does not have GNU_PROPERTY_RISCV_FEATURE_1_CFI_LP_FUNC_SIG property # REPORT-ERROR: error: f3.o: -z zicfilp-func-sig-report: file does not have GNU_PROPERTY_RISCV_FEATURE_1_CFI_LP_FUNC_SIG property @@ -41,6 +55,14 @@ # RUN: not ld.lld f2-s.o -z zicfilp-func-sig-report=x 2>&1 | FileCheck --check-prefix=INVALID %s # INVALID: error: unknown -z zicfilp-func-sig-report= value: x +## ZICFILP-unlabeled and ZICFILP-func-sig should conflict with each other. +# RUN: ld.lld f3-u.o -o out.override -z zicfilp=func-sig 2>&1 | FileCheck --check-prefix=FORCE-CONFLICT %s +# FORCE-CONFLICT: warning: f3-u.o: -z zicfilp=func-sig: file has conflicting property: GNU_PROPERTY_RISCV_FEATURE_1_CFI_LP_UNLABELED + +## -z zicfilp=func-sig should override and disable ZICFILP-unlabeled. +# RUN: llvm-readelf -n out.override | FileCheck --check-prefixes=ZICFILP,OVERRIDE %s +# OVERRIDE-NOT: ZICFILP-unlabeled + #--- rv32-f1-s.s .section ".note.gnu.property", "a" .balign 4 @@ -191,3 +213,24 @@ ndesc_end: .type f3,@function f3: ret + +#--- f3-u.s +.section ".note.gnu.property", "a" +.balign 8 +.4byte 4 +.4byte (ndesc_end - ndesc_begin) +.4byte 0x5 // NT_GNU_PROPERTY_TYPE_0 +.asciz "GNU" +ndesc_begin: +.balign 8 +.4byte 0xc0000000 // GNU_PROPERTY_RISCV_FEATURE_1_AND +.4byte 4 +.4byte 1 // GNU_PROPERTY_RISCV_FEATURE_1_CFI_LP_UNLABELED +.balign 8 +ndesc_end: + +.text +.globl f3 +.type f3,@function +f3: + ret diff --git a/lld/test/ELF/riscv-feature-zicfilp-unlabeled.s b/lld/test/ELF/riscv-feature-zicfilp-unlabeled.s index 0fcd8538d24a1..20491f057c8ed 100644 --- a/lld/test/ELF/riscv-feature-zicfilp-unlabeled.s +++ b/lld/test/ELF/riscv-feature-zicfilp-unlabeled.s @@ -2,6 +2,7 @@ ## Test the ZICFILP unlabeled feature. ## To lift maintenance burden, most tests are conducted only with 64-bit RISC-V ## Naming convention: *-s.s files enables ZICFILP unlabeled. +## Naming convention: *-f.s files enables ZICFILP func-sig. ## Naming convention: *-c.s files enables both of the conflicting ZICFILP unlabeled and ZICFILP func-sig features. # RUN: rm -rf %t && split-file %s %t && cd %t # RUN: llvm-mc --filetype=obj --triple=riscv32 rv32-f1-s.s -o rv32-f1-s.o @@ -14,14 +15,20 @@ # RUN: llvm-mc --filetype=obj --triple=riscv64 f2-s.s -o f2-s.o # RUN: llvm-mc --filetype=obj --triple=riscv64 f3.s -o f3.o # RUN: llvm-mc --filetype=obj --triple=riscv64 f3-s.s -o f3-s.o +# RUN: llvm-mc --filetype=obj --triple=riscv64 f3-f.s -o f3-f.o -## ZICFILP-unlabeled should be enabled when it's enabled in all inputs +## ZICFILP-unlabeled should be enabled when it's enabled in all inputs or when +## it's forced on. # RUN: ld.lld rv32-f1-s.o rv32-f2-s.o rv32-f3-s.o -o out.rv32 --fatal-warnings # RUN: llvm-readelf -n out.rv32 | FileCheck --check-prefix=ZICFILP %s # RUN: ld.lld f1-s.o f2-s.o f3-s.o -o out --fatal-warnings # RUN: llvm-readelf -n out | FileCheck --check-prefix=ZICFILP %s # RUN: ld.lld f1-s.o f3-s.o --shared -o out.so --fatal-warnings # RUN: llvm-readelf -n out.so | FileCheck --check-prefix=ZICFILP %s +# RUN: ld.lld f1-s.o f2.o f3-s.o -o out.force -z zicfilp=unlabeled --fatal-warnings +# RUN: llvm-readelf -n out.force | FileCheck --check-prefix=ZICFILP %s +# RUN: ld.lld f2-s.o f3.o --shared -o out.force.so -z zicfilp=never -z zicfilp=unlabeled --fatal-warnings +# RUN: llvm-readelf -n out.force.so | FileCheck --check-prefix=ZICFILP %s # ZICFILP: Properties: RISC-V feature: ZICFILP-unlabeled ## ZICFILP-unlabeled should not be enabled if it's not enabled in at least one @@ -31,21 +38,35 @@ # RUN: ld.lld f2-s.o f3.o --shared -o out.no.so --fatal-warnings # RUN: llvm-readelf -n out.no.so | count 0 +## ZICFILP-unlabeled should be disabled with zicfilp=never, even if +## ZICFILP-unlabeled is present in all inputs. +# RUN: ld.lld f1-s.o f2-s.o f3-s.o -z zicfilp=unlabeled -z zicfilp=never -o out.never --fatal-warnings +# RUN: llvm-readelf -n out.never | count 0 + ## zicfilp-unlabeled-report should report any input files that don't have the ## ZICFILP-unlabeled property # RUN: ld.lld f1-s.o f2.o f3-s.o -z zicfilp-unlabeled-report=warning 2>&1 | FileCheck --check-prefix=REPORT-WARN %s +# RUN: ld.lld f1-s.o f2.o f3-s.o -z zicfilp-unlabeled-report=warning -z zicfilp=unlabeled 2>&1 | FileCheck --check-prefix=REPORT-WARN %s +# RUN: ld.lld f1-s.o f2.o f3-s.o -z zicfilp-unlabeled-report=warning -z zicfilp=never 2>&1 | FileCheck --check-prefix=REPORT-WARN %s # RUN: not ld.lld f2-s.o f3.o --shared -z zicfilp-unlabeled-report=error 2>&1 | FileCheck --check-prefix=REPORT-ERROR %s -# RUN: ld.lld f1-s.o f2-s.o f3-s.o -z zicfilp-unlabeled-report=warning 2>&1 | count 0 +# RUN: ld.lld f1-s.o f2-s.o f3-s.o -z zicfilp-unlabeled-report=warning -z zicfilp=never 2>&1 | count 0 # REPORT-WARN: warning: f2.o: -z zicfilp-unlabeled-report: file does not have GNU_PROPERTY_RISCV_FEATURE_1_CFI_LP_UNLABELED property # REPORT-ERROR: error: f3.o: -z zicfilp-unlabeled-report: file does not have GNU_PROPERTY_RISCV_FEATURE_1_CFI_LP_UNLABELED property ## An invalid -z zicfilp-unlabeled-report option should give an error -# RUN: not ld.lld f2-s.o -z zicfilp-unlabeled-report=x 2>&1 | FileCheck --check-prefix=INVALID %s +# RUN: not ld.lld f2-s.o -z zicfilp=x -z zicfilp-unlabeled-report=x 2>&1 | FileCheck --check-prefix=INVALID %s +# INVALID: error: unknown -z zicfilp= value: x # INVALID: error: unknown -z zicfilp-unlabeled-report= value: x ## ZICFILP-unlabeled and ZICFILP-func-sig should conflict with each other # RUN: not ld.lld f1-c.o 2>&1 | FileCheck --check-prefix=CONFLICT %s +# RUN: ld.lld f3-f.o -o out.override -z zicfilp=unlabeled 2>&1 | FileCheck --check-prefix=FORCE-CONFLICT %s # CONFLICT: error: f1-c.o: file has conflicting properties: GNU_PROPERTY_RISCV_FEATURE_1_CFI_LP_UNLABELED and GNU_PROPERTY_RISCV_FEATURE_1_CFI_LP_FUNC_SIG +# FORCE-CONFLICT: warning: f3-f.o: -z zicfilp=unlabeled: file has conflicting property: GNU_PROPERTY_RISCV_FEATURE_1_CFI_LP_FUNC_SIG + +## -z zicfilp=unlabeled should override and disable ZICFILP-func-sig. +# RUN: llvm-readelf -n out.override | FileCheck --check-prefixes=ZICFILP,OVERRIDE %s +# OVERRIDE-NOT: ZICFILP-func-sig #--- rv32-f1-s.s .section ".note.gnu.property", "a" @@ -219,3 +240,24 @@ ndesc_end: .type f3,@function f3: ret + +#--- f3-f.s +.section ".note.gnu.property", "a" +.balign 8 +.4byte 4 +.4byte (ndesc_end - ndesc_begin) +.4byte 0x5 // NT_GNU_PROPERTY_TYPE_0 +.asciz "GNU" +ndesc_begin: +.balign 8 +.4byte 0xc0000000 // GNU_PROPERTY_RISCV_FEATURE_1_AND +.4byte 4 +.4byte 4 // GNU_PROPERTY_RISCV_FEATURE_1_CFI_LP_FUNC_SIG +.balign 8 +ndesc_end: + +.text +.globl f3 +.type f3,@function +f3: + ret diff --git a/lld/test/ELF/riscv-feature-zicfiss.s b/lld/test/ELF/riscv-feature-zicfiss.s index 4623522f5ed79..7b208ddd9b8eb 100644 --- a/lld/test/ELF/riscv-feature-zicfiss.s +++ b/lld/test/ELF/riscv-feature-zicfiss.s @@ -13,13 +13,17 @@ # RUN: llvm-mc --filetype=obj --triple=riscv64 f3.s -o f3.o # RUN: llvm-mc --filetype=obj --triple=riscv64 f3-s.s -o f3-s.o -## ZICFISS should be enabled when it's enabled in all inputs +## ZICFISS should be enabled when it's enabled in all inputs or when it's forced on. # RUN: ld.lld rv32-f1-s.o rv32-f2-s.o rv32-f3-s.o -o out.rv32 --fatal-warnings # RUN: llvm-readelf -n out.rv32 | FileCheck --check-prefix=ZICFISS %s # RUN: ld.lld f1-s.o f2-s.o f3-s.o -o out --fatal-warnings # RUN: llvm-readelf -n out | FileCheck --check-prefix=ZICFISS %s # RUN: ld.lld f1-s.o f3-s.o --shared -o out.so --fatal-warnings # RUN: llvm-readelf -n out.so | FileCheck --check-prefix=ZICFISS %s +# RUN: ld.lld f1-s.o f2.o f3-s.o -o out.force -z zicfiss=always --fatal-warnings +# RUN: llvm-readelf -n out.force | FileCheck --check-prefix=ZICFISS %s +# RUN: ld.lld f2-s.o f3.o --shared -o out.force.so -z zicfiss=never -z zicfiss=always --fatal-warnings +# RUN: llvm-readelf -n out.force.so | FileCheck --check-prefix=ZICFISS %s # ZICFISS: Properties: RISC-V feature: ZICFISS ## ZICFISS should not be enabled if it's not enabled in at least one input @@ -28,17 +32,25 @@ # RUN: ld.lld f2-s.o f3.o --shared -o out.no.so --fatal-warnings # RUN: llvm-readelf -n out.no.so | count 0 +## ZICFISS should be disabled with zicfiss=never, even if ZICFISS is present in +## all inputs. +# RUN: ld.lld f1-s.o f2-s.o f3-s.o -z zicfiss=always -z zicfiss=never -o out.never --fatal-warnings +# RUN: llvm-readelf -n out.never | count 0 + ## zicfiss-report should report any input files that don't have the zicfiss ## property # RUN: ld.lld f1-s.o f2.o f3-s.o -z zicfiss-report=warning 2>&1 | FileCheck --check-prefix=REPORT-WARN %s +# RUN: ld.lld f1-s.o f2.o f3-s.o -z zicfiss-report=warning -z zicfiss=always 2>&1 | FileCheck --check-prefix=REPORT-WARN %s +# RUN: ld.lld f1-s.o f2.o f3-s.o -z zicfiss-report=warning -z zicfiss=never 2>&1 | FileCheck --check-prefix=REPORT-WARN %s # RUN: not ld.lld f2-s.o f3.o --shared -z zicfiss-report=error 2>&1 | FileCheck --check-prefix=REPORT-ERROR %s -# RUN: ld.lld f1-s.o f2-s.o f3-s.o -z zicfiss-report=warning 2>&1 | count 0 -# RUN: ld.lld f1-s.o f2-s.o f3-s.o -z zicfiss-report=error 2>&1 | count 0 +# RUN: ld.lld f1-s.o f2-s.o f3-s.o -z zicfiss-report=warning -z zicfiss=always 2>&1 | count 0 +# RUN: ld.lld f1-s.o f2-s.o f3-s.o -z zicfiss-report=error -z zicfiss=always 2>&1 | count 0 # REPORT-WARN: warning: f2.o: -z zicfiss-report: file does not have GNU_PROPERTY_RISCV_FEATURE_1_CFI_SS property # REPORT-ERROR: error: f3.o: -z zicfiss-report: file does not have GNU_PROPERTY_RISCV_FEATURE_1_CFI_SS property ## An invalid -z zicfiss-report option should give an error -# RUN: not ld.lld f2-s.o f3-s.o -z zicfiss-report=x 2>&1 | FileCheck --check-prefix=INVALID %s +# RUN: not ld.lld f2-s.o f3-s.o -z zicfiss=x -z zicfiss-report=x 2>&1 | FileCheck --check-prefix=INVALID %s +# INVALID: error: unknown -z zicfiss= value: x # INVALID: error: unknown -z zicfiss-report= value: x #--- rv32-f1-s.s