]> granicus.if.org Git - clang/commitdiff
Fix Neon builtin pointer argument checking for "sret" builtins.
authorBob Wilson <bob.wilson@apple.com>
Wed, 16 Nov 2011 21:32:23 +0000 (21:32 +0000)
committerBob Wilson <bob.wilson@apple.com>
Wed, 16 Nov 2011 21:32:23 +0000 (21:32 +0000)
The code for checking Neon builtin pointer argument types was assuming that
there would only be one pointer argument.  But, for vld2-4 builtins, the first
argument is a special sret pointer where the result will be stored.  So,
instead of scanning all the arguments to find a pointer, have TableGen figure
out the index of the pointer argument that needs checking.  That's better than
scanning all the arguments regardless.  <rdar://problem/10448804>

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@144834 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaChecking.cpp
utils/TableGen/NeonEmitter.cpp

index f4968f697a05f99f661dc60e97d0bc6eb16f6422..760b5f33b221b38bbf284752cddc42dc1bf38c0d 100644 (file)
@@ -298,7 +298,7 @@ bool Sema::CheckARMBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) {
 
   unsigned mask = 0;
   unsigned TV = 0;
-  bool HasPtr = false;
+  int PtrArgNum = -1;
   bool HasConstPtr = false;
   switch (BuiltinID) {
 #define GET_NEON_OVERLOAD_CHECK
@@ -319,28 +319,24 @@ bool Sema::CheckARMBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) {
         << TheCall->getArg(ImmArg)->getSourceRange();
   }
 
-  if (HasPtr || HasConstPtr) {
+  if (PtrArgNum >= 0) {
     // Check that pointer arguments have the specified type.
-    for (unsigned ArgNo = 0; ArgNo < ImmArg; ++ArgNo) {
-      Expr *Arg = TheCall->getArg(ArgNo);
-      if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Arg))
-        Arg = ICE->getSubExpr();
-      ExprResult RHS = DefaultFunctionArrayLvalueConversion(Arg);
-      QualType RHSTy = RHS.get()->getType();
-      if (!RHSTy->isPointerType())
-        continue;
-      QualType EltTy = getNeonEltType(NeonTypeFlags(TV), Context);
-      if (HasConstPtr)
-        EltTy = EltTy.withConst();
-      QualType LHSTy = Context.getPointerType(EltTy);
-      AssignConvertType ConvTy;
-      ConvTy = CheckSingleAssignmentConstraints(LHSTy, RHS);
-      if (RHS.isInvalid())
-        return true;
-      if (DiagnoseAssignmentResult(ConvTy, Arg->getLocStart(), LHSTy, RHSTy,
-                                   RHS.get(), AA_Assigning))
-        return true;
-    }
+    Expr *Arg = TheCall->getArg(PtrArgNum);
+    if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Arg))
+      Arg = ICE->getSubExpr();
+    ExprResult RHS = DefaultFunctionArrayLvalueConversion(Arg);
+    QualType RHSTy = RHS.get()->getType();
+    QualType EltTy = getNeonEltType(NeonTypeFlags(TV), Context);
+    if (HasConstPtr)
+      EltTy = EltTy.withConst();
+    QualType LHSTy = Context.getPointerType(EltTy);
+    AssignConvertType ConvTy;
+    ConvTy = CheckSingleAssignmentConstraints(LHSTy, RHS);
+    if (RHS.isInvalid())
+      return true;
+    if (DiagnoseAssignmentResult(ConvTy, Arg->getLocStart(), LHSTy, RHSTy,
+                                 RHS.get(), AA_Assigning))
+      return true;
   }
   
   // For NEON intrinsics which take an immediate value as part of the 
index fec16b957efc2830df078b53163c3888d288f855..589fbde771e464f8e511207ff1d2a0c608217c82 100644 (file)
@@ -1336,14 +1336,32 @@ void NeonEmitter::runHeader(raw_ostream &OS) {
         mask |= 1 << GetNeonEnum(Proto, TypeVec[ti]);
       }
     }
-    bool HasPtr = (Proto.find('p') != std::string::npos);
-    bool HasConstPtr = (Proto.find('c') != std::string::npos);
+
+    // Check if the builtin function has a pointer or const pointer argument.
+    int PtrArgNum = -1;
+    bool HasConstPtr = false;
+    for (unsigned arg = 1, arge = Proto.size(); arg != arge; ++arg) {
+      char ArgType = Proto[arg];
+      if (ArgType == 'c') {
+        HasConstPtr = true;
+        PtrArgNum = arg - 1;
+        break;
+      }
+      if (ArgType == 'p') {
+        PtrArgNum = arg - 1;
+        break;
+      }
+    }
+    // For sret builtins, adjust the pointer argument index.
+    if (PtrArgNum >= 0 && (Proto[0] >= '2' && Proto[0] <= '4'))
+      PtrArgNum += 1;
+
     if (mask) {
       OS << "case ARM::BI__builtin_neon_"
          << MangleName(name, TypeVec[si], ClassB)
          << ": mask = " << "0x" << utohexstr(mask);
-      if (HasPtr)
-        OS << "; HasPtr = true";
+      if (PtrArgNum >= 0)
+        OS << "; PtrArgNum = " << PtrArgNum;
       if (HasConstPtr)
         OS << "; HasConstPtr = true";
       OS << "; break;\n";
@@ -1352,8 +1370,8 @@ void NeonEmitter::runHeader(raw_ostream &OS) {
       OS << "case ARM::BI__builtin_neon_"
          << MangleName(name, TypeVec[qi], ClassB)
          << ": mask = " << "0x" << utohexstr(qmask);
-      if (HasPtr)
-        OS << "; HasPtr = true";
+      if (PtrArgNum >= 0)
+        OS << "; PtrArgNum = " << PtrArgNum;
       if (HasConstPtr)
         OS << "; HasConstPtr = true";
       OS << "; break;\n";