Update Clang for 3.5 rebase (r209713).
Change-Id: I8c9133b0f8f776dc915f270b60f94962e771bc83
diff --git a/lib/Frontend/ASTUnit.cpp b/lib/Frontend/ASTUnit.cpp
index c4f7596..49487d9 100644
--- a/lib/Frontend/ASTUnit.cpp
+++ b/lib/Frontend/ASTUnit.cpp
@@ -214,14 +214,14 @@
static std::atomic<unsigned> ActiveASTUnitObjects;
ASTUnit::ASTUnit(bool _MainFileIsAST)
- : Reader(0), HadModuleLoaderFatalFailure(false),
+ : Reader(nullptr), HadModuleLoaderFatalFailure(false),
OnlyLocalDecls(false), CaptureDiagnostics(false),
MainFileIsAST(_MainFileIsAST),
TUKind(TU_Complete), WantTiming(getenv("LIBCLANG_TIMING")),
OwnsRemappedFileBuffers(true),
NumStoredDiagnosticsFromDriver(0),
- PreambleRebuildCounter(0), SavedMainFileBuffer(0), PreambleBuffer(0),
- NumWarningsInPreamble(0),
+ PreambleRebuildCounter(0), SavedMainFileBuffer(nullptr),
+ PreambleBuffer(nullptr), NumWarningsInPreamble(0),
ShouldCacheCodeCompletionResults(false),
IncludeBriefCommentsInCodeCompletion(false), UserFilesAreVolatile(false),
CompletionCacheTopLevelHashValue(0),
@@ -493,7 +493,7 @@
void ASTUnit::ClearCachedCompletionResults() {
CachedCompletionResults.clear();
CachedCompletionTypes.clear();
- CachedCompletionAllocator = 0;
+ CachedCompletionAllocator = nullptr;
}
namespace {
@@ -582,10 +582,10 @@
public:
explicit StoredDiagnosticConsumer(
SmallVectorImpl<StoredDiagnostic> &StoredDiags)
- : StoredDiags(StoredDiags), SourceMgr(0) { }
+ : StoredDiags(StoredDiags), SourceMgr(nullptr) {}
void BeginSourceFile(const LangOptions &LangOpts,
- const Preprocessor *PP = 0) override {
+ const Preprocessor *PP = nullptr) override {
if (PP)
SourceMgr = &PP->getSourceManager();
}
@@ -604,9 +604,9 @@
public:
CaptureDroppedDiagnostics(bool RequestCapture, DiagnosticsEngine &Diags,
SmallVectorImpl<StoredDiagnostic> &StoredDiags)
- : Diags(Diags), Client(StoredDiags), PreviousClient(0)
+ : Diags(Diags), Client(StoredDiags), PreviousClient(nullptr)
{
- if (RequestCapture || Diags.getClient() == 0) {
+ if (RequestCapture || Diags.getClient() == nullptr) {
PreviousClient = Diags.takeClient();
Diags.setClient(&Client);
}
@@ -637,13 +637,13 @@
ASTMutationListener *ASTUnit::getASTMutationListener() {
if (WriterData)
return &WriterData->Writer;
- return 0;
+ return nullptr;
}
ASTDeserializationListener *ASTUnit::getDeserializationListener() {
if (WriterData)
return &WriterData->Writer;
- return 0;
+ return nullptr;
}
llvm::MemoryBuffer *ASTUnit::getBufferForFile(StringRef Filename,
@@ -659,7 +659,7 @@
if (!Diags.getPtr()) {
// No diagnostics engine was provided, so create our own diagnostics object
// with the default options.
- DiagnosticConsumer *Client = 0;
+ DiagnosticConsumer *Client = nullptr;
if (CaptureDiagnostics)
Client = new StoredDiagnosticConsumer(AST.StoredDiagnostics);
Diags = CompilerInstance::createDiagnostics(new DiagnosticOptions(),
@@ -687,23 +687,24 @@
llvm::CrashRecoveryContextReleaseRefCleanup<DiagnosticsEngine> >
DiagCleanup(Diags.getPtr());
- ConfigureDiags(Diags, 0, 0, *AST, CaptureDiagnostics);
+ ConfigureDiags(Diags, nullptr, nullptr, *AST, CaptureDiagnostics);
AST->OnlyLocalDecls = OnlyLocalDecls;
AST->CaptureDiagnostics = CaptureDiagnostics;
AST->Diagnostics = Diags;
- AST->FileMgr = new FileManager(FileSystemOpts);
+ IntrusiveRefCntPtr<vfs::FileSystem> VFS = vfs::getRealFileSystem();
+ AST->FileMgr = new FileManager(FileSystemOpts, VFS);
AST->UserFilesAreVolatile = UserFilesAreVolatile;
AST->SourceMgr = new SourceManager(AST->getDiagnostics(),
AST->getFileManager(),
UserFilesAreVolatile);
AST->HSOpts = new HeaderSearchOptions();
-
+
AST->HeaderInfo.reset(new HeaderSearch(AST->HSOpts,
AST->getSourceManager(),
AST->getDiagnostics(),
AST->ASTFileLangOpts,
- /*Target=*/0));
+ /*Target=*/nullptr));
PreprocessorOptions *PPOpts = new PreprocessorOptions();
@@ -715,23 +716,16 @@
HeaderSearch &HeaderInfo = *AST->HeaderInfo.get();
unsigned Counter;
- AST->PP = new Preprocessor(PPOpts,
- AST->getDiagnostics(), AST->ASTFileLangOpts,
- /*Target=*/0, AST->getSourceManager(), HeaderInfo,
- *AST,
- /*IILookup=*/0,
- /*OwnsHeaderSearch=*/false,
- /*DelayInitialization=*/true);
+ AST->PP =
+ new Preprocessor(PPOpts, AST->getDiagnostics(), AST->ASTFileLangOpts,
+ AST->getSourceManager(), HeaderInfo, *AST,
+ /*IILookup=*/nullptr,
+ /*OwnsHeaderSearch=*/false);
Preprocessor &PP = *AST->PP;
- AST->Ctx = new ASTContext(AST->ASTFileLangOpts,
- AST->getSourceManager(),
- /*Target=*/0,
- PP.getIdentifierTable(),
- PP.getSelectorTable(),
- PP.getBuiltinInfo(),
- /* size_reserve = */0,
- /*DelayInitialization=*/true);
+ AST->Ctx = new ASTContext(AST->ASTFileLangOpts, AST->getSourceManager(),
+ PP.getIdentifierTable(), PP.getSelectorTable(),
+ PP.getBuiltinInfo());
ASTContext &Context = *AST->Ctx;
bool disableValid = false;
@@ -759,7 +753,7 @@
case ASTReader::ConfigurationMismatch:
case ASTReader::HadErrors:
AST->getDiagnostics().Report(diag::err_fe_unable_to_load_pch);
- return NULL;
+ return nullptr;
}
AST->OriginalSourceFile = AST->Reader->getOriginalSourceFile();
@@ -951,7 +945,7 @@
PrecompilePreambleConsumer(ASTUnit &Unit, PrecompilePreambleAction *Action,
const Preprocessor &PP, StringRef isysroot,
raw_ostream *Out)
- : PCHGenerator(PP, "", 0, isysroot, Out, /*AllowASTWithErrors=*/true),
+ : PCHGenerator(PP, "", nullptr, isysroot, Out, /*AllowASTWithErrors=*/true),
Unit(Unit), Hash(Unit.getCurrentTopLevelHashValue()), Action(Action) {
Hash = 0;
}
@@ -997,10 +991,10 @@
StringRef InFile) {
std::string Sysroot;
std::string OutputFile;
- raw_ostream *OS = 0;
+ raw_ostream *OS = nullptr;
if (GeneratePCHAction::ComputeASTConsumerArguments(CI, InFile, Sysroot,
OutputFile, OS))
- return 0;
+ return nullptr;
if (!CI.getFrontendOpts().RelocatablePCH)
Sysroot.clear();
@@ -1047,8 +1041,8 @@
/// contain any translation-unit information, false otherwise.
bool ASTUnit::Parse(llvm::MemoryBuffer *OverrideMainBuffer) {
delete SavedMainFileBuffer;
- SavedMainFileBuffer = 0;
-
+ SavedMainFileBuffer = nullptr;
+
if (!Invocation) {
delete OverrideMainBuffer;
return true;
@@ -1093,17 +1087,16 @@
"IR inputs not support here!");
// Configure the various subsystems.
- // FIXME: Should we retain the previous file manager?
LangOpts = &Clang->getLangOpts();
FileSystemOpts = Clang->getFileSystemOpts();
- FileMgr = new FileManager(FileSystemOpts);
+ // Re-use the existing FileManager
SourceMgr = new SourceManager(getDiagnostics(), *FileMgr,
UserFilesAreVolatile);
TheSema.reset();
- Ctx = 0;
- PP = 0;
- Reader = 0;
-
+ Ctx = nullptr;
+ PP = nullptr;
+ Reader = nullptr;
+
// Clear out old caches and data.
TopLevelDecls.clear();
clearFileLevelDecls();
@@ -1173,7 +1166,7 @@
// Remove the overridden buffer we used for the preamble.
if (OverrideMainBuffer) {
delete OverrideMainBuffer;
- SavedMainFileBuffer = 0;
+ SavedMainFileBuffer = nullptr;
}
// Keep the ownership of the data in the ASTUnit because the client may
@@ -1213,7 +1206,7 @@
// Try to determine if the main file has been remapped, either from the
// command line (to another file) or directly through the compiler invocation
// (to a memory buffer).
- llvm::MemoryBuffer *Buffer = 0;
+ llvm::MemoryBuffer *Buffer = nullptr;
std::string MainFilePath(FrontendOpts.Inputs[0].getFile());
llvm::sys::fs::UniqueID MainFileID;
if (!llvm::sys::fs::getUniqueID(MainFilePath, MainFileID)) {
@@ -1235,8 +1228,7 @@
Buffer = getBufferForFile(M->second);
if (!Buffer)
- return std::make_pair((llvm::MemoryBuffer*)0,
- std::make_pair(0, true));
+ return std::make_pair(nullptr, std::make_pair(0, true));
CreatedBuffer = true;
}
}
@@ -1269,8 +1261,8 @@
if (!Buffer) {
Buffer = getBufferForFile(FrontendOpts.Inputs[0].getFile());
if (!Buffer)
- return std::make_pair((llvm::MemoryBuffer*)0, std::make_pair(0, true));
-
+ return std::make_pair(nullptr, std::make_pair(0, true));
+
CreatedBuffer = true;
}
@@ -1404,7 +1396,7 @@
// The next time we actually see a preamble, precompile it.
PreambleRebuildCounter = 1;
- return 0;
+ return nullptr;
}
if (!Preamble.empty()) {
@@ -1494,7 +1486,7 @@
// If we aren't allowed to rebuild the precompiled preamble, just
// return now.
if (!AllowRebuild)
- return 0;
+ return nullptr;
// We can't reuse the previously-computed preamble. Build a new one.
Preamble.clear();
@@ -1504,7 +1496,7 @@
} else if (!AllowRebuild) {
// We aren't allowed to rebuild the precompiled preamble; just
// return now.
- return 0;
+ return nullptr;
}
// If the preamble rebuild counter > 1, it's because we previously
@@ -1512,7 +1504,7 @@
// again. Decrement the counter and return a failure.
if (PreambleRebuildCounter > 1) {
--PreambleRebuildCounter;
- return 0;
+ return nullptr;
}
// Create a temporary file for the precompiled preamble. In rare
@@ -1521,7 +1513,7 @@
if (PreamblePCHPath.empty()) {
// Try again next time.
PreambleRebuildCounter = 1;
- return 0;
+ return nullptr;
}
// We did not previously compute a preamble, or it can't be reused anyway.
@@ -1575,7 +1567,7 @@
PreambleRebuildCounter = DefaultPreambleRebuildInterval;
PreprocessorOpts.eraseRemappedFile(
PreprocessorOpts.remapped_file_buffer_end() - 1);
- return 0;
+ return nullptr;
}
// Inform the target of the language options.
@@ -1598,9 +1590,14 @@
TopLevelDecls.clear();
TopLevelDeclsInPreamble.clear();
PreambleDiagnostics.clear();
-
+
+ IntrusiveRefCntPtr<vfs::FileSystem> VFS =
+ createVFSFromCompilerInvocation(Clang->getInvocation(), getDiagnostics());
+ if (!VFS)
+ return nullptr;
+
// Create a file manager object to provide access to and cache the filesystem.
- Clang->setFileManager(new FileManager(Clang->getFileSystemOpts()));
+ Clang->setFileManager(new FileManager(Clang->getFileSystemOpts(), VFS));
// Create the source manager.
Clang->setSourceManager(new SourceManager(getDiagnostics(),
@@ -1614,7 +1611,7 @@
PreambleRebuildCounter = DefaultPreambleRebuildInterval;
PreprocessorOpts.eraseRemappedFile(
PreprocessorOpts.remapped_file_buffer_end() - 1);
- return 0;
+ return nullptr;
}
Act->Execute();
@@ -1643,7 +1640,7 @@
PreambleRebuildCounter = DefaultPreambleRebuildInterval;
PreprocessorOpts.eraseRemappedFile(
PreprocessorOpts.remapped_file_buffer_end() - 1);
- return 0;
+ return nullptr;
}
// Keep track of the preamble we precompiled.
@@ -1709,14 +1706,20 @@
}
void ASTUnit::transferASTDataFromCompilerInstance(CompilerInstance &CI) {
- // Steal the created target, context, and preprocessor.
+ // Steal the created target, context, and preprocessor if they have been
+ // created.
+ assert(CI.hasInvocation() && "missing invocation");
+ LangOpts = CI.getInvocation().getLangOpts();
TheSema.reset(CI.takeSema());
Consumer.reset(CI.takeASTConsumer());
- Ctx = &CI.getASTContext();
- PP = &CI.getPreprocessor();
- CI.setSourceManager(0);
- CI.setFileManager(0);
- Target = &CI.getTarget();
+ if (CI.hasASTContext())
+ Ctx = &CI.getASTContext();
+ if (CI.hasPreprocessor())
+ PP = &CI.getPreprocessor();
+ CI.setSourceManager(nullptr);
+ CI.setFileManager(nullptr);
+ if (CI.hasTarget())
+ Target = &CI.getTarget();
Reader = CI.getModuleManager();
HadModuleLoaderFatalFailure = CI.hadModuleLoaderFatalFailure();
}
@@ -1754,11 +1757,15 @@
bool UserFilesAreVolatile) {
std::unique_ptr<ASTUnit> AST;
AST.reset(new ASTUnit(false));
- ConfigureDiags(Diags, 0, 0, *AST, CaptureDiagnostics);
+ ConfigureDiags(Diags, nullptr, nullptr, *AST, CaptureDiagnostics);
AST->Diagnostics = Diags;
AST->Invocation = CI;
AST->FileSystemOpts = CI->getFileSystemOpts();
- AST->FileMgr = new FileManager(AST->FileSystemOpts);
+ IntrusiveRefCntPtr<vfs::FileSystem> VFS =
+ createVFSFromCompilerInvocation(*CI, *Diags);
+ if (!VFS)
+ return nullptr;
+ AST->FileMgr = new FileManager(AST->FileSystemOpts, VFS);
AST->UserFilesAreVolatile = UserFilesAreVolatile;
AST->SourceMgr = new SourceManager(AST->getDiagnostics(), *AST->FileMgr,
UserFilesAreVolatile);
@@ -1781,6 +1788,8 @@
// Create the AST unit.
OwnAST.reset(create(CI, Diags, CaptureDiagnostics, UserFilesAreVolatile));
AST = OwnAST.get();
+ if (!AST)
+ return nullptr;
}
if (!ResourceFilesPath.empty()) {
@@ -1826,7 +1835,7 @@
Clang->setTarget(TargetInfo::CreateTargetInfo(Clang->getDiagnostics(),
&Clang->getTargetOpts()));
if (!Clang->hasTarget())
- return 0;
+ return nullptr;
// Inform the target of the language options.
//
@@ -1843,10 +1852,10 @@
// Configure the various subsystems.
AST->TheSema.reset();
- AST->Ctx = 0;
- AST->PP = 0;
- AST->Reader = 0;
-
+ AST->Ctx = nullptr;
+ AST->PP = nullptr;
+ AST->Reader = nullptr;
+
// Create a file manager object to provide access to and cache the filesystem.
Clang->setFileManager(&AST->getFileManager());
@@ -1870,7 +1879,7 @@
if (OwnAST && ErrAST)
ErrAST->swap(OwnAST);
- return 0;
+ return nullptr;
}
if (Persistent && !TrackerAct) {
@@ -1888,7 +1897,7 @@
if (OwnAST && ErrAST)
ErrAST->swap(OwnAST);
- return 0;
+ return nullptr;
}
// Steal the created target, context, and preprocessor.
@@ -1911,7 +1920,7 @@
Invocation->getFrontendOpts().DisableFree = false;
ProcessWarningOptions(getDiagnostics(), Invocation->getDiagnosticOpts());
- llvm::MemoryBuffer *OverrideMainBuffer = 0;
+ llvm::MemoryBuffer *OverrideMainBuffer = nullptr;
if (PrecompilePreamble) {
PreambleRebuildCounter = 2;
OverrideMainBuffer
@@ -1928,19 +1937,14 @@
return Parse(OverrideMainBuffer);
}
-ASTUnit *ASTUnit::LoadFromCompilerInvocation(CompilerInvocation *CI,
- IntrusiveRefCntPtr<DiagnosticsEngine> Diags,
- bool OnlyLocalDecls,
- bool CaptureDiagnostics,
- bool PrecompilePreamble,
- TranslationUnitKind TUKind,
- bool CacheCodeCompletionResults,
- bool IncludeBriefCommentsInCodeCompletion,
- bool UserFilesAreVolatile) {
+std::unique_ptr<ASTUnit> ASTUnit::LoadFromCompilerInvocation(
+ CompilerInvocation *CI, IntrusiveRefCntPtr<DiagnosticsEngine> Diags,
+ bool OnlyLocalDecls, bool CaptureDiagnostics, bool PrecompilePreamble,
+ TranslationUnitKind TUKind, bool CacheCodeCompletionResults,
+ bool IncludeBriefCommentsInCodeCompletion, bool UserFilesAreVolatile) {
// Create the AST unit.
- std::unique_ptr<ASTUnit> AST;
- AST.reset(new ASTUnit(false));
- ConfigureDiags(Diags, 0, 0, *AST, CaptureDiagnostics);
+ std::unique_ptr<ASTUnit> AST(new ASTUnit(false));
+ ConfigureDiags(Diags, nullptr, nullptr, *AST, CaptureDiagnostics);
AST->Diagnostics = Diags;
AST->OnlyLocalDecls = OnlyLocalDecls;
AST->CaptureDiagnostics = CaptureDiagnostics;
@@ -1950,7 +1954,11 @@
= IncludeBriefCommentsInCodeCompletion;
AST->Invocation = CI;
AST->FileSystemOpts = CI->getFileSystemOpts();
- AST->FileMgr = new FileManager(AST->FileSystemOpts);
+ IntrusiveRefCntPtr<vfs::FileSystem> VFS =
+ createVFSFromCompilerInvocation(*CI, *Diags);
+ if (!VFS)
+ return nullptr;
+ AST->FileMgr = new FileManager(AST->FileSystemOpts, VFS);
AST->UserFilesAreVolatile = UserFilesAreVolatile;
// Recover resources if we crash before exiting this method.
@@ -1960,8 +1968,9 @@
llvm::CrashRecoveryContextReleaseRefCleanup<DiagnosticsEngine> >
DiagCleanup(Diags.getPtr());
- return AST->LoadFromCompilerInvocation(PrecompilePreamble) ? 0
- : AST.release();
+ if (AST->LoadFromCompilerInvocation(PrecompilePreamble))
+ return nullptr;
+ return AST;
}
ASTUnit *ASTUnit::LoadFromCommandLine(
@@ -1993,7 +2002,7 @@
llvm::makeArrayRef(ArgBegin, ArgEnd),
Diags);
if (!CI)
- return 0;
+ return nullptr;
}
// Override any files that need remapping
@@ -2015,9 +2024,13 @@
AST.reset(new ASTUnit(false));
ConfigureDiags(Diags, ArgBegin, ArgEnd, *AST, CaptureDiagnostics);
AST->Diagnostics = Diags;
- Diags = 0; // Zero out now to ease cleanup during crash recovery.
+ Diags = nullptr; // Zero out now to ease cleanup during crash recovery.
AST->FileSystemOpts = CI->getFileSystemOpts();
- AST->FileMgr = new FileManager(AST->FileSystemOpts);
+ IntrusiveRefCntPtr<vfs::FileSystem> VFS =
+ createVFSFromCompilerInvocation(*CI, *Diags);
+ if (!VFS)
+ return nullptr;
+ AST->FileMgr = new FileManager(AST->FileSystemOpts, VFS);
AST->OnlyLocalDecls = OnlyLocalDecls;
AST->CaptureDiagnostics = CaptureDiagnostics;
AST->TUKind = TUKind;
@@ -2030,8 +2043,8 @@
AST->Invocation = CI;
if (ForSerialization)
AST->WriterData.reset(new ASTWriterData());
- CI = 0; // Zero out now to ease cleanup during crash recovery.
-
+ CI = nullptr; // Zero out now to ease cleanup during crash recovery.
+
// Recover resources if we crash before exiting this method.
llvm::CrashRecoveryContextCleanupRegistrar<ASTUnit>
ASTUnitCleanup(AST.get());
@@ -2043,7 +2056,7 @@
AST->StoredDiagnostics.swap(AST->FailedParseDiagnostics);
ErrAST->swap(AST);
}
- return 0;
+ return nullptr;
}
return AST.release();
@@ -2075,7 +2088,7 @@
// If we have a preamble file lying around, or if we might try to
// build a precompiled preamble, do so now.
- llvm::MemoryBuffer *OverrideMainBuffer = 0;
+ llvm::MemoryBuffer *OverrideMainBuffer = nullptr;
if (!getPreambleFile(this).empty() || PreambleRebuildCounter > 0)
OverrideMainBuffer = getMainBufferWithPrecompiledPreamble(*Invocation);
@@ -2399,7 +2412,7 @@
Clang->setTarget(TargetInfo::CreateTargetInfo(Clang->getDiagnostics(),
&Clang->getTargetOpts()));
if (!Clang->hasTarget()) {
- Clang->setInvocation(0);
+ Clang->setInvocation(nullptr);
return;
}
@@ -2440,7 +2453,7 @@
// the use of the precompiled preamble if we're if the completion
// point is within the main file, after the end of the precompiled
// preamble.
- llvm::MemoryBuffer *OverrideMainBuffer = 0;
+ llvm::MemoryBuffer *OverrideMainBuffer = nullptr;
if (!getPreambleFile(this).empty()) {
std::string CompleteFilePath(File);
llvm::sys::fs::UniqueID CompleteFileID;
@@ -2522,7 +2535,7 @@
Sema &S,
bool hasErrors,
raw_ostream &OS) {
- Writer.WriteAST(S, std::string(), 0, "", hasErrors);
+ Writer.WriteAST(S, std::string(), nullptr, "", hasErrors);
// Write the generated bitstream to "Out".
if (!Buffer.empty())
@@ -2663,7 +2676,8 @@
LocDeclsTy::iterator BeginIt =
std::lower_bound(LocDecls.begin(), LocDecls.end(),
- std::make_pair(Offset, (Decl *)0), llvm::less_first());
+ std::make_pair(Offset, (Decl *)nullptr),
+ llvm::less_first());
if (BeginIt != LocDecls.begin())
--BeginIt;
@@ -2676,7 +2690,7 @@
LocDeclsTy::iterator EndIt = std::upper_bound(
LocDecls.begin(), LocDecls.end(),
- std::make_pair(Offset + Length, (Decl *)0), llvm::less_first());
+ std::make_pair(Offset + Length, (Decl *)nullptr), llvm::less_first());
if (EndIt != LocDecls.end())
++EndIt;
@@ -2826,7 +2840,7 @@
namespace {
struct PCHLocatorInfo {
serialization::ModuleFile *Mod;
- PCHLocatorInfo() : Mod(0) {}
+ PCHLocatorInfo() : Mod(nullptr) {}
};
}
@@ -2849,14 +2863,14 @@
const FileEntry *ASTUnit::getPCHFile() {
if (!Reader)
- return 0;
+ return nullptr;
PCHLocatorInfo Info;
Reader->getModuleManager().visit(PCHLocator, &Info);
if (Info.Mod)
return Info.Mod->File;
- return 0;
+ return nullptr;
}
bool ASTUnit::isModuleFile() {