diff options
author | Daniel Dunbar <daniel@zuster.org> | 2010-01-30 21:47:16 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2010-01-30 21:47:16 +0000 |
commit | 807b06157a1a5c050520fc194d32f16d22d423a8 (patch) | |
tree | 8bdea0496f06100bd3848b6d033f5d2aaec582f4 /lib/Frontend/ASTUnit.cpp | |
parent | 6228ca00121669ec06a19df4fad87d5049c097cf (diff) |
ASTUnit: Ensure the CompilerInvocation object used in LoadFromCommandLine is
live as long as the ASTUnit. This is useful for clients which want to maintain
pointers to the LangOptions object which ultimately lives in the
CompilerInvocation, although it would be nice to make all of this ownership
stuff more explicit and obvious.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@94924 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Frontend/ASTUnit.cpp')
-rw-r--r-- | lib/Frontend/ASTUnit.cpp | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/lib/Frontend/ASTUnit.cpp b/lib/Frontend/ASTUnit.cpp index eaa2062c86..7f1e722f32 100644 --- a/lib/Frontend/ASTUnit.cpp +++ b/lib/Frontend/ASTUnit.cpp @@ -238,7 +238,7 @@ ASTUnit *ASTUnit::LoadFromCompilerInvocation(const CompilerInvocation &CI, llvm::OwningPtr<ASTUnit> AST; llvm::OwningPtr<TopLevelDeclTrackerAction> Act; - Clang.getInvocation() = CI; + Clang.setInvocation(const_cast<CompilerInvocation*>(&CI)); Clang.setDiagnostics(&Diags); Clang.setDiagnosticClient(Diags.getClient()); @@ -294,6 +294,7 @@ ASTUnit *ASTUnit::LoadFromCompilerInvocation(const CompilerInvocation &CI, Clang.takeDiagnosticClient(); Clang.takeDiagnostics(); + Clang.takeInvocation(); return AST.take(); @@ -349,19 +350,23 @@ ASTUnit *ASTUnit::LoadFromCommandLine(const char **ArgBegin, } const driver::ArgStringList &CCArgs = Cmd->getArguments(); - CompilerInvocation CI; - CompilerInvocation::CreateFromArgs(CI, (const char**) CCArgs.data(), + llvm::OwningPtr<CompilerInvocation> CI(new CompilerInvocation); + CompilerInvocation::CreateFromArgs(*CI, (const char**) CCArgs.data(), (const char**) CCArgs.data()+CCArgs.size(), Diags); // Override any files that need remapping for (unsigned I = 0; I != NumRemappedFiles; ++I) - CI.getPreprocessorOpts().addRemappedFile(RemappedFiles[I].first, + CI->getPreprocessorOpts().addRemappedFile(RemappedFiles[I].first, RemappedFiles[I].second); // Override the resources path. - CI.getHeaderSearchOpts().ResourceDir = ResourceFilesPath; + CI->getHeaderSearchOpts().ResourceDir = ResourceFilesPath; - CI.getFrontendOpts().DisableFree = UseBumpAllocator; - return LoadFromCompilerInvocation(CI, Diags, OnlyLocalDecls); + CI->getFrontendOpts().DisableFree = UseBumpAllocator; + ASTUnit *Unit = LoadFromCompilerInvocation(*CI, Diags, OnlyLocalDecls); + if (Unit) + Unit->Invocation.reset(CI.take()); + + return Unit; } |