| //===- Remark.cpp ---------------------------------------------------------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // Implementation of the Remark type and the C API. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "llvm/Remarks/Remark.h" |
| #include "llvm/ADT/ArrayRef.h" |
| #include "llvm/Support/raw_ostream.h" |
| #include <optional> |
| |
| using namespace llvm; |
| using namespace llvm::remarks; |
| |
| std::string Remark::getArgsAsMsg() const { |
| std::string Str; |
| raw_string_ostream OS(Str); |
| for (const Argument &Arg : Args) |
| OS << Arg.Val; |
| return OS.str(); |
| } |
| |
| // Create wrappers for C Binding types (see CBindingWrapping.h). |
| DEFINE_SIMPLE_CONVERSION_FUNCTIONS(StringRef, LLVMRemarkStringRef) |
| |
| extern "C" const char *LLVMRemarkStringGetData(LLVMRemarkStringRef String) { |
| return unwrap(String)->data(); |
| } |
| |
| extern "C" uint32_t LLVMRemarkStringGetLen(LLVMRemarkStringRef String) { |
| return unwrap(String)->size(); |
| } |
| |
| extern "C" LLVMRemarkStringRef |
| LLVMRemarkDebugLocGetSourceFilePath(LLVMRemarkDebugLocRef DL) { |
| return wrap(&unwrap(DL)->SourceFilePath); |
| } |
| |
| extern "C" uint32_t LLVMRemarkDebugLocGetSourceLine(LLVMRemarkDebugLocRef DL) { |
| return unwrap(DL)->SourceLine; |
| } |
| |
| extern "C" uint32_t |
| LLVMRemarkDebugLocGetSourceColumn(LLVMRemarkDebugLocRef DL) { |
| return unwrap(DL)->SourceColumn; |
| } |
| |
| extern "C" LLVMRemarkStringRef LLVMRemarkArgGetKey(LLVMRemarkArgRef Arg) { |
| return wrap(&unwrap(Arg)->Key); |
| } |
| |
| extern "C" LLVMRemarkStringRef LLVMRemarkArgGetValue(LLVMRemarkArgRef Arg) { |
| return wrap(&unwrap(Arg)->Val); |
| } |
| |
| extern "C" LLVMRemarkDebugLocRef |
| LLVMRemarkArgGetDebugLoc(LLVMRemarkArgRef Arg) { |
| if (const std::optional<RemarkLocation> &Loc = unwrap(Arg)->Loc) |
| return wrap(&*Loc); |
| return nullptr; |
| } |
| |
| extern "C" void LLVMRemarkEntryDispose(LLVMRemarkEntryRef Remark) { |
| delete unwrap(Remark); |
| } |
| |
| extern "C" LLVMRemarkType LLVMRemarkEntryGetType(LLVMRemarkEntryRef Remark) { |
| // Assume here that the enums can be converted both ways. |
| return static_cast<LLVMRemarkType>(unwrap(Remark)->RemarkType); |
| } |
| |
| extern "C" LLVMRemarkStringRef |
| LLVMRemarkEntryGetPassName(LLVMRemarkEntryRef Remark) { |
| return wrap(&unwrap(Remark)->PassName); |
| } |
| |
| extern "C" LLVMRemarkStringRef |
| LLVMRemarkEntryGetRemarkName(LLVMRemarkEntryRef Remark) { |
| return wrap(&unwrap(Remark)->RemarkName); |
| } |
| |
| extern "C" LLVMRemarkStringRef |
| LLVMRemarkEntryGetFunctionName(LLVMRemarkEntryRef Remark) { |
| return wrap(&unwrap(Remark)->FunctionName); |
| } |
| |
| extern "C" LLVMRemarkDebugLocRef |
| LLVMRemarkEntryGetDebugLoc(LLVMRemarkEntryRef Remark) { |
| if (const std::optional<RemarkLocation> &Loc = unwrap(Remark)->Loc) |
| return wrap(&*Loc); |
| return nullptr; |
| } |
| |
| extern "C" uint64_t LLVMRemarkEntryGetHotness(LLVMRemarkEntryRef Remark) { |
| if (const std::optional<uint64_t> &Hotness = unwrap(Remark)->Hotness) |
| return *Hotness; |
| return 0; |
| } |
| |
| extern "C" uint32_t LLVMRemarkEntryGetNumArgs(LLVMRemarkEntryRef Remark) { |
| return unwrap(Remark)->Args.size(); |
| } |
| |
| extern "C" LLVMRemarkArgRef |
| LLVMRemarkEntryGetFirstArg(LLVMRemarkEntryRef Remark) { |
| ArrayRef<Argument> Args = unwrap(Remark)->Args; |
| // No arguments to iterate on. |
| if (Args.empty()) |
| return nullptr; |
| return reinterpret_cast<LLVMRemarkArgRef>( |
| const_cast<Argument *>(Args.begin())); |
| } |
| |
| extern "C" LLVMRemarkArgRef |
| LLVMRemarkEntryGetNextArg(LLVMRemarkArgRef ArgIt, LLVMRemarkEntryRef Remark) { |
| // No more arguments to iterate on. |
| if (ArgIt == nullptr) |
| return nullptr; |
| |
| auto It = (ArrayRef<Argument>::const_iterator)ArgIt; |
| auto Next = std::next(It); |
| if (Next == unwrap(Remark)->Args.end()) |
| return nullptr; |
| |
| return reinterpret_cast<LLVMRemarkArgRef>(const_cast<Argument *>(Next)); |
| } |