aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/CodeGen/CGExprConstant.cpp
diff options
context:
space:
mode:
authorEli Friedman <efriedma@quicinc.com>2024-09-24 20:31:54 -0700
committerGitHub <noreply@github.com>2024-09-24 20:31:54 -0700
commitd50eaac12f0cdfe27e942290942b06889ab12a8c (patch)
tree81cbcd78259adfe621a638f8fc4ce6259ebb0046 /clang/lib/CodeGen/CGExprConstant.cpp
parent18b9d49ce3370c012fdd04ec87d854d53293f6a6 (diff)
downloadllvm-d50eaac12f0cdfe27e942290942b06889ab12a8c.zip
llvm-d50eaac12f0cdfe27e942290942b06889ab12a8c.tar.gz
llvm-d50eaac12f0cdfe27e942290942b06889ab12a8c.tar.bz2
Revert "[clang][CodeGen] Zero init unspecified fields in initializers in C" (#109898)
Reverts llvm/llvm-project#97121 Causing failures on LNT bots; log shows a crash in ConstStructBuilder::BuildStruct.
Diffstat (limited to 'clang/lib/CodeGen/CGExprConstant.cpp')
-rw-r--r--clang/lib/CodeGen/CGExprConstant.cpp93
1 files changed, 11 insertions, 82 deletions
diff --git a/clang/lib/CodeGen/CGExprConstant.cpp b/clang/lib/CodeGen/CGExprConstant.cpp
index 66bc064..dd65080 100644
--- a/clang/lib/CodeGen/CGExprConstant.cpp
+++ b/clang/lib/CodeGen/CGExprConstant.cpp
@@ -42,16 +42,6 @@ using namespace CodeGen;
namespace {
class ConstExprEmitter;
-llvm::Constant *getPadding(const CodeGenModule &CGM, CharUnits PadSize) {
- llvm::Type *Ty = CGM.CharTy;
- if (PadSize > CharUnits::One())
- Ty = llvm::ArrayType::get(Ty, PadSize.getQuantity());
- if (CGM.shouldZeroInitPadding()) {
- return llvm::Constant::getNullValue(Ty);
- }
- return llvm::UndefValue::get(Ty);
-}
-
struct ConstantAggregateBuilderUtils {
CodeGenModule &CGM;
@@ -71,7 +61,10 @@ struct ConstantAggregateBuilderUtils {
}
llvm::Constant *getPadding(CharUnits PadSize) const {
- return ::getPadding(CGM, PadSize);
+ llvm::Type *Ty = CGM.CharTy;
+ if (PadSize > CharUnits::One())
+ Ty = llvm::ArrayType::get(Ty, PadSize.getQuantity());
+ return llvm::UndefValue::get(Ty);
}
llvm::Constant *getZeroes(CharUnits ZeroSize) const {
@@ -598,11 +591,6 @@ private:
bool Build(const InitListExpr *ILE, bool AllowOverwrite);
bool Build(const APValue &Val, const RecordDecl *RD, bool IsPrimaryBase,
const CXXRecordDecl *VTableClass, CharUnits BaseOffset);
- bool DoZeroInitPadding(const ASTRecordLayout &Layout, unsigned FieldNo,
- const FieldDecl &Field, bool AllowOverwrite,
- CharUnits &FieldSize, CharUnits &SizeSoFar);
- bool DoZeroInitPadding(const ASTRecordLayout &Layout, bool AllowOverwrite,
- CharUnits &SizeSoFar);
llvm::Constant *Finalize(QualType Ty);
};
@@ -727,10 +715,6 @@ bool ConstStructBuilder::Build(const InitListExpr *ILE, bool AllowOverwrite) {
if (CXXRD->getNumBases())
return false;
- const bool ZeroInitPadding = CGM.shouldZeroInitPadding();
- CharUnits FieldSize = CharUnits::Zero();
- CharUnits SizeSoFar = CharUnits::Zero();
-
for (FieldDecl *Field : RD->fields()) {
++FieldNo;
@@ -748,13 +732,8 @@ bool ConstStructBuilder::Build(const InitListExpr *ILE, bool AllowOverwrite) {
const Expr *Init = nullptr;
if (ElementNo < ILE->getNumInits())
Init = ILE->getInit(ElementNo++);
- if (isa_and_nonnull<NoInitExpr>(Init)) {
- if (ZeroInitPadding &&
- !DoZeroInitPadding(Layout, FieldNo, *Field, AllowOverwrite, FieldSize,
- SizeSoFar))
- return false;
+ if (isa_and_nonnull<NoInitExpr>(Init))
continue;
- }
// Zero-sized fields are not emitted, but their initializers may still
// prevent emission of this struct as a constant.
@@ -764,11 +743,6 @@ bool ConstStructBuilder::Build(const InitListExpr *ILE, bool AllowOverwrite) {
continue;
}
- if (ZeroInitPadding &&
- !DoZeroInitPadding(Layout, FieldNo, *Field, AllowOverwrite, FieldSize,
- SizeSoFar))
- return false;
-
// When emitting a DesignatedInitUpdateExpr, a nested InitListExpr
// represents additional overwriting of our current constant value, and not
// a new constant to emit independently.
@@ -794,10 +768,6 @@ bool ConstStructBuilder::Build(const InitListExpr *ILE, bool AllowOverwrite) {
if (!EltInit)
return false;
- if (ZeroInitPadding && FieldSize.isZero())
- SizeSoFar += CharUnits::fromQuantity(
- CGM.getDataLayout().getTypeAllocSize(EltInit->getType()));
-
if (!Field->isBitField()) {
// Handle non-bitfield members.
if (!AppendField(Field, Layout.getFieldOffset(FieldNo), EltInit,
@@ -815,9 +785,6 @@ bool ConstStructBuilder::Build(const InitListExpr *ILE, bool AllowOverwrite) {
}
}
- if (ZeroInitPadding && !DoZeroInitPadding(Layout, AllowOverwrite, SizeSoFar))
- return false;
-
return true;
}
@@ -882,9 +849,6 @@ bool ConstStructBuilder::Build(const APValue &Val, const RecordDecl *RD,
unsigned FieldNo = 0;
uint64_t OffsetBits = CGM.getContext().toBits(Offset);
- const bool ZeroInitPadding = CGM.shouldZeroInitPadding();
- CharUnits FieldSize = CharUnits::Zero();
- CharUnits SizeSoFar = CharUnits::Zero();
bool AllowOverwrite = false;
for (RecordDecl::field_iterator Field = RD->field_begin(),
@@ -906,15 +870,6 @@ bool ConstStructBuilder::Build(const APValue &Val, const RecordDecl *RD,
if (!EltInit)
return false;
- if (ZeroInitPadding) {
- if (!DoZeroInitPadding(Layout, FieldNo, **Field, AllowOverwrite,
- FieldSize, SizeSoFar))
- return false;
- if (FieldSize.isZero())
- SizeSoFar += CharUnits::fromQuantity(
- CGM.getDataLayout().getTypeAllocSize(EltInit->getType()));
- }
-
if (!Field->isBitField()) {
// Handle non-bitfield members.
if (!AppendField(*Field, Layout.getFieldOffset(FieldNo) + OffsetBits,
@@ -931,35 +886,7 @@ bool ConstStructBuilder::Build(const APValue &Val, const RecordDecl *RD,
return false;
}
}
- if (ZeroInitPadding && !DoZeroInitPadding(Layout, AllowOverwrite, SizeSoFar))
- return false;
-
- return true;
-}
-bool ConstStructBuilder::DoZeroInitPadding(
- const ASTRecordLayout &Layout, unsigned FieldNo, const FieldDecl &Field,
- bool AllowOverwrite, CharUnits &FieldSize, CharUnits &SizeSoFar) {
- CharUnits Offset =
- CGM.getContext().toCharUnitsFromBits(Layout.getFieldOffset(FieldNo));
- if (SizeSoFar < Offset)
- if (!AppendBytes(SizeSoFar, getPadding(CGM, Offset - SizeSoFar),
- AllowOverwrite))
- return false;
- FieldSize = CGM.getContext().getTypeSizeInChars(Field.getType());
- SizeSoFar = Offset + FieldSize;
- return true;
-}
-
-bool ConstStructBuilder::DoZeroInitPadding(const ASTRecordLayout &Layout,
- bool AllowOverwrite,
- CharUnits &SizeSoFar) {
- CharUnits TotalSize = Layout.getSize();
- if (SizeSoFar < TotalSize)
- if (!AppendBytes(SizeSoFar, getPadding(CGM, TotalSize - SizeSoFar),
- AllowOverwrite))
- return false;
- SizeSoFar = TotalSize;
return true;
}
@@ -1200,10 +1127,12 @@ public:
assert(CurSize <= TotalSize && "Union size mismatch!");
if (unsigned NumPadBytes = TotalSize - CurSize) {
- llvm::Constant *Padding =
- getPadding(CGM, CharUnits::fromQuantity(NumPadBytes));
- Elts.push_back(Padding);
- Types.push_back(Padding->getType());
+ llvm::Type *Ty = CGM.CharTy;
+ if (NumPadBytes > 1)
+ Ty = llvm::ArrayType::get(Ty, NumPadBytes);
+
+ Elts.push_back(llvm::UndefValue::get(Ty));
+ Types.push_back(Ty);
}
llvm::StructType *STy = llvm::StructType::get(VMContext, Types, false);