Skip to content

Commit 45e539d

Browse files
Support all MCEncodedFragmentWithContents variants
In MCCAS we use MCCASBuilder::mergeMCFragmentContents to merge the contents of DWARF sections before doing optimizations on them for deduplication, while most sections only use MCDataFragments, some other sections can use other kinds of fragments, make sure we support all MCEncodedFragmentWithContents types.
1 parent 6e2dca3 commit 45e539d

File tree

1 file changed

+29
-3
lines changed

1 file changed

+29
-3
lines changed

llvm/lib/MCCAS/MCCASObjectV1.cpp

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1809,6 +1809,12 @@ Expected<SmallVector<char, 0>> MCCASBuilder::mergeMCFragmentContents(
18091809
for (const MCFragment &Fragment : FragmentList) {
18101810
if (const auto *DataFragment = dyn_cast<MCDataFragment>(&Fragment))
18111811
llvm::append_range(mergedData, DataFragment->getContents());
1812+
else if (const auto *CompactEncodedInstFragment =
1813+
dyn_cast<MCCompactEncodedInstFragment>(&Fragment))
1814+
llvm::append_range(mergedData, CompactEncodedInstFragment->getContents());
1815+
else if (const auto *RelaxableFragment =
1816+
dyn_cast<MCRelaxableFragment>(&Fragment))
1817+
llvm::append_range(mergedData, RelaxableFragment->getContents());
18121818
else if (const auto *DwarfLineAddrFrag =
18131819
dyn_cast<MCDwarfLineAddrFragment>(&Fragment))
18141820
if (IsDebugLineSection)
@@ -1817,9 +1823,29 @@ Expected<SmallVector<char, 0>> MCCASBuilder::mergeMCFragmentContents(
18171823
return createStringError(
18181824
inconvertibleErrorCode(),
18191825
"Invalid MCDwarfLineAddrFragment in a non debug line section");
1820-
else
1821-
return createStringError(inconvertibleErrorCode(),
1822-
"Invalid fragment type");
1826+
else if (const auto *DwarfCallFrameFragment =
1827+
dyn_cast<MCDwarfCallFrameFragment>(&Fragment))
1828+
llvm::append_range(mergedData, DwarfCallFrameFragment->getContents());
1829+
else if (const auto *CVDefRangeFragment =
1830+
dyn_cast<MCCVDefRangeFragment>(&Fragment))
1831+
llvm::append_range(mergedData, CVDefRangeFragment->getContents());
1832+
else if (const auto *PseudoProbeAddrFragment =
1833+
dyn_cast<MCPseudoProbeAddrFragment>(&Fragment))
1834+
llvm::append_range(mergedData, PseudoProbeAddrFragment->getContents());
1835+
else if (const auto *LEBFragment = dyn_cast<MCLEBFragment>(&Fragment))
1836+
llvm::append_range(mergedData, LEBFragment->getContents());
1837+
else if (const auto *CVInlineLineTableFragment =
1838+
dyn_cast<MCCVInlineLineTableFragment>(&Fragment))
1839+
llvm::append_range(mergedData, CVInlineLineTableFragment->getContents());
1840+
else if (const auto *AlignFragment = dyn_cast<MCAlignFragment>(&Fragment)) {
1841+
auto FragmentSize = Asm.computeFragmentSize(Layout, Fragment);
1842+
raw_svector_ostream OS(mergedData);
1843+
if (auto E = writeAlignFragment(*this, *AlignFragment, OS, FragmentSize))
1844+
return std::move(E);
1845+
} else
1846+
// All other fragment types can be considered empty, see
1847+
// getFragmentContents() for all fragments that have contents.
1848+
continue;
18231849
}
18241850
return mergedData;
18251851
}

0 commit comments

Comments
 (0)