13bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien//===-- BitReader.cpp -----------------------------------------------------===//
23bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien//
33bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien//                     The LLVM Compiler Infrastructure
43bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien//
53bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien// This file is distributed under the University of Illinois Open Source
63bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien// License. See LICENSE.TXT for details.
73bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien//
83bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien//===----------------------------------------------------------------------===//
93bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien
103bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien#include "llvm-c/BitReader.h"
113bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien#include "llvm/Bitcode/ReaderWriter.h"
123bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien#include "llvm/LLVMContext.h"
133bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien#include "llvm/Support/MemoryBuffer.h"
143bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien#include <string>
153bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien#include <cstring>
163bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien
173bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chienusing namespace llvm;
183bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien
193bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien/* Builds a module from the bitcode in the specified memory buffer, returning a
203bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien   reference to the module via the OutModule parameter. Returns 0 on success.
213bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien   Optionally returns a human-readable error message via OutMessage. */
223bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan ChienLLVMBool LLVMParseBitcode(LLVMMemoryBufferRef MemBuf,
233bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien                          LLVMModuleRef *OutModule, char **OutMessage) {
243bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien  return LLVMParseBitcodeInContext(wrap(&getGlobalContext()), MemBuf, OutModule,
253bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien                                   OutMessage);
263bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien}
273bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien
283bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan ChienLLVMBool LLVMParseBitcodeInContext(LLVMContextRef ContextRef,
293bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien                                   LLVMMemoryBufferRef MemBuf,
303bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien                                   LLVMModuleRef *OutModule,
313bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien                                   char **OutMessage) {
323bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien  std::string Message;
333bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien
343bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien  *OutModule = wrap(ParseBitcodeFile(unwrap(MemBuf), *unwrap(ContextRef),
353bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien                                     &Message));
363bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien  if (!*OutModule) {
373bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien    if (OutMessage)
383bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien      *OutMessage = strdup(Message.c_str());
393bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien    return 1;
403bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien  }
413bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien
423bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien  return 0;
433bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien}
443bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien
453bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien/* Reads a module from the specified path, returning via the OutModule parameter
463bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien   a module provider which performs lazy deserialization. Returns 0 on success.
473bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien   Optionally returns a human-readable error message via OutMessage. */
483bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan ChienLLVMBool LLVMGetBitcodeModuleInContext(LLVMContextRef ContextRef,
493bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien                                       LLVMMemoryBufferRef MemBuf,
503bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien                                       LLVMModuleRef *OutM,
513bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien                                       char **OutMessage) {
523bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien  std::string Message;
533bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien
543bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien  *OutM = wrap(getLazyBitcodeModule(unwrap(MemBuf), *unwrap(ContextRef),
553bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien                                    &Message));
563bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien  if (!*OutM) {
573bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien    if (OutMessage)
583bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien      *OutMessage = strdup(Message.c_str());
593bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien    return 1;
603bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien  }
613bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien
623bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien  return 0;
633bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien
643bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien}
653bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien
663bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan ChienLLVMBool LLVMGetBitcodeModule(LLVMMemoryBufferRef MemBuf, LLVMModuleRef *OutM,
673bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien                              char **OutMessage) {
683bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien  return LLVMGetBitcodeModuleInContext(LLVMGetGlobalContext(), MemBuf, OutM,
693bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien                                       OutMessage);
703bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien}
713bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien
723bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien/* Deprecated: Use LLVMGetBitcodeModuleInContext instead. */
733bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan ChienLLVMBool LLVMGetBitcodeModuleProviderInContext(LLVMContextRef ContextRef,
743bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien                                               LLVMMemoryBufferRef MemBuf,
753bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien                                               LLVMModuleProviderRef *OutMP,
763bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien                                               char **OutMessage) {
773bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien  return LLVMGetBitcodeModuleInContext(ContextRef, MemBuf,
783bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien                                       reinterpret_cast<LLVMModuleRef*>(OutMP),
793bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien                                       OutMessage);
803bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien}
813bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien
823bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien/* Deprecated: Use LLVMGetBitcodeModule instead. */
833bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan ChienLLVMBool LLVMGetBitcodeModuleProvider(LLVMMemoryBufferRef MemBuf,
843bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien                                      LLVMModuleProviderRef *OutMP,
853bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien                                      char **OutMessage) {
863bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien  return LLVMGetBitcodeModuleProviderInContext(LLVMGetGlobalContext(), MemBuf,
873bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien                                               OutMP, OutMessage);
883bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien}
89