BitReader.cpp 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  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-c/Core.h"
  11. #include "llvm/Bitcode/ReaderWriter.h"
  12. #include "llvm/IR/DiagnosticPrinter.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. using namespace llvm;
  20. /* Builds a module from the bitcode in the specified memory buffer, returning a
  21. reference to the module via the OutModule parameter. Returns 0 on success.
  22. Optionally returns a human-readable error message via OutMessage. */
  23. LLVMBool LLVMParseBitcode(LLVMMemoryBufferRef MemBuf, LLVMModuleRef *OutModule,
  24. char **OutMessage) {
  25. return LLVMParseBitcodeInContext(LLVMGetGlobalContext(), MemBuf, OutModule,
  26. OutMessage);
  27. }
  28. LLVMBool LLVMParseBitcode2(LLVMMemoryBufferRef MemBuf,
  29. LLVMModuleRef *OutModule) {
  30. return LLVMParseBitcodeInContext2(LLVMGetGlobalContext(), MemBuf, OutModule);
  31. }
  32. static void diagnosticHandler(const DiagnosticInfo &DI, void *C) {
  33. auto *Message = reinterpret_cast<std::string *>(C);
  34. raw_string_ostream Stream(*Message);
  35. DiagnosticPrinterRawOStream DP(Stream);
  36. DI.print(DP);
  37. }
  38. LLVMBool LLVMParseBitcodeInContext(LLVMContextRef ContextRef,
  39. LLVMMemoryBufferRef MemBuf,
  40. LLVMModuleRef *OutModule,
  41. char **OutMessage) {
  42. MemoryBufferRef Buf = unwrap(MemBuf)->getMemBufferRef();
  43. LLVMContext &Ctx = *unwrap(ContextRef);
  44. LLVMContext::DiagnosticHandlerTy OldDiagnosticHandler =
  45. Ctx.getDiagnosticHandler();
  46. void *OldDiagnosticContext = Ctx.getDiagnosticContext();
  47. std::string Message;
  48. Ctx.setDiagnosticHandler(diagnosticHandler, &Message, true);
  49. ErrorOr<std::unique_ptr<Module>> ModuleOrErr = parseBitcodeFile(Buf, Ctx);
  50. Ctx.setDiagnosticHandler(OldDiagnosticHandler, OldDiagnosticContext, true);
  51. if (ModuleOrErr.getError()) {
  52. if (OutMessage)
  53. *OutMessage = strdup(Message.c_str());
  54. *OutModule = wrap((Module *)nullptr);
  55. return 1;
  56. }
  57. *OutModule = wrap(ModuleOrErr.get().release());
  58. return 0;
  59. }
  60. LLVMBool LLVMParseBitcodeInContext2(LLVMContextRef ContextRef,
  61. LLVMMemoryBufferRef MemBuf,
  62. LLVMModuleRef *OutModule) {
  63. MemoryBufferRef Buf = unwrap(MemBuf)->getMemBufferRef();
  64. LLVMContext &Ctx = *unwrap(ContextRef);
  65. ErrorOr<std::unique_ptr<Module>> ModuleOrErr = parseBitcodeFile(Buf, Ctx);
  66. if (ModuleOrErr.getError()) {
  67. *OutModule = wrap((Module *)nullptr);
  68. return 1;
  69. }
  70. *OutModule = wrap(ModuleOrErr.get().release());
  71. return 0;
  72. }
  73. /* Reads a module from the specified path, returning via the OutModule parameter
  74. a module provider which performs lazy deserialization. Returns 0 on success.
  75. Optionally returns a human-readable error message via OutMessage. */
  76. LLVMBool LLVMGetBitcodeModuleInContext(LLVMContextRef ContextRef,
  77. LLVMMemoryBufferRef MemBuf,
  78. LLVMModuleRef *OutM, char **OutMessage) {
  79. LLVMContext &Ctx = *unwrap(ContextRef);
  80. LLVMContext::DiagnosticHandlerTy OldDiagnosticHandler =
  81. Ctx.getDiagnosticHandler();
  82. void *OldDiagnosticContext = Ctx.getDiagnosticContext();
  83. std::string Message;
  84. Ctx.setDiagnosticHandler(diagnosticHandler, &Message, true);
  85. std::unique_ptr<MemoryBuffer> Owner(unwrap(MemBuf));
  86. ErrorOr<std::unique_ptr<Module>> ModuleOrErr =
  87. getOwningLazyBitcodeModule(std::move(Owner), Ctx);
  88. Owner.release();
  89. Ctx.setDiagnosticHandler(OldDiagnosticHandler, OldDiagnosticContext, true);
  90. if (ModuleOrErr.getError()) {
  91. *OutM = wrap((Module *)nullptr);
  92. if (OutMessage)
  93. *OutMessage = strdup(Message.c_str());
  94. return 1;
  95. }
  96. *OutM = wrap(ModuleOrErr.get().release());
  97. return 0;
  98. }
  99. LLVMBool LLVMGetBitcodeModuleInContext2(LLVMContextRef ContextRef,
  100. LLVMMemoryBufferRef MemBuf,
  101. LLVMModuleRef *OutM) {
  102. LLVMContext &Ctx = *unwrap(ContextRef);
  103. std::unique_ptr<MemoryBuffer> Owner(unwrap(MemBuf));
  104. ErrorOr<std::unique_ptr<Module>> ModuleOrErr =
  105. getOwningLazyBitcodeModule(std::move(Owner), Ctx);
  106. Owner.release();
  107. if (ModuleOrErr.getError()) {
  108. *OutM = wrap((Module *)nullptr);
  109. return 1;
  110. }
  111. *OutM = wrap(ModuleOrErr.get().release());
  112. return 0;
  113. }
  114. LLVMBool LLVMGetBitcodeModule(LLVMMemoryBufferRef MemBuf, LLVMModuleRef *OutM,
  115. char **OutMessage) {
  116. return LLVMGetBitcodeModuleInContext(LLVMGetGlobalContext(), MemBuf, OutM,
  117. OutMessage);
  118. }
  119. LLVMBool LLVMGetBitcodeModule2(LLVMMemoryBufferRef MemBuf,
  120. LLVMModuleRef *OutM) {
  121. return LLVMGetBitcodeModuleInContext2(LLVMGetGlobalContext(), MemBuf, OutM);
  122. }