|
18 | 18 | #include "llvm/ADT/SmallVector.h"
|
19 | 19 | #include "llvm/ADT/Statistic.h"
|
20 | 20 | #include "llvm/ADT/StringRef.h"
|
21 |
| -#include "llvm/BinaryFormat/Wasm.h" |
22 | 21 | #include "llvm/Object/Archive.h"
|
23 | 22 | #include "llvm/Object/Binary.h"
|
24 | 23 | #include "llvm/Object/COFF.h"
|
25 | 24 | #include "llvm/Object/Error.h"
|
26 | 25 | #include "llvm/Object/MachOUniversal.h"
|
27 | 26 | #include "llvm/Object/ObjectFile.h"
|
28 |
| -#include "llvm/Object/Wasm.h" |
29 | 27 | #include "llvm/ProfileData/InstrProf.h"
|
30 | 28 | #include "llvm/Support/Casting.h"
|
31 | 29 | #include "llvm/Support/Compression.h"
|
@@ -1079,53 +1077,6 @@ lookupSections(ObjectFile &OF, InstrProfSectKind IPSK) {
|
1079 | 1077 | return Sections;
|
1080 | 1078 | }
|
1081 | 1079 |
|
1082 |
| -/// Find a section that matches \p Name and is allocatable at runtime. |
1083 |
| -/// |
1084 |
| -/// Returns the contents of the section and its start offset in the object file. |
1085 |
| -static Expected<std::pair<StringRef, uint64_t>> |
1086 |
| -lookupAllocatableSection(ObjectFile &OF, InstrProfSectKind IPSK) { |
1087 |
| - // On Wasm, allocatable sections can live only in data segments. |
1088 |
| - if (auto *WOF = dyn_cast<WasmObjectFile>(&OF)) { |
1089 |
| - std::vector<const WasmSegment *> Segments; |
1090 |
| - auto ObjFormat = OF.getTripleObjectFormat(); |
1091 |
| - auto Name = |
1092 |
| - getInstrProfSectionName(IPSK, ObjFormat, /*AddSegmentInfo=*/false); |
1093 |
| - for (const auto &DebugName : WOF->debugNames()) { |
1094 |
| - if (DebugName.Type != wasm::NameType::DATA_SEGMENT || |
1095 |
| - DebugName.Name != Name) |
1096 |
| - continue; |
1097 |
| - if (DebugName.Index >= WOF->dataSegments().size()) |
1098 |
| - return make_error<CoverageMapError>(coveragemap_error::malformed); |
1099 |
| - auto &Segment = WOF->dataSegments()[DebugName.Index]; |
1100 |
| - Segments.push_back(&Segment); |
1101 |
| - } |
1102 |
| - if (Segments.empty()) |
1103 |
| - return make_error<CoverageMapError>(coveragemap_error::no_data_found); |
1104 |
| - if (Segments.size() != 1) |
1105 |
| - return make_error<CoverageMapError>(coveragemap_error::malformed); |
1106 |
| - |
1107 |
| - const auto &Segment = *Segments.front(); |
1108 |
| - auto &Data = Segment.Data; |
1109 |
| - StringRef Content(reinterpret_cast<const char *>(Data.Content.data()), |
1110 |
| - Data.Content.size()); |
1111 |
| - return std::make_pair(Content, Segment.SectionOffset); |
1112 |
| - } |
1113 |
| - |
1114 |
| - // On other object file types, delegate to lookupSections to find the section. |
1115 |
| - auto Sections = lookupSections(OF, IPSK); |
1116 |
| - if (!Sections) |
1117 |
| - return Sections.takeError(); |
1118 |
| - if (Sections->size() != 1) |
1119 |
| - return make_error<CoverageMapError>( |
1120 |
| - coveragemap_error::malformed, |
1121 |
| - "the size of coverage mapping section is not one"); |
1122 |
| - auto &Section = Sections->front(); |
1123 |
| - auto ContentsOrErr = Section.getContents(); |
1124 |
| - if (!ContentsOrErr) |
1125 |
| - return ContentsOrErr.takeError(); |
1126 |
| - return std::make_pair(*ContentsOrErr, Section.getAddress()); |
1127 |
| -} |
1128 |
| - |
1129 | 1080 | static Expected<std::unique_ptr<BinaryCoverageReader>>
|
1130 | 1081 | loadBinaryFormat(std::unique_ptr<Binary> Bin, StringRef Arch,
|
1131 | 1082 | StringRef CompilationDir = "",
|
@@ -1156,20 +1107,23 @@ loadBinaryFormat(std::unique_ptr<Binary> Bin, StringRef Arch,
|
1156 | 1107 |
|
1157 | 1108 | // Look for the sections that we are interested in.
|
1158 | 1109 | auto ProfileNames = std::make_unique<InstrProfSymtab>();
|
| 1110 | + std::vector<SectionRef> NamesSectionRefs; |
1159 | 1111 | // If IPSK_name is not found, fallback to search for IPK_covname, which is
|
1160 | 1112 | // used when binary correlation is enabled.
|
1161 |
| - auto NamesSection = lookupAllocatableSection(*OF, IPSK_name); |
| 1113 | + auto NamesSection = lookupSections(*OF, IPSK_name); |
1162 | 1114 | if (auto E = NamesSection.takeError()) {
|
1163 | 1115 | consumeError(std::move(E));
|
1164 |
| - NamesSection = lookupAllocatableSection(*OF, IPSK_covname); |
| 1116 | + NamesSection = lookupSections(*OF, IPSK_covname); |
1165 | 1117 | if (auto E = NamesSection.takeError())
|
1166 | 1118 | return std::move(E);
|
1167 | 1119 | }
|
| 1120 | + NamesSectionRefs = *NamesSection; |
1168 | 1121 |
|
1169 |
| - uint64_t NamesAddress; |
1170 |
| - StringRef NamesContent; |
1171 |
| - std::tie(NamesContent, NamesAddress) = *NamesSection; |
1172 |
| - if (Error E = ProfileNames->create(NamesContent, NamesAddress)) |
| 1122 | + if (NamesSectionRefs.size() != 1) |
| 1123 | + return make_error<CoverageMapError>( |
| 1124 | + coveragemap_error::malformed, |
| 1125 | + "the size of coverage mapping section is not one"); |
| 1126 | + if (Error E = ProfileNames->create(NamesSectionRefs.back())) |
1173 | 1127 | return std::move(E);
|
1174 | 1128 |
|
1175 | 1129 | auto CoverageSection = lookupSections(*OF, IPSK_covmap);
|
|
0 commit comments