LCOV - code coverage report
Current view: top level - lib/Bitcode/Reader - BitReader.cpp (source / functions) Hit Total Coverage
Test: llvm-toolchain.info Lines: 42 44 95.5 %
Date: 2018-10-20 13:21:21 Functions: 8 8 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : //===-- BitReader.cpp -----------------------------------------------------===//
       2             : //
       3             : //                     The LLVM Compiler Infrastructure
       4             : //
       5             : // This file is distributed under the University of Illinois Open Source
       6             : // License. See LICENSE.TXT for details.
       7             : //
       8             : //===----------------------------------------------------------------------===//
       9             : 
      10             : #include "llvm-c/BitReader.h"
      11             : #include "llvm-c/Core.h"
      12             : #include "llvm/Bitcode/BitcodeReader.h"
      13             : #include "llvm/IR/LLVMContext.h"
      14             : #include "llvm/IR/Module.h"
      15             : #include "llvm/Support/MemoryBuffer.h"
      16             : #include "llvm/Support/raw_ostream.h"
      17             : #include <cstring>
      18             : #include <string>
      19             : 
      20             : using namespace llvm;
      21             : 
      22             : /* Builds a module from the bitcode in the specified memory buffer, returning a
      23             :    reference to the module via the OutModule parameter. Returns 0 on success.
      24             :    Optionally returns a human-readable error message via OutMessage. */
      25           4 : LLVMBool LLVMParseBitcode(LLVMMemoryBufferRef MemBuf, LLVMModuleRef *OutModule,
      26             :                           char **OutMessage) {
      27           4 :   return LLVMParseBitcodeInContext(LLVMGetGlobalContext(), MemBuf, OutModule,
      28           4 :                                    OutMessage);
      29             : }
      30             : 
      31           8 : LLVMBool LLVMParseBitcode2(LLVMMemoryBufferRef MemBuf,
      32             :                            LLVMModuleRef *OutModule) {
      33           8 :   return LLVMParseBitcodeInContext2(LLVMGetGlobalContext(), MemBuf, OutModule);
      34             : }
      35             : 
      36           4 : LLVMBool LLVMParseBitcodeInContext(LLVMContextRef ContextRef,
      37             :                                    LLVMMemoryBufferRef MemBuf,
      38             :                                    LLVMModuleRef *OutModule,
      39             :                                    char **OutMessage) {
      40           4 :   MemoryBufferRef Buf = unwrap(MemBuf)->getMemBufferRef();
      41             :   LLVMContext &Ctx = *unwrap(ContextRef);
      42             : 
      43           8 :   Expected<std::unique_ptr<Module>> ModuleOrErr = parseBitcodeFile(Buf, Ctx);
      44           4 :   if (Error Err = ModuleOrErr.takeError()) {
      45             :     std::string Message;
      46           2 :     handleAllErrors(std::move(Err), [&](ErrorInfoBase &EIB) {
      47             :       Message = EIB.message();
      48             :     });
      49           1 :     if (OutMessage)
      50           1 :       *OutMessage = strdup(Message.c_str());
      51           1 :     *OutModule = wrap((Module *)nullptr);
      52             :     return 1;
      53             :   }
      54             : 
      55           3 :   *OutModule = wrap(ModuleOrErr.get().release());
      56           3 :   return 0;
      57             : }
      58             : 
      59           8 : LLVMBool LLVMParseBitcodeInContext2(LLVMContextRef ContextRef,
      60             :                                     LLVMMemoryBufferRef MemBuf,
      61             :                                     LLVMModuleRef *OutModule) {
      62           8 :   MemoryBufferRef Buf = unwrap(MemBuf)->getMemBufferRef();
      63             :   LLVMContext &Ctx = *unwrap(ContextRef);
      64             : 
      65             :   ErrorOr<std::unique_ptr<Module>> ModuleOrErr =
      66          15 :       expectedToErrorOrAndEmitErrors(Ctx, parseBitcodeFile(Buf, Ctx));
      67           7 :   if (ModuleOrErr.getError()) {
      68           0 :     *OutModule = wrap((Module *)nullptr);
      69           0 :     return 1;
      70             :   }
      71             : 
      72           7 :   *OutModule = wrap(ModuleOrErr.get().release());
      73           7 :   return 0;
      74             : }
      75             : 
      76             : /* Reads a module from the specified path, returning via the OutModule parameter
      77             :    a module provider which performs lazy deserialization. Returns 0 on success.
      78             :    Optionally returns a human-readable error message via OutMessage. */
      79           2 : LLVMBool LLVMGetBitcodeModuleInContext(LLVMContextRef ContextRef,
      80             :                                        LLVMMemoryBufferRef MemBuf,
      81             :                                        LLVMModuleRef *OutM, char **OutMessage) {
      82             :   LLVMContext &Ctx = *unwrap(ContextRef);
      83             :   std::unique_ptr<MemoryBuffer> Owner(unwrap(MemBuf));
      84             :   Expected<std::unique_ptr<Module>> ModuleOrErr =
      85           4 :       getOwningLazyBitcodeModule(std::move(Owner), Ctx);
      86             :   // Release the buffer if we didn't take ownership of it since we never owned
      87             :   // it anyway.
      88             :   (void)Owner.release();
      89             : 
      90           2 :   if (Error Err = ModuleOrErr.takeError()) {
      91             :     std::string Message;
      92           2 :     handleAllErrors(std::move(Err), [&](ErrorInfoBase &EIB) {
      93             :       Message = EIB.message();
      94             :     });
      95           1 :     if (OutMessage)
      96           1 :       *OutMessage = strdup(Message.c_str());
      97           1 :     *OutM = wrap((Module *)nullptr);
      98             :     return 1;
      99             :   }
     100             : 
     101           1 :   *OutM = wrap(ModuleOrErr.get().release());
     102             : 
     103           1 :   return 0;
     104             : }
     105             : 
     106           3 : LLVMBool LLVMGetBitcodeModuleInContext2(LLVMContextRef ContextRef,
     107             :                                         LLVMMemoryBufferRef MemBuf,
     108             :                                         LLVMModuleRef *OutM) {
     109             :   LLVMContext &Ctx = *unwrap(ContextRef);
     110             :   std::unique_ptr<MemoryBuffer> Owner(unwrap(MemBuf));
     111             : 
     112             :   ErrorOr<std::unique_ptr<Module>> ModuleOrErr = expectedToErrorOrAndEmitErrors(
     113           5 :       Ctx, getOwningLazyBitcodeModule(std::move(Owner), Ctx));
     114             :   Owner.release();
     115             : 
     116           2 :   if (ModuleOrErr.getError()) {
     117           1 :     *OutM = wrap((Module *)nullptr);
     118           1 :     return 1;
     119             :   }
     120             : 
     121           1 :   *OutM = wrap(ModuleOrErr.get().release());
     122           1 :   return 0;
     123             : }
     124             : 
     125           2 : LLVMBool LLVMGetBitcodeModule(LLVMMemoryBufferRef MemBuf, LLVMModuleRef *OutM,
     126             :                               char **OutMessage) {
     127           2 :   return LLVMGetBitcodeModuleInContext(LLVMGetGlobalContext(), MemBuf, OutM,
     128           2 :                                        OutMessage);
     129             : }
     130             : 
     131           3 : LLVMBool LLVMGetBitcodeModule2(LLVMMemoryBufferRef MemBuf,
     132             :                                LLVMModuleRef *OutM) {
     133           3 :   return LLVMGetBitcodeModuleInContext2(LLVMGetGlobalContext(), MemBuf, OutM);
     134             : }

Generated by: LCOV version 1.13