]> granicus.if.org Git - clang/commitdiff
AST, Sema, Serialization: keep track of cudaConfigureCall
authorPeter Collingbourne <peter@pcc.me.uk>
Wed, 9 Feb 2011 21:04:32 +0000 (21:04 +0000)
committerPeter Collingbourne <peter@pcc.me.uk>
Wed, 9 Feb 2011 21:04:32 +0000 (21:04 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@125216 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/ASTContext.h
include/clang/Basic/DiagnosticSemaKinds.td
include/clang/Serialization/ASTBitCodes.h
include/clang/Serialization/ASTReader.h
lib/AST/ASTContext.cpp
lib/Sema/SemaDecl.cpp
lib/Serialization/ASTReader.cpp
lib/Serialization/ASTWriter.cpp
test/SemaCUDA/config-type.cu [new file with mode: 0644]

index 8a05730154e7c93aec1eb26074b3d0e7a383eae7..911a50cf6757f2f0ce9f967045e3c1b6d1d51d8b 100644 (file)
@@ -210,6 +210,9 @@ class ASTContext {
   /// \brief Type for the Block descriptor for Blocks CodeGen.
   mutable RecordDecl *BlockDescriptorExtendedType;
 
+  /// \brief Declaration for the CUDA cudaConfigureCall function.
+  FunctionDecl *cudaConfigureCallDecl;
+
   TypeSourceInfo NullTypeSourceInfo;
 
   /// \brief Keeps track of all declaration attributes.
@@ -541,6 +544,13 @@ public:
     return QualType();
   }
 
+  void setcudaConfigureCallDecl(FunctionDecl *FD) {
+    cudaConfigureCallDecl = FD;
+  }
+  FunctionDecl *getcudaConfigureCallDecl() {
+    return cudaConfigureCallDecl;
+  }
+
   /// This gets the struct used to keep track of pointer to blocks, complete
   /// with captured variables.
   QualType getBlockParmType(bool BlockHasCopyDispose,
index 05905c23f106b44502918a70dd059f6e6507144c..2cca767360e8934fb5d3a37564dafdc61a2524d4 100644 (file)
@@ -3049,6 +3049,8 @@ def err_deleted_function_use : Error<"attempt to use a deleted function">;
 
 def err_kern_type_not_void_return : Error<
   "kernel function type %0 must have void return type">;
+def err_config_scalar_return : Error<
+  "CUDA special function 'cudaConfigureCall' must have scalar return type">;
 
 
 def err_cannot_pass_objc_interface_to_vararg : Error<
index 5c9a3086cbd552c5f997d749ef5e0b9fad2d5024..13e857511f4591af294e347ea1b429dd90d6a3bd 100644 (file)
@@ -347,7 +347,10 @@ namespace clang {
       CXX_BASE_SPECIFIER_OFFSETS = 37,
 
       /// \brief Record code for #pragma diagnostic mappings.
-      DIAG_PRAGMA_MAPPINGS = 38
+      DIAG_PRAGMA_MAPPINGS = 38,
+
+      /// \brief Record code for special CUDA declarations.
+      CUDA_SPECIAL_DECL_REFS = 39
     };
 
     /// \brief Record types used within a source manager block.
index ae9820b72fea4f4e703eefe73675c1ccb2230cdb..6c6a271a3e535993524246fe327ff03cf22d9f13 100644 (file)
@@ -575,6 +575,12 @@ private:
   /// The AST context tracks a few important types, such as va_list, directly.
   llvm::SmallVector<uint64_t, 16> SpecialTypes;
 
+  /// \brief The IDs of CUDA-specific declarations ASTContext stores directly.
+  ///
+  /// The AST context tracks a few important decls, currently cudaConfigureCall,
+  /// directly.
+  llvm::SmallVector<uint64_t, 2> CUDASpecialDeclRefs;
+
   //@}
 
   /// \brief Diagnostic IDs and their mappings that the user changed.
index 30fe791e6d3bea47fc87842cf9b832e4d95d5690..d6c89c947ce927a74918def125cf5ddfe994f72d 100644 (file)
@@ -197,6 +197,7 @@ ASTContext::ASTContext(const LangOptions& LOpts, SourceManager &SM,
   CFConstantStringTypeDecl(0), NSConstantStringTypeDecl(0),
   ObjCFastEnumerationStateTypeDecl(0), FILEDecl(0), jmp_bufDecl(0),
   sigjmp_bufDecl(0), BlockDescriptorType(0), BlockDescriptorExtendedType(0),
+  cudaConfigureCallDecl(0),
   NullTypeSourceInfo(QualType()),
   SourceMgr(SM), LangOpts(LOpts), ABI(createCXXABI(t)), Target(t),
   Idents(idents), Selectors(sels),
index ac8e042545892df1631f6c7b70148299a340af58..d756de5e2db5d44a9a4014370290231ffbcf6af7 100644 (file)
@@ -4110,6 +4110,19 @@ Sema::ActOnFunctionDeclarator(Scope* S, Declarator& D, DeclContext* DC,
   }
 
   MarkUnusedFileScopedDecl(NewFD);
+
+  if (getLangOptions().CUDA)
+    if (IdentifierInfo *II = NewFD->getIdentifier())
+      if (!NewFD->isInvalidDecl() &&
+          NewFD->getDeclContext()->getRedeclContext()->isTranslationUnit()) {
+        if (II->isStr("cudaConfigureCall")) {
+          if (!R->getAs<FunctionType>()->getResultType()->isScalarType())
+            Diag(NewFD->getLocation(), diag::err_config_scalar_return);
+
+          Context.setcudaConfigureCallDecl(NewFD);
+        }
+      }
+
   return NewFD;
 }
 
index 0fc62ab96a19def79a8b1240078cf0a5e98b630f..559d927dac9c0d3960ff95dba31f323603374709 100644 (file)
@@ -2152,6 +2152,11 @@ ASTReader::ReadASTBlock(PerFileData &F) {
         PragmaDiagMappings.insert(PragmaDiagMappings.end(),
                                 Record.begin(), Record.end());
       break;
+
+    case CUDA_SPECIAL_DECL_REFS:
+      // Later tables overwrite earlier ones.
+      CUDASpecialDeclRefs.swap(Record);
+      break;
     }
     First = false;
   }
@@ -2496,6 +2501,13 @@ void ASTReader::InitializeContext(ASTContext &Ctx) {
     Context->setInt128Installed();
 
   ReadPragmaDiagnosticMappings(Context->getDiagnostics());
+
+  // If there were any CUDA special declarations, deserialize them.
+  if (!CUDASpecialDeclRefs.empty()) {
+    assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!");
+    Context->setcudaConfigureCallDecl(
+                           cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0])));
+  }
 }
 
 /// \brief Retrieve the name of the original source file name
