class ASTSerializer : public ASTConsumer {
protected:
Diagnostic &Diags;
- const LangOptions& lang;
TranslationUnit* TU;
public:
- ASTSerializer(Diagnostic& diags, const LangOptions& LO)
- : Diags(diags), lang(LO), TU(0) {}
+ ASTSerializer(Diagnostic& diags) : Diags(diags), TU(0) {}
virtual ~ASTSerializer() { delete TU; }
class SingleFileSerializer : public ASTSerializer {
const llvm::sys::Path FName;
public:
- SingleFileSerializer(const llvm::sys::Path& F, Diagnostic &diags,
- const LangOptions &LO)
- : ASTSerializer(diags,LO), FName(F) {}
+ SingleFileSerializer(const llvm::sys::Path& F, Diagnostic &diags)
+ : ASTSerializer(diags), FName(F) {}
~SingleFileSerializer() {
EmitASTBitcodeFile(TU, FName);
class BuildSerializer : public ASTSerializer {
llvm::sys::Path EmitDir;
public:
- BuildSerializer(const llvm::sys::Path& dir, Diagnostic &diags,
- const LangOptions &LO)
- : ASTSerializer(diags,LO), EmitDir(dir) {}
+ BuildSerializer(const llvm::sys::Path& dir, Diagnostic &diags)
+ : ASTSerializer(diags), EmitDir(dir) {}
~BuildSerializer() {
ASTConsumer* clang::CreateASTSerializer(const std::string& InFile,
const std::string& OutputFile,
- Diagnostic &Diags,
- const LangOptions &Features) {
+ Diagnostic &Diags) {
if (OutputFile.size()) {
if (InFile == "-") {
// FIXME: We should probably only allow using BuildSerializer when
// the ASTs come from parsed source files, and not from .ast files.
- return new BuildSerializer(EmitDir, Diags, Features);
+ return new BuildSerializer(EmitDir, Diags);
}
// The user did not specify an output directory for serialized ASTs.
llvm::sys::Path FName(InFile.c_str());
FName.appendSuffix("ast");
- return new SingleFileSerializer(FName, Diags, Features);
+ return new SingleFileSerializer(FName, Diags);
}
Preprocessor *PP, PreprocessorFactory* PPF);
ASTConsumer *CreateSerializationTest(Diagnostic &Diags,
- FileManager& FMgr,
- const LangOptions &LOpts);
+ FileManager& FMgr);
ASTConsumer *CreateASTSerializer(const std::string& InFile,
const std::string& EmitDir,
- Diagnostic &Diags,
- const LangOptions &LOpts);
+ Diagnostic &Diags);
} // end clang namespace
namespace {
class SerializationTest : public ASTConsumer {
- llvm::OwningPtr<TranslationUnit> TU;
+ TranslationUnit* TU;
Diagnostic &Diags;
FileManager &FMgr;
- const LangOptions& lopts;
public:
- SerializationTest(Diagnostic &d, FileManager& fmgr, const LangOptions& LOpts)
- : Diags(d), FMgr(fmgr), lopts(LOpts) {}
+ SerializationTest(Diagnostic &d, FileManager& fmgr)
+ : TU(0), Diags(d), FMgr(fmgr) {}
~SerializationTest();
- virtual void Initialize(ASTContext& context) {
- if (!TU) {
- TU.reset(new TranslationUnit(context, lopts));
- TU->SetOwnsDecls(false);
- }
- }
-
- virtual void HandleTopLevelDecl(Decl *D) {
- TU->AddTopLevelDecl(D);
- }
+ virtual void InitializeTU(TranslationUnit& tu) { TU = &tu; }
private:
bool Serialize(llvm::sys::Path& Filename, llvm::sys::Path& FNameDeclPrint);
} // end anonymous namespace
ASTConsumer*
-clang::CreateSerializationTest(Diagnostic &Diags, FileManager& FMgr,
- const LangOptions &LOpts) {
-
- return new SerializationTest(Diags,FMgr,LOpts);
+clang::CreateSerializationTest(Diagnostic &Diags, FileManager& FMgr) {
+ return new SerializationTest(Diags, FMgr);
}
llvm::sys::Path& FNameDeclPrint) {
// Deserialize the translation unit.
- TranslationUnit* NewTU = ReadASTBitcodeFile(Filename,FMgr);
+ TranslationUnit* NewTU = ReadASTBitcodeFile(Filename, FMgr);
if (!NewTU)
return false;
OutputFile, VisualizeEG, TrimGraph, AnalyzeAll);
case TestSerialization:
- return CreateSerializationTest(Diag, FileMgr, LangOpts);
+ return CreateSerializationTest(Diag, FileMgr);
case EmitLLVM:
case EmitBC:
case SerializeAST:
// FIXME: Allow user to tailor where the file is written.
- return CreateASTSerializer(InFile, OutputFile, Diag, LangOpts);
+ return CreateASTSerializer(InFile, OutputFile, Diag);
case RewriteObjC:
return CreateCodeRewriterTest(InFile, OutputFile, Diag, LangOpts);
// translation unit, rather than InFile.
llvm::Module *DestModule;
llvm::OwningPtr<ASTConsumer>
- Consumer(CreateASTConsumer(InFile, Diag, FileMgr, TU->getLangOpts(), 0, 0,
- DestModule));
+ Consumer(CreateASTConsumer(InFile, Diag, FileMgr, TU->getLangOptions(),
+ 0, 0, DestModule));
if (!Consumer) {
fprintf(stderr, "Unsupported program action with serialized ASTs!\n");
#ifndef LLVM_CLANG_AST_ASTCONTEXT_H
#define LLVM_CLANG_AST_ASTCONTEXT_H
+#include "clang/Basic/LangOptions.h"
#include "clang/AST/Builtins.h"
#include "clang/AST/Expr.h"
#include "clang/AST/RecordLayout.h"
TranslationUnitDecl *TUDecl;
+ /// SourceMgr - The associated SourceManager object.
SourceManager &SourceMgr;
+
+ /// LangOpts - The language options used to create the AST associated with
+ /// this ASTContext object.
+ LangOptions LangOpts;
+
+ /// Allocator - The allocator object used to create AST objects.
llvm::MallocAllocator Allocator;
+
public:
TargetInfo &Target;
IdentifierTable &Idents;
SelectorTable &Selectors;
SourceManager& getSourceManager() { return SourceMgr; }
- llvm::MallocAllocator &getAllocator() { return Allocator; }
+ llvm::MallocAllocator &getAllocator() { return Allocator; }
+ const LangOptions& getLangOptions() const { return LangOpts; }
FullSourceLoc getFullLoc(SourceLocation Loc) const {
return FullSourceLoc(Loc,SourceMgr);
QualType FloatComplexTy, DoubleComplexTy, LongDoubleComplexTy;
QualType VoidPtrTy;
- ASTContext(SourceManager &SM, TargetInfo &t, IdentifierTable &idents,
- SelectorTable &sels, unsigned size_reserve=0 ) :
- CFConstantStringTypeDecl(0), SourceMgr(SM), Target(t),
+ ASTContext(const LangOptions& LOpts, SourceManager &SM, TargetInfo &t,
+ IdentifierTable &idents, SelectorTable &sels,
+ unsigned size_reserve=0 ) :
+ CFConstantStringTypeDecl(0), SourceMgr(SM), LangOpts(LOpts), Target(t),
Idents(idents), Selectors(sels) {
if (size_reserve > 0) Types.reserve(size_reserve);
#ifndef LLVM_CLANG_TRANSLATION_UNIT_H
#define LLVM_CLANG_TRANSLATION_UNIT_H
-#include "clang/Basic/LangOptions.h"
+#include "clang/AST/ASTContext.h"
#include "llvm/Bitcode/SerializationFwd.h"
#include "llvm/System/Path.h"
#include <vector>
class FileEntry;
class TranslationUnit {
- LangOptions LangOpts;
ASTContext* Context;
std::vector<Decl*> TopLevelDecls;
bool OwnsMetaData;
OwnsDecls(true) {}
public:
- explicit TranslationUnit(ASTContext& Ctx, const LangOptions& lopt)
- : LangOpts(lopt), Context(&Ctx), OwnsMetaData(false),
- OwnsDecls(true) {}
+ explicit TranslationUnit(ASTContext& Ctx)
+ : Context(&Ctx), OwnsMetaData(false), OwnsDecls(true) {}
void SetOwnsDecls(bool val) { OwnsDecls = val; }
~TranslationUnit();
- const LangOptions& getLangOpts() const { return LangOpts; }
const std::string& getSourceFile() const;
/// Emit - Emit the translation unit to an arbitray bitcode stream.
static TranslationUnit* Create(llvm::Deserializer& D, FileManager& FMgr);
// Accessors
- const LangOptions& getLangOptions() const { return LangOpts; }
+ const LangOptions& getLangOptions() const { return Context->getLangOptions();}
ASTContext& getContext() { return *Context; }
const ASTContext& getContext() const { return *Context; }
/// Emit - Serialize an ASTContext object to Bitcode.
void ASTContext::Emit(llvm::Serializer& S) const {
+ S.Emit(LangOpts);
S.EmitRef(SourceMgr);
S.EmitRef(Target);
S.EmitRef(Idents);
}
ASTContext* ASTContext::Create(llvm::Deserializer& D) {
+
+ // Read the language options.
+ LangOptions LOpts;
+ LOpts.Read(D);
+
SourceManager &SM = D.ReadRef<SourceManager>();
TargetInfo &t = D.ReadRef<TargetInfo>();
IdentifierTable &idents = D.ReadRef<IdentifierTable>();
unsigned size_reserve = D.ReadInt();
- ASTContext* A = new ASTContext(SM,t,idents,sels,size_reserve);
+ ASTContext* A = new ASTContext(LOpts, SM, t, idents, sels, size_reserve);
for (unsigned i = 0; i < size_reserve; ++i)
Type::Create(*A,i,D);
Sezr.EnterBlock(BasicMetadataBlock);
- // Block for SourceManager, LangOptions, and Target. Allows easy skipping
+ // Block for SourceManager and Target. Allows easy skipping
// around to the block for the Selectors during deserialization.
Sezr.EnterBlock();
// Emit the SourceManager.
Sezr.Emit(Context->getSourceManager());
-
- // Emit the LangOptions.
- Sezr.Emit(LangOpts);
-
+
// Emit the Target.
Sezr.EmitPtr(&Context->Target);
Sezr.EmitCStr(Context->Target.getTargetTriple());
// Read the SourceManager.
SourceManager::CreateAndRegister(Dezr,FMgr);
-
- // Read the LangOptions.
- TU->LangOpts.Read(Dezr);
-
+
{ // Read the TargetInfo.
llvm::SerializedPtrID PtrID = Dezr.ReadPtrID();
char* triple = Dezr.ReadCStr(NULL,0,true);
Stmt::CollectingStats(true);
}
- ASTContext Context(PP.getSourceManager(), PP.getTargetInfo(),
+ ASTContext Context(PP.getLangOptions(), PP.getSourceManager(),
+ PP.getTargetInfo(),
PP.getIdentifierTable(), PP.getSelectorTable());
- TranslationUnit TU(Context, PP.getLangOptions());
+ TranslationUnit TU(Context);
Sema S(PP, Context, *Consumer);
Parser P(PP, S);