[PATCH] D133570: [Clang] changing behavior of constant array emission[AsmPrinter] changing Size from unsigned to uint64_t

Ofek Shochat via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Sep 9 05:38:54 PDT 2022


OfekShochat created this revision.
Herald added a subscriber: hiraditya.
Herald added a project: All.
OfekShochat requested review of this revision.
Herald added projects: clang, LLVM.
Herald added subscribers: llvm-commits, cfe-commits.

fixes issue with emitting partially initialized constant arrays larger than 2^32.
issue #57353 on github.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D133570

Files:
  clang/lib/CodeGen/CGExprConstant.cpp
  llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp


Index: llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
===================================================================
--- llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
+++ llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
@@ -3164,7 +3164,7 @@
                                      const Constant *BaseCV, uint64_t Offset,
                                      AsmPrinter::AliasMapTy *AliasList) {
   // Print the fields in successive locations. Pad to align if needed!
-  unsigned Size = DL.getTypeAllocSize(CS->getType());
+  uint64_t Size = DL.getTypeAllocSize(CS->getType());
   const StructLayout *Layout = DL.getStructLayout(CS->getType());
   uint64_t SizeSoFar = 0;
   for (unsigned I = 0, E = CS->getNumOperands(); I != E; ++I) {
Index: clang/lib/CodeGen/CGExprConstant.cpp
===================================================================
--- clang/lib/CodeGen/CGExprConstant.cpp
+++ clang/lib/CodeGen/CGExprConstant.cpp
@@ -1222,29 +1222,18 @@
   llvm::Constant *EmitArrayInitialization(InitListExpr *ILE, QualType T) {
     auto *CAT = CGM.getContext().getAsConstantArrayType(ILE->getType());
     assert(CAT && "can't emit array init for non-constant-bound array");
-    unsigned NumInitElements = ILE->getNumInits();
-    unsigned NumElements = CAT->getSize().getZExtValue();
+    uint64_t NumInitElements = ILE->getNumInits();
+    uint64_t NumElements = CAT->getSize().getZExtValue();
+    printf("hi\n");
 
     // Initialising an array requires us to automatically
     // initialise any elements that have not been initialised explicitly
-    unsigned NumInitableElts = std::min(NumInitElements, NumElements);
+    uint64_t NumInitableElts = std::min(NumInitElements, NumElements);
 
     QualType EltType = CAT->getElementType();
 
-    // Initialize remaining array elements.
-    llvm::Constant *fillC = nullptr;
-    if (Expr *filler = ILE->getArrayFiller()) {
-      fillC = Emitter.tryEmitAbstractForMemory(filler, EltType);
-      if (!fillC)
-        return nullptr;
-    }
-
-    // Copy initializer elements.
-    SmallVector<llvm::Constant*, 16> Elts;
-    if (fillC && fillC->isNullValue())
-      Elts.reserve(NumInitableElts + 1);
-    else
-      Elts.reserve(NumElements);
+    SmallVector<llvm::Constant *, 16> Inits;
+    Inits.reserve(NumInitableElts + 1);
 
     llvm::Type *CommonElementType = nullptr;
     for (unsigned i = 0; i < NumInitableElts; ++i) {
@@ -1256,13 +1245,33 @@
         CommonElementType = C->getType();
       else if (C->getType() != CommonElementType)
         CommonElementType = nullptr;
-      Elts.push_back(C);
+      Inits.push_back(C);
     }
 
-    llvm::ArrayType *Desired =
+    uint64_t TrailingZeroes = NumElements - NumInitElements;
+
+    // If all elements have the same type, just emit an array constant.
+    if (CommonElementType && TrailingZeroes == 0)
+      return llvm::ConstantArray::get(
+          llvm::ArrayType::get(CommonElementType, NumElements), Inits);
+
+    llvm::ArrayType *DesiredType =
         cast<llvm::ArrayType>(CGM.getTypes().ConvertType(ILE->getType()));
-    return EmitArrayConstant(CGM, Desired, CommonElementType, NumElements, Elts,
-                             fillC);
+
+    auto *FillerType =
+        CommonElementType ? CommonElementType : DesiredType->getElementType();
+    FillerType = llvm::ArrayType::get(FillerType, TrailingZeroes);
+    
+    Inits.push_back(llvm::ConstantAggregateZero::get(FillerType));
+
+    llvm::SmallVector<llvm::Type *, 16> Types;
+    for (llvm::Constant *Elt : Inits)
+      Types.push_back(Elt->getType());
+
+    llvm::StructType *SType =
+        llvm::StructType::get(CGM.getLLVMContext(), Types, true);
+
+    return llvm::ConstantStruct::get(SType, Inits);
   }
 
   llvm::Constant *EmitRecordInitialization(InitListExpr *ILE, QualType T) {


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D133570.459022.patch
Type: text/x-patch
Size: 3790 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220909/754253ea/attachment.bin>


More information about the llvm-commits mailing list