aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMeador Inge <meadori@codesourcery.com>2012-06-19 18:17:30 +0000
committerMeador Inge <meadori@codesourcery.com>2012-06-19 18:17:30 +0000
commit9416d42468eacaae0ea85ab8ed134f5df1a1d142 (patch)
tree38bb09ff9453e85f58ee314cf76886c9c957662e
parentb5aa17c5a118d371db49eb0af8866829b1aff678 (diff)
Revert predefined decl tracking.
r158085 added some logic to track predefined declarations. The main reason we had predefined declarations in the input was because the __builtin_va_list declarations were injected into the preprocessor input. As of r158592 we explicitly build the __builtin_va_list declarations. Therefore the predefined decl tracking is no longer needed. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@158732 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/clang/Basic/SourceManager.h20
-rw-r--r--lib/Basic/SourceManager.cpp1
-rw-r--r--lib/Lex/Preprocessor.cpp2
-rw-r--r--lib/Parse/ParseAST.cpp44
4 files changed, 12 insertions, 55 deletions
diff --git a/include/clang/Basic/SourceManager.h b/include/clang/Basic/SourceManager.h
index 8eb386b8dc..603bfebfd3 100644
--- a/include/clang/Basic/SourceManager.h
+++ b/include/clang/Basic/SourceManager.h
@@ -591,9 +591,6 @@ class SourceManager : public RefCountedBase<SourceManager> {
/// \brief The file ID for the precompiled preamble there is one.
FileID PreambleFileID;
- /// \brief The file ID for the preprocessor's predefines.
- FileID PredefinesFileID;
-
// Statistics for -print-stats.
mutable unsigned NumLinearScans, NumBinaryProbes;
@@ -638,14 +635,6 @@ public:
MainFileID = createFileIDForMemBuffer(Buffer);
return MainFileID;
}
-
- /// \brief Create the FileID for a memory buffer that contains the
- /// preprocessor's predefines.
- FileID createPredefinesFileIDForMemBuffer(const llvm::MemoryBuffer *Buffer) {
- assert(PredefinesFileID.isInvalid() && "PredefinesFileID already set!");
- PredefinesFileID = createFileIDForMemBuffer(Buffer);
- return PredefinesFileID;
- }
//===--------------------------------------------------------------------===//
// MainFileID creation and querying methods.
@@ -654,9 +643,6 @@ public:
/// getMainFileID - Returns the FileID of the main source file.
FileID getMainFileID() const { return MainFileID; }
- /// \brief Returns the FileID of the preprocessor predefines buffer.
- FileID getPredefinesFileID() const { return PredefinesFileID; }
-
/// createMainFileID - Create the FileID for the main source file.
FileID createMainFileID(const FileEntry *SourceFile,
SrcMgr::CharacteristicKind Kind = SrcMgr::C_User) {
@@ -1138,12 +1124,6 @@ public:
return getFileID(Loc) == getMainFileID();
}
- /// isFromPredefines - Returns true if the provided SourceLocation is
- /// within the processor's predefines buffer.
- bool isFromPredefines(SourceLocation Loc) const {
- return getFileID(Loc) == getPredefinesFileID();
- }
-
/// isInSystemHeader - Returns if a SourceLocation is in a system header.
bool isInSystemHeader(SourceLocation Loc) const {
return getFileCharacteristic(Loc) != SrcMgr::C_User;
diff --git a/lib/Basic/SourceManager.cpp b/lib/Basic/SourceManager.cpp
index 24bd51928c..6ddc2880a0 100644
--- a/lib/Basic/SourceManager.cpp
+++ b/lib/Basic/SourceManager.cpp
@@ -407,7 +407,6 @@ SourceManager::~SourceManager() {
void SourceManager::clearIDTables() {
MainFileID = FileID();
- PredefinesFileID = FileID();
LocalSLocEntryTable.clear();
LoadedSLocEntryTable.clear();
SLocEntryLoaded.clear();
diff --git a/lib/Lex/Preprocessor.cpp b/lib/Lex/Preprocessor.cpp
index b420c6cd1d..5509f5f4e8 100644
--- a/lib/Lex/Preprocessor.cpp
+++ b/lib/Lex/Preprocessor.cpp
@@ -427,7 +427,7 @@ void Preprocessor::EnterMainSourceFile() {
llvm::MemoryBuffer *SB =
llvm::MemoryBuffer::getMemBufferCopy(Predefines, "<built-in>");
assert(SB && "Cannot create predefined source buffer");
- FileID FID = SourceMgr.createPredefinesFileIDForMemBuffer(SB);
+ FileID FID = SourceMgr.createFileIDForMemBuffer(SB);
assert(!FID.isInvalid() && "Could not create FileID for predefines?");
// Start parsing the predefines.
diff --git a/lib/Parse/ParseAST.cpp b/lib/Parse/ParseAST.cpp
index 3f86c4d2c8..c50c1c980e 100644
--- a/lib/Parse/ParseAST.cpp
+++ b/lib/Parse/ParseAST.cpp
@@ -83,46 +83,24 @@ void clang::ParseAST(Sema &S, bool PrintStats, bool SkipFunctionBodies) {
// declaration. C++ doesn't have this restriction. We also don't want to
// complain if we have a precompiled header, although technically if the PCH
// is empty we should still emit the (pedantic) diagnostic.
- bool WarnForEmptyTU = !S.getLangOpts().CPlusPlus;
- if (ExternalASTSource *External = S.getASTContext().getExternalSource()) {
- External->StartTranslationUnit(Consumer);
- WarnForEmptyTU = false;
- }
-
- // Clang's predefines contain top-level declarations for things like va_list,
- // making it hard to tell if the /user's/ translation unit has at least one
- // top-level declaration. So we parse cautiously, looking for a declaration
- // that doesn't come from our predefines.
- // Note that ParseTopLevelDecl returns 'true' at EOF.
- SourceManager &SM = S.getSourceManager();
Parser::DeclGroupPtrTy ADecl;
- while (WarnForEmptyTU && !P.ParseTopLevelDecl(ADecl)) {
- if (ADecl) {
- if (!Consumer->HandleTopLevelDecl(ADecl.get()))
- return;
- if (DeclGroupRef::iterator FirstDecl = ADecl.get().begin()) {
- SourceLocation DeclLoc = (*FirstDecl)->getLocation();
- WarnForEmptyTU = SM.isFromPredefines(DeclLoc);
- }
- }
- }
+ ExternalASTSource *External = S.getASTContext().getExternalSource();
+ if (External)
+ External->StartTranslationUnit(Consumer);
- // If we ended up seeing EOF before any top-level declarations, emit our
- // diagnostic. Otherwise, parse the rest of the file normally.
- if (WarnForEmptyTU) {
- P.Diag(diag::ext_empty_translation_unit);
+ if (P.ParseTopLevelDecl(ADecl)) {
+ if (!External && !S.getLangOpts().CPlusPlus)
+ P.Diag(diag::ext_empty_translation_unit);
} else {
- while (!P.ParseTopLevelDecl(ADecl)) { // Not end of file.
+ do {
// If we got a null return and something *was* parsed, ignore it. This
// is due to a top-level semicolon, an action override, or a parse error
// skipping something.
- if (ADecl) {
- if (!Consumer->HandleTopLevelDecl(ADecl.get()))
- return;
- }
- };
+ if (ADecl && !Consumer->HandleTopLevelDecl(ADecl.get()))
+ return;
+ } while (!P.ParseTopLevelDecl(ADecl));
}
-
+
// Process any TopLevelDecls generated by #pragma weak.
for (SmallVector<Decl*,2>::iterator
I = S.WeakTopLevelDecls().begin(),