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