]>
Commit | Line | Data |
---|---|---|
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 | ||
9 | using namespace llvm; | |
10 | ||
6a06907d XL |
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 | ||
3dfed10e XL |
22 | extern "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 | ||
36 | extern "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 | ||
61 | extern "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 |
66 | extern "C" uint64_t LLVMRustCoverageHashCString(const char *StrVal) { |
67 | StringRef StrRef(StrVal); | |
68 | return IndexedInstrProf::ComputeHash(StrRef); | |
69 | } | |
70 | ||
71 | extern "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 |
78 | static 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 |
87 | extern "C" void LLVMRustCoverageWriteMapSectionNameToString(LLVMModuleRef M, |
88 | RustStringRef Str) { | |
89 | WriteSectionNameToString(M, IPSK_covmap, Str); | |
90 | } | |
91 | ||
92 | extern "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 |
100 | extern "C" void LLVMRustCoverageWriteMappingVarNameToString(RustStringRef Str) { |
101 | auto name = getCoverageMappingVarName(); | |
102 | RawRustStringOstream OS(Str); | |
103 | OS << name; | |
104 | } | |
105 | ||
106 | extern "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 | } |