Commit fcc08aa8 authored by Igor Kudrin's avatar Igor Kudrin
Browse files

[MachO] Add a test for detecting reserved unit length.

This is a follow-up for D71546 to add a corresponding unit test.

Differential Revision: https://reviews.llvm.org/D72695
parent 0dc6c249
Loading
Loading
Loading
Loading
+38 −0
Original line number Diff line number Diff line
@@ -97,3 +97,41 @@ TEST(ToAtomsTest, basic_obj_x86_64) {
  EXPECT_TRUE(atom4->name().equals("_undef"));
  EXPECT_EQ(lld::Atom::definitionUndefined, atom4->definition());
}

TEST(ToAtomsTest, reservedUnitLength) {
  static const uint8_t debugInfoWithReservedLengthContent[12] = {
      0xf0, 0xff, 0xff, 0xff // Reserved length value
  };
  static const uint8_t debugInfoWithValidBigLengthContent[12] = {
      0xef, 0xff, 0xff, 0xff, // The maximum valid length value for DWARF32
      0x00, 0x00              // Wrong version
  };
  static const uint8_t debugAbbrevDummyContent[] = {0x00};

  NormalizedFile fReservedLength, fValidBigLength;
  fReservedLength.arch = lld::MachOLinkingContext::arch_x86;
  fValidBigLength.arch = lld::MachOLinkingContext::arch_x86;
  Section section;
  section.segmentName = "__DWARF";
  section.sectionName = "__debug_info";
  section.content = llvm::makeArrayRef(debugInfoWithReservedLengthContent);
  fReservedLength.sections.push_back(section);
  section.content = llvm::makeArrayRef(debugInfoWithValidBigLengthContent);
  fValidBigLength.sections.push_back(section);
  section.sectionName = "__debug_abbrev";
  section.content = llvm::makeArrayRef(debugAbbrevDummyContent);
  fReservedLength.sections.push_back(section);
  fValidBigLength.sections.push_back(section);

  auto resultReservedLength = normalizedToAtoms(fReservedLength, "foo", false);
  auto resultValidBigLength = normalizedToAtoms(fValidBigLength, "foo", false);

  // Both cases should return errors, but different.
  ASSERT_FALSE(resultReservedLength);
  ASSERT_FALSE(resultValidBigLength);

  EXPECT_STREQ("Malformed DWARF in foo",
               toString(resultReservedLength.takeError()).c_str());
  EXPECT_STREQ("Unsupported DWARF version in foo",
               toString(resultValidBigLength.takeError()).c_str());
}