BitReader.cpp 3.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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. #include "llvm-c/BitReader.h"
  10. #include "llvm/Bitcode/ReaderWriter.h"
  11. #include "llvm/IR/LLVMContext.h"
  12. #include "llvm/IR/Module.h"
  13. #include "llvm/Support/MemoryBuffer.h"
  14. #include <cstring>
  15. #include <string>
  16. using namespace llvm;
  17. /* Builds a module from the bitcode in the specified memory buffer, returning a
  18. reference to the module via the OutModule parameter. Returns 0 on success.
  19. Optionally returns a human-readable error message via OutMessage. */
  20. LLVMBool LLVMParseBitcode(LLVMMemoryBufferRef MemBuf,
  21. LLVMModuleRef *OutModule, char **OutMessage) {
  22. return LLVMParseBitcodeInContext(wrap(&getGlobalContext()), MemBuf, OutModule,
  23. OutMessage);
  24. }
  25. LLVMBool LLVMParseBitcodeInContext(LLVMContextRef ContextRef,
  26. LLVMMemoryBufferRef MemBuf,
  27. LLVMModuleRef *OutModule,
  28. char **OutMessage) {
  29. ErrorOr<Module *> ModuleOrErr =
  30. parseBitcodeFile(unwrap(MemBuf), *unwrap(ContextRef));
  31. if (error_code EC = ModuleOrErr.getError()) {
  32. if (OutMessage)
  33. *OutMessage = strdup(EC.message().c_str());
  34. *OutModule = wrap((Module*)nullptr);
  35. return 1;
  36. }
  37. *OutModule = wrap(ModuleOrErr.get());
  38. return 0;
  39. }
  40. /* Reads a module from the specified path, returning via the OutModule parameter
  41. a module provider which performs lazy deserialization. Returns 0 on success.
  42. Optionally returns a human-readable error message via OutMessage. */
  43. LLVMBool LLVMGetBitcodeModuleInContext(LLVMContextRef ContextRef,
  44. LLVMMemoryBufferRef MemBuf,
  45. LLVMModuleRef *OutM,
  46. char **OutMessage) {
  47. std::string Message;
  48. ErrorOr<Module *> ModuleOrErr =
  49. getLazyBitcodeModule(unwrap(MemBuf), *unwrap(ContextRef));
  50. if (error_code EC = ModuleOrErr.getError()) {
  51. *OutM = wrap((Module *)nullptr);
  52. if (OutMessage)
  53. *OutMessage = strdup(EC.message().c_str());
  54. return 1;
  55. }
  56. *OutM = wrap(ModuleOrErr.get());
  57. return 0;
  58. }
  59. LLVMBool LLVMGetBitcodeModule(LLVMMemoryBufferRef MemBuf, LLVMModuleRef *OutM,
  60. char **OutMessage) {
  61. return LLVMGetBitcodeModuleInContext(LLVMGetGlobalContext(), MemBuf, OutM,
  62. OutMessage);
  63. }
  64. /* Deprecated: Use LLVMGetBitcodeModuleInContext instead. */
  65. LLVMBool LLVMGetBitcodeModuleProviderInContext(LLVMContextRef ContextRef,
  66. LLVMMemoryBufferRef MemBuf,
  67. LLVMModuleProviderRef *OutMP,
  68. char **OutMessage) {
  69. return LLVMGetBitcodeModuleInContext(ContextRef, MemBuf,
  70. reinterpret_cast<LLVMModuleRef*>(OutMP),
  71. OutMessage);
  72. }
  73. /* Deprecated: Use LLVMGetBitcodeModule instead. */
  74. LLVMBool LLVMGetBitcodeModuleProvider(LLVMMemoryBufferRef MemBuf,
  75. LLVMModuleProviderRef *OutMP,
  76. char **OutMessage) {
  77. return LLVMGetBitcodeModuleProviderInContext(LLVMGetGlobalContext(), MemBuf,
  78. OutMP, OutMessage);
  79. }