https://github.com/pzzp updated https://github.com/llvm/llvm-project/pull/126481
>From aa4338d8d5809fdb91620e48619634fcf4403a4c Mon Sep 17 00:00:00 2001 From: zhoupeng12 <zhoupen...@baidu.com> Date: Mon, 30 Oct 2023 18:13:07 +0800 Subject: [PATCH] [llvm:ir] Add support for constant data exceeding 4GiB --- clang/lib/CodeGen/CGExprConstant.cpp | 8 ++++---- llvm/include/llvm/IR/Constants.h | 2 +- llvm/lib/Bitcode/Writer/BitcodeWriter.cpp | 6 +++--- llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp | 6 +++--- llvm/lib/IR/Constants.cpp | 5 ++--- llvm/lib/Target/X86/X86MCInstLower.cpp | 2 +- 6 files changed, 14 insertions(+), 15 deletions(-) diff --git a/clang/lib/CodeGen/CGExprConstant.cpp b/clang/lib/CodeGen/CGExprConstant.cpp index ef11798869d3b13..b0ff6fae65f1641 100644 --- a/clang/lib/CodeGen/CGExprConstant.cpp +++ b/clang/lib/CodeGen/CGExprConstant.cpp @@ -364,14 +364,14 @@ bool ConstantAggregateBuilder::split(size_t Index, CharUnits Hint) { // FIXME: If possible, split into two ConstantDataSequentials at Hint. CharUnits ElemSize = getSize(CDS->getElementType()); replace(Elems, Index, Index + 1, - llvm::map_range(llvm::seq(0u, CDS->getNumElements()), - [&](unsigned Elem) { + llvm::map_range(llvm::seq(uint64_t(0u), CDS->getNumElements()), + [&](uint64_t Elem) { return CDS->getElementAsConstant(Elem); })); replace(Offsets, Index, Index + 1, llvm::map_range( - llvm::seq(0u, CDS->getNumElements()), - [&](unsigned Elem) { return Offset + Elem * ElemSize; })); + llvm::seq(uint64_t(0u), CDS->getNumElements()), + [&](uint64_t Elem) { return Offset + Elem * ElemSize; })); return true; } diff --git a/llvm/include/llvm/IR/Constants.h b/llvm/include/llvm/IR/Constants.h index 15b90589b7e2b55..d2ca214e781ee04 100644 --- a/llvm/include/llvm/IR/Constants.h +++ b/llvm/include/llvm/IR/Constants.h @@ -644,7 +644,7 @@ class ConstantDataSequential : public ConstantData { Type *getElementType() const; /// Return the number of elements in the array or vector. - unsigned getNumElements() const; + uint64_t getNumElements() const; /// Return the size (in bytes) of each element in the array/vector. /// The size of the elements is known to be a multiple of one byte. diff --git a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp index 7ca63c2c7251ded..f8968116dcc5319 100644 --- a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp +++ b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp @@ -2773,7 +2773,7 @@ void ModuleBitcodeWriter::writeConstants(unsigned FirstVal, unsigned LastVal, cast<ConstantDataSequential>(C)->isString()) { const ConstantDataSequential *Str = cast<ConstantDataSequential>(C); // Emit constant strings specially. - unsigned NumElts = Str->getNumElements(); + uint64_t NumElts = Str->getNumElements(); // If this is a null-terminated string, use the denser CSTRING encoding. if (Str->isCString()) { Code = bitc::CST_CODE_CSTRING; @@ -2801,10 +2801,10 @@ void ModuleBitcodeWriter::writeConstants(unsigned FirstVal, unsigned LastVal, Code = bitc::CST_CODE_DATA; Type *EltTy = CDS->getElementType(); if (isa<IntegerType>(EltTy)) { - for (unsigned i = 0, e = CDS->getNumElements(); i != e; ++i) + for (uint64_t i = 0, e = CDS->getNumElements(); i != e; ++i) Record.push_back(CDS->getElementAsInteger(i)); } else { - for (unsigned i = 0, e = CDS->getNumElements(); i != e; ++i) + for (uint64_t i = 0, e = CDS->getNumElements(); i != e; ++i) Record.push_back( CDS->getElementAsAPFloat(i).bitcastToAPInt().getLimitedValue()); } diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index 44b10c3ef997267..34ea45ad8d14541 100644 --- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -3628,9 +3628,9 @@ static void emitGlobalConstantDataSequential( return AP.OutStreamer->emitBytes(CDS->getAsString()); // Otherwise, emit the values in successive locations. - unsigned ElementByteSize = CDS->getElementByteSize(); + uint64_t ElementByteSize = CDS->getElementByteSize(); if (isa<IntegerType>(CDS->getElementType())) { - for (unsigned I = 0, E = CDS->getNumElements(); I != E; ++I) { + for (uint64_t I = 0, E = CDS->getNumElements(); I != E; ++I) { emitGlobalAliasInline(AP, ElementByteSize * I, AliasList); if (AP.isVerbose()) AP.OutStreamer->getCommentOS() @@ -3640,7 +3640,7 @@ static void emitGlobalConstantDataSequential( } } else { Type *ET = CDS->getElementType(); - for (unsigned I = 0, E = CDS->getNumElements(); I != E; ++I) { + for (uint64_t I = 0, E = CDS->getNumElements(); I != E; ++I) { emitGlobalAliasInline(AP, ElementByteSize * I, AliasList); emitGlobalConstantFP(CDS->getElementAsAPFloat(I), ET, AP); } diff --git a/llvm/lib/IR/Constants.cpp b/llvm/lib/IR/Constants.cpp index 33f4dc78c6d3f9b..1f7740aab87a66a 100644 --- a/llvm/lib/IR/Constants.cpp +++ b/llvm/lib/IR/Constants.cpp @@ -2855,15 +2855,14 @@ bool ConstantDataSequential::isElementTypeCompatible(Type *Ty) { return false; } -unsigned ConstantDataSequential::getNumElements() const { +uint64_t ConstantDataSequential::getNumElements() const { if (ArrayType *AT = dyn_cast<ArrayType>(getType())) return AT->getNumElements(); return cast<FixedVectorType>(getType())->getNumElements(); } - uint64_t ConstantDataSequential::getElementByteSize() const { - return getElementType()->getPrimitiveSizeInBits()/8; + return getElementType()->getPrimitiveSizeInBits() / 8; } /// Return the start of the specified element. diff --git a/llvm/lib/Target/X86/X86MCInstLower.cpp b/llvm/lib/Target/X86/X86MCInstLower.cpp index 0f8fbf5be1c9557..09166ed9d0f4017 100644 --- a/llvm/lib/Target/X86/X86MCInstLower.cpp +++ b/llvm/lib/Target/X86/X86MCInstLower.cpp @@ -1583,7 +1583,7 @@ static void printConstant(const Constant *COp, unsigned BitWidth, bool IsInteger = EltTy->isIntegerTy(); bool IsFP = EltTy->isHalfTy() || EltTy->isFloatTy() || EltTy->isDoubleTy(); unsigned EltBits = EltTy->getPrimitiveSizeInBits(); - unsigned E = std::min(BitWidth / EltBits, CDS->getNumElements()); + unsigned E = std::min(BitWidth / EltBits, (unsigned)CDS->getNumElements()); assert((BitWidth % EltBits) == 0 && "Element size mismatch"); for (unsigned I = 0; I != E; ++I) { if (I != 0) _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits