1 #include "LLVMWrapper.h"
2 #include "llvm/ProfileData/Coverage/CoverageMapping.h"
3 #include "llvm/ProfileData/Coverage/CoverageMappingWriter.h"
4 #include "llvm/ProfileData/InstrProf.h"
5 #include "llvm/ADT/ArrayRef.h"
11 struct LLVMRustCounterMappingRegion {
12 coverage::Counter Count;
13 coverage::Counter FalseCount;
15 uint32_t ExpandedFileID;
20 coverage::CounterMappingRegion::RegionKind Kind;
23 extern "C" void LLVMRustCoverageWriteFilenamesSectionToBuffer(
24 const char* const Filenames[],
26 RustStringRef BufferOut) {
27 #if LLVM_VERSION_GE(13,0)
28 SmallVector<std::string,32> FilenameRefs;
29 for (size_t i = 0; i < FilenamesLen; i++) {
30 FilenameRefs.push_back(std::string(Filenames[i]));
33 SmallVector<StringRef,32> FilenameRefs;
34 for (size_t i = 0; i < FilenamesLen; i++) {
35 FilenameRefs.push_back(StringRef(Filenames[i]));
38 auto FilenamesWriter = coverage::CoverageFilenamesSectionWriter(
39 makeArrayRef(FilenameRefs));
40 RawRustStringOstream OS(BufferOut);
41 FilenamesWriter.write(OS);
44 extern "C" void LLVMRustCoverageWriteMappingToBuffer(
45 const unsigned *VirtualFileMappingIDs,
46 unsigned NumVirtualFileMappingIDs,
47 const coverage::CounterExpression *Expressions,
48 unsigned NumExpressions,
49 LLVMRustCounterMappingRegion *RustMappingRegions,
50 unsigned NumMappingRegions,
51 RustStringRef BufferOut) {
52 // Convert from FFI representation to LLVM representation.
53 SmallVector<coverage::CounterMappingRegion, 0> MappingRegions;
54 MappingRegions.reserve(NumMappingRegions);
55 for (const auto &Region : makeArrayRef(RustMappingRegions, NumMappingRegions)) {
56 MappingRegions.emplace_back(
57 Region.Count, Region.FalseCount, Region.FileID, Region.ExpandedFileID,
58 Region.LineStart, Region.ColumnStart, Region.LineEnd, Region.ColumnEnd,
61 auto CoverageMappingWriter = coverage::CoverageMappingWriter(
62 makeArrayRef(VirtualFileMappingIDs, NumVirtualFileMappingIDs),
63 makeArrayRef(Expressions, NumExpressions),
65 RawRustStringOstream OS(BufferOut);
66 CoverageMappingWriter.write(OS);
69 extern "C" LLVMValueRef LLVMRustCoverageCreatePGOFuncNameVar(LLVMValueRef F, const char *FuncName) {
70 StringRef FuncNameRef(FuncName);
71 return wrap(createPGOFuncNameVar(*cast<Function>(unwrap(F)), FuncNameRef));
74 extern "C" uint64_t LLVMRustCoverageHashCString(const char *StrVal) {
75 StringRef StrRef(StrVal);
76 return IndexedInstrProf::ComputeHash(StrRef);
79 extern "C" uint64_t LLVMRustCoverageHashByteArray(
82 StringRef StrRef(Bytes, NumBytes);
83 return IndexedInstrProf::ComputeHash(StrRef);
86 static void WriteSectionNameToString(LLVMModuleRef M,
89 Triple TargetTriple(unwrap(M)->getTargetTriple());
90 auto name = getInstrProfSectionName(SK, TargetTriple.getObjectFormat());
91 RawRustStringOstream OS(Str);
95 extern "C" void LLVMRustCoverageWriteMapSectionNameToString(LLVMModuleRef M,
97 WriteSectionNameToString(M, IPSK_covmap, Str);
100 extern "C" void LLVMRustCoverageWriteFuncSectionNameToString(LLVMModuleRef M,
102 WriteSectionNameToString(M, IPSK_covfun, Str);
105 extern "C" void LLVMRustCoverageWriteMappingVarNameToString(RustStringRef Str) {
106 auto name = getCoverageMappingVarName();
107 RawRustStringOstream OS(Str);
111 extern "C" uint32_t LLVMRustCoverageMappingVersion() {
112 #if LLVM_VERSION_GE(13, 0)
113 return coverage::CovMapVersion::Version6;
115 return coverage::CovMapVersion::Version5;