1717#include " RISCVTargetObjectFile.h"
1818#include " RISCVTargetTransformInfo.h"
1919#include " TargetInfo/RISCVTargetInfo.h"
20- #include " llvm/ADT/STLForwardCompat.h"
2120#include " llvm/ADT/StringRef.h"
22- #include " llvm/ADT/StringSwitch.h"
2321#include " llvm/Analysis/TargetTransformInfo.h"
2422#include " llvm/CodeGen/GlobalISel/CSEInfo.h"
2523#include " llvm/CodeGen/GlobalISel/IRTranslator.h"
4644#include " llvm/Transforms/Scalar.h"
4745#include " llvm/Transforms/Vectorize/EVLIndVarSimplify.h"
4846#include " llvm/Transforms/Vectorize/LoopIdiomVectorize.h"
49- #include < cassert>
5047#include < optional>
5148using namespace llvm ;
5249
@@ -253,36 +250,9 @@ RISCVTargetMachine::getSubtargetImpl(const Function &F) const {
253250 RVVBitsMax =
254251 llvm::bit_floor ((RVVBitsMax < 64 || RVVBitsMax > 65536 ) ? 0 : RVVBitsMax);
255252
256- using ZicfilpLabelSchemeKind = RISCVSubtarget::ZicfilpLabelSchemeKind;
257- ZicfilpLabelSchemeKind ZicfilpLabelScheme = ZicfilpLabelSchemeKind::Disabled;
258- if (const Module *const M = F.getParent ()) {
259- if (const Metadata *const Flag = M->getModuleFlag (" cf-protection-branch" );
260- Flag && !mdconst::extract<ConstantInt>(Flag)->isZero ()) {
261- StringRef CFBranchLabelScheme;
262- if (const Metadata *const MD = M->getModuleFlag (" cf-branch-label-scheme" ))
263- CFBranchLabelScheme = cast<MDString>(MD)->getString ();
264- else
265- report_fatal_error (" missing cf-branch-label-scheme module flag" );
266-
267- // See clang::getCFBranchLabelSchemeFlagVal() for possible
268- // CFBranchLabelScheme
269- ZicfilpLabelScheme =
270- StringSwitch<ZicfilpLabelSchemeKind>(CFBranchLabelScheme)
271- .Case (" unlabeled" , ZicfilpLabelSchemeKind::Unlabeled)
272- .Case (" func-sig" , ZicfilpLabelSchemeKind::FuncSig)
273- .Default (ZicfilpLabelSchemeKind::EnabledUnknown);
274- assert (ZicfilpLabelScheme != ZicfilpLabelSchemeKind::EnabledUnknown);
275- }
276- }
277-
278253 SmallString<512 > Key;
279- {
280- raw_svector_ostream OS (Key);
281- OS << " RVVMin" << RVVBitsMin << " RVVMax" << RVVBitsMax;
282- if (ZicfilpLabelScheme != ZicfilpLabelSchemeKind::Disabled)
283- OS << " ZicfilpLabelSchemeKind" << to_underlying (ZicfilpLabelScheme);
284- OS << CPU << TuneCPU << FS;
285- }
254+ raw_svector_ostream (Key) << " RVVMin" << RVVBitsMin << " RVVMax" << RVVBitsMax
255+ << CPU << TuneCPU << FS;
286256 auto &I = SubtargetMap[Key];
287257 if (!I) {
288258 // This needs to be done before we create a new subtarget since any
@@ -299,9 +269,35 @@ RISCVTargetMachine::getSubtargetImpl(const Function &F) const {
299269 }
300270 ABIName = ModuleTargetABI->getString ();
301271 }
302- I = std::make_unique<RISCVSubtarget>(TargetTriple, CPU, TuneCPU, FS,
303- ABIName, RVVBitsMin, RVVBitsMax,
304- ZicfilpLabelScheme, *this );
272+ I = std::make_unique<RISCVSubtarget>(
273+ TargetTriple, CPU, TuneCPU, FS, ABIName, RVVBitsMin, RVVBitsMax, *this );
274+
275+ const Module &M = *F.getParent ();
276+ if (const Metadata *CF = M.getModuleFlag (" cf-protection-branch" );
277+ CF && !mdconst::extract<ConstantInt>(CF)->isZero ()) {
278+ StringRef LabelScheme;
279+ if (const Metadata *MD = M.getModuleFlag (" cf-branch-label-scheme" )) {
280+ LabelScheme = cast<MDString>(MD)->getString ();
281+ if (LabelScheme != " func-sig" && LabelScheme != " unlabeled" )
282+ reportFatalUsageError (" cf-branch-label-scheme=" + LabelScheme +
283+ " module flag is unsupported" );
284+ } else {
285+ reportFatalUsageError (" missing cf-branch-label-scheme module flag" );
286+ }
287+
288+ using ZicfilpLabelSchemeEnum = RISCVSubtarget::ZicfilpLabelSchemeEnum;
289+ const ZicfilpLabelSchemeEnum SupportedScheme = I->getZicfilpLabelScheme ();
290+ if ((SupportedScheme != ZicfilpLabelSchemeEnum::FuncSig &&
291+ LabelScheme == " func-sig" ) ||
292+ (SupportedScheme != ZicfilpLabelSchemeEnum::Unlabeled &&
293+ LabelScheme == " unlabeled" ))
294+ reportFatalUsageError (
295+ " require target feature (+zicfilp-" + LabelScheme +
296+ " ) to handle cf-branch-label-scheme=" + LabelScheme +
297+ " module flag" );
298+ } else if (I->hasZicfilpCFI ()) {
299+ reportFatalUsageError (" require cf-protection-branch != 0 module flag" );
300+ }
305301 }
306302 return I.get ();
307303}
0 commit comments