@@ -57,6 +57,28 @@ ConstantInt *CrossDSOCFI::extractNumericTypeId(MDNode *MD) {
5757 return C;
5858}
5959
60+ void setDefaultSubtargetFeatures (const Triple &Triple,
61+ const StringRef TargetABI, Function *F) {
62+ if (Triple.isRISCV64 ()) {
63+ if (TargetABI.contains (" lp64d" ))
64+ F->addFnAttr (" target-features" , " +d" );
65+ else if (TargetABI.contains (" lp64f" ))
66+ F->addFnAttr (" target-features" , " +f" );
67+ else if (TargetABI.contains (" lp64q" ))
68+ F->addFnAttr (" target-features" , " +q" );
69+ } else if (Triple.isRISCV32 () && TargetABI.contains (" ilp32f" )) {
70+ F->addFnAttr (" target-features" , " +f" );
71+ }
72+ }
73+
74+ StringRef getTargetABIFromMD (const Module &M) {
75+ StringRef TargetABI = " " ;
76+ if (auto *TargetABIMD =
77+ dyn_cast_or_null<MDString>(M.getModuleFlag (" target-abi" )))
78+ TargetABI = TargetABIMD->getString ();
79+ return TargetABI;
80+ }
81+
6082// / buildCFICheck - emits __cfi_check for the current module.
6183void CrossDSOCFI::buildCFICheck (Module &M) {
6284 // FIXME: verify that __cfi_check ends up near the end of the code section,
@@ -96,6 +118,14 @@ void CrossDSOCFI::buildCFICheck(Module &M) {
96118 if (T.isARM () || T.isThumb ())
97119 F->addFnAttr (" target-features" , " +thumb-mode" );
98120
121+ StringRef DefaultTargetFeatures = Ctx.getDefaultTargetFeatures ();
122+ if (DefaultTargetFeatures.empty ()) {
123+ auto TargetABI = getTargetABIFromMD (M);
124+ setDefaultSubtargetFeatures (T, TargetABI, F);
125+ } else {
126+ F->addFnAttr (" target-features" , DefaultTargetFeatures);
127+ }
128+
99129 auto args = F->arg_begin ();
100130 Value &CallSiteTypeId = *(args++);
101131 CallSiteTypeId.setName (" CallSiteTypeId" );
0 commit comments