[cfe-commits] r108756 - in /cfe/trunk: include/clang-c/Index.h include/clang/Basic/Diagnostic.h include/clang/Frontend/ASTUnit.h include/clang/Frontend/PreprocessorOptions.h lib/Basic/Diagnostic.cpp lib/Frontend/ASTUnit.cpp test/Index/cindex-from
Douglas Gregor
dgregor at apple.com
Tue Jul 20 07:37:18 PDT 2010
On Jul 19, 2010, at 5:13 PM, Daniel Dunbar wrote:
> FYI:
> c-index-test.c:1284: warning: string length '570' is greater than the
> length '509' ISO C89 compilers are required to support
Thanks, fixed (r108838).
> Which, it seems, Clang doesn't warn about. :)
Sure it does! (r108837)
Besides, we wouldn't have seen it anyway, since Clang defaults to C99, which has a higher minimum required length.
- Doug
> - Daniel
>
> On Mon, Jul 19, 2010 at 2:46 PM, Douglas Gregor <dgregor at apple.com> wrote:
>> Author: dgregor
>> Date: Mon Jul 19 16:46:24 2010
>> New Revision: 108756
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=108756&view=rev
>> Log:
>> Introduce a new libclang API, clang_reparseTranslationUnit(), which
>> reparses an already-parsed translation unit. At the moment it's just a
>> convenience function, but we hope to use it for performance
>> optimizations.
>>
>> Modified:
>> cfe/trunk/include/clang-c/Index.h
>> cfe/trunk/include/clang/Basic/Diagnostic.h
>> cfe/trunk/include/clang/Frontend/ASTUnit.h
>> cfe/trunk/include/clang/Frontend/PreprocessorOptions.h
>> cfe/trunk/lib/Basic/Diagnostic.cpp
>> cfe/trunk/lib/Frontend/ASTUnit.cpp
>> cfe/trunk/test/Index/cindex-from-source.m
>> cfe/trunk/tools/c-index-test/c-index-test.c
>> cfe/trunk/tools/libclang/CIndex.cpp
>> cfe/trunk/tools/libclang/libclang.darwin.exports
>> cfe/trunk/tools/libclang/libclang.exports
>>
>> Modified: cfe/trunk/include/clang-c/Index.h
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang-c/Index.h?rev=108756&r1=108755&r2=108756&view=diff
>> ==============================================================================
>> --- cfe/trunk/include/clang-c/Index.h (original)
>> +++ cfe/trunk/include/clang-c/Index.h Mon Jul 19 16:46:24 2010
>> @@ -640,6 +640,44 @@
>> CINDEX_LINKAGE void clang_disposeTranslationUnit(CXTranslationUnit);
>>
>> /**
>> + * \brief Reparse the source files that produced this translation unit.
>> + *
>> + * This routine can be used to re-parse the source files that originally
>> + * created the given translation unit, for example because those source files
>> + * have changed (either on disk or as passed via \p unsaved_files). The
>> + * source code will be reparsed with the same command-line options as it
>> + * was originally parsed.
>> + *
>> + * Reparsing a translation unit invalidates all cursors and source locations
>> + * that refer into that translation unit. This makes reparsing a translation
>> + * unit semantically equivalent to destroying the translation unit and then
>> + * creating a new translation unit with the same command-line arguments.
>> + * However, it may be more efficient to reparse a translation
>> + * unit using this routine.
>> + *
>> + * \param TU The translation unit whose contents will be re-parsed. The
>> + * translation unit must originally have been built with
>> + * \c clang_createTranslationUnitFromSourceFile().
>> + *
>> + * \param num_unsaved_files The number of unsaved file entries in \p
>> + * unsaved_files.
>> + *
>> + * \param unsaved_files The files that have not yet been saved to disk
>> + * but may be required for parsing, including the contents of
>> + * those files. The contents and name of these files (as specified by
>> + * CXUnsavedFile) are copied when necessary, so the client only needs to
>> + * guarantee their validity until the call to this function returns.
>> + *
>> + * \returns 0 if the sources could be reparsed. A non-zero value will be
>> + * returned if reparsing was impossible, such that the translation unit is
>> + * invalid. In such cases, the only valid call for \p TU is
>> + * \c clang_disposeTranslationUnit(TU).
>> + */
>> +CINDEX_LINKAGE int clang_reparseTranslationUnit(CXTranslationUnit TU,
>> + unsigned num_unsaved_files,
>> + struct CXUnsavedFile *unsaved_files);
>> +
>> +/**
>> * @}
>> */
>>
>>
>> Modified: cfe/trunk/include/clang/Basic/Diagnostic.h
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Diagnostic.h?rev=108756&r1=108755&r2=108756&view=diff
>> ==============================================================================
>> --- cfe/trunk/include/clang/Basic/Diagnostic.h (original)
>> +++ cfe/trunk/include/clang/Basic/Diagnostic.h Mon Jul 19 16:46:24 2010
>> @@ -404,6 +404,10 @@
>> ArgToStringCookie = Cookie;
>> }
>>
>> + /// \brief Reset the state of the diagnostic object to its initial
>> + /// configuration.
>> + void Reset();
>> +
>> //===--------------------------------------------------------------------===//
>> // Diagnostic classification and reporting interfaces.
>> //
>>
>> Modified: cfe/trunk/include/clang/Frontend/ASTUnit.h
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/ASTUnit.h?rev=108756&r1=108755&r2=108756&view=diff
>> ==============================================================================
>> --- cfe/trunk/include/clang/Frontend/ASTUnit.h (original)
>> +++ cfe/trunk/include/clang/Frontend/ASTUnit.h Mon Jul 19 16:46:24 2010
>> @@ -70,6 +70,9 @@
>> // FIXME: This is temporary; eventually, CIndex will always do this.
>> bool OnlyLocalDecls;
>>
>> + /// \brief Whether to capture any diagnostics produced.
>> + bool CaptureDiagnostics;
>> +
>> /// Track whether the main file was loaded from an AST or not.
>> bool MainFileIsAST;
>>
>> @@ -120,6 +123,9 @@
>>
>> explicit ASTUnit(bool MainFileIsAST);
>>
>> + void CleanTemporaryFiles();
>> + bool Parse();
>> +
>> public:
>> class ConcurrencyCheck {
>> volatile ASTUnit &Self;
>> @@ -259,6 +265,14 @@
>> RemappedFile *RemappedFiles = 0,
>> unsigned NumRemappedFiles = 0,
>> bool CaptureDiagnostics = false);
>> +
>> + /// \brief Reparse the source files using the same command-line options that
>> + /// were originally used to produce this translation unit.
>> + ///
>> + /// \returns True if a failure occurred that causes the ASTUnit not to
>> + /// contain any translation-unit information, false otherwise.
>> + bool Reparse(RemappedFile *RemappedFiles = 0,
>> + unsigned NumRemappedFiles = 0);
>> };
>>
>> } // namespace clang
>>
>> Modified: cfe/trunk/include/clang/Frontend/PreprocessorOptions.h
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/PreprocessorOptions.h?rev=108756&r1=108755&r2=108756&view=diff
>> ==============================================================================
>> --- cfe/trunk/include/clang/Frontend/PreprocessorOptions.h (original)
>> +++ cfe/trunk/include/clang/Frontend/PreprocessorOptions.h Mon Jul 19 16:46:24 2010
>> @@ -95,6 +95,10 @@
>> void addRemappedFile(llvm::StringRef From, const llvm::MemoryBuffer * To) {
>> RemappedFileBuffers.push_back(std::make_pair(From, To));
>> }
>> + void clearRemappedFiles() {
>> + RemappedFiles.clear();
>> + RemappedFileBuffers.clear();
>> + }
>> };
>>
>> } // end namespace clang
>>
>> Modified: cfe/trunk/lib/Basic/Diagnostic.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Diagnostic.cpp?rev=108756&r1=108755&r2=108756&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Basic/Diagnostic.cpp (original)
>> +++ cfe/trunk/lib/Basic/Diagnostic.cpp Mon Jul 19 16:46:24 2010
>> @@ -244,35 +244,10 @@
>>
>>
>> Diagnostic::Diagnostic(DiagnosticClient *client) : Client(client) {
>> - AllExtensionsSilenced = 0;
>> - IgnoreAllWarnings = false;
>> - WarningsAsErrors = false;
>> - ErrorsAsFatal = false;
>> - SuppressSystemWarnings = false;
>> - SuppressAllDiagnostics = false;
>> - ShowOverloads = Ovl_All;
>> - ExtBehavior = Ext_Ignore;
>> -
>> - ErrorOccurred = false;
>> - FatalErrorOccurred = false;
>> - ErrorLimit = 0;
>> - TemplateBacktraceLimit = 0;
>> -
>> - NumWarnings = 0;
>> - NumErrors = 0;
>> - NumErrorsSuppressed = 0;
>> - CustomDiagInfo = 0;
>> - CurDiagID = ~0U;
>> - LastDiagLevel = Ignored;
>> -
>> ArgToStringFn = DummyArgToStringFn;
>> ArgToStringCookie = 0;
>>
>> - DelayedDiagID = 0;
>> -
>> - // Set all mappings to 'unset'.
>> - DiagMappings BlankDiags(diag::DIAG_UPPER_LIMIT/2, 0);
>> - DiagMappingsStack.push_back(BlankDiags);
>> + Reset();
>> }
>>
>> Diagnostic::~Diagnostic() {
>> @@ -335,6 +310,36 @@
>> return true;
>> }
>>
>> +void Diagnostic::Reset() {
>> + AllExtensionsSilenced = 0;
>> + IgnoreAllWarnings = false;
>> + WarningsAsErrors = false;
>> + ErrorsAsFatal = false;
>> + SuppressSystemWarnings = false;
>> + SuppressAllDiagnostics = false;
>> + ShowOverloads = Ovl_All;
>> + ExtBehavior = Ext_Ignore;
>> +
>> + ErrorOccurred = false;
>> + FatalErrorOccurred = false;
>> + ErrorLimit = 0;
>> + TemplateBacktraceLimit = 0;
>> +
>> + NumWarnings = 0;
>> + NumErrors = 0;
>> + NumErrorsSuppressed = 0;
>> + CustomDiagInfo = 0;
>> + CurDiagID = ~0U;
>> + LastDiagLevel = Ignored;
>> + DelayedDiagID = 0;
>> +
>> + // Set all mappings to 'unset'.
>> + while (!DiagMappingsStack.empty())
>> + DiagMappingsStack.pop_back();
>> +
>> + DiagMappings BlankDiags(diag::DIAG_UPPER_LIMIT/2, 0);
>> + DiagMappingsStack.push_back(BlankDiags);
>> +}
>>
>> /// getDescription - Given a diagnostic ID, return a description of the
>> /// issue.
>>
>> Modified: cfe/trunk/lib/Frontend/ASTUnit.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/ASTUnit.cpp?rev=108756&r1=108755&r2=108756&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Frontend/ASTUnit.cpp (original)
>> +++ cfe/trunk/lib/Frontend/ASTUnit.cpp Mon Jul 19 16:46:24 2010
>> @@ -36,12 +36,18 @@
>> using namespace clang;
>>
>> ASTUnit::ASTUnit(bool _MainFileIsAST)
>> - : MainFileIsAST(_MainFileIsAST), ConcurrencyCheckValue(CheckUnlocked) { }
>> + : CaptureDiagnostics(false), MainFileIsAST(_MainFileIsAST),
>> + ConcurrencyCheckValue(CheckUnlocked) { }
>>
>> ASTUnit::~ASTUnit() {
>> ConcurrencyCheckValue = CheckLocked;
>> + CleanTemporaryFiles();
>> +}
>> +
>> +void ASTUnit::CleanTemporaryFiles() {
>> for (unsigned I = 0, N = TemporaryFiles.size(); I != N; ++I)
>> TemporaryFiles[I].eraseFromDisk();
>> + TemporaryFiles.clear();
>> }
>>
>> namespace {
>> @@ -156,7 +162,8 @@
>> DiagnosticOptions DiagOpts;
>> Diags = CompilerInstance::createDiagnostics(DiagOpts, 0, 0);
>> }
>> -
>> +
>> + AST->CaptureDiagnostics = CaptureDiagnostics;
>> AST->OnlyLocalDecls = OnlyLocalDecls;
>> AST->Diagnostics = Diags;
>> AST->FileMgr.reset(new FileManager);
>> @@ -298,41 +305,38 @@
>>
>> }
>>
>> -ASTUnit *ASTUnit::LoadFromCompilerInvocation(CompilerInvocation *CI,
>> - llvm::IntrusiveRefCntPtr<Diagnostic> Diags,
>> - bool OnlyLocalDecls,
>> - bool CaptureDiagnostics) {
>> +/// Parse the source file into a translation unit using the given compiler
>> +/// invocation, replacing the current translation unit.
>> +///
>> +/// \returns True if a failure occurred that causes the ASTUnit not to
>> +/// contain any translation-unit information, false otherwise.
>> +bool ASTUnit::Parse() {
>> + if (!Invocation.get())
>> + return true;
>> +
>> // Create the compiler instance to use for building the AST.
>> CompilerInstance Clang;
>> - llvm::OwningPtr<ASTUnit> AST;
>> - llvm::OwningPtr<TopLevelDeclTrackerAction> Act;
>> -
>> - if (!Diags.getPtr()) {
>> - // No diagnostics engine was provided, so create our own diagnostics object
>> - // with the default options.
>> - DiagnosticOptions DiagOpts;
>> - Diags = CompilerInstance::createDiagnostics(DiagOpts, 0, 0);
>> - }
>> + Clang.setInvocation(Invocation.take());
>> + OriginalSourceFile = Clang.getFrontendOpts().Inputs[0].second;
>> +
>> + // Set up diagnostics.
>> + Clang.setDiagnostics(&getDiagnostics());
>> + Clang.setDiagnosticClient(getDiagnostics().getClient());
>>
>> - Clang.setInvocation(CI);
>> -
>> - Clang.setDiagnostics(Diags.getPtr());
>> - Clang.setDiagnosticClient(Diags->getClient());
>> -
>> // Create the target instance.
>> Clang.setTarget(TargetInfo::CreateTargetInfo(Clang.getDiagnostics(),
>> Clang.getTargetOpts()));
>> if (!Clang.hasTarget()) {
>> Clang.takeDiagnosticClient();
>> - return 0;
>> + return true;
>> }
>> -
>> +
>> // Inform the target of the language options.
>> //
>> // FIXME: We shouldn't need to do this, the target should be immutable once
>> // created. This complexity should be lifted elsewhere.
>> Clang.getTarget().setForcedLangOptions(Clang.getLangOpts());
>> -
>> +
>> assert(Clang.getFrontendOpts().Inputs.size() == 1 &&
>> "Invocation must have exactly one source file!");
>> assert(Clang.getFrontendOpts().Inputs[0].first != IK_AST &&
>> @@ -340,52 +344,84 @@
>> assert(Clang.getFrontendOpts().Inputs[0].first != IK_LLVM_IR &&
>> "IR inputs not support here!");
>>
>> - // Create the AST unit.
>> - AST.reset(new ASTUnit(false));
>> - AST->Diagnostics = Diags;
>> - AST->FileMgr.reset(new FileManager);
>> - AST->SourceMgr.reset(new SourceManager(AST->getDiagnostics()));
>> - AST->OnlyLocalDecls = OnlyLocalDecls;
>> - AST->OriginalSourceFile = Clang.getFrontendOpts().Inputs[0].second;
>> -
>> + // Configure the various subsystems.
>> + // FIXME: Should we retain the previous file manager?
>> + FileMgr.reset(new FileManager);
>> + SourceMgr.reset(new SourceManager(getDiagnostics()));
>> + Ctx.reset();
>> + PP.reset();
>> +
>> + // Clear out old caches and data.
>> + TopLevelDecls.clear();
>> + StoredDiagnostics.clear();
>> + CleanTemporaryFiles();
>> + PreprocessedEntitiesByFile.clear();
>> +
>> // Capture any diagnostics that would otherwise be dropped.
>> CaptureDroppedDiagnostics Capture(CaptureDiagnostics,
>> Clang.getDiagnostics(),
>> - AST->StoredDiagnostics);
>> -
>> + StoredDiagnostics);
>> +
>> // Create a file manager object to provide access to and cache the filesystem.
>> - Clang.setFileManager(&AST->getFileManager());
>> -
>> + Clang.setFileManager(&getFileManager());
>> +
>> // Create the source manager.
>> - Clang.setSourceManager(&AST->getSourceManager());
>> -
>> - Act.reset(new TopLevelDeclTrackerAction(*AST));
>> + Clang.setSourceManager(&getSourceManager());
>> +
>> + llvm::OwningPtr<TopLevelDeclTrackerAction> Act;
>> + Act.reset(new TopLevelDeclTrackerAction(*this));
>> if (!Act->BeginSourceFile(Clang, Clang.getFrontendOpts().Inputs[0].second,
>> Clang.getFrontendOpts().Inputs[0].first))
>> goto error;
>> -
>> +
>> Act->Execute();
>> -
>> +
>> // Steal the created target, context, and preprocessor, and take back the
>> // source and file managers.
>> - AST->Ctx.reset(Clang.takeASTContext());
>> - AST->PP.reset(Clang.takePreprocessor());
>> + Ctx.reset(Clang.takeASTContext());
>> + PP.reset(Clang.takePreprocessor());
>> Clang.takeSourceManager();
>> Clang.takeFileManager();
>> - AST->Target.reset(Clang.takeTarget());
>> -
>> + Target.reset(Clang.takeTarget());
>> +
>> Act->EndSourceFile();
>> -
>> +
>> Clang.takeDiagnosticClient();
>> - Clang.takeInvocation();
>> -
>> - AST->Invocation.reset(Clang.takeInvocation());
>> - return AST.take();
>> -
>> +
>> + Invocation.reset(Clang.takeInvocation());
>> + return false;
>> +
>> error:
>> Clang.takeSourceManager();
>> Clang.takeFileManager();
>> Clang.takeDiagnosticClient();
>> + Invocation.reset(Clang.takeInvocation());
>> + return true;
>> +}
>> +
>> +
>> +ASTUnit *ASTUnit::LoadFromCompilerInvocation(CompilerInvocation *CI,
>> + llvm::IntrusiveRefCntPtr<Diagnostic> Diags,
>> + bool OnlyLocalDecls,
>> + bool CaptureDiagnostics) {
>> + if (!Diags.getPtr()) {
>> + // No diagnostics engine was provided, so create our own diagnostics object
>> + // with the default options.
>> + DiagnosticOptions DiagOpts;
>> + Diags = CompilerInstance::createDiagnostics(DiagOpts, 0, 0);
>> + }
>> +
>> + // Create the AST unit.
>> + llvm::OwningPtr<ASTUnit> AST;
>> + AST.reset(new ASTUnit(false));
>> + AST->Diagnostics = Diags;
>> + AST->CaptureDiagnostics = CaptureDiagnostics;
>> + AST->OnlyLocalDecls = OnlyLocalDecls;
>> + AST->Invocation.reset(CI);
>> +
>> + if (!AST->Parse())
>> + return AST.take();
>> +
>> return 0;
>> }
>>
>> @@ -459,3 +495,19 @@
>> return LoadFromCompilerInvocation(CI.take(), Diags, OnlyLocalDecls,
>> CaptureDiagnostics);
>> }
>> +
>> +bool ASTUnit::Reparse(RemappedFile *RemappedFiles, unsigned NumRemappedFiles) {
>> + if (!Invocation.get())
>> + return true;
>> +
>> + // Clear out the diagnostics state.
>> + getDiagnostics().Reset();
>> +
>> + // Remap files.
>> + Invocation->getPreprocessorOpts().clearRemappedFiles();
>> + for (unsigned I = 0; I != NumRemappedFiles; ++I)
>> + Invocation->getPreprocessorOpts().addRemappedFile(RemappedFiles[I].first,
>> + RemappedFiles[I].second);
>> +
>> + return Parse();
>> +}
>>
>> Modified: cfe/trunk/test/Index/cindex-from-source.m
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/cindex-from-source.m?rev=108756&r1=108755&r2=108756&view=diff
>> ==============================================================================
>> --- cfe/trunk/test/Index/cindex-from-source.m (original)
>> +++ cfe/trunk/test/Index/cindex-from-source.m Mon Jul 19 16:46:24 2010
>> @@ -7,3 +7,6 @@
>> // CHECK: cindex-from-source.m:9:1: TypeRef=t0:1:13 Extent=[9:1 - 9:3]
>> struct s0 {};
>> t0 g0;
>> +
>> +// RUN: c-index-test -test-load-source-reparse 5 local %s -include %t.pfx.h > %t
>> +// RUN: FileCheck %s < %t
>>
>> Modified: cfe/trunk/tools/c-index-test/c-index-test.c
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/c-index-test/c-index-test.c?rev=108756&r1=108755&r2=108756&view=diff
>> ==============================================================================
>> --- cfe/trunk/tools/c-index-test/c-index-test.c (original)
>> +++ cfe/trunk/tools/c-index-test/c-index-test.c Mon Jul 19 16:46:24 2010
>> @@ -558,7 +558,7 @@
>> struct CXUnsavedFile *unsaved_files = 0;
>> int num_unsaved_files = 0;
>> int result;
>> -
>> +
>> Idx = clang_createIndex(/* excludeDeclsFromPCH */
>> !strcmp(filter, "local") ? 1 : 0,
>> /* displayDiagnosics=*/1);
>> @@ -578,6 +578,7 @@
>> unsaved_files);
>> if (!TU) {
>> fprintf(stderr, "Unable to load translation unit!\n");
>> + free_remapped_files(unsaved_files, num_unsaved_files);
>> clang_disposeIndex(Idx);
>> return 1;
>> }
>> @@ -588,6 +589,57 @@
>> return result;
>> }
>>
>> +int perform_test_reparse_source(int argc, const char **argv, int trials,
>> + const char *filter, CXCursorVisitor Visitor,
>> + PostVisitTU PV) {
>> + const char *UseExternalASTs =
>> + getenv("CINDEXTEST_USE_EXTERNAL_AST_GENERATION");
>> + CXIndex Idx;
>> + CXTranslationUnit TU;
>> + struct CXUnsavedFile *unsaved_files = 0;
>> + int num_unsaved_files = 0;
>> + int result;
>> + int trial;
>> +
>> + Idx = clang_createIndex(/* excludeDeclsFromPCH */
>> + !strcmp(filter, "local") ? 1 : 0,
>> + /* displayDiagnosics=*/1);
>> +
>> + if (UseExternalASTs && strlen(UseExternalASTs))
>> + clang_setUseExternalASTGeneration(Idx, 1);
>> +
>> + if (parse_remapped_files(argc, argv, 0, &unsaved_files, &num_unsaved_files)) {
>> + clang_disposeIndex(Idx);
>> + return -1;
>> + }
>> +
>> + TU = clang_createTranslationUnitFromSourceFile(Idx, 0,
>> + argc - num_unsaved_files,
>> + argv + num_unsaved_files,
>> + num_unsaved_files,
>> + unsaved_files);
>> + if (!TU) {
>> + fprintf(stderr, "Unable to load translation unit!\n");
>> + free_remapped_files(unsaved_files, num_unsaved_files);
>> + clang_disposeIndex(Idx);
>> + return 1;
>> + }
>> +
>> + for (trial = 0; trial < trials; ++trial) {
>> + if (clang_reparseTranslationUnit(TU, num_unsaved_files, unsaved_files)) {
>> + clang_disposeTranslationUnit(TU);
>> + free_remapped_files(unsaved_files, num_unsaved_files);
>> + clang_disposeIndex(Idx);
>> + return -1;
>> + }
>> + }
>> +
>> + result = perform_test_load(Idx, TU, filter, NULL, Visitor, PV);
>> + free_remapped_files(unsaved_files, num_unsaved_files);
>> + clang_disposeIndex(Idx);
>> + return result;
>> +}
>> +
>> /******************************************************************************/
>> /* Logic for testing clang_getCursor(). */
>> /******************************************************************************/
>> @@ -1219,6 +1271,8 @@
>> "[FileCheck prefix]\n"
>> " c-index-test -test-load-source <symbol filter> {<args>}*\n");
>> fprintf(stderr,
>> + " c-index-test -test-load-source-reparse <trials> <symbol filter> "
>> + " {<args>}*\n"
>> " c-index-test -test-load-source-usrs <symbol filter> {<args>}*\n"
>> " c-index-test -test-annotate-tokens=<range> {<args>}*\n"
>> " c-index-test -test-inclusion-stack-source {<args>}*\n"
>> @@ -1252,6 +1306,14 @@
>> return perform_test_load_tu(argv[2], argv[3], argc >= 5 ? argv[4] : 0, I,
>> NULL);
>> }
>> + else if (argc >= 5 && strncmp(argv[1], "-test-load-source-reparse", 25) == 0){
>> + CXCursorVisitor I = GetVisitor(argv[1] + 25);
>> + if (I) {
>> + int trials = atoi(argv[2]);
>> + return perform_test_reparse_source(argc - 4, argv + 4, trials, argv[3], I,
>> + NULL);
>> + }
>> + }
>> else if (argc >= 4 && strncmp(argv[1], "-test-load-source", 17) == 0) {
>> CXCursorVisitor I = GetVisitor(argv[1] + 17);
>> if (I)
>>
>> Modified: cfe/trunk/tools/libclang/CIndex.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndex.cpp?rev=108756&r1=108755&r2=108756&view=diff
>> ==============================================================================
>> --- cfe/trunk/tools/libclang/CIndex.cpp (original)
>> +++ cfe/trunk/tools/libclang/CIndex.cpp Mon Jul 19 16:46:24 2010
>> @@ -1390,6 +1390,25 @@
>> delete static_cast<ASTUnit *>(CTUnit);
>> }
>>
>> +int clang_reparseTranslationUnit(CXTranslationUnit TU,
>> + unsigned num_unsaved_files,
>> + struct CXUnsavedFile *unsaved_files) {
>> + if (!TU)
>> + return 1;
>> +
>> + llvm::SmallVector<ASTUnit::RemappedFile, 4> RemappedFiles;
>> + for (unsigned I = 0; I != num_unsaved_files; ++I) {
>> + llvm::StringRef Data(unsaved_files[I].Contents, unsaved_files[I].Length);
>> + const llvm::MemoryBuffer *Buffer
>> + = llvm::MemoryBuffer::getMemBufferCopy(Data, unsaved_files[I].Filename);
>> + RemappedFiles.push_back(std::make_pair(unsaved_files[I].Filename,
>> + Buffer));
>> + }
>> +
>> + return static_cast<ASTUnit *>(TU)->Reparse(RemappedFiles.data(),
>> + RemappedFiles.size())? 1 : 0;
>> +}
>> +
>> CXString clang_getTranslationUnitSpelling(CXTranslationUnit CTUnit) {
>> if (!CTUnit)
>> return createCXString("");
>>
>> Modified: cfe/trunk/tools/libclang/libclang.darwin.exports
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/libclang.darwin.exports?rev=108756&r1=108755&r2=108756&view=diff
>> ==============================================================================
>> --- cfe/trunk/tools/libclang/libclang.darwin.exports (original)
>> +++ cfe/trunk/tools/libclang/libclang.darwin.exports Mon Jul 19 16:46:24 2010
>> @@ -86,6 +86,7 @@
>> _clang_isStatement
>> _clang_isTranslationUnit
>> _clang_isUnexposed
>> +_clang_reparseTranslationUnit
>> _clang_setUseExternalASTGeneration
>> _clang_tokenize
>> _clang_visitChildren
>>
>> Modified: cfe/trunk/tools/libclang/libclang.exports
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/libclang.exports?rev=108756&r1=108755&r2=108756&view=diff
>> ==============================================================================
>> --- cfe/trunk/tools/libclang/libclang.exports (original)
>> +++ cfe/trunk/tools/libclang/libclang.exports Mon Jul 19 16:46:24 2010
>> @@ -86,6 +86,7 @@
>> clang_isStatement
>> clang_isTranslationUnit
>> clang_isUnexposed
>> +clang_reparseTranslationUnit
>> clang_setUseExternalASTGeneration
>> clang_tokenize
>> clang_visitChildren
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>
More information about the cfe-commits
mailing list