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
;