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