Remark.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. //===- Remark.cpp ---------------------------------------------------------===//
  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. //
  9. // Implementation of the Remark type and the C API.
  10. //
  11. //===----------------------------------------------------------------------===//
  12. #include "llvm/Remarks/Remark.h"
  13. #include "llvm/ADT/ArrayRef.h"
  14. #include "llvm/Support/raw_ostream.h"
  15. #include <optional>
  16. using namespace llvm;
  17. using namespace llvm::remarks;
  18. std::string Remark::getArgsAsMsg() const {
  19. std::string Str;
  20. raw_string_ostream OS(Str);
  21. for (const Argument &Arg : Args)
  22. OS << Arg.Val;
  23. return OS.str();
  24. }
  25. // Create wrappers for C Binding types (see CBindingWrapping.h).
  26. DEFINE_SIMPLE_CONVERSION_FUNCTIONS(StringRef, LLVMRemarkStringRef)
  27. extern "C" const char *LLVMRemarkStringGetData(LLVMRemarkStringRef String) {
  28. return unwrap(String)->data();
  29. }
  30. extern "C" uint32_t LLVMRemarkStringGetLen(LLVMRemarkStringRef String) {
  31. return unwrap(String)->size();
  32. }
  33. extern "C" LLVMRemarkStringRef
  34. LLVMRemarkDebugLocGetSourceFilePath(LLVMRemarkDebugLocRef DL) {
  35. return wrap(&unwrap(DL)->SourceFilePath);
  36. }
  37. extern "C" uint32_t LLVMRemarkDebugLocGetSourceLine(LLVMRemarkDebugLocRef DL) {
  38. return unwrap(DL)->SourceLine;
  39. }
  40. extern "C" uint32_t
  41. LLVMRemarkDebugLocGetSourceColumn(LLVMRemarkDebugLocRef DL) {
  42. return unwrap(DL)->SourceColumn;
  43. }
  44. extern "C" LLVMRemarkStringRef LLVMRemarkArgGetKey(LLVMRemarkArgRef Arg) {
  45. return wrap(&unwrap(Arg)->Key);
  46. }
  47. extern "C" LLVMRemarkStringRef LLVMRemarkArgGetValue(LLVMRemarkArgRef Arg) {
  48. return wrap(&unwrap(Arg)->Val);
  49. }
  50. extern "C" LLVMRemarkDebugLocRef
  51. LLVMRemarkArgGetDebugLoc(LLVMRemarkArgRef Arg) {
  52. if (const std::optional<RemarkLocation> &Loc = unwrap(Arg)->Loc)
  53. return wrap(&*Loc);
  54. return nullptr;
  55. }
  56. extern "C" void LLVMRemarkEntryDispose(LLVMRemarkEntryRef Remark) {
  57. delete unwrap(Remark);
  58. }
  59. extern "C" LLVMRemarkType LLVMRemarkEntryGetType(LLVMRemarkEntryRef Remark) {
  60. // Assume here that the enums can be converted both ways.
  61. return static_cast<LLVMRemarkType>(unwrap(Remark)->RemarkType);
  62. }
  63. extern "C" LLVMRemarkStringRef
  64. LLVMRemarkEntryGetPassName(LLVMRemarkEntryRef Remark) {
  65. return wrap(&unwrap(Remark)->PassName);
  66. }
  67. extern "C" LLVMRemarkStringRef
  68. LLVMRemarkEntryGetRemarkName(LLVMRemarkEntryRef Remark) {
  69. return wrap(&unwrap(Remark)->RemarkName);
  70. }
  71. extern "C" LLVMRemarkStringRef
  72. LLVMRemarkEntryGetFunctionName(LLVMRemarkEntryRef Remark) {
  73. return wrap(&unwrap(Remark)->FunctionName);
  74. }
  75. extern "C" LLVMRemarkDebugLocRef
  76. LLVMRemarkEntryGetDebugLoc(LLVMRemarkEntryRef Remark) {
  77. if (const std::optional<RemarkLocation> &Loc = unwrap(Remark)->Loc)
  78. return wrap(&*Loc);
  79. return nullptr;
  80. }
  81. extern "C" uint64_t LLVMRemarkEntryGetHotness(LLVMRemarkEntryRef Remark) {
  82. if (const std::optional<uint64_t> &Hotness = unwrap(Remark)->Hotness)
  83. return *Hotness;
  84. return 0;
  85. }
  86. extern "C" uint32_t LLVMRemarkEntryGetNumArgs(LLVMRemarkEntryRef Remark) {
  87. return unwrap(Remark)->Args.size();
  88. }
  89. extern "C" LLVMRemarkArgRef
  90. LLVMRemarkEntryGetFirstArg(LLVMRemarkEntryRef Remark) {
  91. ArrayRef<Argument> Args = unwrap(Remark)->Args;
  92. // No arguments to iterate on.
  93. if (Args.empty())
  94. return nullptr;
  95. return reinterpret_cast<LLVMRemarkArgRef>(
  96. const_cast<Argument *>(Args.begin()));
  97. }
  98. extern "C" LLVMRemarkArgRef
  99. LLVMRemarkEntryGetNextArg(LLVMRemarkArgRef ArgIt, LLVMRemarkEntryRef Remark) {
  100. // No more arguments to iterate on.
  101. if (ArgIt == nullptr)
  102. return nullptr;
  103. auto It = (ArrayRef<Argument>::const_iterator)ArgIt;
  104. auto Next = std::next(It);
  105. if (Next == unwrap(Remark)->Args.end())
  106. return nullptr;
  107. return reinterpret_cast<LLVMRemarkArgRef>(const_cast<Argument *>(Next));
  108. }