labath created this revision. labath added reviewers: dblaikie, rsmith. llvm has grown a WritableMemoryBuffer class, which is convertible (inherits from) a MemoryBuffer. We can use it to avoid conts_casting the buffer contents when we want to write to it.
Repository: rC Clang https://reviews.llvm.org/D41387 Files: lib/Basic/SourceManager.cpp lib/Lex/Preprocessor.cpp Index: lib/Lex/Preprocessor.cpp =================================================================== --- lib/Lex/Preprocessor.cpp +++ lib/Lex/Preprocessor.cpp @@ -420,10 +420,9 @@ CodeCompletionFile = File; CodeCompletionOffset = Position - Buffer->getBufferStart(); - std::unique_ptr<MemoryBuffer> NewBuffer = - MemoryBuffer::getNewUninitMemBuffer(Buffer->getBufferSize() + 1, - Buffer->getBufferIdentifier()); - char *NewBuf = const_cast<char*>(NewBuffer->getBufferStart()); + auto NewBuffer = llvm::WritableMemoryBuffer::getNewUninitMemBuffer( + Buffer->getBufferSize() + 1, Buffer->getBufferIdentifier()); + char *NewBuf = NewBuffer->getBufferStart(); char *NewPos = std::copy(Buffer->getBufferStart(), Position, NewBuf); *NewPos = '\0'; std::copy(Position, Buffer->getBufferEnd(), NewPos+1); Index: lib/Basic/SourceManager.cpp =================================================================== --- lib/Basic/SourceManager.cpp +++ lib/Basic/SourceManager.cpp @@ -125,11 +125,12 @@ // possible. if (!BufferOrError) { StringRef FillStr("<<<MISSING SOURCE FILE>>>\n"); - Buffer.setPointer(MemoryBuffer::getNewUninitMemBuffer( - ContentsEntry->getSize(), "<invalid>").release()); - char *Ptr = const_cast<char*>(Buffer.getPointer()->getBufferStart()); + auto BackupBuffer = llvm::WritableMemoryBuffer::getNewUninitMemBuffer( + ContentsEntry->getSize(), "<invalid>"); + char *Ptr = BackupBuffer->getBufferStart(); for (unsigned i = 0, e = ContentsEntry->getSize(); i != e; ++i) Ptr[i] = FillStr[i % FillStr.size()]; + Buffer.setPointer(BackupBuffer.release()); if (Diag.isDiagnosticInFlight()) Diag.SetDelayedDiagnostic(diag::err_cannot_open_file,
Index: lib/Lex/Preprocessor.cpp =================================================================== --- lib/Lex/Preprocessor.cpp +++ lib/Lex/Preprocessor.cpp @@ -420,10 +420,9 @@ CodeCompletionFile = File; CodeCompletionOffset = Position - Buffer->getBufferStart(); - std::unique_ptr<MemoryBuffer> NewBuffer = - MemoryBuffer::getNewUninitMemBuffer(Buffer->getBufferSize() + 1, - Buffer->getBufferIdentifier()); - char *NewBuf = const_cast<char*>(NewBuffer->getBufferStart()); + auto NewBuffer = llvm::WritableMemoryBuffer::getNewUninitMemBuffer( + Buffer->getBufferSize() + 1, Buffer->getBufferIdentifier()); + char *NewBuf = NewBuffer->getBufferStart(); char *NewPos = std::copy(Buffer->getBufferStart(), Position, NewBuf); *NewPos = '\0'; std::copy(Position, Buffer->getBufferEnd(), NewPos+1); Index: lib/Basic/SourceManager.cpp =================================================================== --- lib/Basic/SourceManager.cpp +++ lib/Basic/SourceManager.cpp @@ -125,11 +125,12 @@ // possible. if (!BufferOrError) { StringRef FillStr("<<<MISSING SOURCE FILE>>>\n"); - Buffer.setPointer(MemoryBuffer::getNewUninitMemBuffer( - ContentsEntry->getSize(), "<invalid>").release()); - char *Ptr = const_cast<char*>(Buffer.getPointer()->getBufferStart()); + auto BackupBuffer = llvm::WritableMemoryBuffer::getNewUninitMemBuffer( + ContentsEntry->getSize(), "<invalid>"); + char *Ptr = BackupBuffer->getBufferStart(); for (unsigned i = 0, e = ContentsEntry->getSize(); i != e; ++i) Ptr[i] = FillStr[i % FillStr.size()]; + Buffer.setPointer(BackupBuffer.release()); if (Diag.isDiagnosticInFlight()) Diag.SetDelayedDiagnostic(diag::err_cannot_open_file,
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits