]> git.proxmox.com Git - rustc.git/blame - compiler/rustc_llvm/llvm-wrapper/CoverageMappingWrapper.cpp
Merge tag 'debian/1.52.1+dfsg1-1_exp2' into proxmox/buster
[rustc.git] / compiler / rustc_llvm / llvm-wrapper / CoverageMappingWrapper.cpp
CommitLineData
1b1a35ee 1#include "LLVMWrapper.h"
3dfed10e
XL
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"
3dfed10e
XL
6
7#include <iostream>
8
9using namespace llvm;
10
6a06907d
XL
11struct 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
3dfed10e
XL
22extern "C" void LLVMRustCoverageWriteFilenamesSectionToBuffer(
23 const char* const Filenames[],
24 size_t FilenamesLen,
25 RustStringRef BufferOut) {
fc512014 26 SmallVector<StringRef,32> FilenameRefs;
3dfed10e 27 for (size_t i = 0; i < FilenamesLen; i++) {
fc512014 28 FilenameRefs.push_back(StringRef(Filenames[i]));
3dfed10e 29 }
fc512014
XL
30 auto FilenamesWriter = coverage::CoverageFilenamesSectionWriter(
31 makeArrayRef(FilenameRefs));
32 RawRustStringOstream OS(BufferOut);
33 FilenamesWriter.write(OS);
3dfed10e
XL
34}
35
36extern "C" void LLVMRustCoverageWriteMappingToBuffer(
37 const unsigned *VirtualFileMappingIDs,
38 unsigned NumVirtualFileMappingIDs,
39 const coverage::CounterExpression *Expressions,
40 unsigned NumExpressions,
6a06907d 41 LLVMRustCounterMappingRegion *RustMappingRegions,
3dfed10e
XL
42 unsigned NumMappingRegions,
43 RustStringRef BufferOut) {
6a06907d
XL
44 // Convert from FFI representation to LLVM representation.
45 SmallVector<coverage::CounterMappingRegion, 0> MappingRegions;
46 MappingRegions.reserve(NumMappingRegions);
47 for (const auto &Region : makeArrayRef(RustMappingRegions, NumMappingRegions)) {
48 MappingRegions.emplace_back(
49 Region.Count, Region.FileID, Region.ExpandedFileID,
50 Region.LineStart, Region.ColumnStart, Region.LineEnd, Region.ColumnEnd,
51 Region.Kind);
52 }
3dfed10e
XL
53 auto CoverageMappingWriter = coverage::CoverageMappingWriter(
54 makeArrayRef(VirtualFileMappingIDs, NumVirtualFileMappingIDs),
55 makeArrayRef(Expressions, NumExpressions),
6a06907d 56 MappingRegions);
3dfed10e
XL
57 RawRustStringOstream OS(BufferOut);
58 CoverageMappingWriter.write(OS);
59}
60
61extern "C" LLVMValueRef LLVMRustCoverageCreatePGOFuncNameVar(LLVMValueRef F, const char *FuncName) {
62 StringRef FuncNameRef(FuncName);
63 return wrap(createPGOFuncNameVar(*cast<Function>(unwrap(F)), FuncNameRef));
64}
65
fc512014
XL
66extern "C" uint64_t LLVMRustCoverageHashCString(const char *StrVal) {
67 StringRef StrRef(StrVal);
68 return IndexedInstrProf::ComputeHash(StrRef);
69}
70
71extern "C" uint64_t LLVMRustCoverageHashByteArray(
72 const char *Bytes,
73 unsigned NumBytes) {
74 StringRef StrRef(Bytes, NumBytes);
75 return IndexedInstrProf::ComputeHash(StrRef);
3dfed10e
XL
76}
77
fc512014
XL
78static void WriteSectionNameToString(LLVMModuleRef M,
79 InstrProfSectKind SK,
80 RustStringRef Str) {
3dfed10e 81 Triple TargetTriple(unwrap(M)->getTargetTriple());
fc512014 82 auto name = getInstrProfSectionName(SK, TargetTriple.getObjectFormat());
3dfed10e
XL
83 RawRustStringOstream OS(Str);
84 OS << name;
85}
86
fc512014
XL
87extern "C" void LLVMRustCoverageWriteMapSectionNameToString(LLVMModuleRef M,
88 RustStringRef Str) {
89 WriteSectionNameToString(M, IPSK_covmap, Str);
90}
91
92extern "C" void LLVMRustCoverageWriteFuncSectionNameToString(LLVMModuleRef M,
93 RustStringRef Str) {
94#if LLVM_VERSION_GE(11, 0)
95 WriteSectionNameToString(M, IPSK_covfun, Str);
96// else do nothing; the `Version` check will abort codegen on the Rust side
97#endif
98}
99
3dfed10e
XL
100extern "C" void LLVMRustCoverageWriteMappingVarNameToString(RustStringRef Str) {
101 auto name = getCoverageMappingVarName();
102 RawRustStringOstream OS(Str);
103 OS << name;
104}
105
106extern "C" uint32_t LLVMRustCoverageMappingVersion() {
fc512014
XL
107#if LLVM_VERSION_GE(11, 0)
108 return coverage::CovMapVersion::Version4;
109#else
3dfed10e 110 return coverage::CovMapVersion::Version3;
fc512014 111#endif
3dfed10e 112}