Skip to content

Commit ad651ff

Browse files
Fix FT_Align creation and materialization for Nops
1 parent e2422be commit ad651ff

File tree

1 file changed

+16
-10
lines changed

1 file changed

+16
-10
lines changed

llvm/lib/MCCAS/MCCASObjectV1.cpp

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1543,15 +1543,17 @@ MCAlignFragmentRef::create(MCCASBuilder &MB, const MCFragment &F,
15431543
B->Data.append(FragmentContents.begin(), FragmentContents.end());
15441544
uint64_t Count = (FragmentSize - F.getFixedSize()) / F.getAlignFillLen();
15451545
if (F.hasAlignEmitNops()) {
1546-
// Write 0 as size and use backend to emit nop.
1547-
writeVBR8(0, B->Data);
1546+
// Write 1 to signify that it has nops.
1547+
writeVBR8(1, B->Data);
15481548
if (!MB.Asm.getBackend().writeNopData(MB.FragmentOS, Count,
15491549
F.getSubtargetInfo()))
15501550
report_fatal_error("unable to write nop sequence of " + Twine(Count) +
15511551
" bytes");
15521552
B->Data.append(MB.FragmentData);
15531553
return get(B->build());
15541554
}
1555+
// Write 0 to signify that it has nops.
1556+
writeVBR8(0, B->Data);
15551557
writeVBR8(Count, B->Data);
15561558
writeVBR8(F.getAlignFill(), B->Data);
15571559
writeVBR8(F.getAlignFillLen(), B->Data);
@@ -1561,7 +1563,7 @@ MCAlignFragmentRef::create(MCCASBuilder &MB, const MCFragment &F,
15611563
Expected<uint64_t> MCAlignFragmentRef::materialize(MCCASReader &Reader,
15621564
raw_ostream *Stream) const
15631565
{
1564-
uint64_t Count, FragContentSize;
1566+
uint64_t Count, FragContentSize, HasNops;
15651567
auto Remaining = getData();
15661568
auto Endian = Reader.getEndian();
15671569
if (auto E = consumeVBR8(Remaining, FragContentSize))
@@ -1571,14 +1573,18 @@ Expected<uint64_t> MCAlignFragmentRef::materialize(MCCASReader &Reader,
15711573

15721574
Remaining = Remaining.drop_front(FragContentSize);
15731575

1574-
if (auto E = consumeVBR8(Remaining, Count))
1576+
if (auto E = consumeVBR8(Remaining, HasNops))
15751577
return std::move(E);
15761578

15771579
// hasEmitNops.
1578-
if (!Count) {
1580+
if (HasNops) {
15791581
*Stream << Remaining;
15801582
return Remaining.size() + FragContentSize;
15811583
}
1584+
1585+
if (auto E = consumeVBR8(Remaining, Count))
1586+
return std::move(E);
1587+
15821588
int64_t Value;
15831589
unsigned ValueSize;
15841590
if (auto E = consumeVBR8(Remaining, Value))
@@ -2871,7 +2877,6 @@ static void getFragmentContents(const MCFragment &Fragment,
28712877
Fragment.getContents().end()); \
28722878
FragContents.append(Fragment.getVarContents().begin(), \
28732879
Fragment.getVarContents().end()); \
2874-
\
28752880
return; \
28762881
}
28772882
#define MCFRAGMENT_ENCODED_FRAGMENT_ONLY
@@ -2880,13 +2885,14 @@ static void getFragmentContents(const MCFragment &Fragment,
28802885
const MCCVInlineLineTableFragment &SF =
28812886
cast<MCCVInlineLineTableFragment>(Fragment);
28822887
FragContents.append(SF.getContents().begin(), SF.getContents().end());
2888+
FragContents.append(SF.getVarContents().begin(), SF.getVarContents().end());
28832889
return;
28842890
}
28852891
case MCFragment::FT_LEB: {
2886-
auto FixedContent = Fragment.getContents();
2887-
auto VarContent = Fragment.getVarContents();
2888-
FragContents.append(FixedContent.begin(), FixedContent.end());
2889-
FragContents.append(VarContent.begin(), VarContent.end());
2892+
FragContents.append(Fragment.getContents().begin(),
2893+
Fragment.getContents().end());
2894+
FragContents.append(Fragment.getVarContents().begin(),
2895+
Fragment.getVarContents().end());
28902896
return;
28912897
}
28922898
case MCFragment::FT_Align: {

0 commit comments

Comments
 (0)