From: Alp Toker Date: Mon, 7 Jul 2014 01:23:14 +0000 (+0000) Subject: libclang: refactor handling of unsaved_files X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=9d85b18f91a7596934f7928eccca828698635139;p=platform%2Fupstream%2Fllvm.git libclang: refactor handling of unsaved_files Consolidate CXUnsavedFile argument handling in API functions to support a wider cleanup of various file remapping schemes in the frontend. llvm-svn: 212427 --- diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp index f008cfc..06f2d47 100644 --- a/clang/tools/libclang/CIndex.cpp +++ b/clang/tools/libclang/CIndex.cpp @@ -2727,21 +2727,18 @@ struct ParseTranslationUnitInfo { const char *source_filename; const char *const *command_line_args; int num_command_line_args; - struct CXUnsavedFile *unsaved_files; - unsigned num_unsaved_files; + ArrayRef unsaved_files; unsigned options; CXTranslationUnit *out_TU; - CXErrorCode result; + mutable CXErrorCode result; }; static void clang_parseTranslationUnit_Impl(void *UserData) { - ParseTranslationUnitInfo *PTUI = - static_cast(UserData); + const ParseTranslationUnitInfo *PTUI = + static_cast(UserData); CXIndex CIdx = PTUI->CIdx; const char *source_filename = PTUI->source_filename; const char * const *command_line_args = PTUI->command_line_args; int num_command_line_args = PTUI->num_command_line_args; - struct CXUnsavedFile *unsaved_files = PTUI->unsaved_files; - unsigned num_unsaved_files = PTUI->num_unsaved_files; unsigned options = PTUI->options; CXTranslationUnit *out_TU = PTUI->out_TU; @@ -2751,8 +2748,7 @@ static void clang_parseTranslationUnit_Impl(void *UserData) { PTUI->result = CXError_Failure; // Check arguments. - if (!CIdx || !out_TU || - (unsaved_files == nullptr && num_unsaved_files != 0)) { + if (!CIdx || !out_TU) { PTUI->result = CXError_InvalidArguments; return; } @@ -2789,12 +2785,10 @@ static void clang_parseTranslationUnit_Impl(void *UserData) { llvm::CrashRecoveryContextCleanupRegistrar< std::vector > RemappedCleanup(RemappedFiles.get()); - for (unsigned I = 0; I != num_unsaved_files; ++I) { - StringRef Data(unsaved_files[I].Contents, unsaved_files[I].Length); - llvm::MemoryBuffer *Buffer = - llvm::MemoryBuffer::getMemBufferCopy(Data, unsaved_files[I].Filename); - RemappedFiles->push_back(std::make_pair(unsaved_files[I].Filename, - Buffer)); + for (auto &UF : PTUI->unsaved_files) { + llvm::MemoryBuffer *MB = + llvm::MemoryBuffer::getMemBufferCopy(getContents(UF), UF.Filename); + RemappedFiles->push_back(std::make_pair(UF.Filename, MB)); } std::unique_ptr> Args( @@ -2895,10 +2889,18 @@ enum CXErrorCode clang_parseTranslationUnit2( *Log << command_line_args[i] << " "; } - ParseTranslationUnitInfo PTUI = { CIdx, source_filename, command_line_args, - num_command_line_args, unsaved_files, - num_unsaved_files, options, out_TU, - CXError_Failure }; + if (num_unsaved_files && !unsaved_files) + return CXError_InvalidArguments; + + ParseTranslationUnitInfo PTUI = { + CIdx, + source_filename, + command_line_args, + num_command_line_args, + llvm::makeArrayRef(unsaved_files, num_unsaved_files), + options, + out_TU, + CXError_Failure}; llvm::CrashRecoveryContext CRC; if (!RunSafely(CRC, clang_parseTranslationUnit_Impl, &PTUI)) { @@ -3029,20 +3031,17 @@ unsigned clang_defaultReparseOptions(CXTranslationUnit TU) { struct ReparseTranslationUnitInfo { CXTranslationUnit TU; - unsigned num_unsaved_files; - struct CXUnsavedFile *unsaved_files; + ArrayRef unsaved_files; unsigned options; - int result; + mutable int result; }; static void clang_reparseTranslationUnit_Impl(void *UserData) { - ReparseTranslationUnitInfo *RTUI = - static_cast(UserData); + const ReparseTranslationUnitInfo *RTUI = + static_cast(UserData); RTUI->result = CXError_Failure; CXTranslationUnit TU = RTUI->TU; - unsigned num_unsaved_files = RTUI->num_unsaved_files; - struct CXUnsavedFile *unsaved_files = RTUI->unsaved_files; unsigned options = RTUI->options; (void) options; @@ -3052,10 +3051,6 @@ static void clang_reparseTranslationUnit_Impl(void *UserData) { RTUI->result = CXError_InvalidArguments; return; } - if (unsaved_files == nullptr && num_unsaved_files != 0) { - RTUI->result = CXError_InvalidArguments; - return; - } // Reset the associated diagnostics. delete static_cast(TU->Diagnostics); @@ -3074,13 +3069,11 @@ static void clang_reparseTranslationUnit_Impl(void *UserData) { // Recover resources if we crash before exiting this function. llvm::CrashRecoveryContextCleanupRegistrar< std::vector > RemappedCleanup(RemappedFiles.get()); - - for (unsigned I = 0; I != num_unsaved_files; ++I) { - StringRef Data(unsaved_files[I].Contents, unsaved_files[I].Length); - llvm::MemoryBuffer *Buffer = - llvm::MemoryBuffer::getMemBufferCopy(Data, unsaved_files[I].Filename); - RemappedFiles->push_back(std::make_pair(unsaved_files[I].Filename, - Buffer)); + + for (auto &UF : RTUI->unsaved_files) { + llvm::MemoryBuffer *MB = + llvm::MemoryBuffer::getMemBufferCopy(getContents(UF), UF.Filename); + RemappedFiles->push_back(std::make_pair(UF.Filename, MB)); } if (!CXXUnit->Reparse(*RemappedFiles.get())) @@ -3097,8 +3090,12 @@ int clang_reparseTranslationUnit(CXTranslationUnit TU, *Log << TU; } - ReparseTranslationUnitInfo RTUI = { TU, num_unsaved_files, unsaved_files, - options, CXError_Failure }; + if (num_unsaved_files && !unsaved_files) + return CXError_InvalidArguments; + + ReparseTranslationUnitInfo RTUI = { + TU, llvm::makeArrayRef(unsaved_files, num_unsaved_files), options, + CXError_Failure}; if (getenv("LIBCLANG_NOTHREADS")) { clang_reparseTranslationUnit_Impl(&RTUI); diff --git a/clang/tools/libclang/CIndexCodeCompletion.cpp b/clang/tools/libclang/CIndexCodeCompletion.cpp index 9dd2dfe..0d88003 100644 --- a/clang/tools/libclang/CIndexCodeCompletion.cpp +++ b/clang/tools/libclang/CIndexCodeCompletion.cpp @@ -651,8 +651,7 @@ struct CodeCompleteAtInfo { const char *complete_filename; unsigned complete_line; unsigned complete_column; - struct CXUnsavedFile *unsaved_files; - unsigned num_unsaved_files; + ArrayRef unsaved_files; unsigned options; CXCodeCompleteResults *result; }; @@ -662,8 +661,6 @@ void clang_codeCompleteAt_Impl(void *UserData) { const char *complete_filename = CCAI->complete_filename; unsigned complete_line = CCAI->complete_line; unsigned complete_column = CCAI->complete_column; - struct CXUnsavedFile *unsaved_files = CCAI->unsaved_files; - unsigned num_unsaved_files = CCAI->num_unsaved_files; unsigned options = CCAI->options; bool IncludeBriefComments = options & CXCodeComplete_IncludeBriefComments; CCAI->result = nullptr; @@ -693,14 +690,13 @@ void clang_codeCompleteAt_Impl(void *UserData) { // Perform the remapping of source files. SmallVector RemappedFiles; - for (unsigned I = 0; I != num_unsaved_files; ++I) { - StringRef Data(unsaved_files[I].Contents, unsaved_files[I].Length); - llvm::MemoryBuffer *Buffer = - llvm::MemoryBuffer::getMemBufferCopy(Data, unsaved_files[I].Filename); - RemappedFiles.push_back(std::make_pair(unsaved_files[I].Filename, - Buffer)); + + for (auto &UF : CCAI->unsaved_files) { + llvm::MemoryBuffer *MB = + llvm::MemoryBuffer::getMemBufferCopy(getContents(UF), UF.Filename); + RemappedFiles.push_back(std::make_pair(UF.Filename, MB)); } - + if (EnableLogging) { // FIXME: Add logging. } @@ -823,9 +819,12 @@ CXCodeCompleteResults *clang_codeCompleteAt(CXTranslationUnit TU, << complete_filename << ':' << complete_line << ':' << complete_column; } - CodeCompleteAtInfo CCAI = { TU, complete_filename, complete_line, - complete_column, unsaved_files, num_unsaved_files, - options, nullptr }; + if (num_unsaved_files && !unsaved_files) + return nullptr; + + CodeCompleteAtInfo CCAI = {TU, complete_filename, complete_line, + complete_column, llvm::makeArrayRef(unsaved_files, num_unsaved_files), + options, nullptr}; if (getenv("LIBCLANG_NOTHREADS")) { clang_codeCompleteAt_Impl(&CCAI); diff --git a/clang/tools/libclang/CXString.h b/clang/tools/libclang/CXString.h index ac04259..ed3ed4ad 100644 --- a/clang/tools/libclang/CXString.h +++ b/clang/tools/libclang/CXString.h @@ -97,6 +97,10 @@ CXStringBuf *getCXStringBuf(CXTranslationUnit TU); bool isManagedByPool(CXString str); } + +static inline StringRef getContents(const CXUnsavedFile &UF) { + return StringRef(UF.Contents, UF.Length); +} } #endif diff --git a/clang/tools/libclang/Indexing.cpp b/clang/tools/libclang/Indexing.cpp index e4f886b..05a18b7 100644 --- a/clang/tools/libclang/Indexing.cpp +++ b/clang/tools/libclang/Indexing.cpp @@ -472,28 +472,17 @@ struct IndexSourceFileInfo { const char *source_filename; const char *const *command_line_args; int num_command_line_args; - struct CXUnsavedFile *unsaved_files; - unsigned num_unsaved_files; + ArrayRef unsaved_files; CXTranslationUnit *out_TU; unsigned TU_options; - int result; -}; - -struct MemBufferOwner { - SmallVector Buffers; - - ~MemBufferOwner() { - for (SmallVectorImpl::iterator - I = Buffers.begin(), E = Buffers.end(); I != E; ++I) - delete *I; - } + mutable int result; }; } // anonymous namespace static void clang_indexSourceFile_Impl(void *UserData) { - IndexSourceFileInfo *ITUI = - static_cast(UserData); + const IndexSourceFileInfo *ITUI = + static_cast(UserData); CXIndexAction cxIdxAction = ITUI->idxAction; CXClientData client_data = ITUI->client_data; IndexerCallbacks *client_index_callbacks = ITUI->index_callbacks; @@ -502,8 +491,6 @@ static void clang_indexSourceFile_Impl(void *UserData) { const char *source_filename = ITUI->source_filename; const char * const *command_line_args = ITUI->command_line_args; int num_command_line_args = ITUI->num_command_line_args; - struct CXUnsavedFile *unsaved_files = ITUI->unsaved_files; - unsigned num_unsaved_files = ITUI->num_unsaved_files; CXTranslationUnit *out_TU = ITUI->out_TU; unsigned TU_options = ITUI->TU_options; @@ -584,18 +571,18 @@ static void clang_indexSourceFile_Impl(void *UserData) { if (CInvok->getFrontendOpts().Inputs.empty()) return; - std::unique_ptr BufOwner(new MemBufferOwner()); + typedef SmallVector, 8> MemBufferOwner; + std::unique_ptr BufOwner(new MemBufferOwner); // Recover resources if we crash before exiting this method. - llvm::CrashRecoveryContextCleanupRegistrar - BufOwnerCleanup(BufOwner.get()); - - for (unsigned I = 0; I != num_unsaved_files; ++I) { - StringRef Data(unsaved_files[I].Contents, unsaved_files[I].Length); - llvm::MemoryBuffer *Buffer = - llvm::MemoryBuffer::getMemBufferCopy(Data, unsaved_files[I].Filename); - CInvok->getPreprocessorOpts().addRemappedFile(unsaved_files[I].Filename, Buffer); - BufOwner->Buffers.push_back(Buffer); + llvm::CrashRecoveryContextCleanupRegistrar BufOwnerCleanup( + BufOwner.get()); + + for (auto &UF : ITUI->unsaved_files) { + llvm::MemoryBuffer *MB = + llvm::MemoryBuffer::getMemBufferCopy(getContents(UF), UF.Filename); + BufOwner->push_back(std::unique_ptr(MB)); + CInvok->getPreprocessorOpts().addRemappedFile(UF.Filename, MB); } // Since libclang is primarily used by batch tools dealing with @@ -992,12 +979,22 @@ int clang_indexSourceFile(CXIndexAction idxAction, *Log << command_line_args[i] << " "; } - IndexSourceFileInfo ITUI = { idxAction, client_data, index_callbacks, - index_callbacks_size, index_options, - source_filename, command_line_args, - num_command_line_args, unsaved_files, - num_unsaved_files, out_TU, TU_options, - CXError_Failure }; + if (num_unsaved_files && !unsaved_files) + return CXError_InvalidArguments; + + IndexSourceFileInfo ITUI = { + idxAction, + client_data, + index_callbacks, + index_callbacks_size, + index_options, + source_filename, + command_line_args, + num_command_line_args, + llvm::makeArrayRef(unsaved_files, num_unsaved_files), + out_TU, + TU_options, + CXError_Failure}; if (getenv("LIBCLANG_NOTHREADS")) { clang_indexSourceFile_Impl(&ITUI);