Skip to content

Commit 1b0dc8e

Browse files
WIP MCCAS MaskRay Fix, works for small cpp file but not on bootstrap build
1 parent d21a96f commit 1b0dc8e

File tree

3 files changed

+41
-30
lines changed

3 files changed

+41
-30
lines changed

llvm/include/llvm/MCCAS/MCCASObjectV1.def

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,15 +72,21 @@ CASV1_SIMPLE_GROUP_REF(DIEDedupeTopLevelRef, mc:debug_DIE_Dedupe_top_level)
7272
#ifdef MCFRAGMENT_NODE_REF
7373

7474
#ifndef MCFRAGMENT_ENCODED_FRAGMENT_ONLY
75+
MCFRAGMENT_NODE_REF(MCAlignFragment, FT_Align, mc:align)
7576
MCFRAGMENT_NODE_REF(MCBoundaryAlignFragment, FT_BoundaryAlign, mc:boundary_align)
7677
MCFRAGMENT_NODE_REF(MCCVInlineLineTableFragment, FT_CVInlineLines, mc:cv_inline_lines)
7778
MCFRAGMENT_NODE_REF(MCFillFragment, FT_Fill, mc:fill)
79+
MCFRAGMENT_NODE_REF(MCLEBFragment, FT_LEB, mc:leb)
7880
MCFRAGMENT_NODE_REF(MCNopsFragment, FT_Nops, mc:nops)
7981
MCFRAGMENT_NODE_REF(MCOrgFragment, FT_Org, mc:org)
8082
MCFRAGMENT_NODE_REF(MCSymbolIdFragment, FT_SymbolId, mc:symbol_id)
8183
#endif /* MCFRAGMENT_ENCODED_FRAGMENT_ONLY */
8284
#undef MCFRAGMENT_ENCODED_FRAGMENT_ONLY
8385

86+
MCFRAGMENT_NODE_REF(MCDataFragment, FT_Data, mc:data)
87+
MCFRAGMENT_NODE_REF(MCRelaxableFragment, FT_Relaxable, mc:relaxable)
88+
MCFRAGMENT_NODE_REF(MCDwarfLineAddrFragment, FT_Dwarf, mc:dwarf)
89+
MCFRAGMENT_NODE_REF(MCDwarfCallFrameFragment, FT_DwarfFrame, mc:dwarf_frame)
8490
MCFRAGMENT_NODE_REF(MCCVDefRangeFragment, FT_CVDefRange, mc:cv_def_range)
8591

8692
#undef MCFRAGMENT_NODE_REF

llvm/include/llvm/MCCAS/MCCASObjectV1.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -392,7 +392,7 @@ class SpecificRef : public MCObjectProxy {
392392
public: \
393393
static constexpr StringLiteral KindString = #MCEnumIdentifier; \
394394
static Expected<MCFragmentName##Ref> \
395-
create(MCCASBuilder &MB, const MCFragmentName &Fragment, \
395+
create(MCCASBuilder &MB, const MCFragment &Fragment, \
396396
unsigned FragmentSize, ArrayRef<char> FragmentContents); \
397397
static Expected<MCFragmentName##Ref> get(Expected<MCObjectProxy> Ref) { \
398398
auto Specific = SpecificRefT::getSpecific(std::move(Ref)); \
@@ -404,7 +404,7 @@ class SpecificRef : public MCObjectProxy {
404404
cas::ObjectRef ID) { \
405405
return get(Schema.get(ID)); \
406406
} \
407-
static std::optional<MCFragmentName##Ref> Cast(MCObjectProxy Ref) { \
407+
static std::optional<MCFragmentName##Ref> Cast(MCObjectProxy Ref) { \
408408
auto Specific = SpecificRefT::Cast(Ref); \
409409
if (!Specific) \
410410
return std::nullopt; \

llvm/lib/MCCAS/MCCASObjectV1.cpp

Lines changed: 33 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1532,15 +1532,15 @@ Expected<uint64_t> AtomRef::materialize(MCCASReader &Reader,
15321532
}
15331533

15341534
Expected<MCAlignFragmentRef>
1535-
MCAlignFragmentRef::create(MCCASBuilder &MB, const MCAlignFragment &F,
1535+
MCAlignFragmentRef::create(MCCASBuilder &MB, const MCFragment &F,
15361536
unsigned FragmentSize,
15371537
ArrayRef<char> FragmentContents) {
15381538
Expected<Builder> B = Builder::startNode(MB.Schema, KindString);
15391539
if (!B)
15401540
return B.takeError();
15411541

1542-
uint64_t Count = FragmentSize / F.getFillLen();
1543-
if (F.hasEmitNops()) {
1542+
uint64_t Count = FragmentSize / F.getAlignFillLen();
1543+
if (F.hasAlignEmitNops()) {
15441544
// Write 0 as size and use backend to emit nop.
15451545
writeVBR8(0, B->Data);
15461546
if (!MB.Asm.getBackend().writeNopData(MB.FragmentOS, Count,
@@ -1551,8 +1551,8 @@ MCAlignFragmentRef::create(MCCASBuilder &MB, const MCAlignFragment &F,
15511551
return get(B->build());
15521552
}
15531553
writeVBR8(Count, B->Data);
1554-
writeVBR8(F.getFill(), B->Data);
1555-
writeVBR8(F.getFillLen(), B->Data);
1554+
writeVBR8(F.getAlignFill(), B->Data);
1555+
writeVBR8(F.getAlignFillLen(), B->Data);
15561556
return get(B->build());
15571557
}
15581558

@@ -1598,9 +1598,10 @@ Expected<uint64_t> MCAlignFragmentRef::materialize(MCCASReader &Reader,
15981598
return Count * ValueSize;
15991599
}
16001600

1601-
Expected<MCBoundaryAlignFragmentRef> MCBoundaryAlignFragmentRef::create(
1602-
MCCASBuilder &MB, const MCBoundaryAlignFragment &F, unsigned FragmentSize,
1603-
ArrayRef<char> FragmentContents) {
1601+
Expected<MCBoundaryAlignFragmentRef>
1602+
MCBoundaryAlignFragmentRef::create(MCCASBuilder &MB, const MCFragment &F,
1603+
unsigned FragmentSize,
1604+
ArrayRef<char> FragmentContents) {
16041605
Expected<Builder> B = Builder::startNode(MB.Schema, KindString);
16051606
if (!B)
16061607
return B.takeError();
@@ -1619,9 +1620,10 @@ MCBoundaryAlignFragmentRef::materialize(MCCASReader &Reader,
16191620
return getData().size();
16201621
}
16211622

1622-
Expected<MCCVInlineLineTableFragmentRef> MCCVInlineLineTableFragmentRef::create(
1623-
MCCASBuilder &MB, const MCCVInlineLineTableFragment &F,
1624-
unsigned FragmentSize, ArrayRef<char> FragmentContents) {
1623+
Expected<MCCVInlineLineTableFragmentRef>
1624+
MCCVInlineLineTableFragmentRef::create(MCCASBuilder &MB, const MCFragment &F,
1625+
unsigned FragmentSize,
1626+
ArrayRef<char> FragmentContents) {
16251627
Expected<Builder> B = Builder::startNode(MB.Schema, KindString);
16261628
if (!B)
16271629
return B.takeError();
@@ -1637,15 +1639,16 @@ MCCVInlineLineTableFragmentRef::materialize(MCCASReader &Reader,
16371639
}
16381640

16391641
Expected<MCFillFragmentRef>
1640-
MCFillFragmentRef::create(MCCASBuilder &MB, const MCFillFragment &F,
1642+
MCFillFragmentRef::create(MCCASBuilder &MB, const MCFragment &F,
16411643
unsigned FragmentSize,
16421644
ArrayRef<char> FragmentContents) {
1645+
auto *FillFrag = dyn_cast<MCFillFragment>(&F);
16431646
Expected<Builder> B = Builder::startNode(MB.Schema, KindString);
16441647
if (!B)
16451648
return B.takeError();
16461649
writeVBR8(FragmentSize, B->Data);
1647-
writeVBR8(F.getValue(), B->Data);
1648-
writeVBR8(F.getValueSize(), B->Data);
1650+
writeVBR8(FillFrag->getValue(), B->Data);
1651+
writeVBR8(FillFrag->getValueSize(), B->Data);
16491652
return get(B->build());
16501653
}
16511654

@@ -1687,7 +1690,7 @@ Expected<uint64_t> MCFillFragmentRef::materialize(MCCASReader &Reader,
16871690
}
16881691

16891692
Expected<MCLEBFragmentRef>
1690-
MCLEBFragmentRef::create(MCCASBuilder &MB, const MCLEBFragment &F,
1693+
MCLEBFragmentRef::create(MCCASBuilder &MB, const MCFragment &F,
16911694
unsigned FragmentSize,
16921695
ArrayRef<char> FragmentContents) {
16931696
Expected<Builder> B = Builder::startNode(MB.Schema, KindString);
@@ -1704,14 +1707,15 @@ Expected<uint64_t> MCLEBFragmentRef::materialize(MCCASReader &Reader,
17041707
}
17051708

17061709
Expected<MCNopsFragmentRef>
1707-
MCNopsFragmentRef::create(MCCASBuilder &MB, const MCNopsFragment &F,
1710+
MCNopsFragmentRef::create(MCCASBuilder &MB, const MCFragment &F,
17081711
unsigned FragmentSize,
17091712
ArrayRef<char> FragmentContents) {
1713+
auto *NopsFrag = dyn_cast<MCNopsFragment>(&F);
17101714
Expected<Builder> B = Builder::startNode(MB.Schema, KindString);
17111715
if (!B)
17121716
return B.takeError();
1713-
int64_t NumBytes = F.getNumBytes();
1714-
int64_t ControlledNopLength = F.getControlledNopLength();
1717+
int64_t NumBytes = NopsFrag->getNumBytes();
1718+
int64_t ControlledNopLength = NopsFrag->getControlledNopLength();
17151719
int64_t MaximumNopLength =
17161720
MB.Asm.getBackend().getMaximumNopSize(*F.getSubtargetInfo());
17171721
if (ControlledNopLength > MaximumNopLength)
@@ -1740,14 +1744,15 @@ Expected<uint64_t> MCNopsFragmentRef::materialize(MCCASReader &Reader,
17401744
}
17411745

17421746
Expected<MCOrgFragmentRef>
1743-
MCOrgFragmentRef::create(MCCASBuilder &MB, const MCOrgFragment &F,
1747+
MCOrgFragmentRef::create(MCCASBuilder &MB, const MCFragment &F,
17441748
unsigned FragmentSize,
17451749
ArrayRef<char> FragmentContents) {
1750+
auto *OrgFrag = dyn_cast<MCOrgFragment>(&F);
17461751
Expected<Builder> B = Builder::startNode(MB.Schema, KindString);
17471752
if (!B)
17481753
return B.takeError();
17491754
writeVBR8(FragmentSize, B->Data);
1750-
writeVBR8((char)F.getValue(), B->Data);
1755+
writeVBR8((char)OrgFrag->getValue(), B->Data);
17511756
return get(B->build());
17521757
}
17531758

@@ -1758,13 +1763,14 @@ Expected<uint64_t> MCOrgFragmentRef::materialize(MCCASReader &Reader,
17581763
}
17591764

17601765
Expected<MCSymbolIdFragmentRef>
1761-
MCSymbolIdFragmentRef::create(MCCASBuilder &MB, const MCSymbolIdFragment &F,
1766+
MCSymbolIdFragmentRef::create(MCCASBuilder &MB, const MCFragment &F,
17621767
unsigned FragmentSize,
17631768
ArrayRef<char> FragmentContents) {
1769+
auto *SymbolIDFrag = dyn_cast<MCSymbolIdFragment>(&F);
17641770
Expected<Builder> B = Builder::startNode(MB.Schema, KindString);
17651771
if (!B)
17661772
return B.takeError();
1767-
writeVBR8(F.getSymbol()->getIndex(), B->Data);
1773+
writeVBR8(SymbolIDFrag->getSymbol()->getIndex(), B->Data);
17681774
return get(B->build());
17691775
}
17701776

@@ -1777,7 +1783,7 @@ MCSymbolIdFragmentRef::materialize(MCCASReader &Reader,
17771783

17781784
#define MCFRAGMENT_NODE_REF(MCFragmentName, MCEnumName, MCEnumIdentifier) \
17791785
Expected<MCFragmentName##Ref> MCFragmentName##Ref::create( \
1780-
MCCASBuilder &MB, const MCFragmentName &F, unsigned FragmentSize, \
1786+
MCCASBuilder &MB, const MCFragment &F, unsigned FragmentSize, \
17811787
ArrayRef<char> FragmentContents) { \
17821788
Expected<Builder> B = Builder::startNode(MB.Schema, KindString); \
17831789
if (!B) \
@@ -1850,8 +1856,7 @@ Error MCCASBuilder::buildFragment(const MCFragment &F, unsigned Size,
18501856
switch (F.getKind()) {
18511857
#define MCFRAGMENT_NODE_REF(MCFragmentName, MCEnumName, MCEnumIdentifier) \
18521858
case MCFragment::MCEnumName: { \
1853-
const MCFragmentName &SF = cast<MCFragmentName>(F); \
1854-
auto FN = MCFragmentName##Ref::create(*this, SF, Size, FragmentContents); \
1859+
auto FN = MCFragmentName##Ref::create(*this, F, Size, FragmentContents); \
18551860
if (!FN) \
18561861
return FN.takeError(); \
18571862
addNode(*FN); \
@@ -1922,7 +1927,8 @@ Error MCDataFragmentMerger::tryMerge(const MCFragment &F, unsigned Size,
19221927

19231928
static Error writeAlignFragment(MCCASBuilder &Builder, const MCFragment &AF,
19241929
raw_ostream &OS, unsigned FragmentSize) {
1925-
uint64_t Count = FragmentSize / AF.getAlignFillLen();
1930+
OS << StringRef(AF.getContents().data(), AF.getContents().size());
1931+
uint64_t Count = (FragmentSize - AF.getFixedSize()) / AF.getAlignFillLen();
19261932
if (AF.hasAlignEmitNops()) {
19271933
if (!Builder.Asm.getBackend().writeNopData(OS, Count,
19281934
AF.getSubtargetInfo()))
@@ -2851,8 +2857,7 @@ static ArrayRef<char> getFragmentContents(const MCFragment &Fragment) {
28512857
switch (Fragment.getKind()) {
28522858
#define MCFRAGMENT_NODE_REF(MCFragmentName, MCEnumName, MCEnumIdentifier) \
28532859
case MCFragment::MCEnumName: { \
2854-
const MCFragmentName &SF = cast<MCFragmentName>(Fragment); \
2855-
return SF.getContents(); \
2860+
return Fragment.getContents(); \
28562861
}
28572862
#define MCFRAGMENT_ENCODED_FRAGMENT_ONLY
28582863
#include "llvm/MCCAS/MCCASObjectV1.def"

0 commit comments

Comments
 (0)