forked from OSchip/llvm-project
Fix undefined behavior (and wrong code, as far as I can tell) in NEON builtin
tablegen code, found by -fcatch-undefined-behavior. I would appreciate if someone more familiar with the NEON code could point me in the direction of how to write a test for this. We appear to have essentially no test coverage whatsoever for these builtins. llvm-svn: 161827
This commit is contained in:
parent
97f6ea9f34
commit
7d6d47b862
|
@ -355,7 +355,7 @@ static QualType getNeonEltType(NeonTypeFlags Flags, ASTContext &Context) {
|
||||||
bool Sema::CheckARMBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) {
|
bool Sema::CheckARMBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) {
|
||||||
llvm::APSInt Result;
|
llvm::APSInt Result;
|
||||||
|
|
||||||
unsigned mask = 0;
|
uint64_t mask = 0;
|
||||||
unsigned TV = 0;
|
unsigned TV = 0;
|
||||||
int PtrArgNum = -1;
|
int PtrArgNum = -1;
|
||||||
bool HasConstPtr = false;
|
bool HasConstPtr = false;
|
||||||
|
@ -373,7 +373,7 @@ bool Sema::CheckARMBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) {
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
TV = Result.getLimitedValue(64);
|
TV = Result.getLimitedValue(64);
|
||||||
if ((TV > 63) || (mask & (1 << TV)) == 0)
|
if ((TV > 63) || (mask & (1ULL << TV)) == 0)
|
||||||
return Diag(TheCall->getLocStart(), diag::err_invalid_neon_type_code)
|
return Diag(TheCall->getLocStart(), diag::err_invalid_neon_type_code)
|
||||||
<< TheCall->getArg(ImmArg)->getSourceRange();
|
<< TheCall->getArg(ImmArg)->getSourceRange();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1504,7 +1504,7 @@ void NeonEmitter::runHeader(raw_ostream &OS) {
|
||||||
throw TGError(R->getLoc(), "Builtin has no class kind");
|
throw TGError(R->getLoc(), "Builtin has no class kind");
|
||||||
|
|
||||||
int si = -1, qi = -1;
|
int si = -1, qi = -1;
|
||||||
unsigned mask = 0, qmask = 0;
|
uint64_t mask = 0, qmask = 0;
|
||||||
for (unsigned ti = 0, te = TypeVec.size(); ti != te; ++ti) {
|
for (unsigned ti = 0, te = TypeVec.size(); ti != te; ++ti) {
|
||||||
// Generate the switch case(s) for this builtin for the type validation.
|
// Generate the switch case(s) for this builtin for the type validation.
|
||||||
bool quad = false, poly = false, usgn = false;
|
bool quad = false, poly = false, usgn = false;
|
||||||
|
@ -1512,10 +1512,10 @@ void NeonEmitter::runHeader(raw_ostream &OS) {
|
||||||
|
|
||||||
if (quad) {
|
if (quad) {
|
||||||
qi = ti;
|
qi = ti;
|
||||||
qmask |= 1 << GetNeonEnum(Proto, TypeVec[ti]);
|
qmask |= 1ULL << GetNeonEnum(Proto, TypeVec[ti]);
|
||||||
} else {
|
} else {
|
||||||
si = ti;
|
si = ti;
|
||||||
mask |= 1 << GetNeonEnum(Proto, TypeVec[ti]);
|
mask |= 1ULL << GetNeonEnum(Proto, TypeVec[ti]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue