2
0

IRReader.cpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. //===---- IRReader.cpp - Reader for LLVM IR files -------------------------===//
  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/IRReader/IRReader.h"
  10. // #include "llvm-c/Core.h"
  11. // #include "llvm-c/IRReader.h"
  12. #include "llvm/AsmParser/Parser.h"
  13. #include "llvm/Bitcode/ReaderWriter.h"
  14. #include "llvm/IR/LLVMContext.h"
  15. #include "llvm/IR/Module.h"
  16. #include "llvm/Support/MemoryBuffer.h"
  17. #include "llvm/Support/SourceMgr.h"
  18. #include "llvm/Support/Timer.h"
  19. #include "llvm/Support/raw_ostream.h"
  20. #include <system_error>
  21. using namespace llvm;
  22. namespace llvm {
  23. extern bool TimePassesIsEnabled;
  24. }
  25. static const char *const TimeIRParsingGroupName = "LLVM IR Parsing";
  26. static const char *const TimeIRParsingName = "Parse IR";
  27. static std::unique_ptr<Module>
  28. getLazyIRModule(std::unique_ptr<MemoryBuffer> Buffer, SMDiagnostic &Err,
  29. LLVMContext &Context) {
  30. if (isBitcode((const unsigned char *)Buffer->getBufferStart(),
  31. (const unsigned char *)Buffer->getBufferEnd())) {
  32. ErrorOr<std::unique_ptr<Module>> ModuleOrErr =
  33. getLazyBitcodeModule(std::move(Buffer), Context);
  34. if (std::error_code EC = ModuleOrErr.getError()) {
  35. Err = SMDiagnostic(Buffer->getBufferIdentifier(), SourceMgr::DK_Error,
  36. EC.message());
  37. return nullptr;
  38. }
  39. return std::move(ModuleOrErr.get());
  40. }
  41. return parseAssembly(Buffer->getMemBufferRef(), Err, Context);
  42. }
  43. std::unique_ptr<Module> llvm::getLazyIRFileModule(StringRef Filename,
  44. SMDiagnostic &Err,
  45. LLVMContext &Context) {
  46. ErrorOr<std::unique_ptr<MemoryBuffer>> FileOrErr =
  47. MemoryBuffer::getFileOrSTDIN(Filename);
  48. if (std::error_code EC = FileOrErr.getError()) {
  49. Err = SMDiagnostic(Filename, SourceMgr::DK_Error,
  50. "Could not open input file: " + EC.message());
  51. return nullptr;
  52. }
  53. return getLazyIRModule(std::move(FileOrErr.get()), Err, Context);
  54. }
  55. std::unique_ptr<Module> llvm::parseIR(MemoryBufferRef Buffer, SMDiagnostic &Err,
  56. LLVMContext &Context) {
  57. NamedRegionTimer T(TimeIRParsingName, TimeIRParsingGroupName,
  58. TimePassesIsEnabled);
  59. if (isBitcode((const unsigned char *)Buffer.getBufferStart(),
  60. (const unsigned char *)Buffer.getBufferEnd())) {
  61. ErrorOr<std::unique_ptr<Module>> ModuleOrErr =
  62. parseBitcodeFile(Buffer, Context);
  63. if (std::error_code EC = ModuleOrErr.getError()) {
  64. Err = SMDiagnostic(Buffer.getBufferIdentifier(), SourceMgr::DK_Error,
  65. EC.message());
  66. return nullptr;
  67. }
  68. return std::move(ModuleOrErr.get());
  69. }
  70. return parseAssembly(Buffer, Err, Context);
  71. }
  72. std::unique_ptr<Module> llvm::parseIRFile(StringRef Filename, SMDiagnostic &Err,
  73. LLVMContext &Context) {
  74. ErrorOr<std::unique_ptr<MemoryBuffer>> FileOrErr =
  75. MemoryBuffer::getFileOrSTDIN(Filename);
  76. if (std::error_code EC = FileOrErr.getError()) {
  77. Err = SMDiagnostic(Filename, SourceMgr::DK_Error,
  78. "Could not open input file: " + EC.message());
  79. return nullptr;
  80. }
  81. return parseIR(FileOrErr.get()->getMemBufferRef(), Err, Context);
  82. }
  83. #if 0 // HLSL Change Starts
  84. //===----------------------------------------------------------------------===//
  85. // C API.
  86. //===----------------------------------------------------------------------===//
  87. LLVMBool LLVMParseIRInContext(LLVMContextRef ContextRef,
  88. LLVMMemoryBufferRef MemBuf, LLVMModuleRef *OutM,
  89. char **OutMessage) {
  90. SMDiagnostic Diag;
  91. std::unique_ptr<MemoryBuffer> MB(unwrap(MemBuf));
  92. *OutM =
  93. wrap(parseIR(MB->getMemBufferRef(), Diag, *unwrap(ContextRef)).release());
  94. if(!*OutM) {
  95. if (OutMessage) {
  96. std::string buf;
  97. raw_string_ostream os(buf);
  98. Diag.print(nullptr, os, false);
  99. os.flush();
  100. *OutMessage = _strdup(buf.c_str());
  101. }
  102. return 1;
  103. }
  104. return 0;
  105. }
  106. #endif // HLSL Change Ends