index fdd5800e9cdd878f1b8afb429068db66ed0e5dc5..a5af03cfb06aa1f8efde20e13102ec16b51de6cf 100644 (file)
@@ -2545,6 +2545,11 @@ void ASTWriter::WriteASTCore(Sema &SemaRef, MemorizeStatCalls *StatCalls,
     AddDeclRef(SemaRef.getStdBadAlloc(), SemaDeclRefs);
   }
 
+  RecordData CUDASpecialDeclRefs;
+  if (Context.getcudaConfigureCallDecl()) {
+    AddDeclRef(Context.getcudaConfigureCallDecl(), CUDASpecialDeclRefs);
+  }
+
   // Write the remaining AST contents.
   RecordData Record;
   Stream.EnterSubblock(AST_BLOCK_ID, 5);
@@ -2659,6 +2664,10 @@ void ASTWriter::WriteASTCore(Sema &SemaRef, MemorizeStatCalls *StatCalls,
   if (!SemaDeclRefs.empty())
     Stream.EmitRecord(SEMA_DECL_REFS, SemaDeclRefs);
 
+  // Write the record containing CUDA-specific declaration references.
+  if (!CUDASpecialDeclRefs.empty())
+    Stream.EmitRecord(CUDA_SPECIAL_DECL_REFS, CUDASpecialDeclRefs);
+
   // Some simple statistics
   Record.clear();
   Record.push_back(NumStatements);
diff --git a/test/SemaCUDA/config-type.cu b/test/SemaCUDA/config-type.cu
new file mode 100644 (file)
index 0000000..a469d38
--- /dev/null
@@ -0,0 +1,3 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+
+void cudaConfigureCall(unsigned gridSize, unsigned blockSize); // expected-error {{must have scalar return type}}