@@ -2114,16 +2114,24 @@ static bool checkFPMathBuiltinElementType(Sema &S, SourceLocation Loc,
2114
2114
/// This checks that the target supports the builtin and that the string
2115
2115
/// argument is constant and valid.
2116
2116
static bool SemaBuiltinCpu(Sema &S, const TargetInfo &TI, CallExpr *TheCall,
2117
- unsigned BuiltinID) {
2117
+ const TargetInfo *AuxTI, unsigned BuiltinID) {
2118
2118
assert((BuiltinID == Builtin::BI__builtin_cpu_supports ||
2119
2119
BuiltinID == Builtin::BI__builtin_cpu_is) &&
2120
2120
"Expecting __builtin_cpu_...");
2121
2121
2122
2122
bool IsCPUSupports = BuiltinID == Builtin::BI__builtin_cpu_supports;
2123
- if (IsCPUSupports && !TI.supportsCpuSupports())
2123
+ const TargetInfo *TheTI = &TI;
2124
+ auto SupportsBI = [=](const TargetInfo *TInfo) {
2125
+ return TInfo && ((IsCPUSupports && TInfo->supportsCpuSupports()) ||
2126
+ (!IsCPUSupports && TInfo->supportsCpuIs()));
2127
+ };
2128
+ if (!SupportsBI(&TI) && SupportsBI(AuxTI))
2129
+ TheTI = AuxTI;
2130
+
2131
+ if (IsCPUSupports && !TheTI->supportsCpuSupports())
2124
2132
return S.Diag(TheCall->getBeginLoc(), diag::err_builtin_target_unsupported)
2125
2133
<< SourceRange(TheCall->getBeginLoc(), TheCall->getEndLoc());
2126
- if (!IsCPUSupports && !TI. supportsCpuIs())
2134
+ if (!IsCPUSupports && !TheTI-> supportsCpuIs())
2127
2135
return S.Diag(TheCall->getBeginLoc(), diag::err_builtin_target_unsupported)
2128
2136
<< SourceRange(TheCall->getBeginLoc(), TheCall->getEndLoc());
2129
2137
@@ -2135,10 +2143,10 @@ static bool SemaBuiltinCpu(Sema &S, const TargetInfo &TI, CallExpr *TheCall,
2135
2143
2136
2144
// Check the contents of the string.
2137
2145
StringRef Feature = cast<StringLiteral>(Arg)->getString();
2138
- if (IsCPUSupports && !TI. validateCpuSupports(Feature))
2146
+ if (IsCPUSupports && !TheTI-> validateCpuSupports(Feature))
2139
2147
return S.Diag(TheCall->getBeginLoc(), diag::err_invalid_cpu_supports)
2140
2148
<< Arg->getSourceRange();
2141
- if (!IsCPUSupports && !TI. validateCpuIs(Feature))
2149
+ if (!IsCPUSupports && !TheTI-> validateCpuIs(Feature))
2142
2150
return S.Diag(TheCall->getBeginLoc(), diag::err_invalid_cpu_is)
2143
2151
<< Arg->getSourceRange();
2144
2152
return false;
@@ -2173,7 +2181,8 @@ Sema::CheckBuiltinFunctionCall(FunctionDecl *FDecl, unsigned BuiltinID,
2173
2181
switch (BuiltinID) {
2174
2182
case Builtin::BI__builtin_cpu_supports:
2175
2183
case Builtin::BI__builtin_cpu_is:
2176
- if (SemaBuiltinCpu(*this, Context.getTargetInfo(), TheCall, BuiltinID))
2184
+ if (SemaBuiltinCpu(*this, Context.getTargetInfo(), TheCall,
2185
+ Context.getAuxTargetInfo(), BuiltinID))
2177
2186
return ExprError();
2178
2187
break;
2179
2188
case Builtin::BI__builtin_cpu_init:
0 commit comments