]> git.lizzy.rs Git - rust.git/blob - compiler/rustc_llvm/llvm-wrapper/CoverageMappingWrapper.cpp
Rollup merge of #89876 - AlexApps99:const_ops, r=oli-obk
[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   uint32_t FileID;
14   uint32_t ExpandedFileID;
15   uint32_t LineStart;
16   uint32_t ColumnStart;
17   uint32_t LineEnd;
18   uint32_t ColumnEnd;
19   coverage::CounterMappingRegion::RegionKind Kind;
20 };
21
22 extern "C" void LLVMRustCoverageWriteFilenamesSectionToBuffer(
23     const char* const Filenames[],
24     size_t FilenamesLen,
25     RustStringRef BufferOut) {
26 #if LLVM_VERSION_GE(13,0)
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 #else
32   SmallVector<StringRef,32> FilenameRefs;
33   for (size_t i = 0; i < FilenamesLen; i++) {
34     FilenameRefs.push_back(StringRef(Filenames[i]));
35   }
36 #endif
37   auto FilenamesWriter = coverage::CoverageFilenamesSectionWriter(
38     makeArrayRef(FilenameRefs));
39   RawRustStringOstream OS(BufferOut);
40   FilenamesWriter.write(OS);
41 }
42
43 extern "C" void LLVMRustCoverageWriteMappingToBuffer(
44     const unsigned *VirtualFileMappingIDs,
45     unsigned NumVirtualFileMappingIDs,
46     const coverage::CounterExpression *Expressions,
47     unsigned NumExpressions,
48     LLVMRustCounterMappingRegion *RustMappingRegions,
49     unsigned NumMappingRegions,
50     RustStringRef BufferOut) {
51   // Convert from FFI representation to LLVM representation.
52   SmallVector<coverage::CounterMappingRegion, 0> MappingRegions;
53   MappingRegions.reserve(NumMappingRegions);
54   for (const auto &Region : makeArrayRef(RustMappingRegions, NumMappingRegions)) {
55     MappingRegions.emplace_back(
56         Region.Count, Region.FileID, Region.ExpandedFileID,
57         Region.LineStart, Region.ColumnStart, Region.LineEnd, Region.ColumnEnd,
58         Region.Kind);
59   }
60   auto CoverageMappingWriter = coverage::CoverageMappingWriter(
61       makeArrayRef(VirtualFileMappingIDs, NumVirtualFileMappingIDs),
62       makeArrayRef(Expressions, NumExpressions),
63       MappingRegions);
64   RawRustStringOstream OS(BufferOut);
65   CoverageMappingWriter.write(OS);
66 }
67
68 extern "C" LLVMValueRef LLVMRustCoverageCreatePGOFuncNameVar(LLVMValueRef F, const char *FuncName) {
69   StringRef FuncNameRef(FuncName);
70   return wrap(createPGOFuncNameVar(*cast<Function>(unwrap(F)), FuncNameRef));
71 }
72
73 extern "C" uint64_t LLVMRustCoverageHashCString(const char *StrVal) {
74   StringRef StrRef(StrVal);
75   return IndexedInstrProf::ComputeHash(StrRef);
76 }
77
78 extern "C" uint64_t LLVMRustCoverageHashByteArray(
79     const char *Bytes,
80     unsigned NumBytes) {
81   StringRef StrRef(Bytes, NumBytes);
82   return IndexedInstrProf::ComputeHash(StrRef);
83 }
84
85 static void WriteSectionNameToString(LLVMModuleRef M,
86                                      InstrProfSectKind SK,
87                                      RustStringRef Str) {
88   Triple TargetTriple(unwrap(M)->getTargetTriple());
89   auto name = getInstrProfSectionName(SK, TargetTriple.getObjectFormat());
90   RawRustStringOstream OS(Str);
91   OS << name;
92 }
93
94 extern "C" void LLVMRustCoverageWriteMapSectionNameToString(LLVMModuleRef M,
95                                                             RustStringRef Str) {
96   WriteSectionNameToString(M, IPSK_covmap, Str);
97 }
98
99 extern "C" void LLVMRustCoverageWriteFuncSectionNameToString(LLVMModuleRef M,
100                                                              RustStringRef Str) {
101   WriteSectionNameToString(M, IPSK_covfun, Str);
102 }
103
104 extern "C" void LLVMRustCoverageWriteMappingVarNameToString(RustStringRef Str) {
105   auto name = getCoverageMappingVarName();
106   RawRustStringOstream OS(Str);
107   OS << name;
108 }
109
110 extern "C" uint32_t LLVMRustCoverageMappingVersion() {
111   return coverage::CovMapVersion::Version4;
112 }