Path: blob/main/contrib/llvm-project/llvm/lib/Remarks/Remark.cpp
35262 views
//===- Remark.cpp ---------------------------------------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// Implementation of the Remark type and the C API.9//10//===----------------------------------------------------------------------===//1112#include "llvm/Remarks/Remark.h"13#include "llvm/ADT/APInt.h"14#include "llvm/ADT/ArrayRef.h"15#include <optional>1617using namespace llvm;18using namespace llvm::remarks;1920std::string Remark::getArgsAsMsg() const {21std::string Str;22raw_string_ostream OS(Str);23for (const Argument &Arg : Args)24OS << Arg.Val;25return Str;26}2728/// Returns the value of a specified key parsed from StringRef.29std::optional<int> Argument::getValAsInt() const {30APInt KeyVal;31if (Val.getAsInteger(10, KeyVal))32return std::nullopt;33return KeyVal.getSExtValue();34}3536bool Argument::isValInt() const { return getValAsInt().has_value(); }3738void RemarkLocation::print(raw_ostream &OS) const {39OS << "{ "40<< "File: " << SourceFilePath << ", Line: " << SourceLine41<< " Column:" << SourceColumn << " }\n";42}4344void Argument::print(raw_ostream &OS) const {45OS << Key << ": " << Val << "\n";46}4748void Remark::print(raw_ostream &OS) const {49OS << "Name: ";50OS << RemarkName << "\n";51OS << "Type: " << typeToStr(RemarkType) << "\n";52OS << "FunctionName: " << FunctionName << "\n";53OS << "PassName: " << PassName << "\n";54if (Loc)55OS << "Loc: " << Loc.value();56if (Hotness)57OS << "Hotness: " << Hotness;58if (!Args.empty()) {59OS << "Args:\n";60for (auto Arg : Args)61OS << "\t" << Arg;62}63}6465// Create wrappers for C Binding types (see CBindingWrapping.h).66DEFINE_SIMPLE_CONVERSION_FUNCTIONS(StringRef, LLVMRemarkStringRef)6768extern "C" const char *LLVMRemarkStringGetData(LLVMRemarkStringRef String) {69return unwrap(String)->data();70}7172extern "C" uint32_t LLVMRemarkStringGetLen(LLVMRemarkStringRef String) {73return unwrap(String)->size();74}7576extern "C" LLVMRemarkStringRef77LLVMRemarkDebugLocGetSourceFilePath(LLVMRemarkDebugLocRef DL) {78return wrap(&unwrap(DL)->SourceFilePath);79}8081extern "C" uint32_t LLVMRemarkDebugLocGetSourceLine(LLVMRemarkDebugLocRef DL) {82return unwrap(DL)->SourceLine;83}8485extern "C" uint32_t86LLVMRemarkDebugLocGetSourceColumn(LLVMRemarkDebugLocRef DL) {87return unwrap(DL)->SourceColumn;88}8990extern "C" LLVMRemarkStringRef LLVMRemarkArgGetKey(LLVMRemarkArgRef Arg) {91return wrap(&unwrap(Arg)->Key);92}9394extern "C" LLVMRemarkStringRef LLVMRemarkArgGetValue(LLVMRemarkArgRef Arg) {95return wrap(&unwrap(Arg)->Val);96}9798extern "C" LLVMRemarkDebugLocRef99LLVMRemarkArgGetDebugLoc(LLVMRemarkArgRef Arg) {100if (const std::optional<RemarkLocation> &Loc = unwrap(Arg)->Loc)101return wrap(&*Loc);102return nullptr;103}104105extern "C" void LLVMRemarkEntryDispose(LLVMRemarkEntryRef Remark) {106delete unwrap(Remark);107}108109extern "C" LLVMRemarkType LLVMRemarkEntryGetType(LLVMRemarkEntryRef Remark) {110// Assume here that the enums can be converted both ways.111return static_cast<LLVMRemarkType>(unwrap(Remark)->RemarkType);112}113114extern "C" LLVMRemarkStringRef115LLVMRemarkEntryGetPassName(LLVMRemarkEntryRef Remark) {116return wrap(&unwrap(Remark)->PassName);117}118119extern "C" LLVMRemarkStringRef120LLVMRemarkEntryGetRemarkName(LLVMRemarkEntryRef Remark) {121return wrap(&unwrap(Remark)->RemarkName);122}123124extern "C" LLVMRemarkStringRef125LLVMRemarkEntryGetFunctionName(LLVMRemarkEntryRef Remark) {126return wrap(&unwrap(Remark)->FunctionName);127}128129extern "C" LLVMRemarkDebugLocRef130LLVMRemarkEntryGetDebugLoc(LLVMRemarkEntryRef Remark) {131if (const std::optional<RemarkLocation> &Loc = unwrap(Remark)->Loc)132return wrap(&*Loc);133return nullptr;134}135136extern "C" uint64_t LLVMRemarkEntryGetHotness(LLVMRemarkEntryRef Remark) {137if (const std::optional<uint64_t> &Hotness = unwrap(Remark)->Hotness)138return *Hotness;139return 0;140}141142extern "C" uint32_t LLVMRemarkEntryGetNumArgs(LLVMRemarkEntryRef Remark) {143return unwrap(Remark)->Args.size();144}145146extern "C" LLVMRemarkArgRef147LLVMRemarkEntryGetFirstArg(LLVMRemarkEntryRef Remark) {148ArrayRef<Argument> Args = unwrap(Remark)->Args;149// No arguments to iterate on.150if (Args.empty())151return nullptr;152return reinterpret_cast<LLVMRemarkArgRef>(153const_cast<Argument *>(Args.begin()));154}155156extern "C" LLVMRemarkArgRef157LLVMRemarkEntryGetNextArg(LLVMRemarkArgRef ArgIt, LLVMRemarkEntryRef Remark) {158// No more arguments to iterate on.159if (ArgIt == nullptr)160return nullptr;161162auto It = (ArrayRef<Argument>::const_iterator)ArgIt;163auto Next = std::next(It);164if (Next == unwrap(Remark)->Args.end())165return nullptr;166167return reinterpret_cast<LLVMRemarkArgRef>(const_cast<Argument *>(Next));168}169170171