Training courses
Kernel and Embedded Linux
Bootlin training courses
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
//===- 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" 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 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 Optional<RemarkLocation> &Loc = unwrap(Remark)->Loc) return wrap(&*Loc); return nullptr; } extern "C" uint64_t LLVMRemarkEntryGetHotness(LLVMRemarkEntryRef Remark) { if (const 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 NULL; 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 == NULL) return NULL; auto It = (ArrayRef<Argument>::const_iterator)ArgIt; auto Next = std::next(It); if (Next == unwrap(Remark)->Args.end()) return NULL; return reinterpret_cast<LLVMRemarkArgRef>(const_cast<Argument *>(Next)); }