xref: /llvm-project/llvm/lib/Remarks/Remark.cpp (revision 34855405b0a7dd6719fa3278f9b888f7f11bc4d8)
15a05cc0eSFrancis Visoiu Mistrih //===- Remark.cpp ---------------------------------------------------------===//
25a05cc0eSFrancis Visoiu Mistrih //
35a05cc0eSFrancis Visoiu Mistrih // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
45a05cc0eSFrancis Visoiu Mistrih // See https://llvm.org/LICENSE.txt for license information.
55a05cc0eSFrancis Visoiu Mistrih // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65a05cc0eSFrancis Visoiu Mistrih //
75a05cc0eSFrancis Visoiu Mistrih //===----------------------------------------------------------------------===//
85a05cc0eSFrancis Visoiu Mistrih //
95a05cc0eSFrancis Visoiu Mistrih // Implementation of the Remark type and the C API.
105a05cc0eSFrancis Visoiu Mistrih //
115a05cc0eSFrancis Visoiu Mistrih //===----------------------------------------------------------------------===//
125a05cc0eSFrancis Visoiu Mistrih 
135a05cc0eSFrancis Visoiu Mistrih #include "llvm/Remarks/Remark.h"
1431c2cf11SZain Jaffal #include "llvm/ADT/APInt.h"
158fd9af45SSimon Pilgrim #include "llvm/ADT/ArrayRef.h"
16c589730aSKrzysztof Parzyszek #include <optional>
175a05cc0eSFrancis Visoiu Mistrih 
185a05cc0eSFrancis Visoiu Mistrih using namespace llvm;
195a05cc0eSFrancis Visoiu Mistrih using namespace llvm::remarks;
205a05cc0eSFrancis Visoiu Mistrih 
getArgsAsMsg() const215a05cc0eSFrancis Visoiu Mistrih std::string Remark::getArgsAsMsg() const {
225a05cc0eSFrancis Visoiu Mistrih   std::string Str;
235a05cc0eSFrancis Visoiu Mistrih   raw_string_ostream OS(Str);
245a05cc0eSFrancis Visoiu Mistrih   for (const Argument &Arg : Args)
255a05cc0eSFrancis Visoiu Mistrih     OS << Arg.Val;
26*34855405SYoungsuk Kim   return Str;
275a05cc0eSFrancis Visoiu Mistrih }
285a05cc0eSFrancis Visoiu Mistrih 
2931c2cf11SZain Jaffal /// Returns the value of a specified key parsed from StringRef.
getValAsInt() const3031c2cf11SZain Jaffal std::optional<int> Argument::getValAsInt() const {
3131c2cf11SZain Jaffal   APInt KeyVal;
3231c2cf11SZain Jaffal   if (Val.getAsInteger(10, KeyVal))
3331c2cf11SZain Jaffal     return std::nullopt;
3431c2cf11SZain Jaffal   return KeyVal.getSExtValue();
3531c2cf11SZain Jaffal }
3631c2cf11SZain Jaffal 
isValInt() const3731c2cf11SZain Jaffal bool Argument::isValInt() const { return getValAsInt().has_value(); }
3831c2cf11SZain Jaffal 
print(raw_ostream & OS) const393161db8cSZain Jaffal void RemarkLocation::print(raw_ostream &OS) const {
403161db8cSZain Jaffal   OS << "{ "
413161db8cSZain Jaffal      << "File: " << SourceFilePath << ", Line: " << SourceLine
423161db8cSZain Jaffal      << " Column:" << SourceColumn << " }\n";
433161db8cSZain Jaffal }
443161db8cSZain Jaffal 
print(raw_ostream & OS) const453161db8cSZain Jaffal void Argument::print(raw_ostream &OS) const {
463161db8cSZain Jaffal   OS << Key << ": " << Val << "\n";
473161db8cSZain Jaffal }
483161db8cSZain Jaffal 
print(raw_ostream & OS) const493161db8cSZain Jaffal void Remark::print(raw_ostream &OS) const {
503161db8cSZain Jaffal   OS << "Name: ";
513161db8cSZain Jaffal   OS << RemarkName << "\n";
523161db8cSZain Jaffal   OS << "Type: " << typeToStr(RemarkType) << "\n";
533161db8cSZain Jaffal   OS << "FunctionName: " << FunctionName << "\n";
543161db8cSZain Jaffal   OS << "PassName: " << PassName << "\n";
553161db8cSZain Jaffal   if (Loc)
563161db8cSZain Jaffal     OS << "Loc: " << Loc.value();
573161db8cSZain Jaffal   if (Hotness)
583161db8cSZain Jaffal     OS << "Hotness: " << Hotness;
593161db8cSZain Jaffal   if (!Args.empty()) {
603161db8cSZain Jaffal     OS << "Args:\n";
613161db8cSZain Jaffal     for (auto Arg : Args)
623161db8cSZain Jaffal       OS << "\t" << Arg;
633161db8cSZain Jaffal   }
643161db8cSZain Jaffal }
653161db8cSZain Jaffal 
665a05cc0eSFrancis Visoiu Mistrih // Create wrappers for C Binding types (see CBindingWrapping.h).
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(StringRef,LLVMRemarkStringRef) const675a05cc0eSFrancis Visoiu Mistrih DEFINE_SIMPLE_CONVERSION_FUNCTIONS(StringRef, LLVMRemarkStringRef)
685a05cc0eSFrancis Visoiu Mistrih 
695a05cc0eSFrancis Visoiu Mistrih extern "C" const char *LLVMRemarkStringGetData(LLVMRemarkStringRef String) {
705a05cc0eSFrancis Visoiu Mistrih   return unwrap(String)->data();
715a05cc0eSFrancis Visoiu Mistrih }
725a05cc0eSFrancis Visoiu Mistrih 
LLVMRemarkStringGetLen(LLVMRemarkStringRef String)735a05cc0eSFrancis Visoiu Mistrih extern "C" uint32_t LLVMRemarkStringGetLen(LLVMRemarkStringRef String) {
745a05cc0eSFrancis Visoiu Mistrih   return unwrap(String)->size();
755a05cc0eSFrancis Visoiu Mistrih }
765a05cc0eSFrancis Visoiu Mistrih 
775a05cc0eSFrancis Visoiu Mistrih extern "C" LLVMRemarkStringRef
LLVMRemarkDebugLocGetSourceFilePath(LLVMRemarkDebugLocRef DL)785a05cc0eSFrancis Visoiu Mistrih LLVMRemarkDebugLocGetSourceFilePath(LLVMRemarkDebugLocRef DL) {
795a05cc0eSFrancis Visoiu Mistrih   return wrap(&unwrap(DL)->SourceFilePath);
805a05cc0eSFrancis Visoiu Mistrih }
815a05cc0eSFrancis Visoiu Mistrih 
LLVMRemarkDebugLocGetSourceLine(LLVMRemarkDebugLocRef DL)825a05cc0eSFrancis Visoiu Mistrih extern "C" uint32_t LLVMRemarkDebugLocGetSourceLine(LLVMRemarkDebugLocRef DL) {
835a05cc0eSFrancis Visoiu Mistrih   return unwrap(DL)->SourceLine;
845a05cc0eSFrancis Visoiu Mistrih }
855a05cc0eSFrancis Visoiu Mistrih 
865a05cc0eSFrancis Visoiu Mistrih extern "C" uint32_t
LLVMRemarkDebugLocGetSourceColumn(LLVMRemarkDebugLocRef DL)875a05cc0eSFrancis Visoiu Mistrih LLVMRemarkDebugLocGetSourceColumn(LLVMRemarkDebugLocRef DL) {
885a05cc0eSFrancis Visoiu Mistrih   return unwrap(DL)->SourceColumn;
895a05cc0eSFrancis Visoiu Mistrih }
905a05cc0eSFrancis Visoiu Mistrih 
LLVMRemarkArgGetKey(LLVMRemarkArgRef Arg)915a05cc0eSFrancis Visoiu Mistrih extern "C" LLVMRemarkStringRef LLVMRemarkArgGetKey(LLVMRemarkArgRef Arg) {
925a05cc0eSFrancis Visoiu Mistrih   return wrap(&unwrap(Arg)->Key);
935a05cc0eSFrancis Visoiu Mistrih }
945a05cc0eSFrancis Visoiu Mistrih 
LLVMRemarkArgGetValue(LLVMRemarkArgRef Arg)955a05cc0eSFrancis Visoiu Mistrih extern "C" LLVMRemarkStringRef LLVMRemarkArgGetValue(LLVMRemarkArgRef Arg) {
965a05cc0eSFrancis Visoiu Mistrih   return wrap(&unwrap(Arg)->Val);
975a05cc0eSFrancis Visoiu Mistrih }
985a05cc0eSFrancis Visoiu Mistrih 
995a05cc0eSFrancis Visoiu Mistrih extern "C" LLVMRemarkDebugLocRef
LLVMRemarkArgGetDebugLoc(LLVMRemarkArgRef Arg)1005a05cc0eSFrancis Visoiu Mistrih LLVMRemarkArgGetDebugLoc(LLVMRemarkArgRef Arg) {
101c589730aSKrzysztof Parzyszek   if (const std::optional<RemarkLocation> &Loc = unwrap(Arg)->Loc)
1025a05cc0eSFrancis Visoiu Mistrih     return wrap(&*Loc);
1035a05cc0eSFrancis Visoiu Mistrih   return nullptr;
1045a05cc0eSFrancis Visoiu Mistrih }
1055a05cc0eSFrancis Visoiu Mistrih 
LLVMRemarkEntryDispose(LLVMRemarkEntryRef Remark)10694bad22cSFrancis Visoiu Mistrih extern "C" void LLVMRemarkEntryDispose(LLVMRemarkEntryRef Remark) {
10794bad22cSFrancis Visoiu Mistrih   delete unwrap(Remark);
10894bad22cSFrancis Visoiu Mistrih }
10994bad22cSFrancis Visoiu Mistrih 
LLVMRemarkEntryGetType(LLVMRemarkEntryRef Remark)1105a05cc0eSFrancis Visoiu Mistrih extern "C" LLVMRemarkType LLVMRemarkEntryGetType(LLVMRemarkEntryRef Remark) {
1115a05cc0eSFrancis Visoiu Mistrih   // Assume here that the enums can be converted both ways.
1125a05cc0eSFrancis Visoiu Mistrih   return static_cast<LLVMRemarkType>(unwrap(Remark)->RemarkType);
1135a05cc0eSFrancis Visoiu Mistrih }
1145a05cc0eSFrancis Visoiu Mistrih 
1155a05cc0eSFrancis Visoiu Mistrih extern "C" LLVMRemarkStringRef
LLVMRemarkEntryGetPassName(LLVMRemarkEntryRef Remark)1165a05cc0eSFrancis Visoiu Mistrih LLVMRemarkEntryGetPassName(LLVMRemarkEntryRef Remark) {
1175a05cc0eSFrancis Visoiu Mistrih   return wrap(&unwrap(Remark)->PassName);
1185a05cc0eSFrancis Visoiu Mistrih }
1195a05cc0eSFrancis Visoiu Mistrih 
1205a05cc0eSFrancis Visoiu Mistrih extern "C" LLVMRemarkStringRef
LLVMRemarkEntryGetRemarkName(LLVMRemarkEntryRef Remark)1215a05cc0eSFrancis Visoiu Mistrih LLVMRemarkEntryGetRemarkName(LLVMRemarkEntryRef Remark) {
1225a05cc0eSFrancis Visoiu Mistrih   return wrap(&unwrap(Remark)->RemarkName);
1235a05cc0eSFrancis Visoiu Mistrih }
1245a05cc0eSFrancis Visoiu Mistrih 
1255a05cc0eSFrancis Visoiu Mistrih extern "C" LLVMRemarkStringRef
LLVMRemarkEntryGetFunctionName(LLVMRemarkEntryRef Remark)1265a05cc0eSFrancis Visoiu Mistrih LLVMRemarkEntryGetFunctionName(LLVMRemarkEntryRef Remark) {
1275a05cc0eSFrancis Visoiu Mistrih   return wrap(&unwrap(Remark)->FunctionName);
1285a05cc0eSFrancis Visoiu Mistrih }
1295a05cc0eSFrancis Visoiu Mistrih 
1305a05cc0eSFrancis Visoiu Mistrih extern "C" LLVMRemarkDebugLocRef
LLVMRemarkEntryGetDebugLoc(LLVMRemarkEntryRef Remark)1315a05cc0eSFrancis Visoiu Mistrih LLVMRemarkEntryGetDebugLoc(LLVMRemarkEntryRef Remark) {
132c589730aSKrzysztof Parzyszek   if (const std::optional<RemarkLocation> &Loc = unwrap(Remark)->Loc)
1335a05cc0eSFrancis Visoiu Mistrih     return wrap(&*Loc);
1345a05cc0eSFrancis Visoiu Mistrih   return nullptr;
1355a05cc0eSFrancis Visoiu Mistrih }
1365a05cc0eSFrancis Visoiu Mistrih 
LLVMRemarkEntryGetHotness(LLVMRemarkEntryRef Remark)1375a05cc0eSFrancis Visoiu Mistrih extern "C" uint64_t LLVMRemarkEntryGetHotness(LLVMRemarkEntryRef Remark) {
138c589730aSKrzysztof Parzyszek   if (const std::optional<uint64_t> &Hotness = unwrap(Remark)->Hotness)
1395a05cc0eSFrancis Visoiu Mistrih     return *Hotness;
1405a05cc0eSFrancis Visoiu Mistrih   return 0;
1415a05cc0eSFrancis Visoiu Mistrih }
1425a05cc0eSFrancis Visoiu Mistrih 
LLVMRemarkEntryGetNumArgs(LLVMRemarkEntryRef Remark)1435a05cc0eSFrancis Visoiu Mistrih extern "C" uint32_t LLVMRemarkEntryGetNumArgs(LLVMRemarkEntryRef Remark) {
1445a05cc0eSFrancis Visoiu Mistrih   return unwrap(Remark)->Args.size();
1455a05cc0eSFrancis Visoiu Mistrih }
1465a05cc0eSFrancis Visoiu Mistrih 
1475a05cc0eSFrancis Visoiu Mistrih extern "C" LLVMRemarkArgRef
LLVMRemarkEntryGetFirstArg(LLVMRemarkEntryRef Remark)1485a05cc0eSFrancis Visoiu Mistrih LLVMRemarkEntryGetFirstArg(LLVMRemarkEntryRef Remark) {
1495a05cc0eSFrancis Visoiu Mistrih   ArrayRef<Argument> Args = unwrap(Remark)->Args;
1505a05cc0eSFrancis Visoiu Mistrih   // No arguments to iterate on.
1515a05cc0eSFrancis Visoiu Mistrih   if (Args.empty())
1525a667c0eSKazu Hirata     return nullptr;
1535a05cc0eSFrancis Visoiu Mistrih   return reinterpret_cast<LLVMRemarkArgRef>(
1545a05cc0eSFrancis Visoiu Mistrih       const_cast<Argument *>(Args.begin()));
1555a05cc0eSFrancis Visoiu Mistrih }
1565a05cc0eSFrancis Visoiu Mistrih 
1575a05cc0eSFrancis Visoiu Mistrih extern "C" LLVMRemarkArgRef
LLVMRemarkEntryGetNextArg(LLVMRemarkArgRef ArgIt,LLVMRemarkEntryRef Remark)1585a05cc0eSFrancis Visoiu Mistrih LLVMRemarkEntryGetNextArg(LLVMRemarkArgRef ArgIt, LLVMRemarkEntryRef Remark) {
1595a05cc0eSFrancis Visoiu Mistrih   // No more arguments to iterate on.
1605a667c0eSKazu Hirata   if (ArgIt == nullptr)
1615a667c0eSKazu Hirata     return nullptr;
1625a05cc0eSFrancis Visoiu Mistrih 
1635a05cc0eSFrancis Visoiu Mistrih   auto It = (ArrayRef<Argument>::const_iterator)ArgIt;
1645a05cc0eSFrancis Visoiu Mistrih   auto Next = std::next(It);
1655a05cc0eSFrancis Visoiu Mistrih   if (Next == unwrap(Remark)->Args.end())
1665a667c0eSKazu Hirata     return nullptr;
1675a05cc0eSFrancis Visoiu Mistrih 
1685a05cc0eSFrancis Visoiu Mistrih   return reinterpret_cast<LLVMRemarkArgRef>(const_cast<Argument *>(Next));
1695a05cc0eSFrancis Visoiu Mistrih }
170