offload2yaml.cpp 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. //===------ offload2yaml.cpp - obj2yaml conversion tool ---*- C++ -------*-===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. #include "obj2yaml.h"
  9. #include "llvm/BinaryFormat/Magic.h"
  10. #include "llvm/Object/OffloadBinary.h"
  11. #include "llvm/ObjectYAML/OffloadYAML.h"
  12. #include "llvm/Support/StringSaver.h"
  13. using namespace llvm;
  14. namespace {
  15. void populateYAML(OffloadYAML::Binary &YAMLBinary, object::OffloadBinary &OB,
  16. UniqueStringSaver Saver) {
  17. YAMLBinary.Members.emplace_back();
  18. auto &Member = YAMLBinary.Members.back();
  19. Member.ImageKind = OB.getImageKind();
  20. Member.OffloadKind = OB.getOffloadKind();
  21. Member.Flags = OB.getFlags();
  22. if (!OB.strings().empty()) {
  23. Member.StringEntries = std::vector<OffloadYAML::Binary::StringEntry>();
  24. for (const auto &Entry : OB.strings())
  25. Member.StringEntries->emplace_back(OffloadYAML::Binary::StringEntry(
  26. {Saver.save(Entry.getKey()), Saver.save(Entry.getValue())}));
  27. }
  28. if (!OB.getImage().empty())
  29. Member.Content = arrayRefFromStringRef(OB.getImage());
  30. }
  31. Expected<OffloadYAML::Binary *> dump(MemoryBufferRef Source,
  32. UniqueStringSaver Saver) {
  33. Expected<std::unique_ptr<object::OffloadBinary>> OB =
  34. object::OffloadBinary::create(Source);
  35. if (!OB)
  36. return OB.takeError();
  37. std::unique_ptr<OffloadYAML::Binary> YAMLBinary =
  38. std::make_unique<OffloadYAML::Binary>();
  39. YAMLBinary->Members = std::vector<OffloadYAML::Binary::Member>();
  40. uint64_t Offset = 0;
  41. while (Offset < (*OB)->getMemoryBufferRef().getBufferSize()) {
  42. MemoryBufferRef Buffer = MemoryBufferRef(
  43. (*OB)->getData().drop_front(Offset), (*OB)->getFileName());
  44. auto BinaryOrErr = object::OffloadBinary::create(Buffer);
  45. if (!BinaryOrErr)
  46. return BinaryOrErr.takeError();
  47. object::OffloadBinary &Binary = **BinaryOrErr;
  48. populateYAML(*YAMLBinary, Binary, Saver);
  49. Offset += Binary.getSize();
  50. }
  51. return YAMLBinary.release();
  52. }
  53. } // namespace
  54. Error offload2yaml(raw_ostream &Out, MemoryBufferRef Source) {
  55. BumpPtrAllocator Alloc;
  56. UniqueStringSaver Saver(Alloc);
  57. Expected<OffloadYAML::Binary *> YAMLOrErr = dump(Source, Saver);
  58. if (!YAMLOrErr)
  59. return YAMLOrErr.takeError();
  60. std::unique_ptr<OffloadYAML::Binary> YAML(YAMLOrErr.get());
  61. yaml::Output Yout(Out);
  62. Yout << *YAML;
  63. return Error::success();
  64. }