summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
Diffstat (limited to 'clang')
-rw-r--r--clang/include/clang/AST/ASTConsumer.h16
-rw-r--r--clang/include/clang/Frontend/PCHWriter.h5
-rw-r--r--clang/include/clang/Sema/SemaConsumer.h45
-rw-r--r--clang/lib/Frontend/PCHWriter.cpp6
-rw-r--r--clang/lib/Sema/ParseAST.cpp4
-rw-r--r--clang/tools/clang-cc/GeneratePCH.cpp10
6 files changed, 78 insertions, 8 deletions
diff --git a/clang/include/clang/AST/ASTConsumer.h b/clang/include/clang/AST/ASTConsumer.h
index cafeecbae41..fd79bf59ea9 100644
--- a/clang/include/clang/AST/ASTConsumer.h
+++ b/clang/include/clang/AST/ASTConsumer.h
@@ -19,16 +19,25 @@ namespace clang {
class DeclGroupRef;
class TagDecl;
class HandleTagDeclDefinition;
-
+ class SemaConsumer; // layering violation required for safe SemaConsumer
+
/// ASTConsumer - This is an abstract interface that should be implemented by
/// clients that read ASTs. This abstraction layer allows the client to be
/// independent of the AST producer (e.g. parser vs AST dump file reader, etc).
class ASTConsumer {
+ /// \brief Whether this AST consumer also requires information about
+ /// semantic analysis.
+ bool SemaConsumer;
+
+ friend class SemaConsumer;
+
public:
+ ASTConsumer() : SemaConsumer(false) { }
+
virtual ~ASTConsumer() {}
/// Initialize - This is called to initialize the consumer, providing the
- /// ASTContext.
+ /// ASTContext and the Action.
virtual void Initialize(ASTContext &Context) {}
/// HandleTopLevelDecl - Handle the specified top-level declaration. This is
@@ -50,6 +59,9 @@ public:
/// PrintStats - If desired, print any statistics.
virtual void PrintStats() {
}
+
+ // Support isa/cast/dyn_cast
+ static bool classof(const ASTConsumer *) { return true; }
};
} // end namespace clang.
diff --git a/clang/include/clang/Frontend/PCHWriter.h b/clang/include/clang/Frontend/PCHWriter.h
index ee101b54f74..a7397750dba 100644
--- a/clang/include/clang/Frontend/PCHWriter.h
+++ b/clang/include/clang/Frontend/PCHWriter.h
@@ -34,6 +34,7 @@ namespace clang {
class ASTContext;
class LabelStmt;
class Preprocessor;
+class Sema;
class SourceManager;
class SwitchCase;
class TargetInfo;
@@ -137,8 +138,8 @@ public:
/// the given bitstream.
PCHWriter(llvm::BitstreamWriter &Stream);
- /// \brief Write a precompiled header for the given AST context.
- void WritePCH(ASTContext &Context, const Preprocessor &PP);
+ /// \brief Write a precompiled header for the given semantic analysis.
+ void WritePCH(Sema &SemaRef);
/// \brief Emit a source location.
void AddSourceLocation(SourceLocation Loc, RecordData &Record);
diff --git a/clang/include/clang/Sema/SemaConsumer.h b/clang/include/clang/Sema/SemaConsumer.h
new file mode 100644
index 00000000000..25d4253390b
--- /dev/null
+++ b/clang/include/clang/Sema/SemaConsumer.h
@@ -0,0 +1,45 @@
+//===--- SemaConsumer.h - Abstract interface for AST semantics --*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file defines the SemaConsumer class, a subclass of
+// ASTConsumer that is used by AST clients that also require
+// additional semantic analysis.
+//
+//===----------------------------------------------------------------------===//
+#ifndef LLVM_CLANG_SEMA_SEMACONSUMER_H
+#define LLVM_CLANG_SEMA_SEMACONSUMER_H
+
+#include "clang/AST/ASTConsumer.h"
+
+namespace clang {
+ class Sema;
+
+ /// \brief An abstract interface that should be implemented by
+ /// clients that read ASTs and then require further semantic
+ /// analysis of the entities in those ASTs.
+ class SemaConsumer : public ASTConsumer {
+ public:
+ explicit SemaConsumer() {
+ ASTConsumer::SemaConsumer = true;
+ }
+
+ /// \brief Initialize the semantic consumer with the Sema instance
+ /// being used to perform semantic analysis on the abstract syntax
+ /// tree.
+ virtual void InitializeSema(Sema &S) {}
+
+ // isa/cast/dyn_cast support
+ static bool classof(const ASTConsumer *Consumer) {
+ return Consumer->SemaConsumer;
+ }
+ static bool classof(const SemaConsumer *) { return true; }
+ };
+}
+
+#endif
diff --git a/clang/lib/Frontend/PCHWriter.cpp b/clang/lib/Frontend/PCHWriter.cpp
index 6aea7a53727..afe77aebf8f 100644
--- a/clang/lib/Frontend/PCHWriter.cpp
+++ b/clang/lib/Frontend/PCHWriter.cpp
@@ -12,6 +12,7 @@
//===----------------------------------------------------------------------===//
#include "clang/Frontend/PCHWriter.h"
+#include "../Sema/Sema.h" // FIXME: move header into include/clang/Sema
#include "clang/AST/ASTContext.h"
#include "clang/AST/Decl.h"
#include "clang/AST/DeclContextInternals.h"
@@ -1760,7 +1761,10 @@ void PCHWriter::AddString(const std::string &Str, RecordData &Record) {
PCHWriter::PCHWriter(llvm::BitstreamWriter &Stream)
: Stream(Stream), NextTypeID(pch::NUM_PREDEF_TYPE_IDS), NumStatements(0) { }
-void PCHWriter::WritePCH(ASTContext &Context, const Preprocessor &PP) {
+void PCHWriter::WritePCH(Sema &SemaRef) {
+ ASTContext &Context = SemaRef.Context;
+ Preprocessor &PP = SemaRef.PP;
+
// Emit the file header.
Stream.Emit((unsigned)'C', 8);
Stream.Emit((unsigned)'P', 8);
diff --git a/clang/lib/Sema/ParseAST.cpp b/clang/lib/Sema/ParseAST.cpp
index b27734745ae..448556092f6 100644
--- a/clang/lib/Sema/ParseAST.cpp
+++ b/clang/lib/Sema/ParseAST.cpp
@@ -13,6 +13,7 @@
#include "clang/Sema/ParseAST.h"
#include "Sema.h"
+#include "clang/Sema/SemaConsumer.h"
#include "clang/AST/ASTConsumer.h"
#include "clang/AST/ExternalASTSource.h"
#include "clang/AST/Stmt.h"
@@ -46,6 +47,9 @@ void clang::ParseAST(Preprocessor &PP, ASTConsumer *Consumer,
Consumer->Initialize(Ctx);
+ if (SemaConsumer *SC = dyn_cast<SemaConsumer>(Consumer))
+ SC->InitializeSema(S);
+
if (Ctx.getExternalSource())
Ctx.getExternalSource()->StartTranslationUnit(Consumer);
diff --git a/clang/tools/clang-cc/GeneratePCH.cpp b/clang/tools/clang-cc/GeneratePCH.cpp
index 9b865140867..4265c816f05 100644
--- a/clang/tools/clang-cc/GeneratePCH.cpp
+++ b/clang/tools/clang-cc/GeneratePCH.cpp
@@ -14,6 +14,7 @@
#include "ASTConsumers.h"
#include "clang/Frontend/PCHWriter.h"
+#include "clang/Sema/SemaConsumer.h"
#include "clang/AST/ASTContext.h"
#include "clang/AST/ASTConsumer.h"
#include "clang/Lex/Preprocessor.h"
@@ -28,14 +29,16 @@ using namespace clang;
using namespace llvm;
namespace {
- class VISIBILITY_HIDDEN PCHGenerator : public ASTConsumer {
+ class VISIBILITY_HIDDEN PCHGenerator : public SemaConsumer {
const Preprocessor &PP;
std::string OutFile;
+ Sema *SemaPtr;
public:
explicit PCHGenerator(const Preprocessor &PP, const std::string &OutFile)
- : PP(PP), OutFile(OutFile) { }
+ : PP(PP), OutFile(OutFile), SemaPtr(0) { }
+ virtual void InitializeSema(Sema &S) { SemaPtr = &S; }
virtual void HandleTranslationUnit(ASTContext &Ctx);
};
}
@@ -50,7 +53,8 @@ void PCHGenerator::HandleTranslationUnit(ASTContext &Ctx) {
PCHWriter Writer(Stream);
// Emit the PCH file
- Writer.WritePCH(Ctx, PP);
+ assert(SemaPtr && "No Sema?");
+ Writer.WritePCH(*SemaPtr);
// Open up the PCH file.
std::string ErrMsg;
OpenPOWER on IntegriCloud