[llvm] Implements PGOBBAddrMap in Object and ObjectYAML with tests [1/5] (PR #71750)
Rahman Lavaee via llvm-commits
llvm-commits at lists.llvm.org
Tue Nov 28 13:42:44 PST 2023
================
@@ -744,6 +745,386 @@ TEST(ELFObjectFileTest, ReadBBAddrMap) {
Section1BBAddrMaps);
}
+// Tests for error paths of the ELFFile::decodeBBAddrMap with PGOBBAddrMap API.
+TEST(ELFObjectFileTest, InvalidDecodePGOBBAddrMap) {
+ if (IsHostWindows())
+ GTEST_SKIP();
+ StringRef CommonYamlString(R"(
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+Sections:
+ - Type: SHT_LLVM_BB_ADDR_MAP
+ Name: .llvm_bb_addr_map
+ Entries:
+ - Address: 0x11111
+)");
+
+ auto DoCheck = [&](StringRef YamlString, const char *ErrMsg) {
+ SmallString<0> Storage;
+ Expected<ELFObjectFile<ELF64LE>> ElfOrErr =
+ toBinary<ELF64LE>(Storage, YamlString);
+ ASSERT_THAT_EXPECTED(ElfOrErr, Succeeded());
+ const ELFFile<ELF64LE> &Elf = ElfOrErr->getELFFile();
+
+ Expected<const typename ELF64LE::Shdr *> BBAddrMapSecOrErr =
+ Elf.getSection(1);
+ ASSERT_THAT_EXPECTED(BBAddrMapSecOrErr, Succeeded());
+
+ std::vector<PGOAnalysisMap> PGOAnalyses;
+ EXPECT_THAT_ERROR(
+ Elf.decodeBBAddrMap(**BBAddrMapSecOrErr, nullptr, &PGOAnalyses)
+ .takeError(),
+ FailedWithMessage(ErrMsg));
+ };
+
+ // Check that we can detect unsupported versions that is too low
+ SmallString<128> UnsupportedLowVersionYamlString(CommonYamlString);
+ UnsupportedLowVersionYamlString += R"(
+ Version: 1
+ Feature: 0x4
+ BBEntries:
+ - AddressOffset: 0x0
+ Size: 0x1
+ Metadata: 0x2
+)";
+
+ DoCheck(UnsupportedLowVersionYamlString,
+ "version should be >= 2 for SHT_LLVM_BB_ADDR_MAP when PGO features "
+ "are enabled: version = 1 feature = 4");
+
+ SmallString<128> CommonVersionedYamlString(CommonYamlString);
+ CommonVersionedYamlString += R"(
+ Version: 2
+ BBEntries:
+ - ID: 1
+ AddressOffset: 0x0
+ Size: 0x1
+ Metadata: 0x2
+)";
+
+ // Check that we fail when function entry count is enabled but not provided.
+ SmallString<128> MissingFuncEntryCount(CommonYamlString);
+ MissingFuncEntryCount += R"(
+ Version: 2
+ Feature: 0x01
+)";
+
+ DoCheck(MissingFuncEntryCount,
+ "unable to decode LEB128 at offset 0x0000000b: malformed uleb128, "
+ "extends past end");
+
+ // Check that we fail when basic block frequency is enabled but not provided.
+ SmallString<128> MissingBBFreq(CommonYamlString);
+ MissingBBFreq += R"(
+ Version: 2
+ Feature: 0x02
+ BBEntries:
+ - ID: 1
+ AddressOffset: 0x0
+ Size: 0x1
+ Metadata: 0x2
+)";
+
+ DoCheck(MissingBBFreq, "unable to decode LEB128 at offset 0x0000000f: "
+ "malformed uleb128, extends past end");
+
+ // Check that we fail when branch probability is enabled but not provided.
+ SmallString<128> MissingBrProb(CommonYamlString);
+ MissingBrProb += R"(
+ Version: 2
+ Feature: 0x02
----------------
rlavaee wrote:
Not sure if thiis is right. Feature value is the same as the one above.
https://github.com/llvm/llvm-project/pull/71750
More information about the llvm-commits
mailing list