2759 lines · cpp
1//===--- CGExprConstant.cpp - Emit LLVM Code from Constant Expressions ----===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// This contains code to emit Constant Expr nodes as LLVM code.10//11//===----------------------------------------------------------------------===//12 13#include "ABIInfoImpl.h"14#include "CGCXXABI.h"15#include "CGObjCRuntime.h"16#include "CGRecordLayout.h"17#include "CodeGenFunction.h"18#include "CodeGenModule.h"19#include "ConstantEmitter.h"20#include "TargetInfo.h"21#include "clang/AST/APValue.h"22#include "clang/AST/ASTContext.h"23#include "clang/AST/Attr.h"24#include "clang/AST/RecordLayout.h"25#include "clang/AST/StmtVisitor.h"26#include "clang/Basic/Builtins.h"27#include "llvm/ADT/STLExtras.h"28#include "llvm/ADT/Sequence.h"29#include "llvm/Analysis/ConstantFolding.h"30#include "llvm/IR/Constants.h"31#include "llvm/IR/DataLayout.h"32#include "llvm/IR/Function.h"33#include "llvm/IR/GlobalVariable.h"34#include <optional>35using namespace clang;36using namespace CodeGen;37 38//===----------------------------------------------------------------------===//39// ConstantAggregateBuilder40//===----------------------------------------------------------------------===//41 42namespace {43class ConstExprEmitter;44 45llvm::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 55struct ConstantAggregateBuilderUtils {56 CodeGenModule &CGM;57 58 ConstantAggregateBuilderUtils(CodeGenModule &CGM) : CGM(CGM) {}59 60 CharUnits getAlignment(const llvm::Constant *C) const {61 return CharUnits::fromQuantity(62 CGM.getDataLayout().getABITypeAlign(C->getType()));63 }64 65 CharUnits getSize(llvm::Type *Ty) const {66 return CharUnits::fromQuantity(CGM.getDataLayout().getTypeAllocSize(Ty));67 }68 69 CharUnits getSize(const llvm::Constant *C) const {70 return getSize(C->getType());71 }72 73 llvm::Constant *getPadding(CharUnits PadSize) const {74 return ::getPadding(CGM, PadSize);75 }76 77 llvm::Constant *getZeroes(CharUnits ZeroSize) const {78 llvm::Type *Ty = llvm::ArrayType::get(CGM.CharTy, ZeroSize.getQuantity());79 return llvm::ConstantAggregateZero::get(Ty);80 }81};82 83/// Incremental builder for an llvm::Constant* holding a struct or array84/// constant.85class ConstantAggregateBuilder : private ConstantAggregateBuilderUtils {86 /// The elements of the constant. These two arrays must have the same size;87 /// Offsets[i] describes the offset of Elems[i] within the constant. The88 /// elements are kept in increasing offset order, and we ensure that there89 /// is no overlap: Offsets[i+1] >= Offsets[i] + getSize(Elemes[i]).90 ///91 /// This may contain explicit padding elements (in order to create a92 /// natural layout), but need not. Gaps between elements are implicitly93 /// considered to be filled with undef.94 llvm::SmallVector<llvm::Constant*, 32> Elems;95 llvm::SmallVector<CharUnits, 32> Offsets;96 97 /// The size of the constant (the maximum end offset of any added element).98 /// May be larger than the end of Elems.back() if we split the last element99 /// and removed some trailing undefs.100 CharUnits Size = CharUnits::Zero();101 102 /// This is true only if laying out Elems in order as the elements of a103 /// non-packed LLVM struct will give the correct layout.104 bool NaturalLayout = true;105 106 bool split(size_t Index, CharUnits Hint);107 std::optional<size_t> splitAt(CharUnits Pos);108 109 static llvm::Constant *buildFrom(CodeGenModule &CGM,110 ArrayRef<llvm::Constant *> Elems,111 ArrayRef<CharUnits> Offsets,112 CharUnits StartOffset, CharUnits Size,113 bool NaturalLayout, llvm::Type *DesiredTy,114 bool AllowOversized);115 116public:117 ConstantAggregateBuilder(CodeGenModule &CGM)118 : ConstantAggregateBuilderUtils(CGM) {}119 120 /// Update or overwrite the value starting at \p Offset with \c C.121 ///122 /// \param AllowOverwrite If \c true, this constant might overwrite (part of)123 /// a constant that has already been added. This flag is only used to124 /// detect bugs.125 bool add(llvm::Constant *C, CharUnits Offset, bool AllowOverwrite);126 127 /// Update or overwrite the bits starting at \p OffsetInBits with \p Bits.128 bool addBits(llvm::APInt Bits, uint64_t OffsetInBits, bool AllowOverwrite);129 130 /// Attempt to condense the value starting at \p Offset to a constant of type131 /// \p DesiredTy.132 void condense(CharUnits Offset, llvm::Type *DesiredTy);133 134 /// Produce a constant representing the entire accumulated value, ideally of135 /// the specified type. If \p AllowOversized, the constant might be larger136 /// than implied by \p DesiredTy (eg, if there is a flexible array member).137 /// Otherwise, the constant will be of exactly the same size as \p DesiredTy138 /// even if we can't represent it as that type.139 llvm::Constant *build(llvm::Type *DesiredTy, bool AllowOversized) const {140 return buildFrom(CGM, Elems, Offsets, CharUnits::Zero(), Size,141 NaturalLayout, DesiredTy, AllowOversized);142 }143};144 145template<typename Container, typename Range = std::initializer_list<146 typename Container::value_type>>147static void replace(Container &C, size_t BeginOff, size_t EndOff, Range Vals) {148 assert(BeginOff <= EndOff && "invalid replacement range");149 llvm::replace(C, C.begin() + BeginOff, C.begin() + EndOff, Vals);150}151 152bool ConstantAggregateBuilder::add(llvm::Constant *C, CharUnits Offset,153 bool AllowOverwrite) {154 // Common case: appending to a layout.155 if (Offset >= Size) {156 CharUnits Align = getAlignment(C);157 CharUnits AlignedSize = Size.alignTo(Align);158 if (AlignedSize > Offset || Offset.alignTo(Align) != Offset)159 NaturalLayout = false;160 else if (AlignedSize < Offset) {161 Elems.push_back(getPadding(Offset - Size));162 Offsets.push_back(Size);163 }164 Elems.push_back(C);165 Offsets.push_back(Offset);166 Size = Offset + getSize(C);167 return true;168 }169 170 // Uncommon case: constant overlaps what we've already created.171 std::optional<size_t> FirstElemToReplace = splitAt(Offset);172 if (!FirstElemToReplace)173 return false;174 175 CharUnits CSize = getSize(C);176 std::optional<size_t> LastElemToReplace = splitAt(Offset + CSize);177 if (!LastElemToReplace)178 return false;179 180 assert((FirstElemToReplace == LastElemToReplace || AllowOverwrite) &&181 "unexpectedly overwriting field");182 183 replace(Elems, *FirstElemToReplace, *LastElemToReplace, {C});184 replace(Offsets, *FirstElemToReplace, *LastElemToReplace, {Offset});185 Size = std::max(Size, Offset + CSize);186 NaturalLayout = false;187 return true;188}189 190bool ConstantAggregateBuilder::addBits(llvm::APInt Bits, uint64_t OffsetInBits,191 bool AllowOverwrite) {192 const ASTContext &Context = CGM.getContext();193 const uint64_t CharWidth = CGM.getContext().getCharWidth();194 195 // Offset of where we want the first bit to go within the bits of the196 // current char.197 unsigned OffsetWithinChar = OffsetInBits % CharWidth;198 199 // We split bit-fields up into individual bytes. Walk over the bytes and200 // update them.201 for (CharUnits OffsetInChars =202 Context.toCharUnitsFromBits(OffsetInBits - OffsetWithinChar);203 /**/; ++OffsetInChars) {204 // Number of bits we want to fill in this char.205 unsigned WantedBits =206 std::min((uint64_t)Bits.getBitWidth(), CharWidth - OffsetWithinChar);207 208 // Get a char containing the bits we want in the right places. The other209 // bits have unspecified values.210 llvm::APInt BitsThisChar = Bits;211 if (BitsThisChar.getBitWidth() < CharWidth)212 BitsThisChar = BitsThisChar.zext(CharWidth);213 if (CGM.getDataLayout().isBigEndian()) {214 // Figure out how much to shift by. We may need to left-shift if we have215 // less than one byte of Bits left.216 int Shift = Bits.getBitWidth() - CharWidth + OffsetWithinChar;217 if (Shift > 0)218 BitsThisChar.lshrInPlace(Shift);219 else if (Shift < 0)220 BitsThisChar = BitsThisChar.shl(-Shift);221 } else {222 BitsThisChar = BitsThisChar.shl(OffsetWithinChar);223 }224 if (BitsThisChar.getBitWidth() > CharWidth)225 BitsThisChar = BitsThisChar.trunc(CharWidth);226 227 if (WantedBits == CharWidth) {228 // Got a full byte: just add it directly.229 add(llvm::ConstantInt::get(CGM.getLLVMContext(), BitsThisChar),230 OffsetInChars, AllowOverwrite);231 } else {232 // Partial byte: update the existing integer if there is one. If we233 // can't split out a 1-CharUnit range to update, then we can't add234 // these bits and fail the entire constant emission.235 std::optional<size_t> FirstElemToUpdate = splitAt(OffsetInChars);236 if (!FirstElemToUpdate)237 return false;238 std::optional<size_t> LastElemToUpdate =239 splitAt(OffsetInChars + CharUnits::One());240 if (!LastElemToUpdate)241 return false;242 assert(*LastElemToUpdate - *FirstElemToUpdate < 2 &&243 "should have at most one element covering one byte");244 245 // Figure out which bits we want and discard the rest.246 llvm::APInt UpdateMask(CharWidth, 0);247 if (CGM.getDataLayout().isBigEndian())248 UpdateMask.setBits(CharWidth - OffsetWithinChar - WantedBits,249 CharWidth - OffsetWithinChar);250 else251 UpdateMask.setBits(OffsetWithinChar, OffsetWithinChar + WantedBits);252 BitsThisChar &= UpdateMask;253 254 if (*FirstElemToUpdate == *LastElemToUpdate ||255 Elems[*FirstElemToUpdate]->isNullValue() ||256 isa<llvm::UndefValue>(Elems[*FirstElemToUpdate])) {257 // All existing bits are either zero or undef.258 add(llvm::ConstantInt::get(CGM.getLLVMContext(), BitsThisChar),259 OffsetInChars, /*AllowOverwrite*/ true);260 } else {261 llvm::Constant *&ToUpdate = Elems[*FirstElemToUpdate];262 // In order to perform a partial update, we need the existing bitwise263 // value, which we can only extract for a constant int.264 auto *CI = dyn_cast<llvm::ConstantInt>(ToUpdate);265 if (!CI)266 return false;267 // Because this is a 1-CharUnit range, the constant occupying it must268 // be exactly one CharUnit wide.269 assert(CI->getBitWidth() == CharWidth && "splitAt failed");270 assert((!(CI->getValue() & UpdateMask) || AllowOverwrite) &&271 "unexpectedly overwriting bitfield");272 BitsThisChar |= (CI->getValue() & ~UpdateMask);273 ToUpdate = llvm::ConstantInt::get(CGM.getLLVMContext(), BitsThisChar);274 }275 }276 277 // Stop if we've added all the bits.278 if (WantedBits == Bits.getBitWidth())279 break;280 281 // Remove the consumed bits from Bits.282 if (!CGM.getDataLayout().isBigEndian())283 Bits.lshrInPlace(WantedBits);284 Bits = Bits.trunc(Bits.getBitWidth() - WantedBits);285 286 // The remanining bits go at the start of the following bytes.287 OffsetWithinChar = 0;288 }289 290 return true;291}292 293/// Returns a position within Elems and Offsets such that all elements294/// before the returned index end before Pos and all elements at or after295/// the returned index begin at or after Pos. Splits elements as necessary296/// to ensure this. Returns std::nullopt if we find something we can't split.297std::optional<size_t> ConstantAggregateBuilder::splitAt(CharUnits Pos) {298 if (Pos >= Size)299 return Offsets.size();300 301 while (true) {302 auto FirstAfterPos = llvm::upper_bound(Offsets, Pos);303 if (FirstAfterPos == Offsets.begin())304 return 0;305 306 // If we already have an element starting at Pos, we're done.307 size_t LastAtOrBeforePosIndex = FirstAfterPos - Offsets.begin() - 1;308 if (Offsets[LastAtOrBeforePosIndex] == Pos)309 return LastAtOrBeforePosIndex;310 311 // We found an element starting before Pos. Check for overlap.312 if (Offsets[LastAtOrBeforePosIndex] +313 getSize(Elems[LastAtOrBeforePosIndex]) <= Pos)314 return LastAtOrBeforePosIndex + 1;315 316 // Try to decompose it into smaller constants.317 if (!split(LastAtOrBeforePosIndex, Pos))318 return std::nullopt;319 }320}321 322/// Split the constant at index Index, if possible. Return true if we did.323/// Hint indicates the location at which we'd like to split, but may be324/// ignored.325bool ConstantAggregateBuilder::split(size_t Index, CharUnits Hint) {326 NaturalLayout = false;327 llvm::Constant *C = Elems[Index];328 CharUnits Offset = Offsets[Index];329 330 if (auto *CA = dyn_cast<llvm::ConstantAggregate>(C)) {331 // Expand the sequence into its contained elements.332 // FIXME: This assumes vector elements are byte-sized.333 replace(Elems, Index, Index + 1,334 llvm::map_range(llvm::seq(0u, CA->getNumOperands()),335 [&](unsigned Op) { return CA->getOperand(Op); }));336 if (isa<llvm::ArrayType>(CA->getType()) ||337 isa<llvm::VectorType>(CA->getType())) {338 // Array or vector.339 llvm::Type *ElemTy =340 llvm::GetElementPtrInst::getTypeAtIndex(CA->getType(), (uint64_t)0);341 CharUnits ElemSize = getSize(ElemTy);342 replace(343 Offsets, Index, Index + 1,344 llvm::map_range(llvm::seq(0u, CA->getNumOperands()),345 [&](unsigned Op) { return Offset + Op * ElemSize; }));346 } else {347 // Must be a struct.348 auto *ST = cast<llvm::StructType>(CA->getType());349 const llvm::StructLayout *Layout =350 CGM.getDataLayout().getStructLayout(ST);351 replace(Offsets, Index, Index + 1,352 llvm::map_range(353 llvm::seq(0u, CA->getNumOperands()), [&](unsigned Op) {354 return Offset + CharUnits::fromQuantity(355 Layout->getElementOffset(Op));356 }));357 }358 return true;359 }360 361 if (auto *CDS = dyn_cast<llvm::ConstantDataSequential>(C)) {362 // Expand the sequence into its contained elements.363 // FIXME: This assumes vector elements are byte-sized.364 // FIXME: If possible, split into two ConstantDataSequentials at Hint.365 CharUnits ElemSize = getSize(CDS->getElementType());366 replace(Elems, Index, Index + 1,367 llvm::map_range(llvm::seq(uint64_t(0u), CDS->getNumElements()),368 [&](uint64_t Elem) {369 return CDS->getElementAsConstant(Elem);370 }));371 replace(Offsets, Index, Index + 1,372 llvm::map_range(373 llvm::seq(uint64_t(0u), CDS->getNumElements()),374 [&](uint64_t Elem) { return Offset + Elem * ElemSize; }));375 return true;376 }377 378 if (isa<llvm::ConstantAggregateZero>(C)) {379 // Split into two zeros at the hinted offset.380 CharUnits ElemSize = getSize(C);381 assert(Hint > Offset && Hint < Offset + ElemSize && "nothing to split");382 replace(Elems, Index, Index + 1,383 {getZeroes(Hint - Offset), getZeroes(Offset + ElemSize - Hint)});384 replace(Offsets, Index, Index + 1, {Offset, Hint});385 return true;386 }387 388 if (isa<llvm::UndefValue>(C)) {389 // Drop undef; it doesn't contribute to the final layout.390 replace(Elems, Index, Index + 1, {});391 replace(Offsets, Index, Index + 1, {});392 return true;393 }394 395 // FIXME: We could split a ConstantInt if the need ever arose.396 // We don't need to do this to handle bit-fields because we always eagerly397 // split them into 1-byte chunks.398 399 return false;400}401 402static llvm::Constant *403EmitArrayConstant(CodeGenModule &CGM, llvm::ArrayType *DesiredType,404 llvm::Type *CommonElementType, uint64_t ArrayBound,405 SmallVectorImpl<llvm::Constant *> &Elements,406 llvm::Constant *Filler);407 408llvm::Constant *ConstantAggregateBuilder::buildFrom(409 CodeGenModule &CGM, ArrayRef<llvm::Constant *> Elems,410 ArrayRef<CharUnits> Offsets, CharUnits StartOffset, CharUnits Size,411 bool NaturalLayout, llvm::Type *DesiredTy, bool AllowOversized) {412 ConstantAggregateBuilderUtils Utils(CGM);413 414 if (Elems.empty())415 return llvm::UndefValue::get(DesiredTy);416 417 auto Offset = [&](size_t I) { return Offsets[I] - StartOffset; };418 419 // If we want an array type, see if all the elements are the same type and420 // appropriately spaced.421 if (llvm::ArrayType *ATy = dyn_cast<llvm::ArrayType>(DesiredTy)) {422 assert(!AllowOversized && "oversized array emission not supported");423 424 bool CanEmitArray = true;425 llvm::Type *CommonType = Elems[0]->getType();426 llvm::Constant *Filler = llvm::Constant::getNullValue(CommonType);427 CharUnits ElemSize = Utils.getSize(ATy->getElementType());428 SmallVector<llvm::Constant*, 32> ArrayElements;429 for (size_t I = 0; I != Elems.size(); ++I) {430 // Skip zeroes; we'll use a zero value as our array filler.431 if (Elems[I]->isNullValue())432 continue;433 434 // All remaining elements must be the same type.435 if (Elems[I]->getType() != CommonType ||436 !Offset(I).isMultipleOf(ElemSize)) {437 CanEmitArray = false;438 break;439 }440 ArrayElements.resize(Offset(I) / ElemSize + 1, Filler);441 ArrayElements.back() = Elems[I];442 }443 444 if (CanEmitArray) {445 return EmitArrayConstant(CGM, ATy, CommonType, ATy->getNumElements(),446 ArrayElements, Filler);447 }448 449 // Can't emit as an array, carry on to emit as a struct.450 }451 452 // The size of the constant we plan to generate. This is usually just453 // the size of the initialized type, but in AllowOversized mode (i.e.454 // flexible array init), it can be larger.455 CharUnits DesiredSize = Utils.getSize(DesiredTy);456 if (Size > DesiredSize) {457 assert(AllowOversized && "Elems are oversized");458 DesiredSize = Size;459 }460 461 // The natural alignment of an unpacked LLVM struct with the given elements.462 CharUnits Align = CharUnits::One();463 for (llvm::Constant *C : Elems)464 Align = std::max(Align, Utils.getAlignment(C));465 466 // The natural size of an unpacked LLVM struct with the given elements.467 CharUnits AlignedSize = Size.alignTo(Align);468 469 bool Packed = false;470 ArrayRef<llvm::Constant*> UnpackedElems = Elems;471 llvm::SmallVector<llvm::Constant*, 32> UnpackedElemStorage;472 if (DesiredSize < AlignedSize || DesiredSize.alignTo(Align) != DesiredSize) {473 // The natural layout would be too big; force use of a packed layout.474 NaturalLayout = false;475 Packed = true;476 } else if (DesiredSize > AlignedSize) {477 // The natural layout would be too small. Add padding to fix it. (This478 // is ignored if we choose a packed layout.)479 UnpackedElemStorage.assign(Elems.begin(), Elems.end());480 UnpackedElemStorage.push_back(Utils.getPadding(DesiredSize - Size));481 UnpackedElems = UnpackedElemStorage;482 }483 484 // If we don't have a natural layout, insert padding as necessary.485 // As we go, double-check to see if we can actually just emit Elems486 // as a non-packed struct and do so opportunistically if possible.487 llvm::SmallVector<llvm::Constant*, 32> PackedElems;488 if (!NaturalLayout) {489 CharUnits SizeSoFar = CharUnits::Zero();490 for (size_t I = 0; I != Elems.size(); ++I) {491 CharUnits Align = Utils.getAlignment(Elems[I]);492 CharUnits NaturalOffset = SizeSoFar.alignTo(Align);493 CharUnits DesiredOffset = Offset(I);494 assert(DesiredOffset >= SizeSoFar && "elements out of order");495 496 if (DesiredOffset != NaturalOffset)497 Packed = true;498 if (DesiredOffset != SizeSoFar)499 PackedElems.push_back(Utils.getPadding(DesiredOffset - SizeSoFar));500 PackedElems.push_back(Elems[I]);501 SizeSoFar = DesiredOffset + Utils.getSize(Elems[I]);502 }503 // If we're using the packed layout, pad it out to the desired size if504 // necessary.505 if (Packed) {506 assert(SizeSoFar <= DesiredSize &&507 "requested size is too small for contents");508 if (SizeSoFar < DesiredSize)509 PackedElems.push_back(Utils.getPadding(DesiredSize - SizeSoFar));510 }511 }512 513 llvm::StructType *STy = llvm::ConstantStruct::getTypeForElements(514 CGM.getLLVMContext(), Packed ? PackedElems : UnpackedElems, Packed);515 516 // Pick the type to use. If the type is layout identical to the desired517 // type then use it, otherwise use whatever the builder produced for us.518 if (llvm::StructType *DesiredSTy = dyn_cast<llvm::StructType>(DesiredTy)) {519 if (DesiredSTy->isLayoutIdentical(STy))520 STy = DesiredSTy;521 }522 523 return llvm::ConstantStruct::get(STy, Packed ? PackedElems : UnpackedElems);524}525 526void ConstantAggregateBuilder::condense(CharUnits Offset,527 llvm::Type *DesiredTy) {528 CharUnits Size = getSize(DesiredTy);529 530 std::optional<size_t> FirstElemToReplace = splitAt(Offset);531 if (!FirstElemToReplace)532 return;533 size_t First = *FirstElemToReplace;534 535 std::optional<size_t> LastElemToReplace = splitAt(Offset + Size);536 if (!LastElemToReplace)537 return;538 size_t Last = *LastElemToReplace;539 540 size_t Length = Last - First;541 if (Length == 0)542 return;543 544 if (Length == 1 && Offsets[First] == Offset &&545 getSize(Elems[First]) == Size) {546 // Re-wrap single element structs if necessary. Otherwise, leave any single547 // element constant of the right size alone even if it has the wrong type.548 auto *STy = dyn_cast<llvm::StructType>(DesiredTy);549 if (STy && STy->getNumElements() == 1 &&550 STy->getElementType(0) == Elems[First]->getType())551 Elems[First] = llvm::ConstantStruct::get(STy, Elems[First]);552 return;553 }554 555 llvm::Constant *Replacement = buildFrom(556 CGM, ArrayRef(Elems).slice(First, Length),557 ArrayRef(Offsets).slice(First, Length), Offset, getSize(DesiredTy),558 /*known to have natural layout=*/false, DesiredTy, false);559 replace(Elems, First, Last, {Replacement});560 replace(Offsets, First, Last, {Offset});561}562 563//===----------------------------------------------------------------------===//564// ConstStructBuilder565//===----------------------------------------------------------------------===//566 567class ConstStructBuilder {568 CodeGenModule &CGM;569 ConstantEmitter &Emitter;570 ConstantAggregateBuilder &Builder;571 CharUnits StartOffset;572 573public:574 static llvm::Constant *BuildStruct(ConstantEmitter &Emitter,575 const InitListExpr *ILE,576 QualType StructTy);577 static llvm::Constant *BuildStruct(ConstantEmitter &Emitter,578 const APValue &Value, QualType ValTy);579 static bool UpdateStruct(ConstantEmitter &Emitter,580 ConstantAggregateBuilder &Const, CharUnits Offset,581 const InitListExpr *Updater);582 583private:584 ConstStructBuilder(ConstantEmitter &Emitter,585 ConstantAggregateBuilder &Builder, CharUnits StartOffset)586 : CGM(Emitter.CGM), Emitter(Emitter), Builder(Builder),587 StartOffset(StartOffset) {}588 589 bool AppendField(const FieldDecl *Field, uint64_t FieldOffset,590 llvm::Constant *InitExpr, bool AllowOverwrite = false);591 592 bool AppendBytes(CharUnits FieldOffsetInChars, llvm::Constant *InitCst,593 bool AllowOverwrite = false);594 595 bool AppendBitField(const FieldDecl *Field, uint64_t FieldOffset,596 llvm::Constant *InitExpr, bool AllowOverwrite = false);597 598 bool Build(const InitListExpr *ILE, bool AllowOverwrite);599 bool Build(const APValue &Val, const RecordDecl *RD, bool IsPrimaryBase,600 const CXXRecordDecl *VTableClass, CharUnits BaseOffset);601 bool DoZeroInitPadding(const ASTRecordLayout &Layout, unsigned FieldNo,602 const FieldDecl &Field, bool AllowOverwrite,603 CharUnits &SizeSoFar, bool &ZeroFieldSize);604 bool DoZeroInitPadding(const ASTRecordLayout &Layout, bool AllowOverwrite,605 CharUnits SizeSoFar);606 llvm::Constant *Finalize(QualType Ty);607};608 609bool ConstStructBuilder::AppendField(610 const FieldDecl *Field, uint64_t FieldOffset, llvm::Constant *InitCst,611 bool AllowOverwrite) {612 const ASTContext &Context = CGM.getContext();613 614 CharUnits FieldOffsetInChars = Context.toCharUnitsFromBits(FieldOffset);615 616 return AppendBytes(FieldOffsetInChars, InitCst, AllowOverwrite);617}618 619bool ConstStructBuilder::AppendBytes(CharUnits FieldOffsetInChars,620 llvm::Constant *InitCst,621 bool AllowOverwrite) {622 return Builder.add(InitCst, StartOffset + FieldOffsetInChars, AllowOverwrite);623}624 625bool ConstStructBuilder::AppendBitField(const FieldDecl *Field,626 uint64_t FieldOffset, llvm::Constant *C,627 bool AllowOverwrite) {628 629 llvm::ConstantInt *CI = dyn_cast<llvm::ConstantInt>(C);630 if (!CI) {631 // Constants for long _BitInt types are sometimes split into individual632 // bytes. Try to fold these back into an integer constant. If that doesn't633 // work out, then we are trying to initialize a bitfield with a non-trivial634 // constant, this must require run-time code.635 llvm::Type *LoadType =636 CGM.getTypes().convertTypeForLoadStore(Field->getType(), C->getType());637 llvm::Constant *FoldedConstant = llvm::ConstantFoldLoadFromConst(638 C, LoadType, llvm::APInt::getZero(32), CGM.getDataLayout());639 CI = dyn_cast_if_present<llvm::ConstantInt>(FoldedConstant);640 if (!CI)641 return false;642 }643 644 const CGRecordLayout &RL =645 CGM.getTypes().getCGRecordLayout(Field->getParent());646 const CGBitFieldInfo &Info = RL.getBitFieldInfo(Field);647 llvm::APInt FieldValue = CI->getValue();648 649 // Promote the size of FieldValue if necessary650 // FIXME: This should never occur, but currently it can because initializer651 // constants are cast to bool, and because clang is not enforcing bitfield652 // width limits.653 if (Info.Size > FieldValue.getBitWidth())654 FieldValue = FieldValue.zext(Info.Size);655 656 // Truncate the size of FieldValue to the bit field size.657 if (Info.Size < FieldValue.getBitWidth())658 FieldValue = FieldValue.trunc(Info.Size);659 660 return Builder.addBits(FieldValue,661 CGM.getContext().toBits(StartOffset) + FieldOffset,662 AllowOverwrite);663}664 665static bool EmitDesignatedInitUpdater(ConstantEmitter &Emitter,666 ConstantAggregateBuilder &Const,667 CharUnits Offset, QualType Type,668 const InitListExpr *Updater) {669 if (Type->isRecordType())670 return ConstStructBuilder::UpdateStruct(Emitter, Const, Offset, Updater);671 672 auto CAT = Emitter.CGM.getContext().getAsConstantArrayType(Type);673 if (!CAT)674 return false;675 QualType ElemType = CAT->getElementType();676 CharUnits ElemSize = Emitter.CGM.getContext().getTypeSizeInChars(ElemType);677 llvm::Type *ElemTy = Emitter.CGM.getTypes().ConvertTypeForMem(ElemType);678 679 llvm::Constant *FillC = nullptr;680 if (const Expr *Filler = Updater->getArrayFiller()) {681 if (!isa<NoInitExpr>(Filler)) {682 FillC = Emitter.tryEmitAbstractForMemory(Filler, ElemType);683 if (!FillC)684 return false;685 }686 }687 688 unsigned NumElementsToUpdate =689 FillC ? CAT->getZExtSize() : Updater->getNumInits();690 for (unsigned I = 0; I != NumElementsToUpdate; ++I, Offset += ElemSize) {691 const Expr *Init = nullptr;692 if (I < Updater->getNumInits())693 Init = Updater->getInit(I);694 695 if (!Init && FillC) {696 if (!Const.add(FillC, Offset, true))697 return false;698 } else if (!Init || isa<NoInitExpr>(Init)) {699 continue;700 } else if (const auto *ChildILE = dyn_cast<InitListExpr>(Init)) {701 if (!EmitDesignatedInitUpdater(Emitter, Const, Offset, ElemType,702 ChildILE))703 return false;704 // Attempt to reduce the array element to a single constant if necessary.705 Const.condense(Offset, ElemTy);706 } else {707 llvm::Constant *Val = Emitter.tryEmitPrivateForMemory(Init, ElemType);708 if (!Const.add(Val, Offset, true))709 return false;710 }711 }712 713 return true;714}715 716bool ConstStructBuilder::Build(const InitListExpr *ILE, bool AllowOverwrite) {717 auto *RD = ILE->getType()->castAsRecordDecl();718 const ASTRecordLayout &Layout = CGM.getContext().getASTRecordLayout(RD);719 720 unsigned FieldNo = -1;721 unsigned ElementNo = 0;722 723 // Bail out if we have base classes. We could support these, but they only724 // arise in C++1z where we will have already constant folded most interesting725 // cases. FIXME: There are still a few more cases we can handle this way.726 if (auto *CXXRD = dyn_cast<CXXRecordDecl>(RD))727 if (CXXRD->getNumBases())728 return false;729 730 const bool ZeroInitPadding = CGM.shouldZeroInitPadding();731 bool ZeroFieldSize = false;732 CharUnits SizeSoFar = CharUnits::Zero();733 734 for (FieldDecl *Field : RD->fields()) {735 ++FieldNo;736 737 // If this is a union, skip all the fields that aren't being initialized.738 if (RD->isUnion() &&739 !declaresSameEntity(ILE->getInitializedFieldInUnion(), Field))740 continue;741 742 // Don't emit anonymous bitfields.743 if (Field->isUnnamedBitField())744 continue;745 746 // Get the initializer. A struct can include fields without initializers,747 // we just use explicit null values for them.748 const Expr *Init = nullptr;749 if (ElementNo < ILE->getNumInits())750 Init = ILE->getInit(ElementNo++);751 if (isa_and_nonnull<NoInitExpr>(Init)) {752 if (ZeroInitPadding &&753 !DoZeroInitPadding(Layout, FieldNo, *Field, AllowOverwrite, SizeSoFar,754 ZeroFieldSize))755 return false;756 continue;757 }758 759 // Zero-sized fields are not emitted, but their initializers may still760 // prevent emission of this struct as a constant.761 if (isEmptyFieldForLayout(CGM.getContext(), Field)) {762 if (Init && Init->HasSideEffects(CGM.getContext()))763 return false;764 continue;765 }766 767 if (ZeroInitPadding &&768 !DoZeroInitPadding(Layout, FieldNo, *Field, AllowOverwrite, SizeSoFar,769 ZeroFieldSize))770 return false;771 772 // When emitting a DesignatedInitUpdateExpr, a nested InitListExpr773 // represents additional overwriting of our current constant value, and not774 // a new constant to emit independently.775 if (AllowOverwrite &&776 (Field->getType()->isArrayType() || Field->getType()->isRecordType())) {777 if (auto *SubILE = dyn_cast<InitListExpr>(Init)) {778 CharUnits Offset = CGM.getContext().toCharUnitsFromBits(779 Layout.getFieldOffset(FieldNo));780 if (!EmitDesignatedInitUpdater(Emitter, Builder, StartOffset + Offset,781 Field->getType(), SubILE))782 return false;783 // If we split apart the field's value, try to collapse it down to a784 // single value now.785 Builder.condense(StartOffset + Offset,786 CGM.getTypes().ConvertTypeForMem(Field->getType()));787 continue;788 }789 }790 791 llvm::Constant *EltInit =792 Init ? Emitter.tryEmitPrivateForMemory(Init, Field->getType())793 : Emitter.emitNullForMemory(Field->getType());794 if (!EltInit)795 return false;796 797 if (ZeroInitPadding && ZeroFieldSize)798 SizeSoFar += CharUnits::fromQuantity(799 CGM.getDataLayout().getTypeAllocSize(EltInit->getType()));800 801 if (!Field->isBitField()) {802 // Handle non-bitfield members.803 if (!AppendField(Field, Layout.getFieldOffset(FieldNo), EltInit,804 AllowOverwrite))805 return false;806 // After emitting a non-empty field with [[no_unique_address]], we may807 // need to overwrite its tail padding.808 if (Field->hasAttr<NoUniqueAddressAttr>())809 AllowOverwrite = true;810 } else {811 // Otherwise we have a bitfield.812 if (!AppendBitField(Field, Layout.getFieldOffset(FieldNo), EltInit,813 AllowOverwrite))814 return false;815 }816 }817 818 if (ZeroInitPadding && !DoZeroInitPadding(Layout, AllowOverwrite, SizeSoFar))819 return false;820 821 return true;822}823 824namespace {825struct BaseInfo {826 BaseInfo(const CXXRecordDecl *Decl, CharUnits Offset, unsigned Index)827 : Decl(Decl), Offset(Offset), Index(Index) {828 }829 830 const CXXRecordDecl *Decl;831 CharUnits Offset;832 unsigned Index;833 834 bool operator<(const BaseInfo &O) const { return Offset < O.Offset; }835};836}837 838bool ConstStructBuilder::Build(const APValue &Val, const RecordDecl *RD,839 bool IsPrimaryBase,840 const CXXRecordDecl *VTableClass,841 CharUnits Offset) {842 const ASTRecordLayout &Layout = CGM.getContext().getASTRecordLayout(RD);843 844 if (const CXXRecordDecl *CD = dyn_cast<CXXRecordDecl>(RD)) {845 // Add a vtable pointer, if we need one and it hasn't already been added.846 if (Layout.hasOwnVFPtr()) {847 llvm::Constant *VTableAddressPoint =848 CGM.getCXXABI().getVTableAddressPoint(BaseSubobject(CD, Offset),849 VTableClass);850 if (auto Authentication = CGM.getVTablePointerAuthentication(CD)) {851 VTableAddressPoint = Emitter.tryEmitConstantSignedPointer(852 VTableAddressPoint, *Authentication);853 if (!VTableAddressPoint)854 return false;855 }856 if (!AppendBytes(Offset, VTableAddressPoint))857 return false;858 }859 860 // Accumulate and sort bases, in order to visit them in address order, which861 // may not be the same as declaration order.862 SmallVector<BaseInfo, 8> Bases;863 Bases.reserve(CD->getNumBases());864 unsigned BaseNo = 0;865 for (CXXRecordDecl::base_class_const_iterator Base = CD->bases_begin(),866 BaseEnd = CD->bases_end(); Base != BaseEnd; ++Base, ++BaseNo) {867 assert(!Base->isVirtual() && "should not have virtual bases here");868 const CXXRecordDecl *BD = Base->getType()->getAsCXXRecordDecl();869 CharUnits BaseOffset = Layout.getBaseClassOffset(BD);870 Bases.push_back(BaseInfo(BD, BaseOffset, BaseNo));871 }872 llvm::stable_sort(Bases);873 874 for (const BaseInfo &Base : Bases) {875 bool IsPrimaryBase = Layout.getPrimaryBase() == Base.Decl;876 if (!Build(Val.getStructBase(Base.Index), Base.Decl, IsPrimaryBase,877 VTableClass, Offset + Base.Offset))878 return false;879 }880 }881 882 unsigned FieldNo = 0;883 uint64_t OffsetBits = CGM.getContext().toBits(Offset);884 const bool ZeroInitPadding = CGM.shouldZeroInitPadding();885 bool ZeroFieldSize = false;886 CharUnits SizeSoFar = CharUnits::Zero();887 888 bool AllowOverwrite = false;889 for (RecordDecl::field_iterator Field = RD->field_begin(),890 FieldEnd = RD->field_end(); Field != FieldEnd; ++Field, ++FieldNo) {891 // If this is a union, skip all the fields that aren't being initialized.892 if (RD->isUnion() && !declaresSameEntity(Val.getUnionField(), *Field))893 continue;894 895 // Don't emit anonymous bitfields or zero-sized fields.896 if (Field->isUnnamedBitField() ||897 isEmptyFieldForLayout(CGM.getContext(), *Field))898 continue;899 900 // Emit the value of the initializer.901 const APValue &FieldValue =902 RD->isUnion() ? Val.getUnionValue() : Val.getStructField(FieldNo);903 llvm::Constant *EltInit =904 Emitter.tryEmitPrivateForMemory(FieldValue, Field->getType());905 if (!EltInit)906 return false;907 908 if (ZeroInitPadding) {909 if (!DoZeroInitPadding(Layout, FieldNo, **Field, AllowOverwrite,910 SizeSoFar, ZeroFieldSize))911 return false;912 if (ZeroFieldSize)913 SizeSoFar += CharUnits::fromQuantity(914 CGM.getDataLayout().getTypeAllocSize(EltInit->getType()));915 }916 917 if (!Field->isBitField()) {918 // Handle non-bitfield members.919 if (!AppendField(*Field, Layout.getFieldOffset(FieldNo) + OffsetBits,920 EltInit, AllowOverwrite))921 return false;922 // After emitting a non-empty field with [[no_unique_address]], we may923 // need to overwrite its tail padding.924 if (Field->hasAttr<NoUniqueAddressAttr>())925 AllowOverwrite = true;926 } else {927 // Otherwise we have a bitfield.928 if (!AppendBitField(*Field, Layout.getFieldOffset(FieldNo) + OffsetBits,929 EltInit, AllowOverwrite))930 return false;931 }932 }933 if (ZeroInitPadding && !DoZeroInitPadding(Layout, AllowOverwrite, SizeSoFar))934 return false;935 936 return true;937}938 939bool ConstStructBuilder::DoZeroInitPadding(940 const ASTRecordLayout &Layout, unsigned FieldNo, const FieldDecl &Field,941 bool AllowOverwrite, CharUnits &SizeSoFar, bool &ZeroFieldSize) {942 uint64_t StartBitOffset = Layout.getFieldOffset(FieldNo);943 CharUnits StartOffset = CGM.getContext().toCharUnitsFromBits(StartBitOffset);944 if (SizeSoFar < StartOffset)945 if (!AppendBytes(SizeSoFar, getPadding(CGM, StartOffset - SizeSoFar),946 AllowOverwrite))947 return false;948 949 if (!Field.isBitField()) {950 CharUnits FieldSize = CGM.getContext().getTypeSizeInChars(Field.getType());951 SizeSoFar = StartOffset + FieldSize;952 ZeroFieldSize = FieldSize.isZero();953 } else {954 const CGRecordLayout &RL =955 CGM.getTypes().getCGRecordLayout(Field.getParent());956 const CGBitFieldInfo &Info = RL.getBitFieldInfo(&Field);957 uint64_t EndBitOffset = StartBitOffset + Info.Size;958 SizeSoFar = CGM.getContext().toCharUnitsFromBits(EndBitOffset);959 if (EndBitOffset % CGM.getContext().getCharWidth() != 0) {960 SizeSoFar++;961 }962 ZeroFieldSize = Info.Size == 0;963 }964 return true;965}966 967bool ConstStructBuilder::DoZeroInitPadding(const ASTRecordLayout &Layout,968 bool AllowOverwrite,969 CharUnits SizeSoFar) {970 CharUnits TotalSize = Layout.getSize();971 if (SizeSoFar < TotalSize)972 if (!AppendBytes(SizeSoFar, getPadding(CGM, TotalSize - SizeSoFar),973 AllowOverwrite))974 return false;975 SizeSoFar = TotalSize;976 return true;977}978 979llvm::Constant *ConstStructBuilder::Finalize(QualType Type) {980 Type = Type.getNonReferenceType();981 auto *RD = Type->castAsRecordDecl();982 llvm::Type *ValTy = CGM.getTypes().ConvertType(Type);983 return Builder.build(ValTy, RD->hasFlexibleArrayMember());984}985 986llvm::Constant *ConstStructBuilder::BuildStruct(ConstantEmitter &Emitter,987 const InitListExpr *ILE,988 QualType ValTy) {989 ConstantAggregateBuilder Const(Emitter.CGM);990 ConstStructBuilder Builder(Emitter, Const, CharUnits::Zero());991 992 if (!Builder.Build(ILE, /*AllowOverwrite*/false))993 return nullptr;994 995 return Builder.Finalize(ValTy);996}997 998llvm::Constant *ConstStructBuilder::BuildStruct(ConstantEmitter &Emitter,999 const APValue &Val,1000 QualType ValTy) {1001 ConstantAggregateBuilder Const(Emitter.CGM);1002 ConstStructBuilder Builder(Emitter, Const, CharUnits::Zero());1003 1004 const auto *RD = ValTy->castAsRecordDecl();1005 const CXXRecordDecl *CD = dyn_cast<CXXRecordDecl>(RD);1006 if (!Builder.Build(Val, RD, false, CD, CharUnits::Zero()))1007 return nullptr;1008 1009 return Builder.Finalize(ValTy);1010}1011 1012bool ConstStructBuilder::UpdateStruct(ConstantEmitter &Emitter,1013 ConstantAggregateBuilder &Const,1014 CharUnits Offset,1015 const InitListExpr *Updater) {1016 return ConstStructBuilder(Emitter, Const, Offset)1017 .Build(Updater, /*AllowOverwrite*/ true);1018}1019 1020//===----------------------------------------------------------------------===//1021// ConstExprEmitter1022//===----------------------------------------------------------------------===//1023 1024static ConstantAddress1025tryEmitGlobalCompoundLiteral(ConstantEmitter &emitter,1026 const CompoundLiteralExpr *E) {1027 CodeGenModule &CGM = emitter.CGM;1028 CharUnits Align = CGM.getContext().getTypeAlignInChars(E->getType());1029 if (llvm::GlobalVariable *Addr =1030 CGM.getAddrOfConstantCompoundLiteralIfEmitted(E))1031 return ConstantAddress(Addr, Addr->getValueType(), Align);1032 1033 LangAS addressSpace = E->getType().getAddressSpace();1034 llvm::Constant *C = emitter.tryEmitForInitializer(E->getInitializer(),1035 addressSpace, E->getType());1036 if (!C) {1037 assert(!E->isFileScope() &&1038 "file-scope compound literal did not have constant initializer!");1039 return ConstantAddress::invalid();1040 }1041 1042 auto GV = new llvm::GlobalVariable(1043 CGM.getModule(), C->getType(),1044 E->getType().isConstantStorage(CGM.getContext(), true, false),1045 llvm::GlobalValue::InternalLinkage, C, ".compoundliteral", nullptr,1046 llvm::GlobalVariable::NotThreadLocal,1047 CGM.getContext().getTargetAddressSpace(addressSpace));1048 emitter.finalize(GV);1049 GV->setAlignment(Align.getAsAlign());1050 CGM.setAddrOfConstantCompoundLiteral(E, GV);1051 return ConstantAddress(GV, GV->getValueType(), Align);1052}1053 1054static llvm::Constant *1055EmitArrayConstant(CodeGenModule &CGM, llvm::ArrayType *DesiredType,1056 llvm::Type *CommonElementType, uint64_t ArrayBound,1057 SmallVectorImpl<llvm::Constant *> &Elements,1058 llvm::Constant *Filler) {1059 // Figure out how long the initial prefix of non-zero elements is.1060 uint64_t NonzeroLength = ArrayBound;1061 if (Elements.size() < NonzeroLength && Filler->isNullValue())1062 NonzeroLength = Elements.size();1063 if (NonzeroLength == Elements.size()) {1064 while (NonzeroLength > 0 && Elements[NonzeroLength - 1]->isNullValue())1065 --NonzeroLength;1066 }1067 1068 if (NonzeroLength == 0)1069 return llvm::ConstantAggregateZero::get(DesiredType);1070 1071 // Add a zeroinitializer array filler if we have lots of trailing zeroes.1072 uint64_t TrailingZeroes = ArrayBound - NonzeroLength;1073 if (TrailingZeroes >= 8) {1074 assert(Elements.size() >= NonzeroLength &&1075 "missing initializer for non-zero element");1076 1077 // If all the elements had the same type up to the trailing zeroes, emit a1078 // struct of two arrays (the nonzero data and the zeroinitializer).1079 if (CommonElementType && NonzeroLength >= 8) {1080 llvm::Constant *Initial = llvm::ConstantArray::get(1081 llvm::ArrayType::get(CommonElementType, NonzeroLength),1082 ArrayRef(Elements).take_front(NonzeroLength));1083 Elements.resize(2);1084 Elements[0] = Initial;1085 } else {1086 Elements.resize(NonzeroLength + 1);1087 }1088 1089 auto *FillerType =1090 CommonElementType ? CommonElementType : DesiredType->getElementType();1091 FillerType = llvm::ArrayType::get(FillerType, TrailingZeroes);1092 Elements.back() = llvm::ConstantAggregateZero::get(FillerType);1093 CommonElementType = nullptr;1094 } else if (Elements.size() != ArrayBound) {1095 // Otherwise pad to the right size with the filler if necessary.1096 Elements.resize(ArrayBound, Filler);1097 if (Filler->getType() != CommonElementType)1098 CommonElementType = nullptr;1099 }1100 1101 // If all elements have the same type, just emit an array constant.1102 if (CommonElementType)1103 return llvm::ConstantArray::get(1104 llvm::ArrayType::get(CommonElementType, ArrayBound), Elements);1105 1106 // We have mixed types. Use a packed struct.1107 llvm::SmallVector<llvm::Type *, 16> Types;1108 Types.reserve(Elements.size());1109 for (llvm::Constant *Elt : Elements)1110 Types.push_back(Elt->getType());1111 llvm::StructType *SType =1112 llvm::StructType::get(CGM.getLLVMContext(), Types, true);1113 return llvm::ConstantStruct::get(SType, Elements);1114}1115 1116// This class only needs to handle arrays, structs and unions. Outside C++111117// mode, we don't currently constant fold those types. All other types are1118// handled by constant folding.1119//1120// Constant folding is currently missing support for a few features supported1121// here: CK_ToUnion, CK_ReinterpretMemberPointer, and DesignatedInitUpdateExpr.1122class ConstExprEmitter1123 : public ConstStmtVisitor<ConstExprEmitter, llvm::Constant *, QualType> {1124 CodeGenModule &CGM;1125 ConstantEmitter &Emitter;1126 llvm::LLVMContext &VMContext;1127public:1128 ConstExprEmitter(ConstantEmitter &emitter)1129 : CGM(emitter.CGM), Emitter(emitter), VMContext(CGM.getLLVMContext()) {1130 }1131 1132 //===--------------------------------------------------------------------===//1133 // Visitor Methods1134 //===--------------------------------------------------------------------===//1135 1136 llvm::Constant *VisitStmt(const Stmt *S, QualType T) { return nullptr; }1137 1138 llvm::Constant *VisitConstantExpr(const ConstantExpr *CE, QualType T) {1139 if (llvm::Constant *Result = Emitter.tryEmitConstantExpr(CE))1140 return Result;1141 return Visit(CE->getSubExpr(), T);1142 }1143 1144 llvm::Constant *VisitParenExpr(const ParenExpr *PE, QualType T) {1145 return Visit(PE->getSubExpr(), T);1146 }1147 1148 llvm::Constant *1149 VisitSubstNonTypeTemplateParmExpr(const SubstNonTypeTemplateParmExpr *PE,1150 QualType T) {1151 return Visit(PE->getReplacement(), T);1152 }1153 1154 llvm::Constant *VisitGenericSelectionExpr(const GenericSelectionExpr *GE,1155 QualType T) {1156 return Visit(GE->getResultExpr(), T);1157 }1158 1159 llvm::Constant *VisitChooseExpr(const ChooseExpr *CE, QualType T) {1160 return Visit(CE->getChosenSubExpr(), T);1161 }1162 1163 llvm::Constant *VisitCompoundLiteralExpr(const CompoundLiteralExpr *E,1164 QualType T) {1165 return Visit(E->getInitializer(), T);1166 }1167 1168 llvm::Constant *ProduceIntToIntCast(const Expr *E, QualType DestType) {1169 QualType FromType = E->getType();1170 // See also HandleIntToIntCast in ExprConstant.cpp1171 if (FromType->isIntegerType())1172 if (llvm::Constant *C = Visit(E, FromType))1173 if (auto *CI = dyn_cast<llvm::ConstantInt>(C)) {1174 unsigned SrcWidth = CGM.getContext().getIntWidth(FromType);1175 unsigned DstWidth = CGM.getContext().getIntWidth(DestType);1176 if (DstWidth == SrcWidth)1177 return CI;1178 llvm::APInt A = FromType->isSignedIntegerType()1179 ? CI->getValue().sextOrTrunc(DstWidth)1180 : CI->getValue().zextOrTrunc(DstWidth);1181 return llvm::ConstantInt::get(CGM.getLLVMContext(), A);1182 }1183 return nullptr;1184 }1185 1186 llvm::Constant *VisitCastExpr(const CastExpr *E, QualType destType) {1187 if (const auto *ECE = dyn_cast<ExplicitCastExpr>(E))1188 CGM.EmitExplicitCastExprType(ECE, Emitter.CGF);1189 const Expr *subExpr = E->getSubExpr();1190 1191 switch (E->getCastKind()) {1192 case CK_ToUnion: {1193 // GCC cast to union extension1194 assert(E->getType()->isUnionType() &&1195 "Destination type is not union type!");1196 1197 auto field = E->getTargetUnionField();1198 1199 auto C = Emitter.tryEmitPrivateForMemory(subExpr, field->getType());1200 if (!C) return nullptr;1201 1202 auto destTy = ConvertType(destType);1203 if (C->getType() == destTy) return C;1204 1205 // Build a struct with the union sub-element as the first member,1206 // and padded to the appropriate size.1207 SmallVector<llvm::Constant*, 2> Elts;1208 SmallVector<llvm::Type*, 2> Types;1209 Elts.push_back(C);1210 Types.push_back(C->getType());1211 unsigned CurSize = CGM.getDataLayout().getTypeAllocSize(C->getType());1212 unsigned TotalSize = CGM.getDataLayout().getTypeAllocSize(destTy);1213 1214 assert(CurSize <= TotalSize && "Union size mismatch!");1215 if (unsigned NumPadBytes = TotalSize - CurSize) {1216 llvm::Constant *Padding =1217 getPadding(CGM, CharUnits::fromQuantity(NumPadBytes));1218 Elts.push_back(Padding);1219 Types.push_back(Padding->getType());1220 }1221 1222 llvm::StructType *STy = llvm::StructType::get(VMContext, Types, false);1223 return llvm::ConstantStruct::get(STy, Elts);1224 }1225 1226 case CK_AddressSpaceConversion: {1227 auto C = Emitter.tryEmitPrivate(subExpr, subExpr->getType());1228 if (!C)1229 return nullptr;1230 LangAS srcAS = subExpr->getType()->getPointeeType().getAddressSpace();1231 llvm::Type *destTy = ConvertType(E->getType());1232 return CGM.getTargetCodeGenInfo().performAddrSpaceCast(CGM, C, srcAS,1233 destTy);1234 }1235 1236 case CK_LValueToRValue: {1237 // We don't really support doing lvalue-to-rvalue conversions here; any1238 // interesting conversions should be done in Evaluate(). But as a1239 // special case, allow compound literals to support the gcc extension1240 // allowing "struct x {int x;} x = (struct x) {};".1241 if (const auto *E =1242 dyn_cast<CompoundLiteralExpr>(subExpr->IgnoreParens()))1243 return Visit(E->getInitializer(), destType);1244 return nullptr;1245 }1246 1247 case CK_AtomicToNonAtomic:1248 case CK_NonAtomicToAtomic:1249 case CK_NoOp:1250 case CK_ConstructorConversion:1251 return Visit(subExpr, destType);1252 1253 case CK_ArrayToPointerDecay:1254 if (const auto *S = dyn_cast<StringLiteral>(subExpr))1255 return CGM.GetAddrOfConstantStringFromLiteral(S).getPointer();1256 return nullptr;1257 case CK_NullToPointer:1258 if (Visit(subExpr, destType))1259 return CGM.EmitNullConstant(destType);1260 return nullptr;1261 1262 case CK_IntToOCLSampler:1263 llvm_unreachable("global sampler variables are not generated");1264 1265 case CK_IntegralCast:1266 return ProduceIntToIntCast(subExpr, destType);1267 1268 case CK_Dependent: llvm_unreachable("saw dependent cast!");1269 1270 case CK_BuiltinFnToFnPtr:1271 llvm_unreachable("builtin functions are handled elsewhere");1272 1273 case CK_ReinterpretMemberPointer:1274 case CK_DerivedToBaseMemberPointer:1275 case CK_BaseToDerivedMemberPointer: {1276 auto C = Emitter.tryEmitPrivate(subExpr, subExpr->getType());1277 if (!C) return nullptr;1278 return CGM.getCXXABI().EmitMemberPointerConversion(E, C);1279 }1280 1281 // These will never be supported.1282 case CK_ObjCObjectLValueCast:1283 case CK_ARCProduceObject:1284 case CK_ARCConsumeObject:1285 case CK_ARCReclaimReturnedObject:1286 case CK_ARCExtendBlockObject:1287 case CK_CopyAndAutoreleaseBlockObject:1288 return nullptr;1289 1290 // These don't need to be handled here because Evaluate knows how to1291 // evaluate them in the cases where they can be folded.1292 case CK_BitCast:1293 case CK_ToVoid:1294 case CK_Dynamic:1295 case CK_LValueBitCast:1296 case CK_LValueToRValueBitCast:1297 case CK_NullToMemberPointer:1298 case CK_UserDefinedConversion:1299 case CK_CPointerToObjCPointerCast:1300 case CK_BlockPointerToObjCPointerCast:1301 case CK_AnyPointerToBlockPointerCast:1302 case CK_FunctionToPointerDecay:1303 case CK_BaseToDerived:1304 case CK_DerivedToBase:1305 case CK_UncheckedDerivedToBase:1306 case CK_MemberPointerToBoolean:1307 case CK_VectorSplat:1308 case CK_FloatingRealToComplex:1309 case CK_FloatingComplexToReal:1310 case CK_FloatingComplexToBoolean:1311 case CK_FloatingComplexCast:1312 case CK_FloatingComplexToIntegralComplex:1313 case CK_IntegralRealToComplex:1314 case CK_IntegralComplexToReal:1315 case CK_IntegralComplexToBoolean:1316 case CK_IntegralComplexCast:1317 case CK_IntegralComplexToFloatingComplex:1318 case CK_PointerToIntegral:1319 case CK_PointerToBoolean:1320 case CK_BooleanToSignedIntegral:1321 case CK_IntegralToPointer:1322 case CK_IntegralToBoolean:1323 case CK_IntegralToFloating:1324 case CK_FloatingToIntegral:1325 case CK_FloatingToBoolean:1326 case CK_FloatingCast:1327 case CK_FloatingToFixedPoint:1328 case CK_FixedPointToFloating:1329 case CK_FixedPointCast:1330 case CK_FixedPointToBoolean:1331 case CK_FixedPointToIntegral:1332 case CK_IntegralToFixedPoint:1333 case CK_ZeroToOCLOpaqueType:1334 case CK_MatrixCast:1335 case CK_HLSLVectorTruncation:1336 case CK_HLSLArrayRValue:1337 case CK_HLSLElementwiseCast:1338 case CK_HLSLAggregateSplatCast:1339 return nullptr;1340 }1341 llvm_unreachable("Invalid CastKind");1342 }1343 1344 llvm::Constant *VisitCXXDefaultInitExpr(const CXXDefaultInitExpr *DIE,1345 QualType T) {1346 // No need for a DefaultInitExprScope: we don't handle 'this' in a1347 // constant expression.1348 return Visit(DIE->getExpr(), T);1349 }1350 1351 llvm::Constant *VisitExprWithCleanups(const ExprWithCleanups *E, QualType T) {1352 return Visit(E->getSubExpr(), T);1353 }1354 1355 llvm::Constant *VisitIntegerLiteral(const IntegerLiteral *I, QualType T) {1356 return llvm::ConstantInt::get(CGM.getLLVMContext(), I->getValue());1357 }1358 1359 static APValue withDestType(ASTContext &Ctx, const Expr *E, QualType SrcType,1360 QualType DestType, const llvm::APSInt &Value) {1361 if (!Ctx.hasSameType(SrcType, DestType)) {1362 if (DestType->isFloatingType()) {1363 llvm::APFloat Result =1364 llvm::APFloat(Ctx.getFloatTypeSemantics(DestType), 1);1365 llvm::RoundingMode RM =1366 E->getFPFeaturesInEffect(Ctx.getLangOpts()).getRoundingMode();1367 if (RM == llvm::RoundingMode::Dynamic)1368 RM = llvm::RoundingMode::NearestTiesToEven;1369 Result.convertFromAPInt(Value, Value.isSigned(), RM);1370 return APValue(Result);1371 }1372 }1373 return APValue(Value);1374 }1375 1376 llvm::Constant *EmitArrayInitialization(const InitListExpr *ILE, QualType T) {1377 auto *CAT = CGM.getContext().getAsConstantArrayType(ILE->getType());1378 assert(CAT && "can't emit array init for non-constant-bound array");1379 uint64_t NumInitElements = ILE->getNumInits();1380 const uint64_t NumElements = CAT->getZExtSize();1381 for (const auto *Init : ILE->inits()) {1382 if (const auto *Embed =1383 dyn_cast<EmbedExpr>(Init->IgnoreParenImpCasts())) {1384 NumInitElements += Embed->getDataElementCount() - 1;1385 if (NumInitElements > NumElements) {1386 NumInitElements = NumElements;1387 break;1388 }1389 }1390 }1391 1392 // Initialising an array requires us to automatically1393 // initialise any elements that have not been initialised explicitly1394 uint64_t NumInitableElts = std::min<uint64_t>(NumInitElements, NumElements);1395 1396 QualType EltType = CAT->getElementType();1397 1398 // Initialize remaining array elements.1399 llvm::Constant *fillC = nullptr;1400 if (const Expr *filler = ILE->getArrayFiller()) {1401 fillC = Emitter.tryEmitAbstractForMemory(filler, EltType);1402 if (!fillC)1403 return nullptr;1404 }1405 1406 // Copy initializer elements.1407 SmallVector<llvm::Constant *, 16> Elts;1408 if (fillC && fillC->isNullValue())1409 Elts.reserve(NumInitableElts + 1);1410 else1411 Elts.reserve(NumElements);1412 1413 llvm::Type *CommonElementType = nullptr;1414 auto Emit = [&](const Expr *Init, unsigned ArrayIndex) {1415 llvm::Constant *C = nullptr;1416 C = Emitter.tryEmitPrivateForMemory(Init, EltType);1417 if (!C)1418 return false;1419 if (ArrayIndex == 0)1420 CommonElementType = C->getType();1421 else if (C->getType() != CommonElementType)1422 CommonElementType = nullptr;1423 Elts.push_back(C);1424 return true;1425 };1426 1427 unsigned ArrayIndex = 0;1428 QualType DestTy = CAT->getElementType();1429 for (unsigned i = 0; i < ILE->getNumInits(); ++i) {1430 const Expr *Init = ILE->getInit(i);1431 if (auto *EmbedS = dyn_cast<EmbedExpr>(Init->IgnoreParenImpCasts())) {1432 StringLiteral *SL = EmbedS->getDataStringLiteral();1433 llvm::APSInt Value(CGM.getContext().getTypeSize(DestTy),1434 DestTy->isUnsignedIntegerType());1435 llvm::Constant *C;1436 for (unsigned I = EmbedS->getStartingElementPos(),1437 N = EmbedS->getDataElementCount();1438 I != EmbedS->getStartingElementPos() + N; ++I) {1439 Value = SL->getCodeUnit(I);1440 if (DestTy->isIntegerType()) {1441 C = llvm::ConstantInt::get(CGM.getLLVMContext(), Value);1442 } else {1443 C = Emitter.tryEmitPrivateForMemory(1444 withDestType(CGM.getContext(), Init, EmbedS->getType(), DestTy,1445 Value),1446 EltType);1447 }1448 if (!C)1449 return nullptr;1450 Elts.push_back(C);1451 ArrayIndex++;1452 }1453 if ((ArrayIndex - EmbedS->getDataElementCount()) == 0)1454 CommonElementType = C->getType();1455 else if (C->getType() != CommonElementType)1456 CommonElementType = nullptr;1457 } else {1458 if (!Emit(Init, ArrayIndex))1459 return nullptr;1460 ArrayIndex++;1461 }1462 }1463 1464 llvm::ArrayType *Desired =1465 cast<llvm::ArrayType>(CGM.getTypes().ConvertType(ILE->getType()));1466 return EmitArrayConstant(CGM, Desired, CommonElementType, NumElements, Elts,1467 fillC);1468 }1469 1470 llvm::Constant *EmitRecordInitialization(const InitListExpr *ILE,1471 QualType T) {1472 return ConstStructBuilder::BuildStruct(Emitter, ILE, T);1473 }1474 1475 llvm::Constant *VisitImplicitValueInitExpr(const ImplicitValueInitExpr *E,1476 QualType T) {1477 return CGM.EmitNullConstant(T);1478 }1479 1480 llvm::Constant *VisitInitListExpr(const InitListExpr *ILE, QualType T) {1481 if (ILE->isTransparent())1482 return Visit(ILE->getInit(0), T);1483 1484 if (ILE->getType()->isArrayType())1485 return EmitArrayInitialization(ILE, T);1486 1487 if (ILE->getType()->isRecordType())1488 return EmitRecordInitialization(ILE, T);1489 1490 return nullptr;1491 }1492 1493 llvm::Constant *1494 VisitDesignatedInitUpdateExpr(const DesignatedInitUpdateExpr *E,1495 QualType destType) {1496 auto C = Visit(E->getBase(), destType);1497 if (!C)1498 return nullptr;1499 1500 ConstantAggregateBuilder Const(CGM);1501 Const.add(C, CharUnits::Zero(), false);1502 1503 if (!EmitDesignatedInitUpdater(Emitter, Const, CharUnits::Zero(), destType,1504 E->getUpdater()))1505 return nullptr;1506 1507 llvm::Type *ValTy = CGM.getTypes().ConvertType(destType);1508 bool HasFlexibleArray = false;1509 if (const auto *RD = destType->getAsRecordDecl())1510 HasFlexibleArray = RD->hasFlexibleArrayMember();1511 return Const.build(ValTy, HasFlexibleArray);1512 }1513 1514 llvm::Constant *VisitCXXConstructExpr(const CXXConstructExpr *E,1515 QualType Ty) {1516 if (!E->getConstructor()->isTrivial())1517 return nullptr;1518 1519 // Only default and copy/move constructors can be trivial.1520 if (E->getNumArgs()) {1521 assert(E->getNumArgs() == 1 && "trivial ctor with > 1 argument");1522 assert(E->getConstructor()->isCopyOrMoveConstructor() &&1523 "trivial ctor has argument but isn't a copy/move ctor");1524 1525 const Expr *Arg = E->getArg(0);1526 assert(CGM.getContext().hasSameUnqualifiedType(Ty, Arg->getType()) &&1527 "argument to copy ctor is of wrong type");1528 1529 // Look through the temporary; it's just converting the value to an1530 // lvalue to pass it to the constructor.1531 if (const auto *MTE = dyn_cast<MaterializeTemporaryExpr>(Arg))1532 return Visit(MTE->getSubExpr(), Ty);1533 // Don't try to support arbitrary lvalue-to-rvalue conversions for now.1534 return nullptr;1535 }1536 1537 return CGM.EmitNullConstant(Ty);1538 }1539 1540 llvm::Constant *VisitStringLiteral(const StringLiteral *E, QualType T) {1541 // This is a string literal initializing an array in an initializer.1542 return CGM.GetConstantArrayFromStringLiteral(E);1543 }1544 1545 llvm::Constant *VisitObjCEncodeExpr(const ObjCEncodeExpr *E, QualType T) {1546 // This must be an @encode initializing an array in a static initializer.1547 // Don't emit it as the address of the string, emit the string data itself1548 // as an inline array.1549 std::string Str;1550 CGM.getContext().getObjCEncodingForType(E->getEncodedType(), Str);1551 const ConstantArrayType *CAT = CGM.getContext().getAsConstantArrayType(T);1552 assert(CAT && "String data not of constant array type!");1553 1554 // Resize the string to the right size, adding zeros at the end, or1555 // truncating as needed.1556 Str.resize(CAT->getZExtSize(), '\0');1557 return llvm::ConstantDataArray::getString(VMContext, Str, false);1558 }1559 1560 llvm::Constant *VisitUnaryExtension(const UnaryOperator *E, QualType T) {1561 return Visit(E->getSubExpr(), T);1562 }1563 1564 llvm::Constant *VisitUnaryMinus(const UnaryOperator *U, QualType T) {1565 if (llvm::Constant *C = Visit(U->getSubExpr(), T))1566 if (auto *CI = dyn_cast<llvm::ConstantInt>(C))1567 return llvm::ConstantInt::get(CGM.getLLVMContext(), -CI->getValue());1568 return nullptr;1569 }1570 1571 llvm::Constant *VisitPackIndexingExpr(const PackIndexingExpr *E, QualType T) {1572 return Visit(E->getSelectedExpr(), T);1573 }1574 1575 // Utility methods1576 llvm::Type *ConvertType(QualType T) {1577 return CGM.getTypes().ConvertType(T);1578 }1579};1580 1581} // end anonymous namespace.1582 1583llvm::Constant *ConstantEmitter::validateAndPopAbstract(llvm::Constant *C,1584 AbstractState saved) {1585 Abstract = saved.OldValue;1586 1587 assert(saved.OldPlaceholdersSize == PlaceholderAddresses.size() &&1588 "created a placeholder while doing an abstract emission?");1589 1590 // No validation necessary for now.1591 // No cleanup to do for now.1592 return C;1593}1594 1595llvm::Constant *1596ConstantEmitter::tryEmitAbstractForInitializer(const VarDecl &D) {1597 auto state = pushAbstract();1598 auto C = tryEmitPrivateForVarInit(D);1599 return validateAndPopAbstract(C, state);1600}1601 1602llvm::Constant *1603ConstantEmitter::tryEmitAbstract(const Expr *E, QualType destType) {1604 auto state = pushAbstract();1605 auto C = tryEmitPrivate(E, destType);1606 return validateAndPopAbstract(C, state);1607}1608 1609llvm::Constant *1610ConstantEmitter::tryEmitAbstract(const APValue &value, QualType destType) {1611 auto state = pushAbstract();1612 auto C = tryEmitPrivate(value, destType);1613 return validateAndPopAbstract(C, state);1614}1615 1616llvm::Constant *ConstantEmitter::tryEmitConstantExpr(const ConstantExpr *CE) {1617 if (!CE->hasAPValueResult())1618 return nullptr;1619 1620 QualType RetType = CE->getType();1621 if (CE->isGLValue())1622 RetType = CGM.getContext().getLValueReferenceType(RetType);1623 1624 return tryEmitAbstract(CE->getAPValueResult(), RetType);1625}1626 1627llvm::Constant *1628ConstantEmitter::emitAbstract(const Expr *E, QualType destType) {1629 auto state = pushAbstract();1630 auto C = tryEmitPrivate(E, destType);1631 C = validateAndPopAbstract(C, state);1632 if (!C) {1633 CGM.Error(E->getExprLoc(),1634 "internal error: could not emit constant value \"abstractly\"");1635 C = CGM.EmitNullConstant(destType);1636 }1637 return C;1638}1639 1640llvm::Constant *1641ConstantEmitter::emitAbstract(SourceLocation loc, const APValue &value,1642 QualType destType,1643 bool EnablePtrAuthFunctionTypeDiscrimination) {1644 auto state = pushAbstract();1645 auto C =1646 tryEmitPrivate(value, destType, EnablePtrAuthFunctionTypeDiscrimination);1647 C = validateAndPopAbstract(C, state);1648 if (!C) {1649 CGM.Error(loc,1650 "internal error: could not emit constant value \"abstractly\"");1651 C = CGM.EmitNullConstant(destType);1652 }1653 return C;1654}1655 1656llvm::Constant *ConstantEmitter::tryEmitForInitializer(const VarDecl &D) {1657 initializeNonAbstract(D.getType().getAddressSpace());1658 return markIfFailed(tryEmitPrivateForVarInit(D));1659}1660 1661llvm::Constant *ConstantEmitter::tryEmitForInitializer(const Expr *E,1662 LangAS destAddrSpace,1663 QualType destType) {1664 initializeNonAbstract(destAddrSpace);1665 return markIfFailed(tryEmitPrivateForMemory(E, destType));1666}1667 1668llvm::Constant *ConstantEmitter::emitForInitializer(const APValue &value,1669 LangAS destAddrSpace,1670 QualType destType) {1671 initializeNonAbstract(destAddrSpace);1672 auto C = tryEmitPrivateForMemory(value, destType);1673 assert(C && "couldn't emit constant value non-abstractly?");1674 return C;1675}1676 1677llvm::GlobalValue *ConstantEmitter::getCurrentAddrPrivate() {1678 assert(!Abstract && "cannot get current address for abstract constant");1679 1680 1681 1682 // Make an obviously ill-formed global that should blow up compilation1683 // if it survives.1684 auto global = new llvm::GlobalVariable(CGM.getModule(), CGM.Int8Ty, true,1685 llvm::GlobalValue::PrivateLinkage,1686 /*init*/ nullptr,1687 /*name*/ "",1688 /*before*/ nullptr,1689 llvm::GlobalVariable::NotThreadLocal,1690 CGM.getContext().getTargetAddressSpace(DestAddressSpace));1691 1692 PlaceholderAddresses.push_back(std::make_pair(nullptr, global));1693 1694 return global;1695}1696 1697void ConstantEmitter::registerCurrentAddrPrivate(llvm::Constant *signal,1698 llvm::GlobalValue *placeholder) {1699 assert(!PlaceholderAddresses.empty());1700 assert(PlaceholderAddresses.back().first == nullptr);1701 assert(PlaceholderAddresses.back().second == placeholder);1702 PlaceholderAddresses.back().first = signal;1703}1704 1705namespace {1706 struct ReplacePlaceholders {1707 CodeGenModule &CGM;1708 1709 /// The base address of the global.1710 llvm::Constant *Base;1711 llvm::Type *BaseValueTy = nullptr;1712 1713 /// The placeholder addresses that were registered during emission.1714 llvm::DenseMap<llvm::Constant*, llvm::GlobalVariable*> PlaceholderAddresses;1715 1716 /// The locations of the placeholder signals.1717 llvm::DenseMap<llvm::GlobalVariable*, llvm::Constant*> Locations;1718 1719 /// The current index stack. We use a simple unsigned stack because1720 /// we assume that placeholders will be relatively sparse in the1721 /// initializer, but we cache the index values we find just in case.1722 llvm::SmallVector<unsigned, 8> Indices;1723 llvm::SmallVector<llvm::Constant*, 8> IndexValues;1724 1725 ReplacePlaceholders(CodeGenModule &CGM, llvm::Constant *base,1726 ArrayRef<std::pair<llvm::Constant*,1727 llvm::GlobalVariable*>> addresses)1728 : CGM(CGM), Base(base),1729 PlaceholderAddresses(addresses.begin(), addresses.end()) {1730 }1731 1732 void replaceInInitializer(llvm::Constant *init) {1733 // Remember the type of the top-most initializer.1734 BaseValueTy = init->getType();1735 1736 // Initialize the stack.1737 Indices.push_back(0);1738 IndexValues.push_back(nullptr);1739 1740 // Recurse into the initializer.1741 findLocations(init);1742 1743 // Check invariants.1744 assert(IndexValues.size() == Indices.size() && "mismatch");1745 assert(Indices.size() == 1 && "didn't pop all indices");1746 1747 // Do the replacement; this basically invalidates 'init'.1748 assert(Locations.size() == PlaceholderAddresses.size() &&1749 "missed a placeholder?");1750 1751 // We're iterating over a hashtable, so this would be a source of1752 // non-determinism in compiler output *except* that we're just1753 // messing around with llvm::Constant structures, which never itself1754 // does anything that should be visible in compiler output.1755 for (auto &entry : Locations) {1756 assert(entry.first->getName() == "" && "not a placeholder!");1757 entry.first->replaceAllUsesWith(entry.second);1758 entry.first->eraseFromParent();1759 }1760 }1761 1762 private:1763 void findLocations(llvm::Constant *init) {1764 // Recurse into aggregates.1765 if (auto agg = dyn_cast<llvm::ConstantAggregate>(init)) {1766 for (unsigned i = 0, e = agg->getNumOperands(); i != e; ++i) {1767 Indices.push_back(i);1768 IndexValues.push_back(nullptr);1769 1770 findLocations(agg->getOperand(i));1771 1772 IndexValues.pop_back();1773 Indices.pop_back();1774 }1775 return;1776 }1777 1778 // Otherwise, check for registered constants.1779 while (true) {1780 auto it = PlaceholderAddresses.find(init);1781 if (it != PlaceholderAddresses.end()) {1782 setLocation(it->second);1783 break;1784 }1785 1786 // Look through bitcasts or other expressions.1787 if (auto expr = dyn_cast<llvm::ConstantExpr>(init)) {1788 init = expr->getOperand(0);1789 } else {1790 break;1791 }1792 }1793 }1794 1795 void setLocation(llvm::GlobalVariable *placeholder) {1796 assert(!Locations.contains(placeholder) &&1797 "already found location for placeholder!");1798 1799 // Lazily fill in IndexValues with the values from Indices.1800 // We do this in reverse because we should always have a strict1801 // prefix of indices from the start.1802 assert(Indices.size() == IndexValues.size());1803 for (size_t i = Indices.size() - 1; i != size_t(-1); --i) {1804 if (IndexValues[i]) {1805#ifndef NDEBUG1806 for (size_t j = 0; j != i + 1; ++j) {1807 assert(IndexValues[j] &&1808 isa<llvm::ConstantInt>(IndexValues[j]) &&1809 cast<llvm::ConstantInt>(IndexValues[j])->getZExtValue()1810 == Indices[j]);1811 }1812#endif1813 break;1814 }1815 1816 IndexValues[i] = llvm::ConstantInt::get(CGM.Int32Ty, Indices[i]);1817 }1818 1819 llvm::Constant *location = llvm::ConstantExpr::getInBoundsGetElementPtr(1820 BaseValueTy, Base, IndexValues);1821 1822 Locations.insert({placeholder, location});1823 }1824 };1825}1826 1827void ConstantEmitter::finalize(llvm::GlobalVariable *global) {1828 assert(InitializedNonAbstract &&1829 "finalizing emitter that was used for abstract emission?");1830 assert(!Finalized && "finalizing emitter multiple times");1831 assert(global->getInitializer());1832 1833 // Note that we might also be Failed.1834 Finalized = true;1835 1836 if (!PlaceholderAddresses.empty()) {1837 ReplacePlaceholders(CGM, global, PlaceholderAddresses)1838 .replaceInInitializer(global->getInitializer());1839 PlaceholderAddresses.clear(); // satisfy1840 }1841}1842 1843ConstantEmitter::~ConstantEmitter() {1844 assert((!InitializedNonAbstract || Finalized || Failed) &&1845 "not finalized after being initialized for non-abstract emission");1846 assert(PlaceholderAddresses.empty() && "unhandled placeholders");1847}1848 1849static QualType getNonMemoryType(CodeGenModule &CGM, QualType type) {1850 if (auto AT = type->getAs<AtomicType>()) {1851 return CGM.getContext().getQualifiedType(AT->getValueType(),1852 type.getQualifiers());1853 }1854 return type;1855}1856 1857llvm::Constant *ConstantEmitter::tryEmitPrivateForVarInit(const VarDecl &D) {1858 // Make a quick check if variable can be default NULL initialized1859 // and avoid going through rest of code which may do, for c++11,1860 // initialization of memory to all NULLs.1861 if (!D.hasLocalStorage()) {1862 QualType Ty = CGM.getContext().getBaseElementType(D.getType());1863 if (Ty->isRecordType())1864 if (const CXXConstructExpr *E =1865 dyn_cast_or_null<CXXConstructExpr>(D.getInit())) {1866 const CXXConstructorDecl *CD = E->getConstructor();1867 if (CD->isTrivial() && CD->isDefaultConstructor())1868 return CGM.EmitNullConstant(D.getType());1869 }1870 }1871 InConstantContext = D.hasConstantInitialization();1872 1873 QualType destType = D.getType();1874 const Expr *E = D.getInit();1875 assert(E && "No initializer to emit");1876 1877 if (!destType->isReferenceType()) {1878 QualType nonMemoryDestType = getNonMemoryType(CGM, destType);1879 if (llvm::Constant *C = ConstExprEmitter(*this).Visit(E, nonMemoryDestType))1880 return emitForMemory(C, destType);1881 }1882 1883 // Try to emit the initializer. Note that this can allow some things that1884 // are not allowed by tryEmitPrivateForMemory alone.1885 if (APValue *value = D.evaluateValue()) {1886 assert(!value->allowConstexprUnknown() &&1887 "Constexpr unknown values are not allowed in CodeGen");1888 return tryEmitPrivateForMemory(*value, destType);1889 }1890 1891 return nullptr;1892}1893 1894llvm::Constant *1895ConstantEmitter::tryEmitAbstractForMemory(const Expr *E, QualType destType) {1896 auto nonMemoryDestType = getNonMemoryType(CGM, destType);1897 auto C = tryEmitAbstract(E, nonMemoryDestType);1898 return (C ? emitForMemory(C, destType) : nullptr);1899}1900 1901llvm::Constant *1902ConstantEmitter::tryEmitAbstractForMemory(const APValue &value,1903 QualType destType) {1904 auto nonMemoryDestType = getNonMemoryType(CGM, destType);1905 auto C = tryEmitAbstract(value, nonMemoryDestType);1906 return (C ? emitForMemory(C, destType) : nullptr);1907}1908 1909llvm::Constant *ConstantEmitter::tryEmitPrivateForMemory(const Expr *E,1910 QualType destType) {1911 auto nonMemoryDestType = getNonMemoryType(CGM, destType);1912 llvm::Constant *C = tryEmitPrivate(E, nonMemoryDestType);1913 return (C ? emitForMemory(C, destType) : nullptr);1914}1915 1916llvm::Constant *ConstantEmitter::tryEmitPrivateForMemory(const APValue &value,1917 QualType destType) {1918 auto nonMemoryDestType = getNonMemoryType(CGM, destType);1919 auto C = tryEmitPrivate(value, nonMemoryDestType);1920 return (C ? emitForMemory(C, destType) : nullptr);1921}1922 1923/// Try to emit a constant signed pointer, given a raw pointer and the1924/// destination ptrauth qualifier.1925///1926/// This can fail if the qualifier needs address discrimination and the1927/// emitter is in an abstract mode.1928llvm::Constant *1929ConstantEmitter::tryEmitConstantSignedPointer(llvm::Constant *UnsignedPointer,1930 PointerAuthQualifier Schema) {1931 assert(Schema && "applying trivial ptrauth schema");1932 1933 if (Schema.hasKeyNone())1934 return UnsignedPointer;1935 1936 unsigned Key = Schema.getKey();1937 1938 // Create an address placeholder if we're using address discrimination.1939 llvm::GlobalValue *StorageAddress = nullptr;1940 if (Schema.isAddressDiscriminated()) {1941 // We can't do this if the emitter is in an abstract state.1942 if (isAbstract())1943 return nullptr;1944 1945 StorageAddress = getCurrentAddrPrivate();1946 }1947 1948 llvm::ConstantInt *Discriminator =1949 llvm::ConstantInt::get(CGM.IntPtrTy, Schema.getExtraDiscriminator());1950 1951 llvm::Constant *SignedPointer = CGM.getConstantSignedPointer(1952 UnsignedPointer, Key, StorageAddress, Discriminator);1953 1954 if (Schema.isAddressDiscriminated())1955 registerCurrentAddrPrivate(SignedPointer, StorageAddress);1956 1957 return SignedPointer;1958}1959 1960llvm::Constant *ConstantEmitter::emitForMemory(CodeGenModule &CGM,1961 llvm::Constant *C,1962 QualType destType) {1963 // For an _Atomic-qualified constant, we may need to add tail padding.1964 if (auto AT = destType->getAs<AtomicType>()) {1965 QualType destValueType = AT->getValueType();1966 C = emitForMemory(CGM, C, destValueType);1967 1968 uint64_t innerSize = CGM.getContext().getTypeSize(destValueType);1969 uint64_t outerSize = CGM.getContext().getTypeSize(destType);1970 if (innerSize == outerSize)1971 return C;1972 1973 assert(innerSize < outerSize && "emitted over-large constant for atomic");1974 llvm::Constant *elts[] = {1975 C,1976 llvm::ConstantAggregateZero::get(1977 llvm::ArrayType::get(CGM.Int8Ty, (outerSize - innerSize) / 8))1978 };1979 return llvm::ConstantStruct::getAnon(elts);1980 }1981 1982 // Zero-extend bool.1983 // In HLSL bool vectors are stored in memory as a vector of i321984 if ((C->getType()->isIntegerTy(1) && !destType->isBitIntType()) ||1985 (destType->isExtVectorBoolType() &&1986 !destType->isPackedVectorBoolType(CGM.getContext()))) {1987 llvm::Type *boolTy = CGM.getTypes().ConvertTypeForMem(destType);1988 llvm::Constant *Res = llvm::ConstantFoldCastOperand(1989 llvm::Instruction::ZExt, C, boolTy, CGM.getDataLayout());1990 assert(Res && "Constant folding must succeed");1991 return Res;1992 }1993 1994 if (destType->isBitIntType()) {1995 ConstantAggregateBuilder Builder(CGM);1996 llvm::Type *LoadStoreTy = CGM.getTypes().convertTypeForLoadStore(destType);1997 // ptrtoint/inttoptr should not involve _BitInt in constant expressions, so1998 // casting to ConstantInt is safe here.1999 auto *CI = cast<llvm::ConstantInt>(C);2000 llvm::Constant *Res = llvm::ConstantFoldCastOperand(2001 destType->isSignedIntegerOrEnumerationType() ? llvm::Instruction::SExt2002 : llvm::Instruction::ZExt,2003 CI, LoadStoreTy, CGM.getDataLayout());2004 if (CGM.getTypes().typeRequiresSplitIntoByteArray(destType, C->getType())) {2005 // Long _BitInt has array of bytes as in-memory type.2006 // So, split constant into individual bytes.2007 llvm::Type *DesiredTy = CGM.getTypes().ConvertTypeForMem(destType);2008 llvm::APInt Value = cast<llvm::ConstantInt>(Res)->getValue();2009 Builder.addBits(Value, /*OffsetInBits=*/0, /*AllowOverwrite=*/false);2010 return Builder.build(DesiredTy, /*AllowOversized*/ false);2011 }2012 return Res;2013 }2014 2015 return C;2016}2017 2018llvm::Constant *ConstantEmitter::tryEmitPrivate(const Expr *E,2019 QualType destType) {2020 assert(!destType->isVoidType() && "can't emit a void constant");2021 2022 if (!destType->isReferenceType())2023 if (llvm::Constant *C = ConstExprEmitter(*this).Visit(E, destType))2024 return C;2025 2026 Expr::EvalResult Result;2027 2028 bool Success = false;2029 2030 if (destType->isReferenceType())2031 Success = E->EvaluateAsLValue(Result, CGM.getContext());2032 else2033 Success = E->EvaluateAsRValue(Result, CGM.getContext(), InConstantContext);2034 2035 if (Success && !Result.HasSideEffects)2036 return tryEmitPrivate(Result.Val, destType);2037 2038 return nullptr;2039}2040 2041llvm::Constant *CodeGenModule::getNullPointer(llvm::PointerType *T, QualType QT) {2042 return getTargetCodeGenInfo().getNullPointer(*this, T, QT);2043}2044 2045namespace {2046/// A struct which can be used to peephole certain kinds of finalization2047/// that normally happen during l-value emission.2048struct ConstantLValue {2049 llvm::Constant *Value;2050 bool HasOffsetApplied;2051 bool HasDestPointerAuth;2052 2053 /*implicit*/ ConstantLValue(llvm::Constant *value,2054 bool hasOffsetApplied = false,2055 bool hasDestPointerAuth = false)2056 : Value(value), HasOffsetApplied(hasOffsetApplied),2057 HasDestPointerAuth(hasDestPointerAuth) {}2058 2059 /*implicit*/ ConstantLValue(ConstantAddress address)2060 : ConstantLValue(address.getPointer()) {}2061};2062 2063/// A helper class for emitting constant l-values.2064class ConstantLValueEmitter : public ConstStmtVisitor<ConstantLValueEmitter,2065 ConstantLValue> {2066 CodeGenModule &CGM;2067 ConstantEmitter &Emitter;2068 const APValue &Value;2069 QualType DestType;2070 bool EnablePtrAuthFunctionTypeDiscrimination;2071 2072 // Befriend StmtVisitorBase so that we don't have to expose Visit*.2073 friend StmtVisitorBase;2074 2075public:2076 ConstantLValueEmitter(ConstantEmitter &emitter, const APValue &value,2077 QualType destType,2078 bool EnablePtrAuthFunctionTypeDiscrimination = true)2079 : CGM(emitter.CGM), Emitter(emitter), Value(value), DestType(destType),2080 EnablePtrAuthFunctionTypeDiscrimination(2081 EnablePtrAuthFunctionTypeDiscrimination) {}2082 2083 llvm::Constant *tryEmit();2084 2085private:2086 llvm::Constant *tryEmitAbsolute(llvm::Type *destTy);2087 ConstantLValue tryEmitBase(const APValue::LValueBase &base);2088 2089 ConstantLValue VisitStmt(const Stmt *S) { return nullptr; }2090 ConstantLValue VisitConstantExpr(const ConstantExpr *E);2091 ConstantLValue VisitCompoundLiteralExpr(const CompoundLiteralExpr *E);2092 ConstantLValue VisitStringLiteral(const StringLiteral *E);2093 ConstantLValue VisitObjCBoxedExpr(const ObjCBoxedExpr *E);2094 ConstantLValue VisitObjCEncodeExpr(const ObjCEncodeExpr *E);2095 ConstantLValue VisitObjCStringLiteral(const ObjCStringLiteral *E);2096 ConstantLValue VisitPredefinedExpr(const PredefinedExpr *E);2097 ConstantLValue VisitAddrLabelExpr(const AddrLabelExpr *E);2098 ConstantLValue VisitCallExpr(const CallExpr *E);2099 ConstantLValue VisitBlockExpr(const BlockExpr *E);2100 ConstantLValue VisitCXXTypeidExpr(const CXXTypeidExpr *E);2101 ConstantLValue VisitMaterializeTemporaryExpr(2102 const MaterializeTemporaryExpr *E);2103 2104 ConstantLValue emitPointerAuthSignConstant(const CallExpr *E);2105 llvm::Constant *emitPointerAuthPointer(const Expr *E);2106 unsigned emitPointerAuthKey(const Expr *E);2107 std::pair<llvm::Constant *, llvm::ConstantInt *>2108 emitPointerAuthDiscriminator(const Expr *E);2109 2110 bool hasNonZeroOffset() const {2111 return !Value.getLValueOffset().isZero();2112 }2113 2114 /// Return the value offset.2115 llvm::Constant *getOffset() {2116 return llvm::ConstantInt::get(CGM.Int64Ty,2117 Value.getLValueOffset().getQuantity());2118 }2119 2120 /// Apply the value offset to the given constant.2121 llvm::Constant *applyOffset(llvm::Constant *C) {2122 if (!hasNonZeroOffset())2123 return C;2124 2125 return llvm::ConstantExpr::getGetElementPtr(CGM.Int8Ty, C, getOffset());2126 }2127};2128 2129}2130 2131llvm::Constant *ConstantLValueEmitter::tryEmit() {2132 const APValue::LValueBase &base = Value.getLValueBase();2133 2134 // The destination type should be a pointer or reference2135 // type, but it might also be a cast thereof.2136 //2137 // FIXME: the chain of casts required should be reflected in the APValue.2138 // We need this in order to correctly handle things like a ptrtoint of a2139 // non-zero null pointer and addrspace casts that aren't trivially2140 // represented in LLVM IR.2141 auto destTy = CGM.getTypes().ConvertTypeForMem(DestType);2142 assert(isa<llvm::IntegerType>(destTy) || isa<llvm::PointerType>(destTy));2143 2144 // If there's no base at all, this is a null or absolute pointer,2145 // possibly cast back to an integer type.2146 if (!base) {2147 return tryEmitAbsolute(destTy);2148 }2149 2150 // Otherwise, try to emit the base.2151 ConstantLValue result = tryEmitBase(base);2152 2153 // If that failed, we're done.2154 llvm::Constant *value = result.Value;2155 if (!value) return nullptr;2156 2157 // Apply the offset if necessary and not already done.2158 if (!result.HasOffsetApplied) {2159 value = applyOffset(value);2160 }2161 2162 // Apply pointer-auth signing from the destination type.2163 if (PointerAuthQualifier PointerAuth = DestType.getPointerAuth();2164 PointerAuth && !result.HasDestPointerAuth) {2165 value = Emitter.tryEmitConstantSignedPointer(value, PointerAuth);2166 if (!value)2167 return nullptr;2168 }2169 2170 // Convert to the appropriate type; this could be an lvalue for2171 // an integer. FIXME: performAddrSpaceCast2172 if (isa<llvm::PointerType>(destTy))2173 return llvm::ConstantExpr::getPointerCast(value, destTy);2174 2175 return llvm::ConstantExpr::getPtrToInt(value, destTy);2176}2177 2178/// Try to emit an absolute l-value, such as a null pointer or an integer2179/// bitcast to pointer type.2180llvm::Constant *2181ConstantLValueEmitter::tryEmitAbsolute(llvm::Type *destTy) {2182 // If we're producing a pointer, this is easy.2183 auto destPtrTy = cast<llvm::PointerType>(destTy);2184 if (Value.isNullPointer()) {2185 // FIXME: integer offsets from non-zero null pointers.2186 return CGM.getNullPointer(destPtrTy, DestType);2187 }2188 2189 // Convert the integer to a pointer-sized integer before converting it2190 // to a pointer.2191 // FIXME: signedness depends on the original integer type.2192 auto intptrTy = CGM.getDataLayout().getIntPtrType(destPtrTy);2193 llvm::Constant *C;2194 C = llvm::ConstantFoldIntegerCast(getOffset(), intptrTy, /*isSigned*/ false,2195 CGM.getDataLayout());2196 assert(C && "Must have folded, as Offset is a ConstantInt");2197 C = llvm::ConstantExpr::getIntToPtr(C, destPtrTy);2198 return C;2199}2200 2201ConstantLValue2202ConstantLValueEmitter::tryEmitBase(const APValue::LValueBase &base) {2203 // Handle values.2204 if (const ValueDecl *D = base.dyn_cast<const ValueDecl*>()) {2205 // The constant always points to the canonical declaration. We want to look2206 // at properties of the most recent declaration at the point of emission.2207 D = cast<ValueDecl>(D->getMostRecentDecl());2208 2209 if (D->hasAttr<WeakRefAttr>())2210 return CGM.GetWeakRefReference(D).getPointer();2211 2212 auto PtrAuthSign = [&](llvm::Constant *C) {2213 if (PointerAuthQualifier PointerAuth = DestType.getPointerAuth()) {2214 C = applyOffset(C);2215 C = Emitter.tryEmitConstantSignedPointer(C, PointerAuth);2216 return ConstantLValue(C, /*applied offset*/ true, /*signed*/ true);2217 }2218 2219 CGPointerAuthInfo AuthInfo;2220 2221 if (EnablePtrAuthFunctionTypeDiscrimination)2222 AuthInfo = CGM.getFunctionPointerAuthInfo(DestType);2223 2224 if (AuthInfo) {2225 if (hasNonZeroOffset())2226 return ConstantLValue(nullptr);2227 2228 C = applyOffset(C);2229 C = CGM.getConstantSignedPointer(2230 C, AuthInfo.getKey(), nullptr,2231 cast_or_null<llvm::ConstantInt>(AuthInfo.getDiscriminator()));2232 return ConstantLValue(C, /*applied offset*/ true, /*signed*/ true);2233 }2234 2235 return ConstantLValue(C);2236 };2237 2238 if (const auto *FD = dyn_cast<FunctionDecl>(D)) {2239 llvm::Constant *C = CGM.getRawFunctionPointer(FD);2240 if (FD->getType()->isCFIUncheckedCalleeFunctionType())2241 C = llvm::NoCFIValue::get(cast<llvm::GlobalValue>(C));2242 return PtrAuthSign(C);2243 }2244 2245 if (const auto *VD = dyn_cast<VarDecl>(D)) {2246 // We can never refer to a variable with local storage.2247 if (!VD->hasLocalStorage()) {2248 if (VD->isFileVarDecl() || VD->hasExternalStorage())2249 return CGM.GetAddrOfGlobalVar(VD);2250 2251 if (VD->isLocalVarDecl()) {2252 return CGM.getOrCreateStaticVarDecl(2253 *VD, CGM.getLLVMLinkageVarDefinition(VD));2254 }2255 }2256 }2257 2258 if (const auto *GD = dyn_cast<MSGuidDecl>(D))2259 return CGM.GetAddrOfMSGuidDecl(GD);2260 2261 if (const auto *GCD = dyn_cast<UnnamedGlobalConstantDecl>(D))2262 return CGM.GetAddrOfUnnamedGlobalConstantDecl(GCD);2263 2264 if (const auto *TPO = dyn_cast<TemplateParamObjectDecl>(D))2265 return CGM.GetAddrOfTemplateParamObject(TPO);2266 2267 return nullptr;2268 }2269 2270 // Handle typeid(T).2271 if (TypeInfoLValue TI = base.dyn_cast<TypeInfoLValue>())2272 return CGM.GetAddrOfRTTIDescriptor(QualType(TI.getType(), 0));2273 2274 // Otherwise, it must be an expression.2275 return Visit(base.get<const Expr*>());2276}2277 2278ConstantLValue2279ConstantLValueEmitter::VisitConstantExpr(const ConstantExpr *E) {2280 if (llvm::Constant *Result = Emitter.tryEmitConstantExpr(E))2281 return Result;2282 return Visit(E->getSubExpr());2283}2284 2285ConstantLValue2286ConstantLValueEmitter::VisitCompoundLiteralExpr(const CompoundLiteralExpr *E) {2287 ConstantEmitter CompoundLiteralEmitter(CGM, Emitter.CGF);2288 CompoundLiteralEmitter.setInConstantContext(Emitter.isInConstantContext());2289 return tryEmitGlobalCompoundLiteral(CompoundLiteralEmitter, E);2290}2291 2292ConstantLValue2293ConstantLValueEmitter::VisitStringLiteral(const StringLiteral *E) {2294 return CGM.GetAddrOfConstantStringFromLiteral(E);2295}2296 2297ConstantLValue2298ConstantLValueEmitter::VisitObjCEncodeExpr(const ObjCEncodeExpr *E) {2299 return CGM.GetAddrOfConstantStringFromObjCEncode(E);2300}2301 2302static ConstantLValue emitConstantObjCStringLiteral(const StringLiteral *S,2303 QualType T,2304 CodeGenModule &CGM) {2305 auto C = CGM.getObjCRuntime().GenerateConstantString(S);2306 return C.withElementType(CGM.getTypes().ConvertTypeForMem(T));2307}2308 2309ConstantLValue2310ConstantLValueEmitter::VisitObjCStringLiteral(const ObjCStringLiteral *E) {2311 return emitConstantObjCStringLiteral(E->getString(), E->getType(), CGM);2312}2313 2314ConstantLValue2315ConstantLValueEmitter::VisitObjCBoxedExpr(const ObjCBoxedExpr *E) {2316 assert(E->isExpressibleAsConstantInitializer() &&2317 "this boxed expression can't be emitted as a compile-time constant");2318 const auto *SL = cast<StringLiteral>(E->getSubExpr()->IgnoreParenCasts());2319 return emitConstantObjCStringLiteral(SL, E->getType(), CGM);2320}2321 2322ConstantLValue2323ConstantLValueEmitter::VisitPredefinedExpr(const PredefinedExpr *E) {2324 return CGM.GetAddrOfConstantStringFromLiteral(E->getFunctionName());2325}2326 2327ConstantLValue2328ConstantLValueEmitter::VisitAddrLabelExpr(const AddrLabelExpr *E) {2329 assert(Emitter.CGF && "Invalid address of label expression outside function");2330 llvm::Constant *Ptr = Emitter.CGF->GetAddrOfLabel(E->getLabel());2331 return Ptr;2332}2333 2334ConstantLValue2335ConstantLValueEmitter::VisitCallExpr(const CallExpr *E) {2336 unsigned builtin = E->getBuiltinCallee();2337 if (builtin == Builtin::BI__builtin_function_start)2338 return CGM.GetFunctionStart(2339 E->getArg(0)->getAsBuiltinConstantDeclRef(CGM.getContext()));2340 2341 if (builtin == Builtin::BI__builtin_ptrauth_sign_constant)2342 return emitPointerAuthSignConstant(E);2343 2344 if (builtin != Builtin::BI__builtin___CFStringMakeConstantString &&2345 builtin != Builtin::BI__builtin___NSStringMakeConstantString)2346 return nullptr;2347 2348 const auto *Literal = cast<StringLiteral>(E->getArg(0)->IgnoreParenCasts());2349 if (builtin == Builtin::BI__builtin___NSStringMakeConstantString) {2350 return CGM.getObjCRuntime().GenerateConstantString(Literal);2351 } else {2352 // FIXME: need to deal with UCN conversion issues.2353 return CGM.GetAddrOfConstantCFString(Literal);2354 }2355}2356 2357ConstantLValue2358ConstantLValueEmitter::emitPointerAuthSignConstant(const CallExpr *E) {2359 llvm::Constant *UnsignedPointer = emitPointerAuthPointer(E->getArg(0));2360 unsigned Key = emitPointerAuthKey(E->getArg(1));2361 auto [StorageAddress, OtherDiscriminator] =2362 emitPointerAuthDiscriminator(E->getArg(2));2363 2364 llvm::Constant *SignedPointer = CGM.getConstantSignedPointer(2365 UnsignedPointer, Key, StorageAddress, OtherDiscriminator);2366 return SignedPointer;2367}2368 2369llvm::Constant *ConstantLValueEmitter::emitPointerAuthPointer(const Expr *E) {2370 Expr::EvalResult Result;2371 bool Succeeded = E->EvaluateAsRValue(Result, CGM.getContext());2372 assert(Succeeded);2373 (void)Succeeded;2374 2375 // The assertions here are all checked by Sema.2376 assert(Result.Val.isLValue());2377 if (isa<FunctionDecl>(Result.Val.getLValueBase().get<const ValueDecl *>()))2378 assert(Result.Val.getLValueOffset().isZero());2379 return ConstantEmitter(CGM, Emitter.CGF)2380 .emitAbstract(E->getExprLoc(), Result.Val, E->getType(), false);2381}2382 2383unsigned ConstantLValueEmitter::emitPointerAuthKey(const Expr *E) {2384 return E->EvaluateKnownConstInt(CGM.getContext()).getZExtValue();2385}2386 2387std::pair<llvm::Constant *, llvm::ConstantInt *>2388ConstantLValueEmitter::emitPointerAuthDiscriminator(const Expr *E) {2389 E = E->IgnoreParens();2390 2391 if (const auto *Call = dyn_cast<CallExpr>(E)) {2392 if (Call->getBuiltinCallee() ==2393 Builtin::BI__builtin_ptrauth_blend_discriminator) {2394 llvm::Constant *Pointer = ConstantEmitter(CGM).emitAbstract(2395 Call->getArg(0), Call->getArg(0)->getType());2396 auto *Extra = cast<llvm::ConstantInt>(ConstantEmitter(CGM).emitAbstract(2397 Call->getArg(1), Call->getArg(1)->getType()));2398 return {Pointer, Extra};2399 }2400 }2401 2402 llvm::Constant *Result = ConstantEmitter(CGM).emitAbstract(E, E->getType());2403 if (Result->getType()->isPointerTy())2404 return {Result, nullptr};2405 return {nullptr, cast<llvm::ConstantInt>(Result)};2406}2407 2408ConstantLValue2409ConstantLValueEmitter::VisitBlockExpr(const BlockExpr *E) {2410 StringRef functionName;2411 if (auto CGF = Emitter.CGF)2412 functionName = CGF->CurFn->getName();2413 else2414 functionName = "global";2415 2416 return CGM.GetAddrOfGlobalBlock(E, functionName);2417}2418 2419ConstantLValue2420ConstantLValueEmitter::VisitCXXTypeidExpr(const CXXTypeidExpr *E) {2421 QualType T;2422 if (E->isTypeOperand())2423 T = E->getTypeOperand(CGM.getContext());2424 else2425 T = E->getExprOperand()->getType();2426 return CGM.GetAddrOfRTTIDescriptor(T);2427}2428 2429ConstantLValue2430ConstantLValueEmitter::VisitMaterializeTemporaryExpr(2431 const MaterializeTemporaryExpr *E) {2432 assert(E->getStorageDuration() == SD_Static);2433 const Expr *Inner = E->getSubExpr()->skipRValueSubobjectAdjustments();2434 return CGM.GetAddrOfGlobalTemporary(E, Inner);2435}2436 2437llvm::Constant *2438ConstantEmitter::tryEmitPrivate(const APValue &Value, QualType DestType,2439 bool EnablePtrAuthFunctionTypeDiscrimination) {2440 switch (Value.getKind()) {2441 case APValue::None:2442 case APValue::Indeterminate:2443 // Out-of-lifetime and indeterminate values can be modeled as 'undef'.2444 return llvm::UndefValue::get(CGM.getTypes().ConvertType(DestType));2445 case APValue::LValue:2446 return ConstantLValueEmitter(*this, Value, DestType,2447 EnablePtrAuthFunctionTypeDiscrimination)2448 .tryEmit();2449 case APValue::Int:2450 if (PointerAuthQualifier PointerAuth = DestType.getPointerAuth();2451 PointerAuth &&2452 (PointerAuth.authenticatesNullValues() || Value.getInt() != 0))2453 return nullptr;2454 return llvm::ConstantInt::get(CGM.getLLVMContext(), Value.getInt());2455 case APValue::FixedPoint:2456 return llvm::ConstantInt::get(CGM.getLLVMContext(),2457 Value.getFixedPoint().getValue());2458 case APValue::ComplexInt: {2459 llvm::Constant *Complex[2];2460 2461 Complex[0] = llvm::ConstantInt::get(CGM.getLLVMContext(),2462 Value.getComplexIntReal());2463 Complex[1] = llvm::ConstantInt::get(CGM.getLLVMContext(),2464 Value.getComplexIntImag());2465 2466 // FIXME: the target may want to specify that this is packed.2467 llvm::StructType *STy =2468 llvm::StructType::get(Complex[0]->getType(), Complex[1]->getType());2469 return llvm::ConstantStruct::get(STy, Complex);2470 }2471 case APValue::Float: {2472 const llvm::APFloat &Init = Value.getFloat();2473 if (&Init.getSemantics() == &llvm::APFloat::IEEEhalf() &&2474 !CGM.getContext().getLangOpts().NativeHalfType &&2475 CGM.getContext().getTargetInfo().useFP16ConversionIntrinsics())2476 return llvm::ConstantInt::get(CGM.getLLVMContext(),2477 Init.bitcastToAPInt());2478 else2479 return llvm::ConstantFP::get(CGM.getLLVMContext(), Init);2480 }2481 case APValue::ComplexFloat: {2482 llvm::Constant *Complex[2];2483 2484 Complex[0] = llvm::ConstantFP::get(CGM.getLLVMContext(),2485 Value.getComplexFloatReal());2486 Complex[1] = llvm::ConstantFP::get(CGM.getLLVMContext(),2487 Value.getComplexFloatImag());2488 2489 // FIXME: the target may want to specify that this is packed.2490 llvm::StructType *STy =2491 llvm::StructType::get(Complex[0]->getType(), Complex[1]->getType());2492 return llvm::ConstantStruct::get(STy, Complex);2493 }2494 case APValue::Vector: {2495 unsigned NumElts = Value.getVectorLength();2496 SmallVector<llvm::Constant *, 4> Inits(NumElts);2497 2498 for (unsigned I = 0; I != NumElts; ++I) {2499 const APValue &Elt = Value.getVectorElt(I);2500 if (Elt.isInt())2501 Inits[I] = llvm::ConstantInt::get(CGM.getLLVMContext(), Elt.getInt());2502 else if (Elt.isFloat())2503 Inits[I] = llvm::ConstantFP::get(CGM.getLLVMContext(), Elt.getFloat());2504 else if (Elt.isIndeterminate())2505 Inits[I] = llvm::UndefValue::get(CGM.getTypes().ConvertType(2506 DestType->castAs<VectorType>()->getElementType()));2507 else2508 llvm_unreachable("unsupported vector element type");2509 }2510 return llvm::ConstantVector::get(Inits);2511 }2512 case APValue::AddrLabelDiff: {2513 const AddrLabelExpr *LHSExpr = Value.getAddrLabelDiffLHS();2514 const AddrLabelExpr *RHSExpr = Value.getAddrLabelDiffRHS();2515 llvm::Constant *LHS = tryEmitPrivate(LHSExpr, LHSExpr->getType());2516 llvm::Constant *RHS = tryEmitPrivate(RHSExpr, RHSExpr->getType());2517 if (!LHS || !RHS) return nullptr;2518 2519 // Compute difference2520 llvm::Type *ResultType = CGM.getTypes().ConvertType(DestType);2521 LHS = llvm::ConstantExpr::getPtrToInt(LHS, CGM.IntPtrTy);2522 RHS = llvm::ConstantExpr::getPtrToInt(RHS, CGM.IntPtrTy);2523 llvm::Constant *AddrLabelDiff = llvm::ConstantExpr::getSub(LHS, RHS);2524 2525 // LLVM is a bit sensitive about the exact format of the2526 // address-of-label difference; make sure to truncate after2527 // the subtraction.2528 return llvm::ConstantExpr::getTruncOrBitCast(AddrLabelDiff, ResultType);2529 }2530 case APValue::Struct:2531 case APValue::Union:2532 return ConstStructBuilder::BuildStruct(*this, Value, DestType);2533 case APValue::Array: {2534 const ArrayType *ArrayTy = CGM.getContext().getAsArrayType(DestType);2535 unsigned NumElements = Value.getArraySize();2536 unsigned NumInitElts = Value.getArrayInitializedElts();2537 2538 // Emit array filler, if there is one.2539 llvm::Constant *Filler = nullptr;2540 if (Value.hasArrayFiller()) {2541 Filler = tryEmitAbstractForMemory(Value.getArrayFiller(),2542 ArrayTy->getElementType());2543 if (!Filler)2544 return nullptr;2545 }2546 2547 // Emit initializer elements.2548 SmallVector<llvm::Constant*, 16> Elts;2549 if (Filler && Filler->isNullValue())2550 Elts.reserve(NumInitElts + 1);2551 else2552 Elts.reserve(NumElements);2553 2554 llvm::Type *CommonElementType = nullptr;2555 for (unsigned I = 0; I < NumInitElts; ++I) {2556 llvm::Constant *C = tryEmitPrivateForMemory(2557 Value.getArrayInitializedElt(I), ArrayTy->getElementType());2558 if (!C) return nullptr;2559 2560 if (I == 0)2561 CommonElementType = C->getType();2562 else if (C->getType() != CommonElementType)2563 CommonElementType = nullptr;2564 Elts.push_back(C);2565 }2566 2567 llvm::ArrayType *Desired =2568 cast<llvm::ArrayType>(CGM.getTypes().ConvertType(DestType));2569 2570 // Fix the type of incomplete arrays if the initializer isn't empty.2571 if (DestType->isIncompleteArrayType() && !Elts.empty())2572 Desired = llvm::ArrayType::get(Desired->getElementType(), Elts.size());2573 2574 return EmitArrayConstant(CGM, Desired, CommonElementType, NumElements, Elts,2575 Filler);2576 }2577 case APValue::MemberPointer:2578 return CGM.getCXXABI().EmitMemberPointer(Value, DestType);2579 }2580 llvm_unreachable("Unknown APValue kind");2581}2582 2583llvm::GlobalVariable *CodeGenModule::getAddrOfConstantCompoundLiteralIfEmitted(2584 const CompoundLiteralExpr *E) {2585 return EmittedCompoundLiterals.lookup(E);2586}2587 2588void CodeGenModule::setAddrOfConstantCompoundLiteral(2589 const CompoundLiteralExpr *CLE, llvm::GlobalVariable *GV) {2590 bool Ok = EmittedCompoundLiterals.insert(std::make_pair(CLE, GV)).second;2591 (void)Ok;2592 assert(Ok && "CLE has already been emitted!");2593}2594 2595ConstantAddress2596CodeGenModule::GetAddrOfConstantCompoundLiteral(const CompoundLiteralExpr *E) {2597 assert(E->isFileScope() && "not a file-scope compound literal expr");2598 ConstantEmitter emitter(*this);2599 return tryEmitGlobalCompoundLiteral(emitter, E);2600}2601 2602llvm::Constant *2603CodeGenModule::getMemberPointerConstant(const UnaryOperator *uo) {2604 // Member pointer constants always have a very particular form.2605 const MemberPointerType *type = cast<MemberPointerType>(uo->getType());2606 const ValueDecl *decl = cast<DeclRefExpr>(uo->getSubExpr())->getDecl();2607 2608 // A member function pointer.2609 if (const CXXMethodDecl *method = dyn_cast<CXXMethodDecl>(decl))2610 return getCXXABI().EmitMemberFunctionPointer(method);2611 2612 // Otherwise, a member data pointer.2613 uint64_t fieldOffset = getContext().getFieldOffset(decl);2614 CharUnits chars = getContext().toCharUnitsFromBits((int64_t) fieldOffset);2615 return getCXXABI().EmitMemberDataPointer(type, chars);2616}2617 2618static llvm::Constant *EmitNullConstantForBase(CodeGenModule &CGM,2619 llvm::Type *baseType,2620 const CXXRecordDecl *base);2621 2622static llvm::Constant *EmitNullConstant(CodeGenModule &CGM,2623 const RecordDecl *record,2624 bool asCompleteObject) {2625 const CGRecordLayout &layout = CGM.getTypes().getCGRecordLayout(record);2626 llvm::StructType *structure =2627 (asCompleteObject ? layout.getLLVMType()2628 : layout.getBaseSubobjectLLVMType());2629 2630 unsigned numElements = structure->getNumElements();2631 std::vector<llvm::Constant *> elements(numElements);2632 2633 auto CXXR = dyn_cast<CXXRecordDecl>(record);2634 // Fill in all the bases.2635 if (CXXR) {2636 for (const auto &I : CXXR->bases()) {2637 if (I.isVirtual()) {2638 // Ignore virtual bases; if we're laying out for a complete2639 // object, we'll lay these out later.2640 continue;2641 }2642 2643 const auto *base = I.getType()->castAsCXXRecordDecl();2644 // Ignore empty bases.2645 if (isEmptyRecordForLayout(CGM.getContext(), I.getType()) ||2646 CGM.getContext()2647 .getASTRecordLayout(base)2648 .getNonVirtualSize()2649 .isZero())2650 continue;2651 2652 unsigned fieldIndex = layout.getNonVirtualBaseLLVMFieldNo(base);2653 llvm::Type *baseType = structure->getElementType(fieldIndex);2654 elements[fieldIndex] = EmitNullConstantForBase(CGM, baseType, base);2655 }2656 }2657 2658 // Fill in all the fields.2659 for (const auto *Field : record->fields()) {2660 // Fill in non-bitfields. (Bitfields always use a zero pattern, which we2661 // will fill in later.)2662 if (!Field->isBitField() &&2663 !isEmptyFieldForLayout(CGM.getContext(), Field)) {2664 unsigned fieldIndex = layout.getLLVMFieldNo(Field);2665 elements[fieldIndex] = CGM.EmitNullConstant(Field->getType());2666 }2667 2668 // For unions, stop after the first named field.2669 if (record->isUnion()) {2670 if (Field->getIdentifier())2671 break;2672 if (const auto *FieldRD = Field->getType()->getAsRecordDecl())2673 if (FieldRD->findFirstNamedDataMember())2674 break;2675 }2676 }2677 2678 // Fill in the virtual bases, if we're working with the complete object.2679 if (CXXR && asCompleteObject) {2680 for (const auto &I : CXXR->vbases()) {2681 const auto *base = I.getType()->castAsCXXRecordDecl();2682 // Ignore empty bases.2683 if (isEmptyRecordForLayout(CGM.getContext(), I.getType()))2684 continue;2685 2686 unsigned fieldIndex = layout.getVirtualBaseIndex(base);2687 2688 // We might have already laid this field out.2689 if (elements[fieldIndex]) continue;2690 2691 llvm::Type *baseType = structure->getElementType(fieldIndex);2692 elements[fieldIndex] = EmitNullConstantForBase(CGM, baseType, base);2693 }2694 }2695 2696 // Now go through all other fields and zero them out.2697 for (unsigned i = 0; i != numElements; ++i) {2698 if (!elements[i])2699 elements[i] = llvm::Constant::getNullValue(structure->getElementType(i));2700 }2701 2702 return llvm::ConstantStruct::get(structure, elements);2703}2704 2705/// Emit the null constant for a base subobject.2706static llvm::Constant *EmitNullConstantForBase(CodeGenModule &CGM,2707 llvm::Type *baseType,2708 const CXXRecordDecl *base) {2709 const CGRecordLayout &baseLayout = CGM.getTypes().getCGRecordLayout(base);2710 2711 // Just zero out bases that don't have any pointer to data members.2712 if (baseLayout.isZeroInitializableAsBase())2713 return llvm::Constant::getNullValue(baseType);2714 2715 // Otherwise, we can just use its null constant.2716 return EmitNullConstant(CGM, base, /*asCompleteObject=*/false);2717}2718 2719llvm::Constant *ConstantEmitter::emitNullForMemory(CodeGenModule &CGM,2720 QualType T) {2721 return emitForMemory(CGM, CGM.EmitNullConstant(T), T);2722}2723 2724llvm::Constant *CodeGenModule::EmitNullConstant(QualType T) {2725 if (T->getAs<PointerType>())2726 return getNullPointer(2727 cast<llvm::PointerType>(getTypes().ConvertTypeForMem(T)), T);2728 2729 if (getTypes().isZeroInitializable(T))2730 return llvm::Constant::getNullValue(getTypes().ConvertTypeForMem(T));2731 2732 if (const ConstantArrayType *CAT = Context.getAsConstantArrayType(T)) {2733 llvm::ArrayType *ATy =2734 cast<llvm::ArrayType>(getTypes().ConvertTypeForMem(T));2735 2736 QualType ElementTy = CAT->getElementType();2737 2738 llvm::Constant *Element =2739 ConstantEmitter::emitNullForMemory(*this, ElementTy);2740 unsigned NumElements = CAT->getZExtSize();2741 SmallVector<llvm::Constant *, 8> Array(NumElements, Element);2742 return llvm::ConstantArray::get(ATy, Array);2743 }2744 2745 if (const auto *RD = T->getAsRecordDecl())2746 return ::EmitNullConstant(*this, RD,2747 /*asCompleteObject=*/true);2748 2749 assert(T->isMemberDataPointerType() &&2750 "Should only see pointers to data members here!");2751 2752 return getCXXABI().EmitNullMemberPointer(T->castAs<MemberPointerType>());2753}2754 2755llvm::Constant *2756CodeGenModule::EmitNullConstantForBase(const CXXRecordDecl *Record) {2757 return ::EmitNullConstant(*this, Record, false);2758}2759