[llvm] r211861 - ParseIR: don't take ownership of the MemoryBuffer
David Blaikie
dblaikie at gmail.com
Thu Jun 26 21:52:39 PDT 2014
On Thu, Jun 26, 2014 at 9:33 PM, Alp Toker <alp at nuanti.com> wrote:
> Author: alp
> Date: Thu Jun 26 23:33:58 2014
> New Revision: 211861
>
> URL: http://llvm.org/viewvc/llvm-project?rev=211861&view=rev
> Log:
> ParseIR: don't take ownership of the MemoryBuffer
>
> clang was needlessly duplicating whole memory buffer contents in an attempt to
> satisfy unclear ownership semantics. Let's just hide internal LLVM quirks and
> present a simple non-owning interface.
>
> The public C API preserves previous behaviour for stability.
>
> Modified:
> llvm/trunk/include/llvm/IRReader/IRReader.h
> llvm/trunk/lib/AsmParser/Parser.cpp
> llvm/trunk/lib/IRReader/IRReader.cpp
>
> Modified: llvm/trunk/include/llvm/IRReader/IRReader.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IRReader/IRReader.h?rev=211861&r1=211860&r2=211861&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/IRReader/IRReader.h (original)
> +++ llvm/trunk/include/llvm/IRReader/IRReader.h Thu Jun 26 23:33:58 2014
> @@ -40,9 +40,9 @@ Module *getLazyIRFileModule(const std::s
>
> /// If the given MemoryBuffer holds a bitcode image, return a Module
> /// for it. Otherwise, attempt to parse it as LLVM Assembly and return
> -/// a Module for it. This function *always* takes ownership of the given
> -/// MemoryBuffer.
> -Module *ParseIR(MemoryBuffer *Buffer, SMDiagnostic &Err, LLVMContext &Context);
> +/// a Module for it. This function *never* takes ownership of Buffer.
> +Module *ParseIR(const MemoryBuffer *Buffer, SMDiagnostic &Err,
> + LLVMContext &Context);
>
> /// If the given file holds a bitcode image, return a Module for it.
> /// Otherwise, attempt to parse it as LLVM Assembly and return a Module
>
> Modified: llvm/trunk/lib/AsmParser/Parser.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/AsmParser/Parser.cpp?rev=211861&r1=211860&r2=211861&view=diff
> ==============================================================================
> --- llvm/trunk/lib/AsmParser/Parser.cpp (original)
> +++ llvm/trunk/lib/AsmParser/Parser.cpp Thu Jun 26 23:33:58 2014
> @@ -54,8 +54,7 @@ Module *llvm::ParseAssemblyFile(const st
> Module *llvm::ParseAssemblyString(const char *AsmString, Module *M,
> SMDiagnostic &Err, LLVMContext &Context) {
> MemoryBuffer *F =
> - MemoryBuffer::getMemBuffer(StringRef(AsmString, strlen(AsmString)),
> - "<string>");
> + MemoryBuffer::getMemBuffer(StringRef(AsmString), "<string>");
>
> return ParseAssembly(F, M, Err, Context);
> }
>
> Modified: llvm/trunk/lib/IRReader/IRReader.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IRReader/IRReader.cpp?rev=211861&r1=211860&r2=211861&view=diff
> ==============================================================================
> --- llvm/trunk/lib/IRReader/IRReader.cpp (original)
> +++ llvm/trunk/lib/IRReader/IRReader.cpp Thu Jun 26 23:33:58 2014
> @@ -39,7 +39,7 @@ Module *llvm::getLazyIRModule(MemoryBuff
> if (std::error_code EC = ModuleOrErr.getError()) {
> Err = SMDiagnostic(Buffer->getBufferIdentifier(), SourceMgr::DK_Error,
> EC.message());
> - // ParseBitcodeFile does not take ownership of the Buffer in the
> + // getLazyBitcodeModule does not take ownership of the Buffer in the
> // case of an error.
> delete Buffer;
> return nullptr;
> @@ -62,13 +62,14 @@ Module *llvm::getLazyIRFileModule(const
> return getLazyIRModule(File.release(), Err, Context);
> }
>
> -Module *llvm::ParseIR(MemoryBuffer *Buffer, SMDiagnostic &Err,
> +Module *llvm::ParseIR(const MemoryBuffer *Buffer, SMDiagnostic &Err,
> LLVMContext &Context) {
> NamedRegionTimer T(TimeIRParsingName, TimeIRParsingGroupName,
> TimePassesIsEnabled);
> if (isBitcode((const unsigned char *)Buffer->getBufferStart(),
> (const unsigned char *)Buffer->getBufferEnd())) {
> - ErrorOr<Module *> ModuleOrErr = parseBitcodeFile(Buffer, Context);
> + ErrorOr<Module *> ModuleOrErr =
> + parseBitcodeFile(const_cast<MemoryBuffer *>(Buffer), Context);
What's the reason for this const_cast? Does parseBitcodeFile actually
modify the MemoryBuffer? If so, I'd rather keep the ParseIR contract
truthful and keep the non-const pointer parameter. If not, a comment
to explain that parseBitcodeFile is actually non-mutating (either
statically (in which case a FIXME suggesting it should be changed to
be const correct), or dynamically for this particular caller)?
> Module *M = nullptr;
> if (std::error_code EC = ModuleOrErr.getError())
> Err = SMDiagnostic(Buffer->getBufferIdentifier(), SourceMgr::DK_Error,
> @@ -76,11 +77,12 @@ Module *llvm::ParseIR(MemoryBuffer *Buff
> else
> M = ModuleOrErr.get();
> // parseBitcodeFile does not take ownership of the Buffer.
> - delete Buffer;
> return M;
> }
>
> - return ParseAssembly(Buffer, nullptr, Err, Context);
> + return ParseAssembly(MemoryBuffer::getMemBuffer(
> + Buffer->getBuffer(), Buffer->getBufferIdentifier()),
> + nullptr, Err, Context);
> }
>
> Module *llvm::ParseIRFile(const std::string &Filename, SMDiagnostic &Err,
> @@ -92,7 +94,7 @@ Module *llvm::ParseIRFile(const std::str
> return nullptr;
> }
>
> - return ParseIR(File.release(), Err, Context);
> + return ParseIR(File.get(), Err, Context);
> }
>
> //===----------------------------------------------------------------------===//
> @@ -104,7 +106,8 @@ LLVMBool LLVMParseIRInContext(LLVMContex
> char **OutMessage) {
> SMDiagnostic Diag;
>
> - *OutM = wrap(ParseIR(unwrap(MemBuf), Diag, *unwrap(ContextRef)));
> + std::unique_ptr<MemoryBuffer> MB(unwrap(MemBuf));
> + *OutM = wrap(ParseIR(MB.get(), Diag, *unwrap(ContextRef)));
>
> if(!*OutM) {
> if (OutMessage) {
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list