[LLD][ELF][RISCV][Zicfilp][Zicfiss] Support -z zicfilp= and -z zicfiss= to force enable/disable features (#143114)
+ If `-z zicfilp=implicit` or option not specified, the output would have the ZICFILP feature enabled/disabled based on input objects + If `-z zicfilp=<never|unlabeled|func-sig>`, the output would have ZICFILP feature forced <off|on to the "unlabeled" scheme|on to the "func-sig" scheme> + If `-z zicfiss=implicit` or option not specified, the output would have the ZICFISS feature enabled/disabled based on input objects + If `-z zicfiss=<never|always>`, the output would have the ZICFISS feature forced <off|on>
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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<StringRef, StringRef> 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<StringRef, StringRef> 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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user