@@ -42,16 +42,6 @@ using namespace CodeGen;
4242namespace {
4343class ConstExprEmitter ;
4444
45- llvm::Constant *getPadding (const CodeGenModule &CGM, CharUnits PadSize) {
46- llvm::Type *Ty = CGM.CharTy ;
47- if (PadSize > CharUnits::One ())
48- Ty = llvm::ArrayType::get (Ty, PadSize.getQuantity ());
49- if (CGM.shouldZeroInitPadding ()) {
50- return llvm::Constant::getNullValue (Ty);
51- }
52- return llvm::UndefValue::get (Ty);
53- }
54-
5545struct ConstantAggregateBuilderUtils {
5646 CodeGenModule &CGM;
5747
@@ -71,7 +61,10 @@ struct ConstantAggregateBuilderUtils {
7161 }
7262
7363 llvm::Constant *getPadding (CharUnits PadSize) const {
74- return ::getPadding (CGM, PadSize);
64+ llvm::Type *Ty = CGM.CharTy ;
65+ if (PadSize > CharUnits::One ())
66+ Ty = llvm::ArrayType::get (Ty, PadSize.getQuantity ());
67+ return llvm::UndefValue::get (Ty);
7568 }
7669
7770 llvm::Constant *getZeroes (CharUnits ZeroSize) const {
@@ -598,11 +591,6 @@ class ConstStructBuilder {
598591 bool Build (const InitListExpr *ILE, bool AllowOverwrite);
599592 bool Build (const APValue &Val, const RecordDecl *RD, bool IsPrimaryBase,
600593 const CXXRecordDecl *VTableClass, CharUnits BaseOffset);
601- bool DoZeroInitPadding (const ASTRecordLayout &Layout, unsigned FieldNo,
602- const FieldDecl &Field, bool AllowOverwrite,
603- CharUnits &FieldSize, CharUnits &SizeSoFar);
604- bool DoZeroInitPadding (const ASTRecordLayout &Layout, bool AllowOverwrite,
605- CharUnits &SizeSoFar);
606594 llvm::Constant *Finalize (QualType Ty);
607595};
608596
@@ -727,10 +715,6 @@ bool ConstStructBuilder::Build(const InitListExpr *ILE, bool AllowOverwrite) {
727715 if (CXXRD->getNumBases ())
728716 return false ;
729717
730- const bool ZeroInitPadding = CGM.shouldZeroInitPadding ();
731- CharUnits FieldSize = CharUnits::Zero ();
732- CharUnits SizeSoFar = CharUnits::Zero ();
733-
734718 for (FieldDecl *Field : RD->fields ()) {
735719 ++FieldNo;
736720
@@ -748,13 +732,8 @@ bool ConstStructBuilder::Build(const InitListExpr *ILE, bool AllowOverwrite) {
748732 const Expr *Init = nullptr ;
749733 if (ElementNo < ILE->getNumInits ())
750734 Init = ILE->getInit (ElementNo++);
751- if (isa_and_nonnull<NoInitExpr>(Init)) {
752- if (ZeroInitPadding &&
753- !DoZeroInitPadding (Layout, FieldNo, *Field, AllowOverwrite, FieldSize,
754- SizeSoFar))
755- return false ;
735+ if (isa_and_nonnull<NoInitExpr>(Init))
756736 continue ;
757- }
758737
759738 // Zero-sized fields are not emitted, but their initializers may still
760739 // prevent emission of this struct as a constant.
@@ -764,11 +743,6 @@ bool ConstStructBuilder::Build(const InitListExpr *ILE, bool AllowOverwrite) {
764743 continue ;
765744 }
766745
767- if (ZeroInitPadding &&
768- !DoZeroInitPadding (Layout, FieldNo, *Field, AllowOverwrite, FieldSize,
769- SizeSoFar))
770- return false ;
771-
772746 // When emitting a DesignatedInitUpdateExpr, a nested InitListExpr
773747 // represents additional overwriting of our current constant value, and not
774748 // a new constant to emit independently.
@@ -794,10 +768,6 @@ bool ConstStructBuilder::Build(const InitListExpr *ILE, bool AllowOverwrite) {
794768 if (!EltInit)
795769 return false ;
796770
797- if (ZeroInitPadding && FieldSize.isZero ())
798- SizeSoFar += CharUnits::fromQuantity (
799- CGM.getDataLayout ().getTypeAllocSize (EltInit->getType ()));
800-
801771 if (!Field->isBitField ()) {
802772 // Handle non-bitfield members.
803773 if (!AppendField (Field, Layout.getFieldOffset (FieldNo), EltInit,
@@ -815,9 +785,6 @@ bool ConstStructBuilder::Build(const InitListExpr *ILE, bool AllowOverwrite) {
815785 }
816786 }
817787
818- if (ZeroInitPadding && !DoZeroInitPadding (Layout, AllowOverwrite, SizeSoFar))
819- return false ;
820-
821788 return true ;
822789}
823790
@@ -882,9 +849,6 @@ bool ConstStructBuilder::Build(const APValue &Val, const RecordDecl *RD,
882849
883850 unsigned FieldNo = 0 ;
884851 uint64_t OffsetBits = CGM.getContext ().toBits (Offset);
885- const bool ZeroInitPadding = CGM.shouldZeroInitPadding ();
886- CharUnits FieldSize = CharUnits::Zero ();
887- CharUnits SizeSoFar = CharUnits::Zero ();
888852
889853 bool AllowOverwrite = false ;
890854 for (RecordDecl::field_iterator Field = RD->field_begin (),
@@ -906,15 +870,6 @@ bool ConstStructBuilder::Build(const APValue &Val, const RecordDecl *RD,
906870 if (!EltInit)
907871 return false ;
908872
909- if (ZeroInitPadding) {
910- if (!DoZeroInitPadding (Layout, FieldNo, **Field, AllowOverwrite,
911- FieldSize, SizeSoFar))
912- return false ;
913- if (FieldSize.isZero ())
914- SizeSoFar += CharUnits::fromQuantity (
915- CGM.getDataLayout ().getTypeAllocSize (EltInit->getType ()));
916- }
917-
918873 if (!Field->isBitField ()) {
919874 // Handle non-bitfield members.
920875 if (!AppendField (*Field, Layout.getFieldOffset (FieldNo) + OffsetBits,
@@ -931,35 +886,7 @@ bool ConstStructBuilder::Build(const APValue &Val, const RecordDecl *RD,
931886 return false ;
932887 }
933888 }
934- if (ZeroInitPadding && !DoZeroInitPadding (Layout, AllowOverwrite, SizeSoFar))
935- return false ;
936-
937- return true ;
938- }
939889
940- bool ConstStructBuilder::DoZeroInitPadding (
941- const ASTRecordLayout &Layout, unsigned FieldNo, const FieldDecl &Field,
942- bool AllowOverwrite, CharUnits &FieldSize, CharUnits &SizeSoFar) {
943- CharUnits Offset =
944- CGM.getContext ().toCharUnitsFromBits (Layout.getFieldOffset (FieldNo));
945- if (SizeSoFar < Offset)
946- if (!AppendBytes (SizeSoFar, getPadding (CGM, Offset - SizeSoFar),
947- AllowOverwrite))
948- return false ;
949- FieldSize = CGM.getContext ().getTypeSizeInChars (Field.getType ());
950- SizeSoFar = Offset + FieldSize;
951- return true ;
952- }
953-
954- bool ConstStructBuilder::DoZeroInitPadding (const ASTRecordLayout &Layout,
955- bool AllowOverwrite,
956- CharUnits &SizeSoFar) {
957- CharUnits TotalSize = Layout.getSize ();
958- if (SizeSoFar < TotalSize)
959- if (!AppendBytes (SizeSoFar, getPadding (CGM, TotalSize - SizeSoFar),
960- AllowOverwrite))
961- return false ;
962- SizeSoFar = TotalSize;
963890 return true ;
964891}
965892
@@ -1200,10 +1127,12 @@ class ConstExprEmitter
12001127
12011128 assert (CurSize <= TotalSize && " Union size mismatch!" );
12021129 if (unsigned NumPadBytes = TotalSize - CurSize) {
1203- llvm::Constant *Padding =
1204- getPadding (CGM, CharUnits::fromQuantity (NumPadBytes));
1205- Elts.push_back (Padding);
1206- Types.push_back (Padding->getType ());
1130+ llvm::Type *Ty = CGM.CharTy ;
1131+ if (NumPadBytes > 1 )
1132+ Ty = llvm::ArrayType::get (Ty, NumPadBytes);
1133+
1134+ Elts.push_back (llvm::UndefValue::get (Ty));
1135+ Types.push_back (Ty);
12071136 }
12081137
12091138 llvm::StructType *STy = llvm::StructType::get (VMContext, Types, false );
0 commit comments