168 lines · cpp
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-exception6//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/APInt.h"15#include "llvm/ADT/ArrayRef.h"16#include "llvm/ADT/STLExtras.h"17#include <optional>18 19using namespace llvm;20using namespace llvm::remarks;21 22std::string Remark::getArgsAsMsg() const {23 std::string Str;24 raw_string_ostream OS(Str);25 for (const Argument &Arg : Args)26 OS << Arg.Val;27 return Str;28}29 30Argument *Remark::getArgByKey(StringRef Key) {31 auto *It = find_if(Args, [&](auto &Arg) { return Arg.Key == Key; });32 if (It == Args.end())33 return nullptr;34 return &*It;35}36 37void RemarkLocation::print(raw_ostream &OS) const {38 OS << "{ "39 << "File: " << SourceFilePath << ", Line: " << SourceLine40 << " Column:" << SourceColumn << " }\n";41}42 43void Argument::print(raw_ostream &OS) const {44 OS << Key << ": " << Val << "\n";45}46 47void Remark::print(raw_ostream &OS) const {48 OS << "Name: ";49 OS << RemarkName << "\n";50 OS << "Type: " << typeToStr(RemarkType) << "\n";51 OS << "FunctionName: " << FunctionName << "\n";52 OS << "PassName: " << PassName << "\n";53 if (Loc)54 OS << "Loc: " << Loc.value();55 if (Hotness)56 OS << "Hotness: " << Hotness;57 if (!Args.empty()) {58 OS << "Args:\n";59 for (auto Arg : Args)60 OS << "\t" << Arg;61 }62}63 64// Create wrappers for C Binding types (see CBindingWrapping.h).65DEFINE_SIMPLE_CONVERSION_FUNCTIONS(StringRef, LLVMRemarkStringRef)66 67extern "C" const char *LLVMRemarkStringGetData(LLVMRemarkStringRef String) {68 return unwrap(String)->data();69}70 71extern "C" uint32_t LLVMRemarkStringGetLen(LLVMRemarkStringRef String) {72 return unwrap(String)->size();73}74 75extern "C" LLVMRemarkStringRef76LLVMRemarkDebugLocGetSourceFilePath(LLVMRemarkDebugLocRef DL) {77 return wrap(&unwrap(DL)->SourceFilePath);78}79 80extern "C" uint32_t LLVMRemarkDebugLocGetSourceLine(LLVMRemarkDebugLocRef DL) {81 return unwrap(DL)->SourceLine;82}83 84extern "C" uint32_t85LLVMRemarkDebugLocGetSourceColumn(LLVMRemarkDebugLocRef DL) {86 return unwrap(DL)->SourceColumn;87}88 89extern "C" LLVMRemarkStringRef LLVMRemarkArgGetKey(LLVMRemarkArgRef Arg) {90 return wrap(&unwrap(Arg)->Key);91}92 93extern "C" LLVMRemarkStringRef LLVMRemarkArgGetValue(LLVMRemarkArgRef Arg) {94 return wrap(&unwrap(Arg)->Val);95}96 97extern "C" LLVMRemarkDebugLocRef98LLVMRemarkArgGetDebugLoc(LLVMRemarkArgRef Arg) {99 if (const std::optional<RemarkLocation> &Loc = unwrap(Arg)->Loc)100 return wrap(&*Loc);101 return nullptr;102}103 104extern "C" void LLVMRemarkEntryDispose(LLVMRemarkEntryRef Remark) {105 delete unwrap(Remark);106}107 108extern "C" LLVMRemarkType LLVMRemarkEntryGetType(LLVMRemarkEntryRef Remark) {109 // Assume here that the enums can be converted both ways.110 return static_cast<LLVMRemarkType>(unwrap(Remark)->RemarkType);111}112 113extern "C" LLVMRemarkStringRef114LLVMRemarkEntryGetPassName(LLVMRemarkEntryRef Remark) {115 return wrap(&unwrap(Remark)->PassName);116}117 118extern "C" LLVMRemarkStringRef119LLVMRemarkEntryGetRemarkName(LLVMRemarkEntryRef Remark) {120 return wrap(&unwrap(Remark)->RemarkName);121}122 123extern "C" LLVMRemarkStringRef124LLVMRemarkEntryGetFunctionName(LLVMRemarkEntryRef Remark) {125 return wrap(&unwrap(Remark)->FunctionName);126}127 128extern "C" LLVMRemarkDebugLocRef129LLVMRemarkEntryGetDebugLoc(LLVMRemarkEntryRef Remark) {130 if (const std::optional<RemarkLocation> &Loc = unwrap(Remark)->Loc)131 return wrap(&*Loc);132 return nullptr;133}134 135extern "C" uint64_t LLVMRemarkEntryGetHotness(LLVMRemarkEntryRef Remark) {136 if (const std::optional<uint64_t> &Hotness = unwrap(Remark)->Hotness)137 return *Hotness;138 return 0;139}140 141extern "C" uint32_t LLVMRemarkEntryGetNumArgs(LLVMRemarkEntryRef Remark) {142 return unwrap(Remark)->Args.size();143}144 145extern "C" LLVMRemarkArgRef146LLVMRemarkEntryGetFirstArg(LLVMRemarkEntryRef Remark) {147 ArrayRef<Argument> Args = unwrap(Remark)->Args;148 // No arguments to iterate on.149 if (Args.empty())150 return nullptr;151 return reinterpret_cast<LLVMRemarkArgRef>(152 const_cast<Argument *>(Args.begin()));153}154 155extern "C" LLVMRemarkArgRef156LLVMRemarkEntryGetNextArg(LLVMRemarkArgRef ArgIt, LLVMRemarkEntryRef Remark) {157 // No more arguments to iterate on.158 if (ArgIt == nullptr)159 return nullptr;160 161 auto It = (ArrayRef<Argument>::const_iterator)ArgIt;162 auto Next = std::next(It);163 if (Next == unwrap(Remark)->Args.end())164 return nullptr;165 166 return reinterpret_cast<LLVMRemarkArgRef>(const_cast<Argument *>(Next));167}168