]> git.lizzy.rs Git - rust.git/blob - compiler/rustc_llvm/llvm-wrapper/CoverageMappingWrapper.cpp
Rollup merge of #106579 - estebank:issue-52144, r=Nilstrieb
[rust.git] / compiler / rustc_llvm / llvm-wrapper / CoverageMappingWrapper.cpp
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"
6
7 #include <iostream>
8
9 using namespace llvm;
10
11 struct LLVMRustCounterMappingRegion {
12   coverage::Counter Count;
13   coverage::Counter FalseCount;
14   uint32_t FileID;
15   uint32_t ExpandedFileID;
16   uint32_t LineStart;
17   uint32_t ColumnStart;
18   uint32_t LineEnd;
19   uint32_t ColumnEnd;
20   coverage::CounterMappingRegion::RegionKind Kind;
21 };
22
23 extern "C" void LLVMRustCoverageWriteFilenamesSectionToBuffer(
24     const char* const Filenames[],
25     size_t FilenamesLen,
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]));
30   }
31   auto FilenamesWriter =
32       coverage::CoverageFilenamesSectionWriter(ArrayRef<std::string>(FilenameRefs));
33   RawRustStringOstream OS(BufferOut);
34   FilenamesWriter.write(OS);
35 }
36
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,
53         Region.Kind);
54   }
55   auto CoverageMappingWriter = coverage::CoverageMappingWriter(
56       ArrayRef<unsigned>(VirtualFileMappingIDs, NumVirtualFileMappingIDs),
57       ArrayRef<coverage::CounterExpression>(Expressions, NumExpressions),
58       MappingRegions);
59   RawRustStringOstream OS(BufferOut);
60   CoverageMappingWriter.write(OS);
61 }
62
63 extern "C" LLVMValueRef LLVMRustCoverageCreatePGOFuncNameVar(LLVMValueRef F, const char *FuncName) {
64   StringRef FuncNameRef(FuncName);
65   return wrap(createPGOFuncNameVar(*cast<Function>(unwrap(F)), FuncNameRef));
66 }
67
68 extern "C" uint64_t LLVMRustCoverageHashCString(const char *StrVal) {
69   StringRef StrRef(StrVal);
70   return IndexedInstrProf::ComputeHash(StrRef);
71 }
72
73 extern "C" uint64_t LLVMRustCoverageHashByteArray(
74     const char *Bytes,
75     unsigned NumBytes) {
76   StringRef StrRef(Bytes, NumBytes);
77   return IndexedInstrProf::ComputeHash(StrRef);
78 }
79
80 static void WriteSectionNameToString(LLVMModuleRef M,
81                                      InstrProfSectKind SK,
82                                      RustStringRef Str) {
83   Triple TargetTriple(unwrap(M)->getTargetTriple());
84   auto name = getInstrProfSectionName(SK, TargetTriple.getObjectFormat());
85   RawRustStringOstream OS(Str);
86   OS << name;
87 }
88
89 extern "C" void LLVMRustCoverageWriteMapSectionNameToString(LLVMModuleRef M,
90                                                             RustStringRef Str) {
91   WriteSectionNameToString(M, IPSK_covmap, Str);
92 }
93
94 extern "C" void LLVMRustCoverageWriteFuncSectionNameToString(LLVMModuleRef M,
95                                                              RustStringRef Str) {
96   WriteSectionNameToString(M, IPSK_covfun, Str);
97 }
98
99 extern "C" void LLVMRustCoverageWriteMappingVarNameToString(RustStringRef Str) {
100   auto name = getCoverageMappingVarName();
101   RawRustStringOstream OS(Str);
102   OS << name;
103 }
104
105 extern "C" uint32_t LLVMRustCoverageMappingVersion() {
106   return coverage::CovMapVersion::Version6;
107 }