diff --git a/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/ObjectWriter/Dwarf/DwarfEhFrame.cs b/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/ObjectWriter/Dwarf/DwarfEhFrame.cs index d0e147b28eb0d4..1705a10dd1ab15 100644 --- a/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/ObjectWriter/Dwarf/DwarfEhFrame.cs +++ b/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/ObjectWriter/Dwarf/DwarfEhFrame.cs @@ -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(); @@ -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(length + padding - 4u); _sectionWriter.WriteLittleEndian(0); @@ -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(length + padding - 4u); _sectionWriter.WriteLittleEndian((uint)(_sectionWriter.Position - cieOffset));