]> git.lizzy.rs Git - rust.git/blob - compiler/rustc_llvm/llvm-wrapper/CoverageMappingWrapper.cpp
Rollup merge of #86374 - bossmc:enable-static-pie-for-gnu, r=nagisa
[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 #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]));
31   }
32 #else
33   SmallVector<StringRef,32> FilenameRefs;
34   for (size_t i = 0; i < FilenamesLen; i++) {
35     FilenameRefs.push_back(StringRef(Filenames[i]));
36   }
37 #endif
38   auto FilenamesWriter = coverage::CoverageFilenamesSectionWriter(
39     makeArrayRef(FilenameRefs));
40   RawRustStringOstream OS(BufferOut);
41   FilenamesWriter.write(OS);
42 }
43
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,
59         Region.Kind);
60   }
61   auto CoverageMappingWriter = coverage::CoverageMappingWriter(
62       makeArrayRef(VirtualFileMappingIDs, NumVirtualFileMappingIDs),
63       makeArrayRef(Expressions, NumExpressions),
64       MappingRegions);
65   RawRustStringOstream OS(BufferOut);
66   CoverageMappingWriter.write(OS);
67 }
68
69 extern "C" LLVMValueRef LLVMRustCoverageCreatePGOFuncNameVar(LLVMValueRef F, const char *FuncName) {
70   StringRef FuncNameRef(FuncName);
71   return wrap(createPGOFuncNameVar(*cast<Function>(unwrap(F)), FuncNameRef));
72 }
73
74 extern "C" uint64_t LLVMRustCoverageHashCString(const char *StrVal) {
75   StringRef StrRef(StrVal);
76   return IndexedInstrProf::ComputeHash(StrRef);
77 }
78
79 extern "C" uint64_t LLVMRustCoverageHashByteArray(
80     const char *Bytes,
81     unsigned NumBytes) {
82   StringRef StrRef(Bytes, NumBytes);
83   return IndexedInstrProf::ComputeHash(StrRef);
84 }
85
86 static void WriteSectionNameToString(LLVMModuleRef M,
87                                      InstrProfSectKind SK,
88                                      RustStringRef Str) {
89   Triple TargetTriple(unwrap(M)->getTargetTriple());
90   auto name = getInstrProfSectionName(SK, TargetTriple.getObjectFormat());
91   RawRustStringOstream OS(Str);
92   OS << name;
93 }
94
95 extern "C" void LLVMRustCoverageWriteMapSectionNameToString(LLVMModuleRef M,
96                                                             RustStringRef Str) {
97   WriteSectionNameToString(M, IPSK_covmap, Str);
98 }
99
100 extern "C" void LLVMRustCoverageWriteFuncSectionNameToString(LLVMModuleRef M,
101                                                              RustStringRef Str) {
102   WriteSectionNameToString(M, IPSK_covfun, Str);
103 }
104
105 extern "C" void LLVMRustCoverageWriteMappingVarNameToString(RustStringRef Str) {
106   auto name = getCoverageMappingVarName();
107   RawRustStringOstream OS(Str);
108   OS << name;
109 }
110
111 extern "C" uint32_t LLVMRustCoverageMappingVersion() {
112 #if LLVM_VERSION_GE(13, 0)
113   return coverage::CovMapVersion::Version6;
114 #else
115   return coverage::CovMapVersion::Version5;
116 #endif
117 }