forked from OSchip/llvm-project
When we create a precompiled preamble, don't copy the
CompilerInvocation on the stack, because other objects (e.g., the CompilerInstance) maintain an intrusive reference-counted pointer to the CompilerInvocation. This doesn't matter in the normal case, because we take back the CompilerInvocation. However, during crash recovery, this leads to us trying to free an object on the stack, and hilarity ensues. Fixes <rdar://problem/9652540>. llvm-svn: 134245
This commit is contained in:
parent
703a0fbf39
commit
3cc1581020
|
@ -363,7 +363,7 @@ private:
|
|||
unsigned MaxLines, bool &CreatedBuffer);
|
||||
|
||||
llvm::MemoryBuffer *getMainBufferWithPrecompiledPreamble(
|
||||
CompilerInvocation PreambleInvocation,
|
||||
const CompilerInvocation &PreambleInvocationIn,
|
||||
bool AllowRebuild = true,
|
||||
unsigned MaxLines = 0);
|
||||
void RealizeTopLevelDeclsFromPreamble();
|
||||
|
|
|
@ -1150,16 +1150,19 @@ static llvm::MemoryBuffer *CreatePaddedMainFileBuffer(llvm::MemoryBuffer *Old,
|
|||
/// buffer that should be used in place of the main file when doing so.
|
||||
/// Otherwise, returns a NULL pointer.
|
||||
llvm::MemoryBuffer *ASTUnit::getMainBufferWithPrecompiledPreamble(
|
||||
CompilerInvocation PreambleInvocation,
|
||||
const CompilerInvocation &PreambleInvocationIn,
|
||||
bool AllowRebuild,
|
||||
unsigned MaxLines) {
|
||||
FrontendOptions &FrontendOpts = PreambleInvocation.getFrontendOpts();
|
||||
|
||||
llvm::IntrusiveRefCntPtr<CompilerInvocation>
|
||||
PreambleInvocation(new CompilerInvocation(PreambleInvocationIn));
|
||||
FrontendOptions &FrontendOpts = PreambleInvocation->getFrontendOpts();
|
||||
PreprocessorOptions &PreprocessorOpts
|
||||
= PreambleInvocation.getPreprocessorOpts();
|
||||
= PreambleInvocation->getPreprocessorOpts();
|
||||
|
||||
bool CreatedPreambleBuffer = false;
|
||||
std::pair<llvm::MemoryBuffer *, std::pair<unsigned, bool> > NewPreamble
|
||||
= ComputePreamble(PreambleInvocation, MaxLines, CreatedPreambleBuffer);
|
||||
= ComputePreamble(*PreambleInvocation, MaxLines, CreatedPreambleBuffer);
|
||||
|
||||
// If ComputePreamble() Take ownership of the
|
||||
llvm::OwningPtr<llvm::MemoryBuffer> OwnedPreambleBuffer;
|
||||
|
@ -1260,7 +1263,7 @@ llvm::MemoryBuffer *ASTUnit::getMainBufferWithPrecompiledPreamble(
|
|||
// have occurred in the preamble.
|
||||
getDiagnostics().Reset();
|
||||
ProcessWarningOptions(getDiagnostics(),
|
||||
PreambleInvocation.getDiagnosticOpts());
|
||||
PreambleInvocation->getDiagnosticOpts());
|
||||
getDiagnostics().setNumWarnings(NumWarningsInPreamble);
|
||||
if (StoredDiagnostics.size() > NumStoredDiagnosticsInPreamble)
|
||||
StoredDiagnostics.erase(
|
||||
|
@ -1357,7 +1360,7 @@ llvm::MemoryBuffer *ASTUnit::getMainBufferWithPrecompiledPreamble(
|
|||
llvm::CrashRecoveryContextCleanupRegistrar<CompilerInstance>
|
||||
CICleanup(Clang.get());
|
||||
|
||||
Clang->setInvocation(&PreambleInvocation);
|
||||
Clang->setInvocation(&*PreambleInvocation);
|
||||
OriginalSourceFile = Clang->getFrontendOpts().Inputs[0].second;
|
||||
|
||||
// Set up diagnostics, capturing all of the diagnostics produced.
|
||||
|
|
Loading…
Reference in New Issue