@@ -48,6 +48,7 @@ constexpr StringLiteral PaddingRef::KindString;
48
48
#define MCFRAGMENT_NODE_REF (MCFragmentName, MCEnumName, MCEnumIdentifier ) \
49
49
constexpr StringLiteral MCFragmentName##Ref::KindString;
50
50
#include " llvm/MCCAS/MCCASObjectV1.def"
51
+ constexpr StringLiteral MCGenericFragmentRef::KindString;
51
52
constexpr StringLiteral DebugInfoSectionRef::KindString;
52
53
53
54
void MCSchema::anchor () {}
@@ -172,6 +173,7 @@ Error MCSchema::fillCache() {
172
173
PaddingRef::KindString,
173
174
MCAssemblerRef::KindString,
174
175
DebugInfoSectionRef::KindString,
176
+ MCGenericFragmentRef::KindString,
175
177
#define CASV1_SIMPLE_DATA_REF (RefName, IdentifierName ) RefName::KindString,
176
178
#define CASV1_SIMPLE_GROUP_REF (RefName, IdentifierName ) RefName::KindString,
177
179
#define MCFRAGMENT_NODE_REF (MCFragmentName, MCEnumName, MCEnumIdentifier ) \
@@ -1531,34 +1533,33 @@ Expected<uint64_t> AtomRef::materialize(MCCASReader &Reader,
1531
1533
return Size;
1532
1534
}
1533
1535
1534
- Expected<MCAlignFragmentRef >
1535
- MCAlignFragmentRef::create (MCCASBuilder &MB, const MCAlignFragment &F,
1536
- unsigned FragmentSize,
1537
- ArrayRef<char > FragmentContents) {
1536
+ Expected<MCGenericFragmentRef >
1537
+ MCGenericFragmentRef::createGenericAlignFragmentRef (
1538
+ MCCASBuilder &MB, const MCFragment &F, unsigned FragmentSize,
1539
+ ArrayRef<char > FragmentContents) {
1538
1540
Expected<Builder> B = Builder::startNode (MB.Schema , KindString);
1539
1541
if (!B)
1540
1542
return B.takeError ();
1541
1543
1542
- uint64_t Count = FragmentSize / F.getFillLen ();
1543
- if (F.hasEmitNops ()) {
1544
+ uint64_t Count = FragmentSize / F.getAlignFillLen ();
1545
+ if (F.hasAlignEmitNops ()) {
1544
1546
// Write 0 as size and use backend to emit nop.
1545
1547
writeVBR8 (0 , B->Data );
1546
1548
if (!MB.Asm .getBackend ().writeNopData (MB.FragmentOS , Count,
1547
1549
F.getSubtargetInfo ()))
1548
1550
report_fatal_error (" unable to write nop sequence of " + Twine (Count) +
1549
1551
" bytes" );
1550
1552
B->Data .append (MB.FragmentData );
1551
- return get (B->build ());
1553
+ return get (B->build (), MCFragment::FT_Align );
1552
1554
}
1553
1555
writeVBR8 (Count, B->Data );
1554
- writeVBR8 (F.getFill (), B->Data );
1555
- writeVBR8 (F.getFillLen (), B->Data );
1556
- return get (B->build ());
1556
+ writeVBR8 (F.getAlignFill (), B->Data );
1557
+ writeVBR8 (F.getAlignFillLen (), B->Data );
1558
+ return get (B->build (), MCFragment::FT_Align );
1557
1559
}
1558
1560
1559
- Expected<uint64_t > MCAlignFragmentRef::materialize (MCCASReader &Reader,
1560
- raw_ostream *Stream) const
1561
- {
1561
+ Expected<uint64_t > MCGenericFragmentRef::materializeGenericAlignFragmentRef (
1562
+ MCCASReader &Reader, raw_ostream *Stream) const {
1562
1563
uint64_t Count;
1563
1564
auto Remaining = getData ();
1564
1565
auto Endian = Reader.getEndian ();
@@ -1686,23 +1687,76 @@ Expected<uint64_t> MCFillFragmentRef::materialize(MCCASReader &Reader,
1686
1687
return Size;
1687
1688
}
1688
1689
1689
- Expected<MCLEBFragmentRef >
1690
- MCLEBFragmentRef::create (MCCASBuilder &MB, const MCLEBFragment &F,
1691
- unsigned FragmentSize,
1692
- ArrayRef<char > FragmentContents) {
1690
+ Expected<MCGenericFragmentRef >
1691
+ MCGenericFragmentRef::createGenericLEBFragmentRef (
1692
+ MCCASBuilder &MB, const MCFragment &F, unsigned FragmentSize,
1693
+ ArrayRef<char > FragmentContents) {
1693
1694
Expected<Builder> B = Builder::startNode (MB.Schema , KindString);
1694
1695
if (!B)
1695
1696
return B.takeError ();
1696
1697
llvm::append_range (B->Data , F.getContents ());
1697
- return get (B->build ());
1698
+ return get (B->build (), MCFragment::FT_LEB );
1698
1699
}
1699
1700
1700
- Expected<uint64_t > MCLEBFragmentRef::materialize (MCCASReader &Reader,
1701
- raw_ostream *Stream) const {
1701
+ Expected<uint64_t > MCGenericFragmentRef::materializeGenericLEBFragmentRef (
1702
+ MCCASReader &Reader, raw_ostream *Stream) const {
1702
1703
*Stream << getData ();
1703
1704
return getData ().size ();
1704
1705
}
1705
1706
1707
+ Expected<MCGenericFragmentRef>
1708
+ MCGenericFragmentRef::create (MCCASBuilder &MB, const MCFragment &Fragment,
1709
+ unsigned int FragmentSize,
1710
+ ArrayRef<char > FragmentContents) {
1711
+ auto FragType = Fragment.getKind ();
1712
+ switch (FragType) {
1713
+ case MCFragment::FT_Align:
1714
+ return createGenericAlignFragmentRef (MB, Fragment, FragmentSize,
1715
+ FragmentContents);
1716
+ case MCFragment::FT_LEB:
1717
+ return createGenericLEBFragmentRef (MB, Fragment, FragmentSize,
1718
+ FragmentContents);
1719
+ case MCFragment::FT_Relaxable:
1720
+ case MCFragment::FT_Data:
1721
+ case MCFragment::FT_Dwarf:
1722
+ case MCFragment::FT_DwarfFrame: {
1723
+ Expected<Builder> B = Builder::startNode (MB.Schema , KindString);
1724
+ if (!B)
1725
+ return B.takeError ();
1726
+ B->Data .append (MB.FragmentData );
1727
+ B->Data .append (FragmentContents.begin (), FragmentContents.end ());
1728
+ assert (((MB.FragmentData .empty () && Fragment.getContents ().empty ()) ||
1729
+ (MB.FragmentData .size () + Fragment.getContents ().size () ==
1730
+ FragmentSize)) &&
1731
+ " Size should match" );
1732
+ return get (B->build (), FragType);
1733
+ }
1734
+ default :
1735
+ llvm_unreachable (" Other Fragment Kinds should be handled elsewhere!" );
1736
+ }
1737
+ }
1738
+
1739
+ Expected<uint64_t >
1740
+ MCGenericFragmentRef::materialize (const MCFragment::FragmentType FragType,
1741
+ MCCASReader &Reader,
1742
+ raw_ostream *Stream) const {
1743
+ switch (FragType) {
1744
+ case MCFragment::FT_Align:
1745
+ return materializeGenericAlignFragmentRef (Reader, Stream);
1746
+ case MCFragment::FT_LEB:
1747
+ return materializeGenericLEBFragmentRef (Reader, Stream);
1748
+ case MCFragment::FT_Relaxable:
1749
+ case MCFragment::FT_Data:
1750
+ case MCFragment::FT_Dwarf:
1751
+ case MCFragment::FT_DwarfFrame: {
1752
+ *Stream << getData ();
1753
+ return getData ().size ();
1754
+ }
1755
+ default :
1756
+ llvm_unreachable (" Other Fragment Kinds should be handled elsewhere!" );
1757
+ }
1758
+ }
1759
+
1706
1760
Expected<MCNopsFragmentRef>
1707
1761
MCNopsFragmentRef::create (MCCASBuilder &MB, const MCNopsFragment &F,
1708
1762
unsigned FragmentSize,
@@ -1858,6 +1912,18 @@ Error MCCASBuilder::buildFragment(const MCFragment &F, unsigned Size,
1858
1912
return Error::success (); \
1859
1913
}
1860
1914
#include " llvm/MCCAS/MCCASObjectV1.def"
1915
+ case MCFragment::FT_Relaxable:
1916
+ case MCFragment::FT_Data:
1917
+ case MCFragment::FT_Align:
1918
+ case MCFragment::FT_Dwarf:
1919
+ case MCFragment::FT_DwarfFrame:
1920
+ case MCFragment::FT_LEB: {
1921
+ auto GF = MCGenericFragmentRef::create (*this , F, Size, FragmentContents);
1922
+ if (!GF)
1923
+ return GF.takeError ();
1924
+ addNode (*GF);
1925
+ return Error::success ();
1926
+ }
1861
1927
}
1862
1928
llvm_unreachable (" unknown fragment" );
1863
1929
}
@@ -1984,6 +2050,14 @@ Error MCDataFragmentMerger::emitMergedFragments() {
1984
2050
return E;
1985
2051
break ;
1986
2052
}
2053
+ case MCFragment::FT_Relaxable:
2054
+ case MCFragment::FT_Data:
2055
+ case MCFragment::FT_Dwarf:
2056
+ case MCFragment::FT_DwarfFrame:
2057
+ case MCFragment::FT_LEB: {
2058
+ FragmentData.append (CandidateContents);
2059
+ break ;
2060
+ }
1987
2061
default :
1988
2062
llvm_unreachable (" other framgents should not be added" );
1989
2063
}
@@ -2861,6 +2935,11 @@ static ArrayRef<char> getFragmentContents(const MCFragment &Fragment) {
2861
2935
cast<MCCVInlineLineTableFragment>(Fragment);
2862
2936
return SF.getContents ();
2863
2937
}
2938
+ case MCFragment::FT_Relaxable:
2939
+ case MCFragment::FT_Data:
2940
+ case MCFragment::FT_Align:
2941
+ case MCFragment::FT_Dwarf:
2942
+ case MCFragment::FT_DwarfFrame:
2864
2943
case MCFragment::FT_LEB: {
2865
2944
return Fragment.getContents ();
2866
2945
}
@@ -3602,6 +3681,9 @@ Expected<uint64_t> MCCASReader::materializeAtom(cas::ObjectRef ID,
3602
3681
return F->materialize (*Stream);
3603
3682
if (auto F = MergedFragmentRef::Cast (*Node))
3604
3683
return F->materialize (*Stream);
3684
+ if (auto F = MCGenericFragmentRef::Cast (*Node)) {
3685
+ return F->materialize (F->FragType , *this , Stream);
3686
+ }
3605
3687
3606
3688
return createStringError (inconvertibleErrorCode (),
3607
3689
" unsupported CAS node for fragment" );
0 commit comments