10b57cec5SDimitry Andric //===- CoverageMappingWriter.h - Code coverage mapping writer ---*- C++ -*-===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric // 90b57cec5SDimitry Andric // This file contains support for writing coverage mapping data for 100b57cec5SDimitry Andric // instrumentation based coverage. 110b57cec5SDimitry Andric // 120b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 130b57cec5SDimitry Andric 140b57cec5SDimitry Andric #ifndef LLVM_PROFILEDATA_COVERAGE_COVERAGEMAPPINGWRITER_H 150b57cec5SDimitry Andric #define LLVM_PROFILEDATA_COVERAGE_COVERAGEMAPPINGWRITER_H 160b57cec5SDimitry Andric 170b57cec5SDimitry Andric #include "llvm/ADT/ArrayRef.h" 180b57cec5SDimitry Andric #include "llvm/ADT/StringRef.h" 190b57cec5SDimitry Andric #include "llvm/ProfileData/Coverage/CoverageMapping.h" 200b57cec5SDimitry Andric 210b57cec5SDimitry Andric namespace llvm { 220b57cec5SDimitry Andric 230b57cec5SDimitry Andric class raw_ostream; 240b57cec5SDimitry Andric 250b57cec5SDimitry Andric namespace coverage { 260b57cec5SDimitry Andric 270b57cec5SDimitry Andric /// Writer of the filenames section for the instrumentation 280b57cec5SDimitry Andric /// based code coverage. 290b57cec5SDimitry Andric class CoverageFilenamesSectionWriter { 30fe6060f1SDimitry Andric ArrayRef<std::string> Filenames; 310b57cec5SDimitry Andric 320b57cec5SDimitry Andric public: 33fe6060f1SDimitry Andric CoverageFilenamesSectionWriter(ArrayRef<std::string> Filenames); 340b57cec5SDimitry Andric 355ffd83dbSDimitry Andric /// Write encoded filenames to the given output stream. If \p Compress is 365ffd83dbSDimitry Andric /// true, attempt to compress the filenames. 375ffd83dbSDimitry Andric void write(raw_ostream &OS, bool Compress = true); 380b57cec5SDimitry Andric }; 390b57cec5SDimitry Andric 400b57cec5SDimitry Andric /// Writer for instrumentation based coverage mapping data. 410b57cec5SDimitry Andric class CoverageMappingWriter { 420b57cec5SDimitry Andric ArrayRef<unsigned> VirtualFileMapping; 430b57cec5SDimitry Andric ArrayRef<CounterExpression> Expressions; 440b57cec5SDimitry Andric MutableArrayRef<CounterMappingRegion> MappingRegions; 450b57cec5SDimitry Andric 460b57cec5SDimitry Andric public: 470b57cec5SDimitry Andric CoverageMappingWriter(ArrayRef<unsigned> VirtualFileMapping, 480b57cec5SDimitry Andric ArrayRef<CounterExpression> Expressions, 490b57cec5SDimitry Andric MutableArrayRef<CounterMappingRegion> MappingRegions) 500b57cec5SDimitry Andric : VirtualFileMapping(VirtualFileMapping), Expressions(Expressions), 510b57cec5SDimitry Andric MappingRegions(MappingRegions) {} 520b57cec5SDimitry Andric 530b57cec5SDimitry Andric /// Write encoded coverage mapping data to the given output stream. 540b57cec5SDimitry Andric void write(raw_ostream &OS); 550b57cec5SDimitry Andric }; 560b57cec5SDimitry Andric 57*5f757f3fSDimitry Andric /// Writer for the coverage mapping testing format. 58*5f757f3fSDimitry Andric class TestingFormatWriter { 59*5f757f3fSDimitry Andric uint64_t ProfileNamesAddr; 60*5f757f3fSDimitry Andric StringRef ProfileNamesData; 61*5f757f3fSDimitry Andric StringRef CoverageMappingData; 62*5f757f3fSDimitry Andric StringRef CoverageRecordsData; 63*5f757f3fSDimitry Andric 64*5f757f3fSDimitry Andric public: 65*5f757f3fSDimitry Andric TestingFormatWriter(uint64_t ProfileNamesAddr, StringRef ProfileNamesData, 66*5f757f3fSDimitry Andric StringRef CoverageMappingData, 67*5f757f3fSDimitry Andric StringRef CoverageRecordsData) 68*5f757f3fSDimitry Andric : ProfileNamesAddr(ProfileNamesAddr), ProfileNamesData(ProfileNamesData), 69*5f757f3fSDimitry Andric CoverageMappingData(CoverageMappingData), 70*5f757f3fSDimitry Andric CoverageRecordsData(CoverageRecordsData) {} 71*5f757f3fSDimitry Andric 72*5f757f3fSDimitry Andric /// Encode to the given output stream. 73*5f757f3fSDimitry Andric void 74*5f757f3fSDimitry Andric write(raw_ostream &OS, 75*5f757f3fSDimitry Andric TestingFormatVersion Version = TestingFormatVersion::CurrentVersion); 76*5f757f3fSDimitry Andric }; 77*5f757f3fSDimitry Andric 780b57cec5SDimitry Andric } // end namespace coverage 790b57cec5SDimitry Andric 800b57cec5SDimitry Andric } // end namespace llvm 810b57cec5SDimitry Andric 820b57cec5SDimitry Andric #endif // LLVM_PROFILEDATA_COVERAGE_COVERAGEMAPPINGWRITER_H 83