@@ -2147,16 +2147,24 @@ static bool checkFPMathBuiltinElementType(Sema &S, SourceLocation Loc,
2147
2147
/// This checks that the target supports the builtin and that the string
2148
2148
/// argument is constant and valid.
2149
2149
static bool SemaBuiltinCpu(Sema &S, const TargetInfo &TI, CallExpr *TheCall,
2150
- unsigned BuiltinID) {
2150
+ const TargetInfo *AuxTI, unsigned BuiltinID) {
2151
2151
assert((BuiltinID == Builtin::BI__builtin_cpu_supports ||
2152
2152
BuiltinID == Builtin::BI__builtin_cpu_is) &&
2153
2153
"Expecting __builtin_cpu_...");
2154
2154
2155
2155
bool IsCPUSupports = BuiltinID == Builtin::BI__builtin_cpu_supports;
2156
- if (IsCPUSupports && !TI.supportsCpuSupports())
2156
+ const TargetInfo *TheTI = &TI;
2157
+ auto SupportsBI = [=](const TargetInfo *TInfo) {
2158
+ return TInfo && ((IsCPUSupports && TInfo->supportsCpuSupports()) ||
2159
+ (!IsCPUSupports && TInfo->supportsCpuIs()));
2160
+ };
2161
+ if (!SupportsBI(&TI) && SupportsBI(AuxTI))
2162
+ TheTI = AuxTI;
2163
+
2164
+ if (IsCPUSupports && !TheTI->supportsCpuSupports())
2157
2165
return S.Diag(TheCall->getBeginLoc(), diag::err_builtin_target_unsupported)
2158
2166
<< SourceRange(TheCall->getBeginLoc(), TheCall->getEndLoc());
2159
- if (!IsCPUSupports && !TI. supportsCpuIs())
2167
+ if (!IsCPUSupports && !TheTI-> supportsCpuIs())
2160
2168
return S.Diag(TheCall->getBeginLoc(), diag::err_builtin_target_unsupported)
2161
2169
<< SourceRange(TheCall->getBeginLoc(), TheCall->getEndLoc());
2162
2170
@@ -2168,10 +2176,10 @@ static bool SemaBuiltinCpu(Sema &S, const TargetInfo &TI, CallExpr *TheCall,
2168
2176
2169
2177
// Check the contents of the string.
2170
2178
StringRef Feature = cast<StringLiteral>(Arg)->getString();
2171
- if (IsCPUSupports && !TI. validateCpuSupports(Feature))
2179
+ if (IsCPUSupports && !TheTI-> validateCpuSupports(Feature))
2172
2180
return S.Diag(TheCall->getBeginLoc(), diag::err_invalid_cpu_supports)
2173
2181
<< Arg->getSourceRange();
2174
- if (!IsCPUSupports && !TI. validateCpuIs(Feature))
2182
+ if (!IsCPUSupports && !TheTI-> validateCpuIs(Feature))
2175
2183
return S.Diag(TheCall->getBeginLoc(), diag::err_invalid_cpu_is)
2176
2184
<< Arg->getSourceRange();
2177
2185
return false;
@@ -2207,7 +2215,8 @@ Sema::CheckBuiltinFunctionCall(FunctionDecl *FDecl, unsigned BuiltinID,
2207
2215
switch (BuiltinID) {
2208
2216
case Builtin::BI__builtin_cpu_supports:
2209
2217
case Builtin::BI__builtin_cpu_is:
2210
- if (SemaBuiltinCpu(*this, Context.getTargetInfo(), TheCall, BuiltinID))
2218
+ if (SemaBuiltinCpu(*this, Context.getTargetInfo(), TheCall,
2219
+ Context.getAuxTargetInfo(), BuiltinID))
2211
2220
return ExprError();
2212
2221
break;
2213
2222
case Builtin::BI__builtin_cpu_init:
0 commit comments