1 //===-- CGValue.h - LLVM CodeGen wrappers for llvm::Value* ------*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
9 // These classes implement wrappers around llvm::Value in order to
10 // fully represent the range of values for C L- and R- values.
12 //===----------------------------------------------------------------------===//
14 #ifndef LLVM_CLANG_LIB_CODEGEN_CGVALUE_H
15 #define LLVM_CLANG_LIB_CODEGEN_CGVALUE_H
17 #include "clang/AST/ASTContext.h"
18 #include "clang/AST/Type.h"
19 #include "llvm/IR/Value.h"
20 #include "llvm/IR/Type.h"
22 #include "CodeGenTBAA.h"
32 class CodeGenFunction
;
33 struct CGBitFieldInfo
;
35 /// RValue - This trivial value class is used to represent the result of an
36 /// expression that is evaluated. It can be one of three things: either a
37 /// simple LLVM SSA value, a pair of SSA values for complex numbers, or the
38 /// address of an aggregate value in memory.
40 enum Flavor
{ Scalar
, Complex
, Aggregate
};
42 // The shift to make to an aggregate's alignment to make it look
44 enum { AggAlignShift
= 4 };
46 // Stores first value and flavor.
47 llvm::PointerIntPair
<llvm::Value
*, 2, Flavor
> V1
;
48 // Stores second value and volatility.
49 llvm::PointerIntPair
<llvm::Value
*, 1, bool> V2
;
50 // Stores element type for aggregate values.
51 llvm::Type
*ElementType
;
54 bool isScalar() const { return V1
.getInt() == Scalar
; }
55 bool isComplex() const { return V1
.getInt() == Complex
; }
56 bool isAggregate() const { return V1
.getInt() == Aggregate
; }
58 bool isVolatileQualified() const { return V2
.getInt(); }
60 /// getScalarVal() - Return the Value* of this scalar value.
61 llvm::Value
*getScalarVal() const {
62 assert(isScalar() && "Not a scalar!");
63 return V1
.getPointer();
66 /// getComplexVal - Return the real/imag components of this complex value.
68 std::pair
<llvm::Value
*, llvm::Value
*> getComplexVal() const {
69 return std::make_pair(V1
.getPointer(), V2
.getPointer());
72 /// getAggregateAddr() - Return the Value* of the address of the aggregate.
73 Address
getAggregateAddress() const {
74 assert(isAggregate() && "Not an aggregate!");
75 auto align
= reinterpret_cast<uintptr_t>(V2
.getPointer()) >> AggAlignShift
;
77 V1
.getPointer(), ElementType
, CharUnits::fromQuantity(align
));
79 llvm::Value
*getAggregatePointer() const {
80 assert(isAggregate() && "Not an aggregate!");
81 return V1
.getPointer();
84 static RValue
getIgnored() {
85 // FIXME: should we make this a more explicit state?
89 static RValue
get(llvm::Value
*V
) {
96 static RValue
getComplex(llvm::Value
*V1
, llvm::Value
*V2
) {
100 ER
.V1
.setInt(Complex
);
104 static RValue
getComplex(const std::pair
<llvm::Value
*, llvm::Value
*> &C
) {
105 return getComplex(C
.first
, C
.second
);
107 // FIXME: Aggregate rvalues need to retain information about whether they are
108 // volatile or not. Remove default to find all places that probably get this
110 static RValue
getAggregate(Address addr
, bool isVolatile
= false) {
112 ER
.V1
.setPointer(addr
.getPointer());
113 ER
.V1
.setInt(Aggregate
);
114 ER
.ElementType
= addr
.getElementType();
116 auto align
= static_cast<uintptr_t>(addr
.getAlignment().getQuantity());
117 ER
.V2
.setPointer(reinterpret_cast<llvm::Value
*>(align
<< AggAlignShift
));
118 ER
.V2
.setInt(isVolatile
);
123 /// Does an ARC strong l-value have precise lifetime?
124 enum ARCPreciseLifetime_t
{
125 ARCImpreciseLifetime
, ARCPreciseLifetime
128 /// The source of the alignment of an l-value; an expression of
129 /// confidence in the alignment actually matching the estimate.
130 enum class AlignmentSource
{
131 /// The l-value was an access to a declared entity or something
132 /// equivalently strong, like the address of an array allocated by a
133 /// language runtime.
136 /// The l-value was considered opaque, so the alignment was
137 /// determined from a type, but that type was an explicitly-aligned
141 /// The l-value was considered opaque, so the alignment was
142 /// determined from a type.
146 /// Given that the base address has the given alignment source, what's
147 /// our confidence in the alignment of the field?
148 static inline AlignmentSource
getFieldAlignmentSource(AlignmentSource Source
) {
149 // For now, we don't distinguish fields of opaque pointers from
150 // top-level declarations, but maybe we should.
151 return AlignmentSource::Decl
;
154 class LValueBaseInfo
{
155 AlignmentSource AlignSource
;
158 explicit LValueBaseInfo(AlignmentSource Source
= AlignmentSource::Type
)
159 : AlignSource(Source
) {}
160 AlignmentSource
getAlignmentSource() const { return AlignSource
; }
161 void setAlignmentSource(AlignmentSource Source
) { AlignSource
= Source
; }
163 void mergeForCast(const LValueBaseInfo
&Info
) {
164 setAlignmentSource(Info
.getAlignmentSource());
168 /// LValue - This represents an lvalue references. Because C/C++ allow
169 /// bitfields, this is not a simple LLVM pointer, it may be a pointer plus a
173 Simple
, // This is a normal l-value, use getAddress().
174 VectorElt
, // This is a vector element l-value (V[i]), use getVector*
175 BitField
, // This is a bitfield l-value, use getBitfield*.
176 ExtVectorElt
, // This is an extended vector subset, use getExtVectorComp
177 GlobalReg
, // This is a register l-value, use getGlobalReg()
178 MatrixElt
// This is a matrix element, use getVector*
182 llvm::Type
*ElementType
;
185 // Index into a vector subscript: V[i]
186 llvm::Value
*VectorIdx
;
188 // ExtVector element subset: V.xyx
189 llvm::Constant
*VectorElts
;
191 // BitField start bit and size
192 const CGBitFieldInfo
*BitFieldInfo
;
197 // 'const' is unused here
200 // The alignment to use when accessing this lvalue. (For vector elements,
201 // this is the alignment of the whole vector.)
204 // objective-c's ivar
207 // objective-c's ivar is an array
210 // LValue is non-gc'able for any reason, including being a parameter or local
214 // Lvalue is a global reference of an objective-c object
215 bool GlobalObjCRef
: 1;
217 // Lvalue is a thread local reference
218 bool ThreadLocalRef
: 1;
220 // Lvalue has ARC imprecise lifetime. We store this inverted to try
221 // to make the default bitfield pattern all-zeroes.
222 bool ImpreciseLifetime
: 1;
224 // This flag shows if a nontemporal load/stores should be used when accessing
226 bool Nontemporal
: 1;
228 // The pointer is known not to be null.
229 bool IsKnownNonNull
: 1;
231 LValueBaseInfo BaseInfo
;
232 TBAAAccessInfo TBAAInfo
;
237 void Initialize(QualType Type
, Qualifiers Quals
, CharUnits Alignment
,
238 LValueBaseInfo BaseInfo
, TBAAAccessInfo TBAAInfo
) {
239 assert((!Alignment
.isZero() || Type
->isIncompleteType()) &&
240 "initializing l-value with zero alignment!");
242 assert(ElementType
== nullptr && "Global reg does not store elem type");
244 assert(ElementType
!= nullptr && "Must have elem type");
248 const unsigned MaxAlign
= 1U << 31;
249 this->Alignment
= Alignment
.getQuantity() <= MaxAlign
250 ? Alignment
.getQuantity()
252 assert(this->Alignment
== Alignment
.getQuantity() &&
253 "Alignment exceeds allowed max!");
254 this->BaseInfo
= BaseInfo
;
255 this->TBAAInfo
= TBAAInfo
;
257 // Initialize Objective-C flags.
258 this->Ivar
= this->ObjIsArray
= this->NonGC
= this->GlobalObjCRef
= false;
259 this->ImpreciseLifetime
= false;
260 this->Nontemporal
= false;
261 this->ThreadLocalRef
= false;
262 this->BaseIvarExp
= nullptr;
266 bool isSimple() const { return LVType
== Simple
; }
267 bool isVectorElt() const { return LVType
== VectorElt
; }
268 bool isBitField() const { return LVType
== BitField
; }
269 bool isExtVectorElt() const { return LVType
== ExtVectorElt
; }
270 bool isGlobalReg() const { return LVType
== GlobalReg
; }
271 bool isMatrixElt() const { return LVType
== MatrixElt
; }
273 bool isVolatileQualified() const { return Quals
.hasVolatile(); }
274 bool isRestrictQualified() const { return Quals
.hasRestrict(); }
275 unsigned getVRQualifiers() const {
276 return Quals
.getCVRQualifiers() & ~Qualifiers::Const
;
279 QualType
getType() const { return Type
; }
281 Qualifiers::ObjCLifetime
getObjCLifetime() const {
282 return Quals
.getObjCLifetime();
285 bool isObjCIvar() const { return Ivar
; }
286 void setObjCIvar(bool Value
) { Ivar
= Value
; }
288 bool isObjCArray() const { return ObjIsArray
; }
289 void setObjCArray(bool Value
) { ObjIsArray
= Value
; }
291 bool isNonGC () const { return NonGC
; }
292 void setNonGC(bool Value
) { NonGC
= Value
; }
294 bool isGlobalObjCRef() const { return GlobalObjCRef
; }
295 void setGlobalObjCRef(bool Value
) { GlobalObjCRef
= Value
; }
297 bool isThreadLocalRef() const { return ThreadLocalRef
; }
298 void setThreadLocalRef(bool Value
) { ThreadLocalRef
= Value
;}
300 ARCPreciseLifetime_t
isARCPreciseLifetime() const {
301 return ARCPreciseLifetime_t(!ImpreciseLifetime
);
303 void setARCPreciseLifetime(ARCPreciseLifetime_t value
) {
304 ImpreciseLifetime
= (value
== ARCImpreciseLifetime
);
306 bool isNontemporal() const { return Nontemporal
; }
307 void setNontemporal(bool Value
) { Nontemporal
= Value
; }
309 bool isObjCWeak() const {
310 return Quals
.getObjCGCAttr() == Qualifiers::Weak
;
312 bool isObjCStrong() const {
313 return Quals
.getObjCGCAttr() == Qualifiers::Strong
;
316 bool isVolatile() const {
317 return Quals
.hasVolatile();
320 Expr
*getBaseIvarExp() const { return BaseIvarExp
; }
321 void setBaseIvarExp(Expr
*V
) { BaseIvarExp
= V
; }
323 TBAAAccessInfo
getTBAAInfo() const { return TBAAInfo
; }
324 void setTBAAInfo(TBAAAccessInfo Info
) { TBAAInfo
= Info
; }
326 const Qualifiers
&getQuals() const { return Quals
; }
327 Qualifiers
&getQuals() { return Quals
; }
329 LangAS
getAddressSpace() const { return Quals
.getAddressSpace(); }
331 CharUnits
getAlignment() const { return CharUnits::fromQuantity(Alignment
); }
332 void setAlignment(CharUnits A
) { Alignment
= A
.getQuantity(); }
334 LValueBaseInfo
getBaseInfo() const { return BaseInfo
; }
335 void setBaseInfo(LValueBaseInfo Info
) { BaseInfo
= Info
; }
337 KnownNonNull_t
isKnownNonNull() const {
338 return (KnownNonNull_t
)IsKnownNonNull
;
340 LValue
setKnownNonNull() {
341 IsKnownNonNull
= true;
346 llvm::Value
*getPointer(CodeGenFunction
&CGF
) const {
350 Address
getAddress(CodeGenFunction
&CGF
) const {
351 return Address(getPointer(CGF
), ElementType
, getAlignment(),
354 void setAddress(Address address
) {
356 V
= address
.getPointer();
357 ElementType
= address
.getElementType();
358 Alignment
= address
.getAlignment().getQuantity();
359 IsKnownNonNull
= address
.isKnownNonNull();
363 Address
getVectorAddress() const {
364 return Address(getVectorPointer(), ElementType
, getAlignment(),
365 (KnownNonNull_t
)isKnownNonNull());
367 llvm::Value
*getVectorPointer() const {
368 assert(isVectorElt());
371 llvm::Value
*getVectorIdx() const {
372 assert(isVectorElt());
376 Address
getMatrixAddress() const {
377 return Address(getMatrixPointer(), ElementType
, getAlignment(),
378 (KnownNonNull_t
)isKnownNonNull());
380 llvm::Value
*getMatrixPointer() const {
381 assert(isMatrixElt());
384 llvm::Value
*getMatrixIdx() const {
385 assert(isMatrixElt());
389 // extended vector elements.
390 Address
getExtVectorAddress() const {
391 return Address(getExtVectorPointer(), ElementType
, getAlignment(),
392 (KnownNonNull_t
)isKnownNonNull());
394 llvm::Value
*getExtVectorPointer() const {
395 assert(isExtVectorElt());
398 llvm::Constant
*getExtVectorElts() const {
399 assert(isExtVectorElt());
404 Address
getBitFieldAddress() const {
405 return Address(getBitFieldPointer(), ElementType
, getAlignment(),
406 (KnownNonNull_t
)isKnownNonNull());
408 llvm::Value
*getBitFieldPointer() const { assert(isBitField()); return V
; }
409 const CGBitFieldInfo
&getBitFieldInfo() const {
410 assert(isBitField());
411 return *BitFieldInfo
;
414 // global register lvalue
415 llvm::Value
*getGlobalReg() const { assert(isGlobalReg()); return V
; }
417 static LValue
MakeAddr(Address address
, QualType type
, ASTContext
&Context
,
418 LValueBaseInfo BaseInfo
, TBAAAccessInfo TBAAInfo
) {
419 Qualifiers qs
= type
.getQualifiers();
420 qs
.setObjCGCAttr(Context
.getObjCGCAttrKind(type
));
424 assert(address
.getPointer()->getType()->isPointerTy());
425 R
.V
= address
.getPointer();
426 R
.ElementType
= address
.getElementType();
427 R
.IsKnownNonNull
= address
.isKnownNonNull();
428 R
.Initialize(type
, qs
, address
.getAlignment(), BaseInfo
, TBAAInfo
);
432 static LValue
MakeVectorElt(Address vecAddress
, llvm::Value
*Idx
,
433 QualType type
, LValueBaseInfo BaseInfo
,
434 TBAAAccessInfo TBAAInfo
) {
436 R
.LVType
= VectorElt
;
437 R
.V
= vecAddress
.getPointer();
438 R
.ElementType
= vecAddress
.getElementType();
440 R
.IsKnownNonNull
= vecAddress
.isKnownNonNull();
441 R
.Initialize(type
, type
.getQualifiers(), vecAddress
.getAlignment(),
446 static LValue
MakeExtVectorElt(Address vecAddress
, llvm::Constant
*Elts
,
447 QualType type
, LValueBaseInfo BaseInfo
,
448 TBAAAccessInfo TBAAInfo
) {
450 R
.LVType
= ExtVectorElt
;
451 R
.V
= vecAddress
.getPointer();
452 R
.ElementType
= vecAddress
.getElementType();
454 R
.IsKnownNonNull
= vecAddress
.isKnownNonNull();
455 R
.Initialize(type
, type
.getQualifiers(), vecAddress
.getAlignment(),
460 /// Create a new object to represent a bit-field access.
462 /// \param Addr - The base address of the bit-field sequence this
463 /// bit-field refers to.
464 /// \param Info - The information describing how to perform the bit-field
466 static LValue
MakeBitfield(Address Addr
, const CGBitFieldInfo
&Info
,
467 QualType type
, LValueBaseInfo BaseInfo
,
468 TBAAAccessInfo TBAAInfo
) {
471 R
.V
= Addr
.getPointer();
472 R
.ElementType
= Addr
.getElementType();
473 R
.BitFieldInfo
= &Info
;
474 R
.IsKnownNonNull
= Addr
.isKnownNonNull();
475 R
.Initialize(type
, type
.getQualifiers(), Addr
.getAlignment(), BaseInfo
,
480 static LValue
MakeGlobalReg(llvm::Value
*V
, CharUnits alignment
,
483 R
.LVType
= GlobalReg
;
485 R
.ElementType
= nullptr;
486 R
.IsKnownNonNull
= true;
487 R
.Initialize(type
, type
.getQualifiers(), alignment
,
488 LValueBaseInfo(AlignmentSource::Decl
), TBAAAccessInfo());
492 static LValue
MakeMatrixElt(Address matAddress
, llvm::Value
*Idx
,
493 QualType type
, LValueBaseInfo BaseInfo
,
494 TBAAAccessInfo TBAAInfo
) {
496 R
.LVType
= MatrixElt
;
497 R
.V
= matAddress
.getPointer();
498 R
.ElementType
= matAddress
.getElementType();
500 R
.IsKnownNonNull
= matAddress
.isKnownNonNull();
501 R
.Initialize(type
, type
.getQualifiers(), matAddress
.getAlignment(),
506 RValue
asAggregateRValue(CodeGenFunction
&CGF
) const {
507 return RValue::getAggregate(getAddress(CGF
), isVolatileQualified());
511 /// An aggregate value slot.
519 /// DestructedFlag - This is set to true if some external code is
520 /// responsible for setting up a destructor for the slot. Otherwise
521 /// the code which constructs it should push the appropriate cleanup.
522 bool DestructedFlag
: 1;
524 /// ObjCGCFlag - This is set to true if writing to the memory in the
525 /// slot might require calling an appropriate Objective-C GC
526 /// barrier. The exact interaction here is unnecessarily mysterious.
529 /// ZeroedFlag - This is set to true if the memory in the slot is
530 /// known to be zero before the assignment into it. This means that
531 /// zero fields don't need to be set.
534 /// AliasedFlag - This is set to true if the slot might be aliased
535 /// and it's not undefined behavior to access it through such an
536 /// alias. Note that it's always undefined behavior to access a C++
537 /// object that's under construction through an alias derived from
538 /// outside the construction process.
540 /// This flag controls whether calls that produce the aggregate
541 /// value may be evaluated directly into the slot, or whether they
542 /// must be evaluated into an unaliased temporary and then memcpy'ed
543 /// over. Since it's invalid in general to memcpy a non-POD C++
544 /// object, it's important that this flag never be set when
545 /// evaluating an expression which constructs such an object.
546 bool AliasedFlag
: 1;
548 /// This is set to true if the tail padding of this slot might overlap
549 /// another object that may have already been initialized (and whose
550 /// value must be preserved by this initialization). If so, we may only
551 /// store up to the dsize of the type. Otherwise we can widen stores to
552 /// the size of the type.
553 bool OverlapFlag
: 1;
555 /// If is set to true, sanitizer checks are already generated for this address
556 /// or not required. For instance, if this address represents an object
557 /// created in 'new' expression, sanitizer checks for memory is made as a part
558 /// of 'operator new' emission and object constructor should not generate
560 bool SanitizerCheckedFlag
: 1;
562 AggValueSlot(Address Addr
, Qualifiers Quals
, bool DestructedFlag
,
563 bool ObjCGCFlag
, bool ZeroedFlag
, bool AliasedFlag
,
564 bool OverlapFlag
, bool SanitizerCheckedFlag
)
565 : Addr(Addr
), Quals(Quals
), DestructedFlag(DestructedFlag
),
566 ObjCGCFlag(ObjCGCFlag
), ZeroedFlag(ZeroedFlag
),
567 AliasedFlag(AliasedFlag
), OverlapFlag(OverlapFlag
),
568 SanitizerCheckedFlag(SanitizerCheckedFlag
) {}
571 enum IsAliased_t
{ IsNotAliased
, IsAliased
};
572 enum IsDestructed_t
{ IsNotDestructed
, IsDestructed
};
573 enum IsZeroed_t
{ IsNotZeroed
, IsZeroed
};
574 enum Overlap_t
{ DoesNotOverlap
, MayOverlap
};
575 enum NeedsGCBarriers_t
{ DoesNotNeedGCBarriers
, NeedsGCBarriers
};
576 enum IsSanitizerChecked_t
{ IsNotSanitizerChecked
, IsSanitizerChecked
};
578 /// ignored - Returns an aggregate value slot indicating that the
579 /// aggregate value is being ignored.
580 static AggValueSlot
ignored() {
581 return forAddr(Address::invalid(), Qualifiers(), IsNotDestructed
,
582 DoesNotNeedGCBarriers
, IsNotAliased
, DoesNotOverlap
);
585 /// forAddr - Make a slot for an aggregate value.
587 /// \param quals - The qualifiers that dictate how the slot should
588 /// be initialied. Only 'volatile' and the Objective-C lifetime
589 /// qualifiers matter.
591 /// \param isDestructed - true if something else is responsible
592 /// for calling destructors on this object
593 /// \param needsGC - true if the slot is potentially located
594 /// somewhere that ObjC GC calls should be emitted for
595 static AggValueSlot
forAddr(Address addr
,
597 IsDestructed_t isDestructed
,
598 NeedsGCBarriers_t needsGC
,
599 IsAliased_t isAliased
,
600 Overlap_t mayOverlap
,
601 IsZeroed_t isZeroed
= IsNotZeroed
,
602 IsSanitizerChecked_t isChecked
= IsNotSanitizerChecked
) {
604 addr
.setKnownNonNull();
605 return AggValueSlot(addr
, quals
, isDestructed
, needsGC
, isZeroed
, isAliased
,
606 mayOverlap
, isChecked
);
610 forLValue(const LValue
&LV
, CodeGenFunction
&CGF
, IsDestructed_t isDestructed
,
611 NeedsGCBarriers_t needsGC
, IsAliased_t isAliased
,
612 Overlap_t mayOverlap
, IsZeroed_t isZeroed
= IsNotZeroed
,
613 IsSanitizerChecked_t isChecked
= IsNotSanitizerChecked
) {
614 return forAddr(LV
.getAddress(CGF
), LV
.getQuals(), isDestructed
, needsGC
,
615 isAliased
, mayOverlap
, isZeroed
, isChecked
);
618 IsDestructed_t
isExternallyDestructed() const {
619 return IsDestructed_t(DestructedFlag
);
621 void setExternallyDestructed(bool destructed
= true) {
622 DestructedFlag
= destructed
;
625 Qualifiers
getQualifiers() const { return Quals
; }
627 bool isVolatile() const {
628 return Quals
.hasVolatile();
631 void setVolatile(bool flag
) {
635 Quals
.removeVolatile();
638 Qualifiers::ObjCLifetime
getObjCLifetime() const {
639 return Quals
.getObjCLifetime();
642 NeedsGCBarriers_t
requiresGCollection() const {
643 return NeedsGCBarriers_t(ObjCGCFlag
);
646 llvm::Value
*getPointer() const {
647 return Addr
.getPointer();
650 Address
getAddress() const {
654 bool isIgnored() const {
655 return !Addr
.isValid();
658 CharUnits
getAlignment() const {
659 return Addr
.getAlignment();
662 IsAliased_t
isPotentiallyAliased() const {
663 return IsAliased_t(AliasedFlag
);
666 Overlap_t
mayOverlap() const {
667 return Overlap_t(OverlapFlag
);
670 bool isSanitizerChecked() const {
671 return SanitizerCheckedFlag
;
674 RValue
asRValue() const {
676 return RValue::getIgnored();
678 return RValue::getAggregate(getAddress(), isVolatile());
682 void setZeroed(bool V
= true) { ZeroedFlag
= V
; }
683 IsZeroed_t
isZeroed() const {
684 return IsZeroed_t(ZeroedFlag
);
687 /// Get the preferred size to use when storing a value to this slot. This
688 /// is the type size unless that might overlap another object, in which
689 /// case it's the dsize.
690 CharUnits
getPreferredSize(ASTContext
&Ctx
, QualType Type
) const {
691 return mayOverlap() ? Ctx
.getTypeInfoDataSizeInChars(Type
).Width
692 : Ctx
.getTypeSizeInChars(Type
);
696 } // end namespace CodeGen
697 } // end namespace clang