xref: /freebsd/contrib/llvm-project/clang/lib/CodeGen/CGValue.h (revision b64c5a0ace59af62eff52bfe110a521dc73c937b)
1 //===-- CGValue.h - LLVM CodeGen wrappers for llvm::Value* ------*- C++ -*-===//
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 // These classes implement wrappers around llvm::Value in order to
10 // fully represent the range of values for C L- and R- values.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef LLVM_CLANG_LIB_CODEGEN_CGVALUE_H
15 #define LLVM_CLANG_LIB_CODEGEN_CGVALUE_H
16 
17 #include "Address.h"
18 #include "CGPointerAuthInfo.h"
19 #include "CodeGenTBAA.h"
20 #include "EHScopeStack.h"
21 #include "clang/AST/ASTContext.h"
22 #include "clang/AST/Type.h"
23 #include "llvm/IR/Type.h"
24 #include "llvm/IR/Value.h"
25 
26 namespace llvm {
27   class Constant;
28   class MDNode;
29 }
30 
31 namespace clang {
32 namespace CodeGen {
33 class AggValueSlot;
34 class CGBuilderTy;
35 class CodeGenFunction;
36 struct CGBitFieldInfo;
37 
38 /// RValue - This trivial value class is used to represent the result of an
39 /// expression that is evaluated.  It can be one of three things: either a
40 /// simple LLVM SSA value, a pair of SSA values for complex numbers, or the
41 /// address of an aggregate value in memory.
42 class RValue {
43   friend struct DominatingValue<RValue>;
44 
45   enum FlavorEnum { Scalar, Complex, Aggregate };
46 
47   union {
48     // Stores first and second value.
49     struct {
50       llvm::Value *first;
51       llvm::Value *second;
52     } Vals;
53 
54     // Stores aggregate address.
55     Address AggregateAddr;
56   };
57 
58   unsigned IsVolatile : 1;
59   unsigned Flavor : 2;
60 
61 public:
62   RValue() : Vals{nullptr, nullptr}, Flavor(Scalar) {}
63 
64   bool isScalar() const { return Flavor == Scalar; }
65   bool isComplex() const { return Flavor == Complex; }
66   bool isAggregate() const { return Flavor == Aggregate; }
67 
68   bool isVolatileQualified() const { return IsVolatile; }
69 
70   /// getScalarVal() - Return the Value* of this scalar value.
71   llvm::Value *getScalarVal() const {
72     assert(isScalar() && "Not a scalar!");
73     return Vals.first;
74   }
75 
76   /// getComplexVal - Return the real/imag components of this complex value.
77   ///
78   std::pair<llvm::Value *, llvm::Value *> getComplexVal() const {
79     return std::make_pair(Vals.first, Vals.second);
80   }
81 
82   /// getAggregateAddr() - Return the Value* of the address of the aggregate.
83   Address getAggregateAddress() const {
84     assert(isAggregate() && "Not an aggregate!");
85     return AggregateAddr;
86   }
87 
88   llvm::Value *getAggregatePointer(QualType PointeeType,
89                                    CodeGenFunction &CGF) const {
90     return getAggregateAddress().getBasePointer();
91   }
92 
93   static RValue getIgnored() {
94     // FIXME: should we make this a more explicit state?
95     return get(nullptr);
96   }
97 
98   static RValue get(llvm::Value *V) {
99     RValue ER;
100     ER.Vals.first = V;
101     ER.Flavor = Scalar;
102     ER.IsVolatile = false;
103     return ER;
104   }
105   static RValue get(Address Addr, CodeGenFunction &CGF) {
106     return RValue::get(Addr.emitRawPointer(CGF));
107   }
108   static RValue getComplex(llvm::Value *V1, llvm::Value *V2) {
109     RValue ER;
110     ER.Vals = {V1, V2};
111     ER.Flavor = Complex;
112     ER.IsVolatile = false;
113     return ER;
114   }
115   static RValue getComplex(const std::pair<llvm::Value *, llvm::Value *> &C) {
116     return getComplex(C.first, C.second);
117   }
118   // FIXME: Aggregate rvalues need to retain information about whether they are
119   // volatile or not.  Remove default to find all places that probably get this
120   // wrong.
121 
122   /// Convert an Address to an RValue. If the Address is not
123   /// signed, create an RValue using the unsigned address. Otherwise, resign the
124   /// address using the provided type.
125   static RValue getAggregate(Address addr, bool isVolatile = false) {
126     RValue ER;
127     ER.AggregateAddr = addr;
128     ER.Flavor = Aggregate;
129     ER.IsVolatile = isVolatile;
130     return ER;
131   }
132 };
133 
134 /// Does an ARC strong l-value have precise lifetime?
135 enum ARCPreciseLifetime_t {
136   ARCImpreciseLifetime, ARCPreciseLifetime
137 };
138 
139 /// The source of the alignment of an l-value; an expression of
140 /// confidence in the alignment actually matching the estimate.
141 enum class AlignmentSource {
142   /// The l-value was an access to a declared entity or something
143   /// equivalently strong, like the address of an array allocated by a
144   /// language runtime.
145   Decl,
146 
147   /// The l-value was considered opaque, so the alignment was
148   /// determined from a type, but that type was an explicitly-aligned
149   /// typedef.
150   AttributedType,
151 
152   /// The l-value was considered opaque, so the alignment was
153   /// determined from a type.
154   Type
155 };
156 
157 /// Given that the base address has the given alignment source, what's
158 /// our confidence in the alignment of the field?
159 static inline AlignmentSource getFieldAlignmentSource(AlignmentSource Source) {
160   // For now, we don't distinguish fields of opaque pointers from
161   // top-level declarations, but maybe we should.
162   return AlignmentSource::Decl;
163 }
164 
165 class LValueBaseInfo {
166   AlignmentSource AlignSource;
167 
168 public:
169   explicit LValueBaseInfo(AlignmentSource Source = AlignmentSource::Type)
170     : AlignSource(Source) {}
171   AlignmentSource getAlignmentSource() const { return AlignSource; }
172   void setAlignmentSource(AlignmentSource Source) { AlignSource = Source; }
173 
174   void mergeForCast(const LValueBaseInfo &Info) {
175     setAlignmentSource(Info.getAlignmentSource());
176   }
177 };
178 
179 /// LValue - This represents an lvalue references.  Because C/C++ allow
180 /// bitfields, this is not a simple LLVM pointer, it may be a pointer plus a
181 /// bitrange.
182 class LValue {
183   enum {
184     Simple,       // This is a normal l-value, use getAddress().
185     VectorElt,    // This is a vector element l-value (V[i]), use getVector*
186     BitField,     // This is a bitfield l-value, use getBitfield*.
187     ExtVectorElt, // This is an extended vector subset, use getExtVectorComp
188     GlobalReg,    // This is a register l-value, use getGlobalReg()
189     MatrixElt     // This is a matrix element, use getVector*
190   } LVType;
191 
192   union {
193     Address Addr = Address::invalid();
194     llvm::Value *V;
195   };
196 
197   union {
198     // Index into a vector subscript: V[i]
199     llvm::Value *VectorIdx;
200 
201     // ExtVector element subset: V.xyx
202     llvm::Constant *VectorElts;
203 
204     // BitField start bit and size
205     const CGBitFieldInfo *BitFieldInfo;
206   };
207 
208   QualType Type;
209 
210   // 'const' is unused here
211   Qualifiers Quals;
212 
213   // objective-c's ivar
214   bool Ivar:1;
215 
216   // objective-c's ivar is an array
217   bool ObjIsArray:1;
218 
219   // LValue is non-gc'able for any reason, including being a parameter or local
220   // variable.
221   bool NonGC: 1;
222 
223   // Lvalue is a global reference of an objective-c object
224   bool GlobalObjCRef : 1;
225 
226   // Lvalue is a thread local reference
227   bool ThreadLocalRef : 1;
228 
229   // Lvalue has ARC imprecise lifetime.  We store this inverted to try
230   // to make the default bitfield pattern all-zeroes.
231   bool ImpreciseLifetime : 1;
232 
233   // This flag shows if a nontemporal load/stores should be used when accessing
234   // this lvalue.
235   bool Nontemporal : 1;
236 
237   LValueBaseInfo BaseInfo;
238   TBAAAccessInfo TBAAInfo;
239 
240   Expr *BaseIvarExp;
241 
242 private:
243   void Initialize(QualType Type, Qualifiers Quals, Address Addr,
244                   LValueBaseInfo BaseInfo, TBAAAccessInfo TBAAInfo) {
245     this->Type = Type;
246     this->Quals = Quals;
247     const unsigned MaxAlign = 1U << 31;
248     CharUnits Alignment = Addr.getAlignment();
249     assert((isGlobalReg() || !Alignment.isZero() || Type->isIncompleteType()) &&
250            "initializing l-value with zero alignment!");
251     if (Alignment.getQuantity() > MaxAlign) {
252       assert(false && "Alignment exceeds allowed max!");
253       Alignment = CharUnits::fromQuantity(MaxAlign);
254     }
255     this->Addr = Addr;
256     this->BaseInfo = BaseInfo;
257     this->TBAAInfo = TBAAInfo;
258 
259     // Initialize Objective-C flags.
260     this->Ivar = this->ObjIsArray = this->NonGC = this->GlobalObjCRef = false;
261     this->ImpreciseLifetime = false;
262     this->Nontemporal = false;
263     this->ThreadLocalRef = false;
264     this->BaseIvarExp = nullptr;
265   }
266 
267   void initializeSimpleLValue(Address Addr, QualType Type,
268                               LValueBaseInfo BaseInfo, TBAAAccessInfo TBAAInfo,
269                               ASTContext &Context) {
270     Qualifiers QS = Type.getQualifiers();
271     QS.setObjCGCAttr(Context.getObjCGCAttrKind(Type));
272     LVType = Simple;
273     Initialize(Type, QS, Addr, BaseInfo, TBAAInfo);
274     assert(Addr.getBasePointer()->getType()->isPointerTy());
275   }
276 
277 public:
278   bool isSimple() const { return LVType == Simple; }
279   bool isVectorElt() const { return LVType == VectorElt; }
280   bool isBitField() const { return LVType == BitField; }
281   bool isExtVectorElt() const { return LVType == ExtVectorElt; }
282   bool isGlobalReg() const { return LVType == GlobalReg; }
283   bool isMatrixElt() const { return LVType == MatrixElt; }
284 
285   bool isVolatileQualified() const { return Quals.hasVolatile(); }
286   bool isRestrictQualified() const { return Quals.hasRestrict(); }
287   unsigned getVRQualifiers() const {
288     return Quals.getCVRQualifiers() & ~Qualifiers::Const;
289   }
290 
291   QualType getType() const { return Type; }
292 
293   Qualifiers::ObjCLifetime getObjCLifetime() const {
294     return Quals.getObjCLifetime();
295   }
296 
297   bool isObjCIvar() const { return Ivar; }
298   void setObjCIvar(bool Value) { Ivar = Value; }
299 
300   bool isObjCArray() const { return ObjIsArray; }
301   void setObjCArray(bool Value) { ObjIsArray = Value; }
302 
303   bool isNonGC () const { return NonGC; }
304   void setNonGC(bool Value) { NonGC = Value; }
305 
306   bool isGlobalObjCRef() const { return GlobalObjCRef; }
307   void setGlobalObjCRef(bool Value) { GlobalObjCRef = Value; }
308 
309   bool isThreadLocalRef() const { return ThreadLocalRef; }
310   void setThreadLocalRef(bool Value) { ThreadLocalRef = Value;}
311 
312   ARCPreciseLifetime_t isARCPreciseLifetime() const {
313     return ARCPreciseLifetime_t(!ImpreciseLifetime);
314   }
315   void setARCPreciseLifetime(ARCPreciseLifetime_t value) {
316     ImpreciseLifetime = (value == ARCImpreciseLifetime);
317   }
318   bool isNontemporal() const { return Nontemporal; }
319   void setNontemporal(bool Value) { Nontemporal = Value; }
320 
321   bool isObjCWeak() const {
322     return Quals.getObjCGCAttr() == Qualifiers::Weak;
323   }
324   bool isObjCStrong() const {
325     return Quals.getObjCGCAttr() == Qualifiers::Strong;
326   }
327 
328   bool isVolatile() const {
329     return Quals.hasVolatile();
330   }
331 
332   Expr *getBaseIvarExp() const { return BaseIvarExp; }
333   void setBaseIvarExp(Expr *V) { BaseIvarExp = V; }
334 
335   TBAAAccessInfo getTBAAInfo() const { return TBAAInfo; }
336   void setTBAAInfo(TBAAAccessInfo Info) { TBAAInfo = Info; }
337 
338   const Qualifiers &getQuals() const { return Quals; }
339   Qualifiers &getQuals() { return Quals; }
340 
341   LangAS getAddressSpace() const { return Quals.getAddressSpace(); }
342 
343   CharUnits getAlignment() const { return Addr.getAlignment(); }
344   void setAlignment(CharUnits A) { Addr.setAlignment(A); }
345 
346   LValueBaseInfo getBaseInfo() const { return BaseInfo; }
347   void setBaseInfo(LValueBaseInfo Info) { BaseInfo = Info; }
348 
349   KnownNonNull_t isKnownNonNull() const { return Addr.isKnownNonNull(); }
350   LValue setKnownNonNull() {
351     Addr.setKnownNonNull();
352     return *this;
353   }
354 
355   // simple lvalue
356   llvm::Value *getPointer(CodeGenFunction &CGF) const;
357   llvm::Value *emitResignedPointer(QualType PointeeTy,
358                                    CodeGenFunction &CGF) const;
359   llvm::Value *emitRawPointer(CodeGenFunction &CGF) const;
360 
361   Address getAddress() const { return Addr; }
362 
363   void setAddress(Address address) { Addr = address; }
364 
365   CGPointerAuthInfo getPointerAuthInfo() const {
366     return Addr.getPointerAuthInfo();
367   }
368 
369   // vector elt lvalue
370   Address getVectorAddress() const {
371     assert(isVectorElt());
372     return Addr;
373   }
374   llvm::Value *getRawVectorPointer(CodeGenFunction &CGF) const {
375     assert(isVectorElt());
376     return Addr.emitRawPointer(CGF);
377   }
378   llvm::Value *getVectorPointer() const {
379     assert(isVectorElt());
380     return Addr.getBasePointer();
381   }
382   llvm::Value *getVectorIdx() const {
383     assert(isVectorElt());
384     return VectorIdx;
385   }
386 
387   Address getMatrixAddress() const {
388     assert(isMatrixElt());
389     return Addr;
390   }
391   llvm::Value *getMatrixPointer() const {
392     assert(isMatrixElt());
393     return Addr.getBasePointer();
394   }
395   llvm::Value *getMatrixIdx() const {
396     assert(isMatrixElt());
397     return VectorIdx;
398   }
399 
400   // extended vector elements.
401   Address getExtVectorAddress() const {
402     assert(isExtVectorElt());
403     return Addr;
404   }
405   llvm::Value *getRawExtVectorPointer(CodeGenFunction &CGF) const {
406     assert(isExtVectorElt());
407     return Addr.emitRawPointer(CGF);
408   }
409   llvm::Constant *getExtVectorElts() const {
410     assert(isExtVectorElt());
411     return VectorElts;
412   }
413 
414   // bitfield lvalue
415   Address getBitFieldAddress() const {
416     assert(isBitField());
417     return Addr;
418   }
419   llvm::Value *getRawBitFieldPointer(CodeGenFunction &CGF) const {
420     assert(isBitField());
421     return Addr.emitRawPointer(CGF);
422   }
423 
424   const CGBitFieldInfo &getBitFieldInfo() const {
425     assert(isBitField());
426     return *BitFieldInfo;
427   }
428 
429   // global register lvalue
430   llvm::Value *getGlobalReg() const { assert(isGlobalReg()); return V; }
431 
432   static LValue MakeAddr(Address Addr, QualType type, ASTContext &Context,
433                          LValueBaseInfo BaseInfo, TBAAAccessInfo TBAAInfo) {
434     LValue R;
435     R.LVType = Simple;
436     R.initializeSimpleLValue(Addr, type, BaseInfo, TBAAInfo, Context);
437     R.Addr = Addr;
438     assert(Addr.getType()->isPointerTy());
439     return R;
440   }
441 
442   static LValue MakeVectorElt(Address vecAddress, llvm::Value *Idx,
443                               QualType type, LValueBaseInfo BaseInfo,
444                               TBAAAccessInfo TBAAInfo) {
445     LValue R;
446     R.LVType = VectorElt;
447     R.VectorIdx = Idx;
448     R.Initialize(type, type.getQualifiers(), vecAddress, BaseInfo, TBAAInfo);
449     return R;
450   }
451 
452   static LValue MakeExtVectorElt(Address Addr, llvm::Constant *Elts,
453                                  QualType type, LValueBaseInfo BaseInfo,
454                                  TBAAAccessInfo TBAAInfo) {
455     LValue R;
456     R.LVType = ExtVectorElt;
457     R.VectorElts = Elts;
458     R.Initialize(type, type.getQualifiers(), Addr, BaseInfo, TBAAInfo);
459     return R;
460   }
461 
462   /// Create a new object to represent a bit-field access.
463   ///
464   /// \param Addr - The base address of the bit-field sequence this
465   /// bit-field refers to.
466   /// \param Info - The information describing how to perform the bit-field
467   /// access.
468   static LValue MakeBitfield(Address Addr, const CGBitFieldInfo &Info,
469                              QualType type, LValueBaseInfo BaseInfo,
470                              TBAAAccessInfo TBAAInfo) {
471     LValue R;
472     R.LVType = BitField;
473     R.BitFieldInfo = &Info;
474     R.Initialize(type, type.getQualifiers(), Addr, BaseInfo, TBAAInfo);
475     return R;
476   }
477 
478   static LValue MakeGlobalReg(llvm::Value *V, CharUnits alignment,
479                               QualType type) {
480     LValue R;
481     R.LVType = GlobalReg;
482     R.Initialize(type, type.getQualifiers(), Address::invalid(),
483                  LValueBaseInfo(AlignmentSource::Decl), TBAAAccessInfo());
484     R.V = V;
485     return R;
486   }
487 
488   static LValue MakeMatrixElt(Address matAddress, llvm::Value *Idx,
489                               QualType type, LValueBaseInfo BaseInfo,
490                               TBAAAccessInfo TBAAInfo) {
491     LValue R;
492     R.LVType = MatrixElt;
493     R.VectorIdx = Idx;
494     R.Initialize(type, type.getQualifiers(), matAddress, BaseInfo, TBAAInfo);
495     return R;
496   }
497 
498   RValue asAggregateRValue() const {
499     return RValue::getAggregate(getAddress(), isVolatileQualified());
500   }
501 };
502 
503 /// An aggregate value slot.
504 class AggValueSlot {
505   /// The address.
506   Address Addr;
507 
508   // Qualifiers
509   Qualifiers Quals;
510 
511   /// DestructedFlag - This is set to true if some external code is
512   /// responsible for setting up a destructor for the slot.  Otherwise
513   /// the code which constructs it should push the appropriate cleanup.
514   bool DestructedFlag : 1;
515 
516   /// ObjCGCFlag - This is set to true if writing to the memory in the
517   /// slot might require calling an appropriate Objective-C GC
518   /// barrier.  The exact interaction here is unnecessarily mysterious.
519   bool ObjCGCFlag : 1;
520 
521   /// ZeroedFlag - This is set to true if the memory in the slot is
522   /// known to be zero before the assignment into it.  This means that
523   /// zero fields don't need to be set.
524   bool ZeroedFlag : 1;
525 
526   /// AliasedFlag - This is set to true if the slot might be aliased
527   /// and it's not undefined behavior to access it through such an
528   /// alias.  Note that it's always undefined behavior to access a C++
529   /// object that's under construction through an alias derived from
530   /// outside the construction process.
531   ///
532   /// This flag controls whether calls that produce the aggregate
533   /// value may be evaluated directly into the slot, or whether they
534   /// must be evaluated into an unaliased temporary and then memcpy'ed
535   /// over.  Since it's invalid in general to memcpy a non-POD C++
536   /// object, it's important that this flag never be set when
537   /// evaluating an expression which constructs such an object.
538   bool AliasedFlag : 1;
539 
540   /// This is set to true if the tail padding of this slot might overlap
541   /// another object that may have already been initialized (and whose
542   /// value must be preserved by this initialization). If so, we may only
543   /// store up to the dsize of the type. Otherwise we can widen stores to
544   /// the size of the type.
545   bool OverlapFlag : 1;
546 
547   /// If is set to true, sanitizer checks are already generated for this address
548   /// or not required. For instance, if this address represents an object
549   /// created in 'new' expression, sanitizer checks for memory is made as a part
550   /// of 'operator new' emission and object constructor should not generate
551   /// them.
552   bool SanitizerCheckedFlag : 1;
553 
554   AggValueSlot(Address Addr, Qualifiers Quals, bool DestructedFlag,
555                bool ObjCGCFlag, bool ZeroedFlag, bool AliasedFlag,
556                bool OverlapFlag, bool SanitizerCheckedFlag)
557       : Addr(Addr), Quals(Quals), DestructedFlag(DestructedFlag),
558         ObjCGCFlag(ObjCGCFlag), ZeroedFlag(ZeroedFlag),
559         AliasedFlag(AliasedFlag), OverlapFlag(OverlapFlag),
560         SanitizerCheckedFlag(SanitizerCheckedFlag) {}
561 
562 public:
563   enum IsAliased_t { IsNotAliased, IsAliased };
564   enum IsDestructed_t { IsNotDestructed, IsDestructed };
565   enum IsZeroed_t { IsNotZeroed, IsZeroed };
566   enum Overlap_t { DoesNotOverlap, MayOverlap };
567   enum NeedsGCBarriers_t { DoesNotNeedGCBarriers, NeedsGCBarriers };
568   enum IsSanitizerChecked_t { IsNotSanitizerChecked, IsSanitizerChecked };
569 
570   /// ignored - Returns an aggregate value slot indicating that the
571   /// aggregate value is being ignored.
572   static AggValueSlot ignored() {
573     return forAddr(Address::invalid(), Qualifiers(), IsNotDestructed,
574                    DoesNotNeedGCBarriers, IsNotAliased, DoesNotOverlap);
575   }
576 
577   /// forAddr - Make a slot for an aggregate value.
578   ///
579   /// \param quals - The qualifiers that dictate how the slot should
580   /// be initialied. Only 'volatile' and the Objective-C lifetime
581   /// qualifiers matter.
582   ///
583   /// \param isDestructed - true if something else is responsible
584   ///   for calling destructors on this object
585   /// \param needsGC - true if the slot is potentially located
586   ///   somewhere that ObjC GC calls should be emitted for
587   static AggValueSlot forAddr(Address addr,
588                               Qualifiers quals,
589                               IsDestructed_t isDestructed,
590                               NeedsGCBarriers_t needsGC,
591                               IsAliased_t isAliased,
592                               Overlap_t mayOverlap,
593                               IsZeroed_t isZeroed = IsNotZeroed,
594                        IsSanitizerChecked_t isChecked = IsNotSanitizerChecked) {
595     if (addr.isValid())
596       addr.setKnownNonNull();
597     return AggValueSlot(addr, quals, isDestructed, needsGC, isZeroed, isAliased,
598                         mayOverlap, isChecked);
599   }
600 
601   static AggValueSlot
602   forLValue(const LValue &LV, IsDestructed_t isDestructed,
603             NeedsGCBarriers_t needsGC, IsAliased_t isAliased,
604             Overlap_t mayOverlap, IsZeroed_t isZeroed = IsNotZeroed,
605             IsSanitizerChecked_t isChecked = IsNotSanitizerChecked) {
606     return forAddr(LV.getAddress(), LV.getQuals(), isDestructed, needsGC,
607                    isAliased, mayOverlap, isZeroed, isChecked);
608   }
609 
610   IsDestructed_t isExternallyDestructed() const {
611     return IsDestructed_t(DestructedFlag);
612   }
613   void setExternallyDestructed(bool destructed = true) {
614     DestructedFlag = destructed;
615   }
616 
617   Qualifiers getQualifiers() const { return Quals; }
618 
619   bool isVolatile() const {
620     return Quals.hasVolatile();
621   }
622 
623   void setVolatile(bool flag) {
624     if (flag)
625       Quals.addVolatile();
626     else
627       Quals.removeVolatile();
628   }
629 
630   Qualifiers::ObjCLifetime getObjCLifetime() const {
631     return Quals.getObjCLifetime();
632   }
633 
634   NeedsGCBarriers_t requiresGCollection() const {
635     return NeedsGCBarriers_t(ObjCGCFlag);
636   }
637 
638   llvm::Value *getPointer(QualType PointeeTy, CodeGenFunction &CGF) const;
639 
640   llvm::Value *emitRawPointer(CodeGenFunction &CGF) const {
641     return Addr.isValid() ? Addr.emitRawPointer(CGF) : nullptr;
642   }
643 
644   Address getAddress() const {
645     return Addr;
646   }
647 
648   bool isIgnored() const { return !Addr.isValid(); }
649 
650   CharUnits getAlignment() const {
651     return Addr.getAlignment();
652   }
653 
654   IsAliased_t isPotentiallyAliased() const {
655     return IsAliased_t(AliasedFlag);
656   }
657 
658   Overlap_t mayOverlap() const {
659     return Overlap_t(OverlapFlag);
660   }
661 
662   bool isSanitizerChecked() const {
663     return SanitizerCheckedFlag;
664   }
665 
666   RValue asRValue() const {
667     if (isIgnored()) {
668       return RValue::getIgnored();
669     } else {
670       return RValue::getAggregate(getAddress(), isVolatile());
671     }
672   }
673 
674   void setZeroed(bool V = true) { ZeroedFlag = V; }
675   IsZeroed_t isZeroed() const {
676     return IsZeroed_t(ZeroedFlag);
677   }
678 
679   /// Get the preferred size to use when storing a value to this slot. This
680   /// is the type size unless that might overlap another object, in which
681   /// case it's the dsize.
682   CharUnits getPreferredSize(ASTContext &Ctx, QualType Type) const {
683     return mayOverlap() ? Ctx.getTypeInfoDataSizeInChars(Type).Width
684                         : Ctx.getTypeSizeInChars(Type);
685   }
686 };
687 
688 }  // end namespace CodeGen
689 }  // end namespace clang
690 
691 #endif
692