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 SmallVector<std::string,32> FilenameRefs;
28 for (size_t i = 0; i < FilenamesLen; i++) {
29 FilenameRefs.push_back(std::string(Filenames[i]));
31 auto FilenamesWriter =
32 coverage::CoverageFilenamesSectionWriter(ArrayRef<std::string>(FilenameRefs));
33 RawRustStringOstream OS(BufferOut);
34 FilenamesWriter.write(OS);
37 extern "C" void LLVMRustCoverageWriteMappingToBuffer(
38 const unsigned *VirtualFileMappingIDs,
39 unsigned NumVirtualFileMappingIDs,
40 const coverage::CounterExpression *Expressions,
41 unsigned NumExpressions,
42 LLVMRustCounterMappingRegion *RustMappingRegions,
43 unsigned NumMappingRegions,
44 RustStringRef BufferOut) {
45 // Convert from FFI representation to LLVM representation.
46 SmallVector<coverage::CounterMappingRegion, 0> MappingRegions;
47 MappingRegions.reserve(NumMappingRegions);
48 for (const auto &Region : ArrayRef<LLVMRustCounterMappingRegion>(
49 RustMappingRegions, NumMappingRegions)) {
50 MappingRegions.emplace_back(
51 Region.Count, Region.FalseCount, Region.FileID, Region.ExpandedFileID,
52 Region.LineStart, Region.ColumnStart, Region.LineEnd, Region.ColumnEnd,
55 auto CoverageMappingWriter = coverage::CoverageMappingWriter(
56 ArrayRef<unsigned>(VirtualFileMappingIDs, NumVirtualFileMappingIDs),
57 ArrayRef<coverage::CounterExpression>(Expressions, NumExpressions),
59 RawRustStringOstream OS(BufferOut);
60 CoverageMappingWriter.write(OS);
63 extern "C" LLVMValueRef LLVMRustCoverageCreatePGOFuncNameVar(LLVMValueRef F, const char *FuncName) {
64 StringRef FuncNameRef(FuncName);
65 return wrap(createPGOFuncNameVar(*cast<Function>(unwrap(F)), FuncNameRef));
68 extern "C" uint64_t LLVMRustCoverageHashCString(const char *StrVal) {
69 StringRef StrRef(StrVal);
70 return IndexedInstrProf::ComputeHash(StrRef);
73 extern "C" uint64_t LLVMRustCoverageHashByteArray(
76 StringRef StrRef(Bytes, NumBytes);
77 return IndexedInstrProf::ComputeHash(StrRef);
80 static void WriteSectionNameToString(LLVMModuleRef M,
83 Triple TargetTriple(unwrap(M)->getTargetTriple());
84 auto name = getInstrProfSectionName(SK, TargetTriple.getObjectFormat());
85 RawRustStringOstream OS(Str);
89 extern "C" void LLVMRustCoverageWriteMapSectionNameToString(LLVMModuleRef M,
91 WriteSectionNameToString(M, IPSK_covmap, Str);
94 extern "C" void LLVMRustCoverageWriteFuncSectionNameToString(LLVMModuleRef M,
96 WriteSectionNameToString(M, IPSK_covfun, Str);
99 extern "C" void LLVMRustCoverageWriteMappingVarNameToString(RustStringRef Str) {
100 auto name = getCoverageMappingVarName();
101 RawRustStringOstream OS(Str);
105 extern "C" uint32_t LLVMRustCoverageMappingVersion() {
106 return coverage::CovMapVersion::Version6;