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 Mistrihstd::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 Jaffalstd::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 Jaffalbool Argument::isValInt() const { return getValAsInt().has_value(); } 3831c2cf11SZain Jaffal print(raw_ostream & OS) const393161db8cSZain Jaffalvoid 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 Jaffalvoid Argument::print(raw_ostream &OS) const { 463161db8cSZain Jaffal OS << Key << ": " << Val << "\n"; 473161db8cSZain Jaffal } 483161db8cSZain Jaffal print(raw_ostream & OS) const493161db8cSZain Jaffalvoid 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 MistrihDEFINE_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 Mistrihextern "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 MistrihLLVMRemarkDebugLocGetSourceFilePath(LLVMRemarkDebugLocRef DL) { 795a05cc0eSFrancis Visoiu Mistrih return wrap(&unwrap(DL)->SourceFilePath); 805a05cc0eSFrancis Visoiu Mistrih } 815a05cc0eSFrancis Visoiu Mistrih LLVMRemarkDebugLocGetSourceLine(LLVMRemarkDebugLocRef DL)825a05cc0eSFrancis Visoiu Mistrihextern "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 MistrihLLVMRemarkDebugLocGetSourceColumn(LLVMRemarkDebugLocRef DL) { 885a05cc0eSFrancis Visoiu Mistrih return unwrap(DL)->SourceColumn; 895a05cc0eSFrancis Visoiu Mistrih } 905a05cc0eSFrancis Visoiu Mistrih LLVMRemarkArgGetKey(LLVMRemarkArgRef Arg)915a05cc0eSFrancis Visoiu Mistrihextern "C" LLVMRemarkStringRef LLVMRemarkArgGetKey(LLVMRemarkArgRef Arg) { 925a05cc0eSFrancis Visoiu Mistrih return wrap(&unwrap(Arg)->Key); 935a05cc0eSFrancis Visoiu Mistrih } 945a05cc0eSFrancis Visoiu Mistrih LLVMRemarkArgGetValue(LLVMRemarkArgRef Arg)955a05cc0eSFrancis Visoiu Mistrihextern "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 MistrihLLVMRemarkArgGetDebugLoc(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 Mistrihextern "C" void LLVMRemarkEntryDispose(LLVMRemarkEntryRef Remark) { 10794bad22cSFrancis Visoiu Mistrih delete unwrap(Remark); 10894bad22cSFrancis Visoiu Mistrih } 10994bad22cSFrancis Visoiu Mistrih LLVMRemarkEntryGetType(LLVMRemarkEntryRef Remark)1105a05cc0eSFrancis Visoiu Mistrihextern "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 MistrihLLVMRemarkEntryGetPassName(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 MistrihLLVMRemarkEntryGetRemarkName(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 MistrihLLVMRemarkEntryGetFunctionName(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 MistrihLLVMRemarkEntryGetDebugLoc(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 Mistrihextern "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 Mistrihextern "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 MistrihLLVMRemarkEntryGetFirstArg(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 MistrihLLVMRemarkEntryGetNextArg(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