Skip to content

Commit

Permalink
[release/9.0-preview1] [NativeAOT] ObjWriter: Fix over-alignment of .…
Browse files Browse the repository at this point in the history
…eh_frame entries (#97457)

* Fix over-alignment of .eh_frame entries

* PR feedback

---------

Co-authored-by: Filip Navara <[email protected]>
  • Loading branch information
github-actions[bot] and filipnavara authored Jan 24, 2024
1 parent 37828ce commit b4aa81d
Showing 1 changed file with 10 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,11 @@ public void AddFde(in DwarfFde fde)
WriteFde(fde, cieOffset);
}

private static uint PaddingSize(uint length, uint alignment)
{
return ((length + alignment - 1u) & ~(alignment - 1u)) - length;
}

private void WriteCie(DwarfCie cie)
{
Utf8StringBuilder augmentationString = new Utf8StringBuilder();
Expand Down Expand Up @@ -82,7 +87,7 @@ private void WriteCie(DwarfCie cie)
DwarfHelper.SizeOfULEB128(cie.ReturnAddressRegister) +
(uint)(augmentationLength > 0 ? DwarfHelper.SizeOfULEB128(augmentationLength) + augmentationLength : 0) +
(uint)cie.Instructions.Length;
uint padding = ((length + 7u) & ~7u) - length;
uint padding = PaddingSize(length, AddressSize(cie.PointerEncoding));

_sectionWriter.WriteLittleEndian<uint>(length + padding - 4u);
_sectionWriter.WriteLittleEndian<uint>(0);
Expand Down Expand Up @@ -122,14 +127,15 @@ private void WriteFde(in DwarfFde fde, uint cieOffset)
(fde.Cie.PersonalityEncoding != 0 ? AddressSize(fde.Cie.PersonalityEncoding) : 0) +
(fde.Cie.LsdaEncoding != 0 ? AddressSize(fde.Cie.LsdaEncoding) : 0) : 0;

uint pointerEncodingSize = AddressSize(fde.Cie.PointerEncoding);
uint length =
4u + // Length
4u + // CIE offset
AddressSize(fde.Cie.PointerEncoding) + // PC start
AddressSize(fde.Cie.PointerEncoding) + // PC end
pointerEncodingSize + // PC start
pointerEncodingSize + // PC end
augmentationLength +
(uint)fde.Instructions.Length;
uint padding = ((length + 7u) & ~7u) - length;
uint padding = PaddingSize(length, pointerEncodingSize);

_sectionWriter.WriteLittleEndian<uint>(length + padding - 4u);
_sectionWriter.WriteLittleEndian<uint>((uint)(_sectionWriter.Position - cieOffset));
Expand Down

0 comments on commit b4aa81d

Please sign in to comment.