[PATCH] D113809: [MachO] Fix struct size assertion

Shoaib Meenai via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Nov 22 14:26:21 PST 2021


smeenai added a comment.

In D113809#3147417 <https://reviews.llvm.org/D113809#3147417>, @kevcadieux wrote:

> We are also seeing this in our internal Windows builds. As can be seen below, the size difference in debug is due to the `std::vector<lld::macho::Reloc>` member, which is actually due to the `_Vector_val` internal vector member that uses a different base class in debug mode (`std::_Container_base12` instead of `std::_Container_base0`). Could we simply turn off this static assert for debug builds (e.g. with #ifdef NDEBUG)?
>
> Class layout of ConcatInputSection x64 debug:
>
>   class lld::macho::ConcatInputSection	size(128):
>   	+---
>    0	| +--- (base class lld::macho::InputSection)
>    0	| | {vfptr}
>    8	| | parent
>   16	| | align
>   20.	| | callSiteCount (bitstart=0,nbits=31)
>   20.	| | isFinal (bitstart=31,nbits=1)
>   24	| | ?$ArrayRef at E data
>   40	| | ?$vector at UReloc@macho at lld@@V?$allocator at UReloc@macho at lld@@@std@@ relocs
>   72	| | ?$TinyPtrVector at PEAVDefined@macho at lld@@ symbols
>   80	| | shared
>   	| +---
>   88	| replacement
>   96	| icfEqClass
>   112	| wasCoalesced
>   113	| live
>     	| <alignment member> (size=6)
>   120	| outSecOff
>   	+---
>   
>   class std::vector<struct lld::macho::Reloc,class std::allocator<struct lld::macho::Reloc> >	size(32):
>   	+---
>    0	| ?$_Compressed_pair at V?$allocator at UReloc@macho at lld@@@std@@V?$_Vector_val at U?$_Simple_types at UReloc@macho at lld@@@std@@@2@$00 _Mypair
>   	+---
>   
>   class std::_Compressed_pair<class std::allocator<struct lld::macho::Reloc>,class std::_Vector_val<struct std::_Simple_types<struct lld::macho::Reloc> >,1>	size(32):
>   	+---
>    0	| +--- (base class std::allocator<struct lld::macho::Reloc>)
>   	| +---
>    0	| ?$_Vector_val at U?$_Simple_types at UReloc@macho at lld@@@std@@ _Myval2
>   	+---
>   class std::_Vector_val<struct std::_Simple_types<struct lld::macho::Reloc> >	size(32):
>   	+---
>    0	| +--- (base class std::_Container_base12)
>    0	| | _Myproxy
>   	| +---
>    8	| _Myfirst
>   16	| _Mylast
>   24	| _Myend
>   	+---
>
> The same layout for x64 release:
>
>   class lld::macho::ConcatInputSection	size(120):
>   	+---
>    0	| +--- (base class lld::macho::InputSection)
>    0	| | {vfptr}
>    8	| | parent
>   16	| | align
>   20.	| | callSiteCount (bitstart=0,nbits=31)
>   20.	| | isFinal (bitstart=31,nbits=1)
>   24	| | ?$ArrayRef at E data
>   40	| | ?$vector at UReloc@macho at lld@@V?$allocator at UReloc@macho at lld@@@std@@ relocs
>   64	| | ?$TinyPtrVector at PEAVDefined@macho at lld@@ symbols
>   72	| | shared
>   	| +---
>   80	| replacement
>   88	| icfEqClass
>   104	| wasCoalesced
>   105	| live
>     	| <alignment member> (size=6)
>   112	| outSecOff
>   	+---
>   	
>   class std::vector<struct lld::macho::Reloc,class std::allocator<struct lld::macho::Reloc> >	size(24):
>   	+---
>    0	| ?$_Compressed_pair at V?$allocator at UReloc@macho at lld@@@std@@V?$_Vector_val at U?$_Simple_types at UReloc@macho at lld@@@std@@@2@$00 _Mypair
>   	+---
>   	
>   class std::_Compressed_pair<class std::allocator<struct lld::macho::Reloc>,class std::_Vector_val<struct std::_Simple_types<struct lld::macho::Reloc> >,1>	size(24):
>   	+---
>    0	| +--- (base class std::allocator<struct lld::macho::Reloc>)
>   	| +---
>    0	| ?$_Vector_val at U?$_Simple_types at UReloc@macho at lld@@@std@@ _Myval2
>   	+---
>   	
>   class std::_Vector_val<struct std::_Simple_types<struct lld::macho::Reloc> >	size(24):
>   	+---
>    0	| +--- (base class std::_Container_base0)
>   	| +---
>    0	| _Myfirst
>    8	| _Mylast
>   16	| _Myend
>   	+---

Ah, that makes sense. I'll put up a fix.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D113809/new/

https://reviews.llvm.org/D113809



More information about the llvm-commits mailing list