Interned MainFileID within SourceManager. Since SourceManager is referenced by

both Preprocessor and ASTContext, we no longer need to explicitly pass
MainFileID around in function calls that also pass either Preprocessor or
ASTContext. This resulted in some nice cleanups in the ASTConsumers and the
driver.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@45228 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Ted Kremenek 2007-12-19 22:51:13 +00:00
Родитель 7dcc968f17
Коммит 95041a2029
12 изменённых файлов: 48 добавлений и 50 удалений

Просмотреть файл

@ -356,7 +356,7 @@ namespace {
public: public:
ASTDumper() : DeclPrinter() {} ASTDumper() : DeclPrinter() {}
void Initialize(ASTContext &Context, unsigned MainFileID) { void Initialize(ASTContext &Context) {
SM = &Context.getSourceManager(); SM = &Context.getSourceManager();
} }
@ -400,7 +400,7 @@ namespace {
class ASTViewer : public ASTConsumer { class ASTViewer : public ASTConsumer {
SourceManager *SM; SourceManager *SM;
public: public:
void Initialize(ASTContext &Context, unsigned MainFileID) { void Initialize(ASTContext &Context) {
SM = &Context.getSourceManager(); SM = &Context.getSourceManager();
} }
@ -482,7 +482,7 @@ namespace {
class LivenessVisitor : public CFGVisitor { class LivenessVisitor : public CFGVisitor {
SourceManager *SM; SourceManager *SM;
public: public:
virtual void Initialize(ASTContext &Context, unsigned MainFileID) { virtual void Initialize(ASTContext &Context) {
SM = &Context.getSourceManager(); SM = &Context.getSourceManager();
} }
@ -507,7 +507,7 @@ namespace {
ASTContext *Ctx; ASTContext *Ctx;
public: public:
DeadStoreVisitor(Diagnostic &diags) : Diags(diags) {} DeadStoreVisitor(Diagnostic &diags) : Diags(diags) {}
virtual void Initialize(ASTContext &Context, unsigned MainFileID) { virtual void Initialize(ASTContext &Context) {
Ctx = &Context; Ctx = &Context;
} }
@ -530,7 +530,7 @@ namespace {
ASTContext *Ctx; ASTContext *Ctx;
public: public:
UninitValsVisitor(Diagnostic &diags) : Diags(diags) {} UninitValsVisitor(Diagnostic &diags) : Diags(diags) {}
virtual void Initialize(ASTContext &Context, unsigned MainFileID) { virtual void Initialize(ASTContext &Context) {
Ctx = &Context; Ctx = &Context;
} }
@ -565,7 +565,7 @@ namespace {
LLVMEmitter(Diagnostic &diags, const LangOptions &LO) LLVMEmitter(Diagnostic &diags, const LangOptions &LO)
: Diags(diags) : Diags(diags)
, Features(LO) {} , Features(LO) {}
virtual void Initialize(ASTContext &Context, unsigned MainFileID) { virtual void Initialize(ASTContext &Context) {
Ctx = &Context; Ctx = &Context;
M = new llvm::Module("foo"); M = new llvm::Module("foo");
M->setTargetTriple(Ctx->Target.getTargetTriple()); M->setTargetTriple(Ctx->Target.getTargetTriple());
@ -618,7 +618,7 @@ namespace {
const LangOptions &LO) const LangOptions &LO)
: Diags(diags), TU(LO), FName(F) {} : Diags(diags), TU(LO), FName(F) {}
virtual void Initialize(ASTContext &Context, unsigned MainFileID) { virtual void Initialize(ASTContext &Context) {
TU.setContext(&Context); TU.setContext(&Context);
} }

Просмотреть файл

@ -82,16 +82,16 @@ static void FindDiagnostics(const std::string &Comment,
} }
} }
/// FindExpectedDiags - Lex the file to finds all of the expected errors and /// FindExpectedDiags - Lex the main source file to find all of the
/// warnings. // expected errors and warnings.
static void FindExpectedDiags(Preprocessor &PP, unsigned MainFileID, static void FindExpectedDiags(Preprocessor &PP,
DiagList &ExpectedErrors, DiagList &ExpectedErrors,
DiagList &ExpectedWarnings) { DiagList &ExpectedWarnings) {
// Return comments as tokens, this is how we find expected diagnostics. // Return comments as tokens, this is how we find expected diagnostics.
PP.SetCommentRetentionState(true, true); PP.SetCommentRetentionState(true, true);
// Enter the cave. // Enter the cave.
PP.EnterMainSourceFile(MainFileID); PP.EnterMainSourceFile();
// Turn off all warnings from relexing or preprocessing. // Turn off all warnings from relexing or preprocessing.
PP.getDiagnostics().setWarnOnExtensions(false); PP.getDiagnostics().setWarnOnExtensions(false);
@ -225,14 +225,14 @@ static bool CheckResults(Preprocessor &PP,
/// CheckASTConsumer - Implement diagnostic checking for AST consumers. /// CheckASTConsumer - Implement diagnostic checking for AST consumers.
bool clang::CheckASTConsumer(Preprocessor &PP, unsigned MainFileID, bool clang::CheckASTConsumer(Preprocessor &PP, ASTConsumer* C) {
ASTConsumer* C) {
// Parse the AST and run the consumer, ultimately deleting C. // Parse the AST and run the consumer, ultimately deleting C.
ParseAST(PP, MainFileID, C); ParseAST(PP, C);
// Gather the set of expected diagnostics. // Gather the set of expected diagnostics.
DiagList ExpectedErrors, ExpectedWarnings; DiagList ExpectedErrors, ExpectedWarnings;
FindExpectedDiags(PP, MainFileID, ExpectedErrors, ExpectedWarnings); FindExpectedDiags(PP, ExpectedErrors, ExpectedWarnings);
// Check that the expected diagnostics occurred. // Check that the expected diagnostics occurred.
return CheckResults(PP, ExpectedErrors, ExpectedWarnings); return CheckResults(PP, ExpectedErrors, ExpectedWarnings);

Просмотреть файл

@ -531,7 +531,7 @@ bool PrintPPOutputPPCallbacks::AvoidConcat(const Token &PrevTok,
/// DoPrintPreprocessedInput - This implements -E mode. /// DoPrintPreprocessedInput - This implements -E mode.
/// ///
void clang::DoPrintPreprocessedInput(unsigned MainFileID, Preprocessor &PP) { void clang::DoPrintPreprocessedInput(Preprocessor &PP) {
// Inform the preprocessor whether we want it to retain comments or not, due // Inform the preprocessor whether we want it to retain comments or not, due
// to -C or -CC. // to -C or -CC.
PP.SetCommentRetentionState(EnableCommentOutput, EnableMacroCommentOutput); PP.SetCommentRetentionState(EnableCommentOutput, EnableMacroCommentOutput);
@ -550,7 +550,7 @@ void clang::DoPrintPreprocessedInput(unsigned MainFileID, Preprocessor &PP) {
// After we have configured the preprocessor, enter the main file. // After we have configured the preprocessor, enter the main file.
// Start parsing the specified input file. // Start parsing the specified input file.
PP.EnterMainSourceFile(MainFileID); PP.EnterMainSourceFile();
// Consume all of the tokens that come from the predefines buffer. Those // Consume all of the tokens that come from the predefines buffer. Those
// should not be emitted into the output and are guaranteed to be at the // should not be emitted into the output and are guaranteed to be at the

Просмотреть файл

@ -62,7 +62,7 @@ namespace {
static const int OBJC_ABI_VERSION =7 ; static const int OBJC_ABI_VERSION =7 ;
public: public:
void Initialize(ASTContext &context, unsigned mainFileID) { void Initialize(ASTContext &context) {
Context = &context; Context = &context;
SM = &Context->getSourceManager(); SM = &Context->getSourceManager();
MsgSendFunctionDecl = 0; MsgSendFunctionDecl = 0;
@ -81,7 +81,7 @@ namespace {
SuperStructDecl = 0; SuperStructDecl = 0;
// Get the ID and start/end of the main file. // Get the ID and start/end of the main file.
MainFileID = mainFileID; MainFileID = SM->getMainFileID();
const llvm::MemoryBuffer *MainBuf = SM->getBuffer(MainFileID); const llvm::MemoryBuffer *MainBuf = SM->getBuffer(MainFileID);
MainFileStart = MainBuf->getBufferStart(); MainFileStart = MainBuf->getBufferStart();
MainFileEnd = MainBuf->getBufferEnd(); MainFileEnd = MainBuf->getBufferEnd();
@ -123,7 +123,7 @@ namespace {
"extern Protocol *objc_getProtocol(const char *);\n" "extern Protocol *objc_getProtocol(const char *);\n"
"#include <objc/objc.h>\n"; "#include <objc/objc.h>\n";
Rewrite.InsertText(SourceLocation::getFileLoc(mainFileID, 0), Rewrite.InsertText(SourceLocation::getFileLoc(MainFileID, 0),
s, strlen(s)); s, strlen(s));
} }

Просмотреть файл

@ -42,7 +42,7 @@ public:
~SerializationTest(); ~SerializationTest();
virtual void Initialize(ASTContext& context, unsigned) { virtual void Initialize(ASTContext& context) {
TU.setContext(&context); TU.setContext(&context);
} }

Просмотреть файл

@ -878,9 +878,9 @@ static void InitializeIncludePaths(HeaderSearch &Headers, FileManager &FM,
// Basic Parser driver // Basic Parser driver
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
static void ParseFile(Preprocessor &PP, MinimalAction *PA, unsigned MainFileID){ static void ParseFile(Preprocessor &PP, MinimalAction *PA){
Parser P(PP, *PA); Parser P(PP, *PA);
PP.EnterMainSourceFile(MainFileID); PP.EnterMainSourceFile();
// Parsing the specified input file. // Parsing the specified input file.
P.ParseTranslationUnit(); P.ParseTranslationUnit();
@ -963,7 +963,7 @@ static void ProcessInputFile(Preprocessor &PP, const std::string &InFile,
case DumpTokens: { // Token dump mode. case DumpTokens: { // Token dump mode.
Token Tok; Token Tok;
// Start parsing the specified input file. // Start parsing the specified input file.
PP.EnterMainSourceFile(MainFileID); PP.EnterMainSourceFile();
do { do {
PP.Lex(Tok); PP.Lex(Tok);
PP.DumpToken(Tok, true); PP.DumpToken(Tok, true);
@ -975,7 +975,7 @@ static void ProcessInputFile(Preprocessor &PP, const std::string &InFile,
case RunPreprocessorOnly: { // Just lex as fast as we can, no output. case RunPreprocessorOnly: { // Just lex as fast as we can, no output.
Token Tok; Token Tok;
// Start parsing the specified input file. // Start parsing the specified input file.
PP.EnterMainSourceFile(MainFileID); PP.EnterMainSourceFile();
do { do {
PP.Lex(Tok); PP.Lex(Tok);
} while (Tok.isNot(tok::eof)); } while (Tok.isNot(tok::eof));
@ -984,18 +984,17 @@ static void ProcessInputFile(Preprocessor &PP, const std::string &InFile,
} }
case PrintPreprocessedInput: // -E mode. case PrintPreprocessedInput: // -E mode.
DoPrintPreprocessedInput(MainFileID, PP); DoPrintPreprocessedInput(PP);
ClearSourceMgr = true; ClearSourceMgr = true;
break; break;
case ParseNoop: // -parse-noop case ParseNoop: // -parse-noop
ParseFile(PP, new MinimalAction(PP.getIdentifierTable()), MainFileID); ParseFile(PP, new MinimalAction(PP.getIdentifierTable()));
ClearSourceMgr = true; ClearSourceMgr = true;
break; break;
case ParsePrintCallbacks: case ParsePrintCallbacks:
ParseFile(PP, CreatePrintParserActionsAction(PP.getIdentifierTable()), ParseFile(PP, CreatePrintParserActionsAction(PP.getIdentifierTable()));
MainFileID);
ClearSourceMgr = true; ClearSourceMgr = true;
break; break;
@ -1006,10 +1005,10 @@ static void ProcessInputFile(Preprocessor &PP, const std::string &InFile,
if (Consumer) { if (Consumer) {
if (VerifyDiagnostics) if (VerifyDiagnostics)
exit(CheckASTConsumer(PP, MainFileID, Consumer)); exit(CheckASTConsumer(PP, Consumer));
// This deletes Consumer. // This deletes Consumer.
ParseAST(PP, MainFileID, Consumer, Stats); ParseAST(PP, Consumer, Stats);
} }
if (Stats) { if (Stats) {
@ -1062,8 +1061,7 @@ static void ProcessSerializedFile(const std::string& InFile, Diagnostic& Diag,
exit (1); exit (1);
} }
// FIXME: only work on consumers that do not require MainFileID. Consumer->Initialize(*TU->getContext());
Consumer->Initialize(*TU->getContext(), 0);
for (TranslationUnit::iterator I=TU->begin(), E=TU->end(); I!=E; ++I) for (TranslationUnit::iterator I=TU->begin(), E=TU->end(); I!=E; ++I)
Consumer->HandleTopLevelDecl(*I); Consumer->HandleTopLevelDecl(*I);

Просмотреть файл

@ -27,18 +27,17 @@ class IdentifierTable;
class SourceManager; class SourceManager;
/// DoPrintPreprocessedInput - Implement -E mode. /// DoPrintPreprocessedInput - Implement -E mode.
void DoPrintPreprocessedInput(unsigned MainFileID, Preprocessor &PP); void DoPrintPreprocessedInput(Preprocessor &PP);
/// CreatePrintParserActionsAction - Return the actions implementation that /// CreatePrintParserActionsAction - Return the actions implementation that
/// implements the -parse-print-callbacks option. /// implements the -parse-print-callbacks option.
MinimalAction *CreatePrintParserActionsAction(IdentifierTable &); MinimalAction *CreatePrintParserActionsAction(IdentifierTable &);
/// EmitLLVMFromASTs - Implement -emit-llvm, which generates llvm IR from C. /// EmitLLVMFromASTs - Implement -emit-llvm, which generates llvm IR from C.
void EmitLLVMFromASTs(Preprocessor &PP, unsigned MainFileID, void EmitLLVMFromASTs(Preprocessor &PP, bool PrintStats);
bool PrintStats);
/// CheckASTConsumer - Implement diagnostic checking for AST consumers. /// CheckASTConsumer - Implement diagnostic checking for AST consumers.
bool CheckASTConsumer(Preprocessor &PP, unsigned MainFileID, ASTConsumer* C); bool CheckASTConsumer(Preprocessor &PP, ASTConsumer* C);
} // end namespace clang } // end namespace clang

Просмотреть файл

@ -431,7 +431,10 @@ static void InitializePredefinedMacros(Preprocessor &PP,
/// EnterMainSourceFile - Enter the specified FileID as the main source file, /// EnterMainSourceFile - Enter the specified FileID as the main source file,
/// which implicitly adds the builting defines etc. /// which implicitly adds the builting defines etc.
void Preprocessor::EnterMainSourceFile(unsigned MainFileID) { void Preprocessor::EnterMainSourceFile() {
unsigned MainFileID = SourceMgr.getMainFileID();
// Enter the main file source buffer. // Enter the main file source buffer.
EnterSourceFile(MainFileID, 0); EnterSourceFile(MainFileID, 0);

Просмотреть файл

@ -25,9 +25,10 @@ namespace {
class ASTStreamer { class ASTStreamer {
Parser P; Parser P;
public: public:
ASTStreamer(Preprocessor &pp, ASTContext &ctxt, unsigned MainFileID) ASTStreamer(Preprocessor &pp, ASTContext &ctxt)
: P(pp, *new Sema(pp, ctxt)) { : P(pp, *new Sema(pp, ctxt)) {
pp.EnterMainSourceFile(MainFileID);
pp.EnterMainSourceFile();
// Initialize the parser. // Initialize the parser.
P.Initialize(); P.Initialize();
@ -73,8 +74,7 @@ void ASTStreamer::PrintStats() const {
/// ParseAST - Parse the entire file specified, notifying the ASTConsumer as /// ParseAST - Parse the entire file specified, notifying the ASTConsumer as
/// the file is parsed. This takes ownership of the ASTConsumer and /// the file is parsed. This takes ownership of the ASTConsumer and
/// ultimately deletes it. /// ultimately deletes it.
void clang::ParseAST(Preprocessor &PP, unsigned MainFileID, void clang::ParseAST(Preprocessor &PP, ASTConsumer *Consumer, bool PrintStats) {
ASTConsumer *Consumer, bool PrintStats) {
// Collect global stats on Decls/Stmts (until we have a module streamer). // Collect global stats on Decls/Stmts (until we have a module streamer).
if (PrintStats) { if (PrintStats) {
Decl::CollectingStats(true); Decl::CollectingStats(true);
@ -84,9 +84,9 @@ void clang::ParseAST(Preprocessor &PP, unsigned MainFileID,
ASTContext Context(PP.getSourceManager(), PP.getTargetInfo(), ASTContext Context(PP.getSourceManager(), PP.getTargetInfo(),
PP.getIdentifierTable(), PP.getSelectorTable()); PP.getIdentifierTable(), PP.getSelectorTable());
ASTStreamer Streamer(PP, Context, MainFileID); ASTStreamer Streamer(PP, Context);
Consumer->Initialize(Context, MainFileID); Consumer->Initialize(Context);
while (Decl *D = Streamer.ReadTopLevelDecl()) while (Decl *D = Streamer.ReadTopLevelDecl())
Consumer->HandleTopLevelDecl(D); Consumer->HandleTopLevelDecl(D);

Просмотреть файл

@ -26,8 +26,8 @@ public:
virtual ~ASTConsumer(); virtual ~ASTConsumer();
/// Initialize - This is called to initialize the consumer, providing the /// Initialize - This is called to initialize the consumer, providing the
/// ASTContext and the file ID of the primary file. /// ASTContext.
virtual void Initialize(ASTContext &Context, unsigned MainFileID) {} virtual void Initialize(ASTContext &Context) {}
/// HandleTopLevelDecl - Handle the specified top-level declaration. This is /// HandleTopLevelDecl - Handle the specified top-level declaration. This is
/// called by HandleTopLevelDeclaration to process every top-level Decl*. /// called by HandleTopLevelDeclaration to process every top-level Decl*.

Просмотреть файл

@ -217,8 +217,7 @@ public:
/// EnterMainSourceFile - Enter the specified FileID as the main source file, /// EnterMainSourceFile - Enter the specified FileID as the main source file,
/// which implicitly adds the builtin defines etc. /// which implicitly adds the builtin defines etc.
void EnterMainSourceFile(unsigned CurFileID); void EnterMainSourceFile();
/// EnterSourceFile - Add a source file to the top of the include stack and /// EnterSourceFile - Add a source file to the top of the include stack and
/// start lexing tokens from it instead of the current buffer. If isMainFile /// start lexing tokens from it instead of the current buffer. If isMainFile

Просмотреть файл

@ -23,8 +23,7 @@ namespace clang {
/// ParseAST - Parse the entire file specified, notifying the ASTConsumer as /// ParseAST - Parse the entire file specified, notifying the ASTConsumer as
/// the file is parsed. This takes ownership of the ASTConsumer and /// the file is parsed. This takes ownership of the ASTConsumer and
/// ultimately deletes it. /// ultimately deletes it.
void ParseAST(Preprocessor &pp, unsigned MainFileID, void ParseAST(Preprocessor &pp, ASTConsumer *C, bool PrintStats = false);
ASTConsumer *C, bool PrintStats = false);
} // end namespace clang } // end namespace clang
#endif #endif