Skip to content

Commit

Permalink
Revert "[llvm-cov][WebAssembly] Read __llvm_prf_names from data seg…
Browse files Browse the repository at this point in the history
…ments" (llvm#112520)

This reverts commit efc9dd4 in order to
fix Windows test failure:
llvm#111332 (comment)
  • Loading branch information
kateinoigakukun committed Oct 24, 2024
1 parent a1a7a17 commit 5dbf8f3
Show file tree
Hide file tree
Showing 4 changed files with 9 additions and 66 deletions.
64 changes: 9 additions & 55 deletions llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,12 @@
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/BinaryFormat/Wasm.h"
#include "llvm/Object/Archive.h"
#include "llvm/Object/Binary.h"
#include "llvm/Object/COFF.h"
#include "llvm/Object/Error.h"
#include "llvm/Object/MachOUniversal.h"
#include "llvm/Object/ObjectFile.h"
#include "llvm/Object/Wasm.h"
#include "llvm/ProfileData/InstrProf.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/Compression.h"
Expand Down Expand Up @@ -1077,53 +1075,6 @@ lookupSections(ObjectFile &OF, InstrProfSectKind IPSK) {
return Sections;
}

/// Find a section that matches \p Name and is allocatable at runtime.
///
/// Returns the contents of the section and its start offset in the object file.
static Expected<std::pair<StringRef, uint64_t>>
lookupAllocatableSection(ObjectFile &OF, InstrProfSectKind IPSK) {
// On Wasm, allocatable sections can live only in data segments.
if (auto *WOF = dyn_cast<WasmObjectFile>(&OF)) {
std::vector<const WasmSegment *> Segments;
auto ObjFormat = OF.getTripleObjectFormat();
auto Name =
getInstrProfSectionName(IPSK, ObjFormat, /*AddSegmentInfo=*/false);
for (const auto &DebugName : WOF->debugNames()) {
if (DebugName.Type != wasm::NameType::DATA_SEGMENT ||
DebugName.Name != Name)
continue;
if (DebugName.Index >= WOF->dataSegments().size())
return make_error<CoverageMapError>(coveragemap_error::malformed);
auto &Segment = WOF->dataSegments()[DebugName.Index];
Segments.push_back(&Segment);
}
if (Segments.empty())
return make_error<CoverageMapError>(coveragemap_error::no_data_found);
if (Segments.size() != 1)
return make_error<CoverageMapError>(coveragemap_error::malformed);

const auto &Segment = *Segments.front();
auto &Data = Segment.Data;
StringRef Content(reinterpret_cast<const char *>(Data.Content.data()),
Data.Content.size());
return std::make_pair(Content, Segment.SectionOffset);
}

// On other object file types, delegate to lookupSections to find the section.
auto Sections = lookupSections(OF, IPSK);
if (!Sections)
return Sections.takeError();
if (Sections->size() != 1)
return make_error<CoverageMapError>(
coveragemap_error::malformed,
"the size of coverage mapping section is not one");
auto &Section = Sections->front();
auto ContentsOrErr = Section.getContents();
if (!ContentsOrErr)
return ContentsOrErr.takeError();
return std::make_pair(*ContentsOrErr, Section.getAddress());
}

static Expected<std::unique_ptr<BinaryCoverageReader>>
loadBinaryFormat(std::unique_ptr<Binary> Bin, StringRef Arch,
StringRef CompilationDir = "",
Expand Down Expand Up @@ -1154,20 +1105,23 @@ loadBinaryFormat(std::unique_ptr<Binary> Bin, StringRef Arch,

// Look for the sections that we are interested in.
auto ProfileNames = std::make_unique<InstrProfSymtab>();
std::vector<SectionRef> NamesSectionRefs;
// If IPSK_name is not found, fallback to search for IPK_covname, which is
// used when binary correlation is enabled.
auto NamesSection = lookupAllocatableSection(*OF, IPSK_name);
auto NamesSection = lookupSections(*OF, IPSK_name);
if (auto E = NamesSection.takeError()) {
consumeError(std::move(E));
NamesSection = lookupAllocatableSection(*OF, IPSK_covname);
NamesSection = lookupSections(*OF, IPSK_covname);
if (auto E = NamesSection.takeError())
return std::move(E);
}
NamesSectionRefs = *NamesSection;

uint64_t NamesAddress;
StringRef NamesContent;
std::tie(NamesContent, NamesAddress) = *NamesSection;
if (Error E = ProfileNames->create(NamesContent, NamesAddress))
if (NamesSectionRefs.size() != 1)
return make_error<CoverageMapError>(
coveragemap_error::malformed,
"the size of coverage mapping section is not one");
if (Error E = ProfileNames->create(NamesSectionRefs.back()))
return std::move(E);

auto CoverageSection = lookupSections(*OF, IPSK_covmap);
Expand Down
Binary file not shown.
4 changes: 0 additions & 4 deletions llvm/test/tools/llvm-cov/Inputs/binary-formats.wasm.proftext

This file was deleted.

7 changes: 0 additions & 7 deletions llvm/test/tools/llvm-cov/binary-formats.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,4 @@ int main(int argc, const char *argv[]) {}
// RUN: llvm-cov show %S/Inputs/binary-formats.v3.macho64l -instr-profile %t.profdata -path-equivalence=/tmp,%S %s | FileCheck %s
// RUN: llvm-cov show %S/Inputs/binary-formats.v6.linux64l -instr-profile %t.profdata -path-equivalence=/tmp,%S %s | FileCheck %s

// RUN: llvm-profdata merge %S/Inputs/binary-formats.wasm.proftext -o %t.wasm.profdata
// NOTE: The wasm binary is built with the following command:
// clang -target wasm32-unknown-wasi %s -o %S/Inputs/binary-formats.v6.wasm32 \
// -mllvm -enable-name-compression=false \
// -fprofile-instr-generate -fcoverage-mapping -lwasi-emulated-getpid -lwasi-emulated-mman
// RUN: llvm-cov show %S/Inputs/binary-formats.v6.wasm32 -instr-profile %t.wasm.profdata -path-equivalence=/tmp,%S %s | FileCheck %s

// RUN: llvm-cov export %S/Inputs/binary-formats.macho64l -instr-profile %t.profdata | FileCheck %S/Inputs/binary-formats.canonical.json

0 comments on commit 5dbf8f3

Please sign in to comment.