File: | clang/lib/CodeGen/CGExprScalar.cpp |
Warning: | line 3838, column 39 Called C++ object pointer is null |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
1 | //===--- CGExprScalar.cpp - Emit LLVM Code for Scalar Exprs ---------------===// | ||||
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 Expr nodes with scalar LLVM types as LLVM code. | ||||
10 | // | ||||
11 | //===----------------------------------------------------------------------===// | ||||
12 | |||||
13 | #include "CGCXXABI.h" | ||||
14 | #include "CGCleanup.h" | ||||
15 | #include "CGDebugInfo.h" | ||||
16 | #include "CGObjCRuntime.h" | ||||
17 | #include "CGOpenMPRuntime.h" | ||||
18 | #include "CodeGenFunction.h" | ||||
19 | #include "CodeGenModule.h" | ||||
20 | #include "ConstantEmitter.h" | ||||
21 | #include "TargetInfo.h" | ||||
22 | #include "clang/AST/ASTContext.h" | ||||
23 | #include "clang/AST/Attr.h" | ||||
24 | #include "clang/AST/DeclObjC.h" | ||||
25 | #include "clang/AST/Expr.h" | ||||
26 | #include "clang/AST/RecordLayout.h" | ||||
27 | #include "clang/AST/StmtVisitor.h" | ||||
28 | #include "clang/Basic/CodeGenOptions.h" | ||||
29 | #include "clang/Basic/FixedPoint.h" | ||||
30 | #include "clang/Basic/TargetInfo.h" | ||||
31 | #include "llvm/ADT/Optional.h" | ||||
32 | #include "llvm/IR/CFG.h" | ||||
33 | #include "llvm/IR/Constants.h" | ||||
34 | #include "llvm/IR/DataLayout.h" | ||||
35 | #include "llvm/IR/Function.h" | ||||
36 | #include "llvm/IR/GetElementPtrTypeIterator.h" | ||||
37 | #include "llvm/IR/GlobalVariable.h" | ||||
38 | #include "llvm/IR/Intrinsics.h" | ||||
39 | #include "llvm/IR/IntrinsicsPowerPC.h" | ||||
40 | #include "llvm/IR/Module.h" | ||||
41 | #include <cstdarg> | ||||
42 | |||||
43 | using namespace clang; | ||||
44 | using namespace CodeGen; | ||||
45 | using llvm::Value; | ||||
46 | |||||
47 | //===----------------------------------------------------------------------===// | ||||
48 | // Scalar Expression Emitter | ||||
49 | //===----------------------------------------------------------------------===// | ||||
50 | |||||
51 | namespace { | ||||
52 | |||||
53 | /// Determine whether the given binary operation may overflow. | ||||
54 | /// Sets \p Result to the value of the operation for BO_Add, BO_Sub, BO_Mul, | ||||
55 | /// and signed BO_{Div,Rem}. For these opcodes, and for unsigned BO_{Div,Rem}, | ||||
56 | /// the returned overflow check is precise. The returned value is 'true' for | ||||
57 | /// all other opcodes, to be conservative. | ||||
58 | bool mayHaveIntegerOverflow(llvm::ConstantInt *LHS, llvm::ConstantInt *RHS, | ||||
59 | BinaryOperator::Opcode Opcode, bool Signed, | ||||
60 | llvm::APInt &Result) { | ||||
61 | // Assume overflow is possible, unless we can prove otherwise. | ||||
62 | bool Overflow = true; | ||||
63 | const auto &LHSAP = LHS->getValue(); | ||||
64 | const auto &RHSAP = RHS->getValue(); | ||||
65 | if (Opcode == BO_Add) { | ||||
66 | if (Signed) | ||||
67 | Result = LHSAP.sadd_ov(RHSAP, Overflow); | ||||
68 | else | ||||
69 | Result = LHSAP.uadd_ov(RHSAP, Overflow); | ||||
70 | } else if (Opcode == BO_Sub) { | ||||
71 | if (Signed) | ||||
72 | Result = LHSAP.ssub_ov(RHSAP, Overflow); | ||||
73 | else | ||||
74 | Result = LHSAP.usub_ov(RHSAP, Overflow); | ||||
75 | } else if (Opcode == BO_Mul) { | ||||
76 | if (Signed) | ||||
77 | Result = LHSAP.smul_ov(RHSAP, Overflow); | ||||
78 | else | ||||
79 | Result = LHSAP.umul_ov(RHSAP, Overflow); | ||||
80 | } else if (Opcode == BO_Div || Opcode == BO_Rem) { | ||||
81 | if (Signed && !RHS->isZero()) | ||||
82 | Result = LHSAP.sdiv_ov(RHSAP, Overflow); | ||||
83 | else | ||||
84 | return false; | ||||
85 | } | ||||
86 | return Overflow; | ||||
87 | } | ||||
88 | |||||
89 | struct BinOpInfo { | ||||
90 | Value *LHS; | ||||
91 | Value *RHS; | ||||
92 | QualType Ty; // Computation Type. | ||||
93 | BinaryOperator::Opcode Opcode; // Opcode of BinOp to perform | ||||
94 | FPOptions FPFeatures; | ||||
95 | const Expr *E; // Entire expr, for error unsupported. May not be binop. | ||||
96 | |||||
97 | /// Check if the binop can result in integer overflow. | ||||
98 | bool mayHaveIntegerOverflow() const { | ||||
99 | // Without constant input, we can't rule out overflow. | ||||
100 | auto *LHSCI = dyn_cast<llvm::ConstantInt>(LHS); | ||||
101 | auto *RHSCI = dyn_cast<llvm::ConstantInt>(RHS); | ||||
102 | if (!LHSCI || !RHSCI) | ||||
103 | return true; | ||||
104 | |||||
105 | llvm::APInt Result; | ||||
106 | return ::mayHaveIntegerOverflow( | ||||
107 | LHSCI, RHSCI, Opcode, Ty->hasSignedIntegerRepresentation(), Result); | ||||
108 | } | ||||
109 | |||||
110 | /// Check if the binop computes a division or a remainder. | ||||
111 | bool isDivremOp() const { | ||||
112 | return Opcode == BO_Div || Opcode == BO_Rem || Opcode == BO_DivAssign || | ||||
113 | Opcode == BO_RemAssign; | ||||
114 | } | ||||
115 | |||||
116 | /// Check if the binop can result in an integer division by zero. | ||||
117 | bool mayHaveIntegerDivisionByZero() const { | ||||
118 | if (isDivremOp()) | ||||
119 | if (auto *CI = dyn_cast<llvm::ConstantInt>(RHS)) | ||||
120 | return CI->isZero(); | ||||
121 | return true; | ||||
122 | } | ||||
123 | |||||
124 | /// Check if the binop can result in a float division by zero. | ||||
125 | bool mayHaveFloatDivisionByZero() const { | ||||
126 | if (isDivremOp()) | ||||
127 | if (auto *CFP = dyn_cast<llvm::ConstantFP>(RHS)) | ||||
128 | return CFP->isZero(); | ||||
129 | return true; | ||||
130 | } | ||||
131 | |||||
132 | /// Check if either operand is a fixed point type or integer type, with at | ||||
133 | /// least one being a fixed point type. In any case, this | ||||
134 | /// operation did not follow usual arithmetic conversion and both operands may | ||||
135 | /// not be the same. | ||||
136 | bool isFixedPointBinOp() const { | ||||
137 | // We cannot simply check the result type since comparison operations return | ||||
138 | // an int. | ||||
139 | if (const auto *BinOp = dyn_cast<BinaryOperator>(E)) { | ||||
140 | QualType LHSType = BinOp->getLHS()->getType(); | ||||
141 | QualType RHSType = BinOp->getRHS()->getType(); | ||||
142 | return LHSType->isFixedPointType() || RHSType->isFixedPointType(); | ||||
143 | } | ||||
144 | return false; | ||||
145 | } | ||||
146 | }; | ||||
147 | |||||
148 | static bool MustVisitNullValue(const Expr *E) { | ||||
149 | // If a null pointer expression's type is the C++0x nullptr_t, then | ||||
150 | // it's not necessarily a simple constant and it must be evaluated | ||||
151 | // for its potential side effects. | ||||
152 | return E->getType()->isNullPtrType(); | ||||
153 | } | ||||
154 | |||||
155 | /// If \p E is a widened promoted integer, get its base (unpromoted) type. | ||||
156 | static llvm::Optional<QualType> getUnwidenedIntegerType(const ASTContext &Ctx, | ||||
157 | const Expr *E) { | ||||
158 | const Expr *Base = E->IgnoreImpCasts(); | ||||
159 | if (E == Base) | ||||
160 | return llvm::None; | ||||
161 | |||||
162 | QualType BaseTy = Base->getType(); | ||||
163 | if (!BaseTy->isPromotableIntegerType() || | ||||
164 | Ctx.getTypeSize(BaseTy) >= Ctx.getTypeSize(E->getType())) | ||||
165 | return llvm::None; | ||||
166 | |||||
167 | return BaseTy; | ||||
168 | } | ||||
169 | |||||
170 | /// Check if \p E is a widened promoted integer. | ||||
171 | static bool IsWidenedIntegerOp(const ASTContext &Ctx, const Expr *E) { | ||||
172 | return getUnwidenedIntegerType(Ctx, E).hasValue(); | ||||
173 | } | ||||
174 | |||||
175 | /// Check if we can skip the overflow check for \p Op. | ||||
176 | static bool CanElideOverflowCheck(const ASTContext &Ctx, const BinOpInfo &Op) { | ||||
177 | assert((isa<UnaryOperator>(Op.E) || isa<BinaryOperator>(Op.E)) &&(((isa<UnaryOperator>(Op.E) || isa<BinaryOperator> (Op.E)) && "Expected a unary or binary operator") ? static_cast <void> (0) : __assert_fail ("(isa<UnaryOperator>(Op.E) || isa<BinaryOperator>(Op.E)) && \"Expected a unary or binary operator\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 178, __PRETTY_FUNCTION__)) | ||||
178 | "Expected a unary or binary operator")(((isa<UnaryOperator>(Op.E) || isa<BinaryOperator> (Op.E)) && "Expected a unary or binary operator") ? static_cast <void> (0) : __assert_fail ("(isa<UnaryOperator>(Op.E) || isa<BinaryOperator>(Op.E)) && \"Expected a unary or binary operator\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 178, __PRETTY_FUNCTION__)); | ||||
179 | |||||
180 | // If the binop has constant inputs and we can prove there is no overflow, | ||||
181 | // we can elide the overflow check. | ||||
182 | if (!Op.mayHaveIntegerOverflow()) | ||||
183 | return true; | ||||
184 | |||||
185 | // If a unary op has a widened operand, the op cannot overflow. | ||||
186 | if (const auto *UO = dyn_cast<UnaryOperator>(Op.E)) | ||||
187 | return !UO->canOverflow(); | ||||
188 | |||||
189 | // We usually don't need overflow checks for binops with widened operands. | ||||
190 | // Multiplication with promoted unsigned operands is a special case. | ||||
191 | const auto *BO = cast<BinaryOperator>(Op.E); | ||||
192 | auto OptionalLHSTy = getUnwidenedIntegerType(Ctx, BO->getLHS()); | ||||
193 | if (!OptionalLHSTy) | ||||
194 | return false; | ||||
195 | |||||
196 | auto OptionalRHSTy = getUnwidenedIntegerType(Ctx, BO->getRHS()); | ||||
197 | if (!OptionalRHSTy) | ||||
198 | return false; | ||||
199 | |||||
200 | QualType LHSTy = *OptionalLHSTy; | ||||
201 | QualType RHSTy = *OptionalRHSTy; | ||||
202 | |||||
203 | // This is the simple case: binops without unsigned multiplication, and with | ||||
204 | // widened operands. No overflow check is needed here. | ||||
205 | if ((Op.Opcode != BO_Mul && Op.Opcode != BO_MulAssign) || | ||||
206 | !LHSTy->isUnsignedIntegerType() || !RHSTy->isUnsignedIntegerType()) | ||||
207 | return true; | ||||
208 | |||||
209 | // For unsigned multiplication the overflow check can be elided if either one | ||||
210 | // of the unpromoted types are less than half the size of the promoted type. | ||||
211 | unsigned PromotedSize = Ctx.getTypeSize(Op.E->getType()); | ||||
212 | return (2 * Ctx.getTypeSize(LHSTy)) < PromotedSize || | ||||
213 | (2 * Ctx.getTypeSize(RHSTy)) < PromotedSize; | ||||
214 | } | ||||
215 | |||||
216 | /// Update the FastMathFlags of LLVM IR from the FPOptions in LangOptions. | ||||
217 | static void updateFastMathFlags(llvm::FastMathFlags &FMF, | ||||
218 | FPOptions FPFeatures) { | ||||
219 | FMF.setAllowContract(FPFeatures.allowFPContractAcrossStatement()); | ||||
220 | } | ||||
221 | |||||
222 | /// Propagate fast-math flags from \p Op to the instruction in \p V. | ||||
223 | static Value *propagateFMFlags(Value *V, const BinOpInfo &Op) { | ||||
224 | if (auto *I = dyn_cast<llvm::Instruction>(V)) { | ||||
225 | llvm::FastMathFlags FMF = I->getFastMathFlags(); | ||||
226 | updateFastMathFlags(FMF, Op.FPFeatures); | ||||
227 | I->setFastMathFlags(FMF); | ||||
228 | } | ||||
229 | return V; | ||||
230 | } | ||||
231 | |||||
232 | class ScalarExprEmitter | ||||
233 | : public StmtVisitor<ScalarExprEmitter, Value*> { | ||||
234 | CodeGenFunction &CGF; | ||||
235 | CGBuilderTy &Builder; | ||||
236 | bool IgnoreResultAssign; | ||||
237 | llvm::LLVMContext &VMContext; | ||||
238 | public: | ||||
239 | |||||
240 | ScalarExprEmitter(CodeGenFunction &cgf, bool ira=false) | ||||
241 | : CGF(cgf), Builder(CGF.Builder), IgnoreResultAssign(ira), | ||||
242 | VMContext(cgf.getLLVMContext()) { | ||||
243 | } | ||||
244 | |||||
245 | //===--------------------------------------------------------------------===// | ||||
246 | // Utilities | ||||
247 | //===--------------------------------------------------------------------===// | ||||
248 | |||||
249 | bool TestAndClearIgnoreResultAssign() { | ||||
250 | bool I = IgnoreResultAssign; | ||||
251 | IgnoreResultAssign = false; | ||||
252 | return I; | ||||
253 | } | ||||
254 | |||||
255 | llvm::Type *ConvertType(QualType T) { return CGF.ConvertType(T); } | ||||
256 | LValue EmitLValue(const Expr *E) { return CGF.EmitLValue(E); } | ||||
257 | LValue EmitCheckedLValue(const Expr *E, CodeGenFunction::TypeCheckKind TCK) { | ||||
258 | return CGF.EmitCheckedLValue(E, TCK); | ||||
259 | } | ||||
260 | |||||
261 | void EmitBinOpCheck(ArrayRef<std::pair<Value *, SanitizerMask>> Checks, | ||||
262 | const BinOpInfo &Info); | ||||
263 | |||||
264 | Value *EmitLoadOfLValue(LValue LV, SourceLocation Loc) { | ||||
265 | return CGF.EmitLoadOfLValue(LV, Loc).getScalarVal(); | ||||
266 | } | ||||
267 | |||||
268 | void EmitLValueAlignmentAssumption(const Expr *E, Value *V) { | ||||
269 | const AlignValueAttr *AVAttr = nullptr; | ||||
270 | if (const auto *DRE = dyn_cast<DeclRefExpr>(E)) { | ||||
271 | const ValueDecl *VD = DRE->getDecl(); | ||||
272 | |||||
273 | if (VD->getType()->isReferenceType()) { | ||||
274 | if (const auto *TTy = | ||||
275 | dyn_cast<TypedefType>(VD->getType().getNonReferenceType())) | ||||
276 | AVAttr = TTy->getDecl()->getAttr<AlignValueAttr>(); | ||||
277 | } else { | ||||
278 | // Assumptions for function parameters are emitted at the start of the | ||||
279 | // function, so there is no need to repeat that here, | ||||
280 | // unless the alignment-assumption sanitizer is enabled, | ||||
281 | // then we prefer the assumption over alignment attribute | ||||
282 | // on IR function param. | ||||
283 | if (isa<ParmVarDecl>(VD) && !CGF.SanOpts.has(SanitizerKind::Alignment)) | ||||
284 | return; | ||||
285 | |||||
286 | AVAttr = VD->getAttr<AlignValueAttr>(); | ||||
287 | } | ||||
288 | } | ||||
289 | |||||
290 | if (!AVAttr) | ||||
291 | if (const auto *TTy = | ||||
292 | dyn_cast<TypedefType>(E->getType())) | ||||
293 | AVAttr = TTy->getDecl()->getAttr<AlignValueAttr>(); | ||||
294 | |||||
295 | if (!AVAttr) | ||||
296 | return; | ||||
297 | |||||
298 | Value *AlignmentValue = CGF.EmitScalarExpr(AVAttr->getAlignment()); | ||||
299 | llvm::ConstantInt *AlignmentCI = cast<llvm::ConstantInt>(AlignmentValue); | ||||
300 | CGF.EmitAlignmentAssumption(V, E, AVAttr->getLocation(), AlignmentCI); | ||||
301 | } | ||||
302 | |||||
303 | /// EmitLoadOfLValue - Given an expression with complex type that represents a | ||||
304 | /// value l-value, this method emits the address of the l-value, then loads | ||||
305 | /// and returns the result. | ||||
306 | Value *EmitLoadOfLValue(const Expr *E) { | ||||
307 | Value *V = EmitLoadOfLValue(EmitCheckedLValue(E, CodeGenFunction::TCK_Load), | ||||
308 | E->getExprLoc()); | ||||
309 | |||||
310 | EmitLValueAlignmentAssumption(E, V); | ||||
311 | return V; | ||||
312 | } | ||||
313 | |||||
314 | /// EmitConversionToBool - Convert the specified expression value to a | ||||
315 | /// boolean (i1) truth value. This is equivalent to "Val != 0". | ||||
316 | Value *EmitConversionToBool(Value *Src, QualType DstTy); | ||||
317 | |||||
318 | /// Emit a check that a conversion from a floating-point type does not | ||||
319 | /// overflow. | ||||
320 | void EmitFloatConversionCheck(Value *OrigSrc, QualType OrigSrcType, | ||||
321 | Value *Src, QualType SrcType, QualType DstType, | ||||
322 | llvm::Type *DstTy, SourceLocation Loc); | ||||
323 | |||||
324 | /// Known implicit conversion check kinds. | ||||
325 | /// Keep in sync with the enum of the same name in ubsan_handlers.h | ||||
326 | enum ImplicitConversionCheckKind : unsigned char { | ||||
327 | ICCK_IntegerTruncation = 0, // Legacy, was only used by clang 7. | ||||
328 | ICCK_UnsignedIntegerTruncation = 1, | ||||
329 | ICCK_SignedIntegerTruncation = 2, | ||||
330 | ICCK_IntegerSignChange = 3, | ||||
331 | ICCK_SignedIntegerTruncationOrSignChange = 4, | ||||
332 | }; | ||||
333 | |||||
334 | /// Emit a check that an [implicit] truncation of an integer does not | ||||
335 | /// discard any bits. It is not UB, so we use the value after truncation. | ||||
336 | void EmitIntegerTruncationCheck(Value *Src, QualType SrcType, Value *Dst, | ||||
337 | QualType DstType, SourceLocation Loc); | ||||
338 | |||||
339 | /// Emit a check that an [implicit] conversion of an integer does not change | ||||
340 | /// the sign of the value. It is not UB, so we use the value after conversion. | ||||
341 | /// NOTE: Src and Dst may be the exact same value! (point to the same thing) | ||||
342 | void EmitIntegerSignChangeCheck(Value *Src, QualType SrcType, Value *Dst, | ||||
343 | QualType DstType, SourceLocation Loc); | ||||
344 | |||||
345 | /// Emit a conversion from the specified type to the specified destination | ||||
346 | /// type, both of which are LLVM scalar types. | ||||
347 | struct ScalarConversionOpts { | ||||
348 | bool TreatBooleanAsSigned; | ||||
349 | bool EmitImplicitIntegerTruncationChecks; | ||||
350 | bool EmitImplicitIntegerSignChangeChecks; | ||||
351 | |||||
352 | ScalarConversionOpts() | ||||
353 | : TreatBooleanAsSigned(false), | ||||
354 | EmitImplicitIntegerTruncationChecks(false), | ||||
355 | EmitImplicitIntegerSignChangeChecks(false) {} | ||||
356 | |||||
357 | ScalarConversionOpts(clang::SanitizerSet SanOpts) | ||||
358 | : TreatBooleanAsSigned(false), | ||||
359 | EmitImplicitIntegerTruncationChecks( | ||||
360 | SanOpts.hasOneOf(SanitizerKind::ImplicitIntegerTruncation)), | ||||
361 | EmitImplicitIntegerSignChangeChecks( | ||||
362 | SanOpts.has(SanitizerKind::ImplicitIntegerSignChange)) {} | ||||
363 | }; | ||||
364 | Value * | ||||
365 | EmitScalarConversion(Value *Src, QualType SrcTy, QualType DstTy, | ||||
366 | SourceLocation Loc, | ||||
367 | ScalarConversionOpts Opts = ScalarConversionOpts()); | ||||
368 | |||||
369 | /// Convert between either a fixed point and other fixed point or fixed point | ||||
370 | /// and an integer. | ||||
371 | Value *EmitFixedPointConversion(Value *Src, QualType SrcTy, QualType DstTy, | ||||
372 | SourceLocation Loc); | ||||
373 | Value *EmitFixedPointConversion(Value *Src, FixedPointSemantics &SrcFixedSema, | ||||
374 | FixedPointSemantics &DstFixedSema, | ||||
375 | SourceLocation Loc, | ||||
376 | bool DstIsInteger = false); | ||||
377 | |||||
378 | /// Emit a conversion from the specified complex type to the specified | ||||
379 | /// destination type, where the destination type is an LLVM scalar type. | ||||
380 | Value *EmitComplexToScalarConversion(CodeGenFunction::ComplexPairTy Src, | ||||
381 | QualType SrcTy, QualType DstTy, | ||||
382 | SourceLocation Loc); | ||||
383 | |||||
384 | /// EmitNullValue - Emit a value that corresponds to null for the given type. | ||||
385 | Value *EmitNullValue(QualType Ty); | ||||
386 | |||||
387 | /// EmitFloatToBoolConversion - Perform an FP to boolean conversion. | ||||
388 | Value *EmitFloatToBoolConversion(Value *V) { | ||||
389 | // Compare against 0.0 for fp scalars. | ||||
390 | llvm::Value *Zero = llvm::Constant::getNullValue(V->getType()); | ||||
391 | return Builder.CreateFCmpUNE(V, Zero, "tobool"); | ||||
392 | } | ||||
393 | |||||
394 | /// EmitPointerToBoolConversion - Perform a pointer to boolean conversion. | ||||
395 | Value *EmitPointerToBoolConversion(Value *V, QualType QT) { | ||||
396 | Value *Zero = CGF.CGM.getNullPointer(cast<llvm::PointerType>(V->getType()), QT); | ||||
397 | |||||
398 | return Builder.CreateICmpNE(V, Zero, "tobool"); | ||||
399 | } | ||||
400 | |||||
401 | Value *EmitIntToBoolConversion(Value *V) { | ||||
402 | // Because of the type rules of C, we often end up computing a | ||||
403 | // logical value, then zero extending it to int, then wanting it | ||||
404 | // as a logical value again. Optimize this common case. | ||||
405 | if (llvm::ZExtInst *ZI = dyn_cast<llvm::ZExtInst>(V)) { | ||||
406 | if (ZI->getOperand(0)->getType() == Builder.getInt1Ty()) { | ||||
407 | Value *Result = ZI->getOperand(0); | ||||
408 | // If there aren't any more uses, zap the instruction to save space. | ||||
409 | // Note that there can be more uses, for example if this | ||||
410 | // is the result of an assignment. | ||||
411 | if (ZI->use_empty()) | ||||
412 | ZI->eraseFromParent(); | ||||
413 | return Result; | ||||
414 | } | ||||
415 | } | ||||
416 | |||||
417 | return Builder.CreateIsNotNull(V, "tobool"); | ||||
418 | } | ||||
419 | |||||
420 | //===--------------------------------------------------------------------===// | ||||
421 | // Visitor Methods | ||||
422 | //===--------------------------------------------------------------------===// | ||||
423 | |||||
424 | Value *Visit(Expr *E) { | ||||
425 | ApplyDebugLocation DL(CGF, E); | ||||
426 | return StmtVisitor<ScalarExprEmitter, Value*>::Visit(E); | ||||
427 | } | ||||
428 | |||||
429 | Value *VisitStmt(Stmt *S) { | ||||
430 | S->dump(CGF.getContext().getSourceManager()); | ||||
431 | llvm_unreachable("Stmt can't have complex result type!")::llvm::llvm_unreachable_internal("Stmt can't have complex result type!" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 431); | ||||
432 | } | ||||
433 | Value *VisitExpr(Expr *S); | ||||
434 | |||||
435 | Value *VisitConstantExpr(ConstantExpr *E) { | ||||
436 | return Visit(E->getSubExpr()); | ||||
437 | } | ||||
438 | Value *VisitParenExpr(ParenExpr *PE) { | ||||
439 | return Visit(PE->getSubExpr()); | ||||
440 | } | ||||
441 | Value *VisitSubstNonTypeTemplateParmExpr(SubstNonTypeTemplateParmExpr *E) { | ||||
442 | return Visit(E->getReplacement()); | ||||
443 | } | ||||
444 | Value *VisitGenericSelectionExpr(GenericSelectionExpr *GE) { | ||||
445 | return Visit(GE->getResultExpr()); | ||||
446 | } | ||||
447 | Value *VisitCoawaitExpr(CoawaitExpr *S) { | ||||
448 | return CGF.EmitCoawaitExpr(*S).getScalarVal(); | ||||
449 | } | ||||
450 | Value *VisitCoyieldExpr(CoyieldExpr *S) { | ||||
451 | return CGF.EmitCoyieldExpr(*S).getScalarVal(); | ||||
452 | } | ||||
453 | Value *VisitUnaryCoawait(const UnaryOperator *E) { | ||||
454 | return Visit(E->getSubExpr()); | ||||
455 | } | ||||
456 | |||||
457 | // Leaves. | ||||
458 | Value *VisitIntegerLiteral(const IntegerLiteral *E) { | ||||
459 | return Builder.getInt(E->getValue()); | ||||
460 | } | ||||
461 | Value *VisitFixedPointLiteral(const FixedPointLiteral *E) { | ||||
462 | return Builder.getInt(E->getValue()); | ||||
463 | } | ||||
464 | Value *VisitFloatingLiteral(const FloatingLiteral *E) { | ||||
465 | return llvm::ConstantFP::get(VMContext, E->getValue()); | ||||
466 | } | ||||
467 | Value *VisitCharacterLiteral(const CharacterLiteral *E) { | ||||
468 | return llvm::ConstantInt::get(ConvertType(E->getType()), E->getValue()); | ||||
469 | } | ||||
470 | Value *VisitObjCBoolLiteralExpr(const ObjCBoolLiteralExpr *E) { | ||||
471 | return llvm::ConstantInt::get(ConvertType(E->getType()), E->getValue()); | ||||
472 | } | ||||
473 | Value *VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *E) { | ||||
474 | return llvm::ConstantInt::get(ConvertType(E->getType()), E->getValue()); | ||||
475 | } | ||||
476 | Value *VisitCXXScalarValueInitExpr(const CXXScalarValueInitExpr *E) { | ||||
477 | return EmitNullValue(E->getType()); | ||||
478 | } | ||||
479 | Value *VisitGNUNullExpr(const GNUNullExpr *E) { | ||||
480 | return EmitNullValue(E->getType()); | ||||
481 | } | ||||
482 | Value *VisitOffsetOfExpr(OffsetOfExpr *E); | ||||
483 | Value *VisitUnaryExprOrTypeTraitExpr(const UnaryExprOrTypeTraitExpr *E); | ||||
484 | Value *VisitAddrLabelExpr(const AddrLabelExpr *E) { | ||||
485 | llvm::Value *V = CGF.GetAddrOfLabel(E->getLabel()); | ||||
486 | return Builder.CreateBitCast(V, ConvertType(E->getType())); | ||||
487 | } | ||||
488 | |||||
489 | Value *VisitSizeOfPackExpr(SizeOfPackExpr *E) { | ||||
490 | return llvm::ConstantInt::get(ConvertType(E->getType()),E->getPackLength()); | ||||
491 | } | ||||
492 | |||||
493 | Value *VisitPseudoObjectExpr(PseudoObjectExpr *E) { | ||||
494 | return CGF.EmitPseudoObjectRValue(E).getScalarVal(); | ||||
495 | } | ||||
496 | |||||
497 | Value *VisitOpaqueValueExpr(OpaqueValueExpr *E) { | ||||
498 | if (E->isGLValue()) | ||||
499 | return EmitLoadOfLValue(CGF.getOrCreateOpaqueLValueMapping(E), | ||||
500 | E->getExprLoc()); | ||||
501 | |||||
502 | // Otherwise, assume the mapping is the scalar directly. | ||||
503 | return CGF.getOrCreateOpaqueRValueMapping(E).getScalarVal(); | ||||
504 | } | ||||
505 | |||||
506 | // l-values. | ||||
507 | Value *VisitDeclRefExpr(DeclRefExpr *E) { | ||||
508 | if (CodeGenFunction::ConstantEmission Constant = CGF.tryEmitAsConstant(E)) | ||||
509 | return CGF.emitScalarConstant(Constant, E); | ||||
510 | return EmitLoadOfLValue(E); | ||||
511 | } | ||||
512 | |||||
513 | Value *VisitObjCSelectorExpr(ObjCSelectorExpr *E) { | ||||
514 | return CGF.EmitObjCSelectorExpr(E); | ||||
515 | } | ||||
516 | Value *VisitObjCProtocolExpr(ObjCProtocolExpr *E) { | ||||
517 | return CGF.EmitObjCProtocolExpr(E); | ||||
518 | } | ||||
519 | Value *VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) { | ||||
520 | return EmitLoadOfLValue(E); | ||||
521 | } | ||||
522 | Value *VisitObjCMessageExpr(ObjCMessageExpr *E) { | ||||
523 | if (E->getMethodDecl() && | ||||
524 | E->getMethodDecl()->getReturnType()->isReferenceType()) | ||||
525 | return EmitLoadOfLValue(E); | ||||
526 | return CGF.EmitObjCMessageExpr(E).getScalarVal(); | ||||
527 | } | ||||
528 | |||||
529 | Value *VisitObjCIsaExpr(ObjCIsaExpr *E) { | ||||
530 | LValue LV = CGF.EmitObjCIsaExpr(E); | ||||
531 | Value *V = CGF.EmitLoadOfLValue(LV, E->getExprLoc()).getScalarVal(); | ||||
532 | return V; | ||||
533 | } | ||||
534 | |||||
535 | Value *VisitObjCAvailabilityCheckExpr(ObjCAvailabilityCheckExpr *E) { | ||||
536 | VersionTuple Version = E->getVersion(); | ||||
537 | |||||
538 | // If we're checking for a platform older than our minimum deployment | ||||
539 | // target, we can fold the check away. | ||||
540 | if (Version <= CGF.CGM.getTarget().getPlatformMinVersion()) | ||||
541 | return llvm::ConstantInt::get(Builder.getInt1Ty(), 1); | ||||
542 | |||||
543 | Optional<unsigned> Min = Version.getMinor(), SMin = Version.getSubminor(); | ||||
544 | llvm::Value *Args[] = { | ||||
545 | llvm::ConstantInt::get(CGF.CGM.Int32Ty, Version.getMajor()), | ||||
546 | llvm::ConstantInt::get(CGF.CGM.Int32Ty, Min ? *Min : 0), | ||||
547 | llvm::ConstantInt::get(CGF.CGM.Int32Ty, SMin ? *SMin : 0), | ||||
548 | }; | ||||
549 | |||||
550 | return CGF.EmitBuiltinAvailable(Args); | ||||
551 | } | ||||
552 | |||||
553 | Value *VisitArraySubscriptExpr(ArraySubscriptExpr *E); | ||||
554 | Value *VisitShuffleVectorExpr(ShuffleVectorExpr *E); | ||||
555 | Value *VisitConvertVectorExpr(ConvertVectorExpr *E); | ||||
556 | Value *VisitMemberExpr(MemberExpr *E); | ||||
557 | Value *VisitExtVectorElementExpr(Expr *E) { return EmitLoadOfLValue(E); } | ||||
558 | Value *VisitCompoundLiteralExpr(CompoundLiteralExpr *E) { | ||||
559 | return EmitLoadOfLValue(E); | ||||
560 | } | ||||
561 | |||||
562 | Value *VisitInitListExpr(InitListExpr *E); | ||||
563 | |||||
564 | Value *VisitArrayInitIndexExpr(ArrayInitIndexExpr *E) { | ||||
565 | assert(CGF.getArrayInitIndex() &&((CGF.getArrayInitIndex() && "ArrayInitIndexExpr not inside an ArrayInitLoopExpr?" ) ? static_cast<void> (0) : __assert_fail ("CGF.getArrayInitIndex() && \"ArrayInitIndexExpr not inside an ArrayInitLoopExpr?\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 566, __PRETTY_FUNCTION__)) | ||||
566 | "ArrayInitIndexExpr not inside an ArrayInitLoopExpr?")((CGF.getArrayInitIndex() && "ArrayInitIndexExpr not inside an ArrayInitLoopExpr?" ) ? static_cast<void> (0) : __assert_fail ("CGF.getArrayInitIndex() && \"ArrayInitIndexExpr not inside an ArrayInitLoopExpr?\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 566, __PRETTY_FUNCTION__)); | ||||
567 | return CGF.getArrayInitIndex(); | ||||
568 | } | ||||
569 | |||||
570 | Value *VisitImplicitValueInitExpr(const ImplicitValueInitExpr *E) { | ||||
571 | return EmitNullValue(E->getType()); | ||||
572 | } | ||||
573 | Value *VisitExplicitCastExpr(ExplicitCastExpr *E) { | ||||
574 | CGF.CGM.EmitExplicitCastExprType(E, &CGF); | ||||
575 | return VisitCastExpr(E); | ||||
576 | } | ||||
577 | Value *VisitCastExpr(CastExpr *E); | ||||
578 | |||||
579 | Value *VisitCallExpr(const CallExpr *E) { | ||||
580 | if (E->getCallReturnType(CGF.getContext())->isReferenceType()) | ||||
581 | return EmitLoadOfLValue(E); | ||||
582 | |||||
583 | Value *V = CGF.EmitCallExpr(E).getScalarVal(); | ||||
584 | |||||
585 | EmitLValueAlignmentAssumption(E, V); | ||||
586 | return V; | ||||
587 | } | ||||
588 | |||||
589 | Value *VisitStmtExpr(const StmtExpr *E); | ||||
590 | |||||
591 | // Unary Operators. | ||||
592 | Value *VisitUnaryPostDec(const UnaryOperator *E) { | ||||
593 | LValue LV = EmitLValue(E->getSubExpr()); | ||||
594 | return EmitScalarPrePostIncDec(E, LV, false, false); | ||||
595 | } | ||||
596 | Value *VisitUnaryPostInc(const UnaryOperator *E) { | ||||
597 | LValue LV = EmitLValue(E->getSubExpr()); | ||||
598 | return EmitScalarPrePostIncDec(E, LV, true, false); | ||||
599 | } | ||||
600 | Value *VisitUnaryPreDec(const UnaryOperator *E) { | ||||
601 | LValue LV = EmitLValue(E->getSubExpr()); | ||||
602 | return EmitScalarPrePostIncDec(E, LV, false, true); | ||||
603 | } | ||||
604 | Value *VisitUnaryPreInc(const UnaryOperator *E) { | ||||
605 | LValue LV = EmitLValue(E->getSubExpr()); | ||||
606 | return EmitScalarPrePostIncDec(E, LV, true, true); | ||||
607 | } | ||||
608 | |||||
609 | llvm::Value *EmitIncDecConsiderOverflowBehavior(const UnaryOperator *E, | ||||
610 | llvm::Value *InVal, | ||||
611 | bool IsInc); | ||||
612 | |||||
613 | llvm::Value *EmitScalarPrePostIncDec(const UnaryOperator *E, LValue LV, | ||||
614 | bool isInc, bool isPre); | ||||
615 | |||||
616 | |||||
617 | Value *VisitUnaryAddrOf(const UnaryOperator *E) { | ||||
618 | if (isa<MemberPointerType>(E->getType())) // never sugared | ||||
619 | return CGF.CGM.getMemberPointerConstant(E); | ||||
620 | |||||
621 | return EmitLValue(E->getSubExpr()).getPointer(CGF); | ||||
622 | } | ||||
623 | Value *VisitUnaryDeref(const UnaryOperator *E) { | ||||
624 | if (E->getType()->isVoidType()) | ||||
625 | return Visit(E->getSubExpr()); // the actual value should be unused | ||||
626 | return EmitLoadOfLValue(E); | ||||
627 | } | ||||
628 | Value *VisitUnaryPlus(const UnaryOperator *E) { | ||||
629 | // This differs from gcc, though, most likely due to a bug in gcc. | ||||
630 | TestAndClearIgnoreResultAssign(); | ||||
631 | return Visit(E->getSubExpr()); | ||||
632 | } | ||||
633 | Value *VisitUnaryMinus (const UnaryOperator *E); | ||||
634 | Value *VisitUnaryNot (const UnaryOperator *E); | ||||
635 | Value *VisitUnaryLNot (const UnaryOperator *E); | ||||
636 | Value *VisitUnaryReal (const UnaryOperator *E); | ||||
637 | Value *VisitUnaryImag (const UnaryOperator *E); | ||||
638 | Value *VisitUnaryExtension(const UnaryOperator *E) { | ||||
639 | return Visit(E->getSubExpr()); | ||||
640 | } | ||||
641 | |||||
642 | // C++ | ||||
643 | Value *VisitMaterializeTemporaryExpr(const MaterializeTemporaryExpr *E) { | ||||
644 | return EmitLoadOfLValue(E); | ||||
645 | } | ||||
646 | Value *VisitSourceLocExpr(SourceLocExpr *SLE) { | ||||
647 | auto &Ctx = CGF.getContext(); | ||||
648 | APValue Evaluated = | ||||
649 | SLE->EvaluateInContext(Ctx, CGF.CurSourceLocExprScope.getDefaultExpr()); | ||||
650 | return ConstantEmitter(CGF).emitAbstract(SLE->getLocation(), Evaluated, | ||||
651 | SLE->getType()); | ||||
652 | } | ||||
653 | |||||
654 | Value *VisitCXXDefaultArgExpr(CXXDefaultArgExpr *DAE) { | ||||
655 | CodeGenFunction::CXXDefaultArgExprScope Scope(CGF, DAE); | ||||
656 | return Visit(DAE->getExpr()); | ||||
657 | } | ||||
658 | Value *VisitCXXDefaultInitExpr(CXXDefaultInitExpr *DIE) { | ||||
659 | CodeGenFunction::CXXDefaultInitExprScope Scope(CGF, DIE); | ||||
660 | return Visit(DIE->getExpr()); | ||||
661 | } | ||||
662 | Value *VisitCXXThisExpr(CXXThisExpr *TE) { | ||||
663 | return CGF.LoadCXXThis(); | ||||
664 | } | ||||
665 | |||||
666 | Value *VisitExprWithCleanups(ExprWithCleanups *E); | ||||
667 | Value *VisitCXXNewExpr(const CXXNewExpr *E) { | ||||
668 | return CGF.EmitCXXNewExpr(E); | ||||
669 | } | ||||
670 | Value *VisitCXXDeleteExpr(const CXXDeleteExpr *E) { | ||||
671 | CGF.EmitCXXDeleteExpr(E); | ||||
672 | return nullptr; | ||||
673 | } | ||||
674 | |||||
675 | Value *VisitTypeTraitExpr(const TypeTraitExpr *E) { | ||||
676 | return llvm::ConstantInt::get(ConvertType(E->getType()), E->getValue()); | ||||
677 | } | ||||
678 | |||||
679 | Value *VisitConceptSpecializationExpr(const ConceptSpecializationExpr *E) { | ||||
680 | return Builder.getInt1(E->isSatisfied()); | ||||
681 | } | ||||
682 | |||||
683 | Value *VisitArrayTypeTraitExpr(const ArrayTypeTraitExpr *E) { | ||||
684 | return llvm::ConstantInt::get(Builder.getInt32Ty(), E->getValue()); | ||||
685 | } | ||||
686 | |||||
687 | Value *VisitExpressionTraitExpr(const ExpressionTraitExpr *E) { | ||||
688 | return llvm::ConstantInt::get(Builder.getInt1Ty(), E->getValue()); | ||||
689 | } | ||||
690 | |||||
691 | Value *VisitCXXPseudoDestructorExpr(const CXXPseudoDestructorExpr *E) { | ||||
692 | // C++ [expr.pseudo]p1: | ||||
693 | // The result shall only be used as the operand for the function call | ||||
694 | // operator (), and the result of such a call has type void. The only | ||||
695 | // effect is the evaluation of the postfix-expression before the dot or | ||||
696 | // arrow. | ||||
697 | CGF.EmitScalarExpr(E->getBase()); | ||||
698 | return nullptr; | ||||
699 | } | ||||
700 | |||||
701 | Value *VisitCXXNullPtrLiteralExpr(const CXXNullPtrLiteralExpr *E) { | ||||
702 | return EmitNullValue(E->getType()); | ||||
703 | } | ||||
704 | |||||
705 | Value *VisitCXXThrowExpr(const CXXThrowExpr *E) { | ||||
706 | CGF.EmitCXXThrowExpr(E); | ||||
707 | return nullptr; | ||||
708 | } | ||||
709 | |||||
710 | Value *VisitCXXNoexceptExpr(const CXXNoexceptExpr *E) { | ||||
711 | return Builder.getInt1(E->getValue()); | ||||
712 | } | ||||
713 | |||||
714 | // Binary Operators. | ||||
715 | Value *EmitMul(const BinOpInfo &Ops) { | ||||
716 | if (Ops.Ty->isSignedIntegerOrEnumerationType()) { | ||||
717 | switch (CGF.getLangOpts().getSignedOverflowBehavior()) { | ||||
718 | case LangOptions::SOB_Defined: | ||||
719 | return Builder.CreateMul(Ops.LHS, Ops.RHS, "mul"); | ||||
720 | case LangOptions::SOB_Undefined: | ||||
721 | if (!CGF.SanOpts.has(SanitizerKind::SignedIntegerOverflow)) | ||||
722 | return Builder.CreateNSWMul(Ops.LHS, Ops.RHS, "mul"); | ||||
723 | LLVM_FALLTHROUGH[[gnu::fallthrough]]; | ||||
724 | case LangOptions::SOB_Trapping: | ||||
725 | if (CanElideOverflowCheck(CGF.getContext(), Ops)) | ||||
726 | return Builder.CreateNSWMul(Ops.LHS, Ops.RHS, "mul"); | ||||
727 | return EmitOverflowCheckedBinOp(Ops); | ||||
728 | } | ||||
729 | } | ||||
730 | |||||
731 | if (Ops.Ty->isUnsignedIntegerType() && | ||||
732 | CGF.SanOpts.has(SanitizerKind::UnsignedIntegerOverflow) && | ||||
733 | !CanElideOverflowCheck(CGF.getContext(), Ops)) | ||||
734 | return EmitOverflowCheckedBinOp(Ops); | ||||
735 | |||||
736 | if (Ops.LHS->getType()->isFPOrFPVectorTy()) { | ||||
737 | Value *V = Builder.CreateFMul(Ops.LHS, Ops.RHS, "mul"); | ||||
738 | return propagateFMFlags(V, Ops); | ||||
739 | } | ||||
740 | return Builder.CreateMul(Ops.LHS, Ops.RHS, "mul"); | ||||
741 | } | ||||
742 | /// Create a binary op that checks for overflow. | ||||
743 | /// Currently only supports +, - and *. | ||||
744 | Value *EmitOverflowCheckedBinOp(const BinOpInfo &Ops); | ||||
745 | |||||
746 | // Check for undefined division and modulus behaviors. | ||||
747 | void EmitUndefinedBehaviorIntegerDivAndRemCheck(const BinOpInfo &Ops, | ||||
748 | llvm::Value *Zero,bool isDiv); | ||||
749 | // Common helper for getting how wide LHS of shift is. | ||||
750 | static Value *GetWidthMinusOneValue(Value* LHS,Value* RHS); | ||||
751 | Value *EmitDiv(const BinOpInfo &Ops); | ||||
752 | Value *EmitRem(const BinOpInfo &Ops); | ||||
753 | Value *EmitAdd(const BinOpInfo &Ops); | ||||
754 | Value *EmitSub(const BinOpInfo &Ops); | ||||
755 | Value *EmitShl(const BinOpInfo &Ops); | ||||
756 | Value *EmitShr(const BinOpInfo &Ops); | ||||
757 | Value *EmitAnd(const BinOpInfo &Ops) { | ||||
758 | return Builder.CreateAnd(Ops.LHS, Ops.RHS, "and"); | ||||
759 | } | ||||
760 | Value *EmitXor(const BinOpInfo &Ops) { | ||||
761 | return Builder.CreateXor(Ops.LHS, Ops.RHS, "xor"); | ||||
762 | } | ||||
763 | Value *EmitOr (const BinOpInfo &Ops) { | ||||
764 | return Builder.CreateOr(Ops.LHS, Ops.RHS, "or"); | ||||
765 | } | ||||
766 | |||||
767 | // Helper functions for fixed point binary operations. | ||||
768 | Value *EmitFixedPointBinOp(const BinOpInfo &Ops); | ||||
769 | |||||
770 | BinOpInfo EmitBinOps(const BinaryOperator *E); | ||||
771 | LValue EmitCompoundAssignLValue(const CompoundAssignOperator *E, | ||||
772 | Value *(ScalarExprEmitter::*F)(const BinOpInfo &), | ||||
773 | Value *&Result); | ||||
774 | |||||
775 | Value *EmitCompoundAssign(const CompoundAssignOperator *E, | ||||
776 | Value *(ScalarExprEmitter::*F)(const BinOpInfo &)); | ||||
777 | |||||
778 | // Binary operators and binary compound assignment operators. | ||||
779 | #define HANDLEBINOP(OP) \ | ||||
780 | Value *VisitBin ## OP(const BinaryOperator *E) { \ | ||||
781 | return Emit ## OP(EmitBinOps(E)); \ | ||||
782 | } \ | ||||
783 | Value *VisitBin ## OP ## Assign(const CompoundAssignOperator *E) { \ | ||||
784 | return EmitCompoundAssign(E, &ScalarExprEmitter::Emit ## OP); \ | ||||
785 | } | ||||
786 | HANDLEBINOP(Mul) | ||||
787 | HANDLEBINOP(Div) | ||||
788 | HANDLEBINOP(Rem) | ||||
789 | HANDLEBINOP(Add) | ||||
790 | HANDLEBINOP(Sub) | ||||
791 | HANDLEBINOP(Shl) | ||||
792 | HANDLEBINOP(Shr) | ||||
793 | HANDLEBINOP(And) | ||||
794 | HANDLEBINOP(Xor) | ||||
795 | HANDLEBINOP(Or) | ||||
796 | #undef HANDLEBINOP | ||||
797 | |||||
798 | // Comparisons. | ||||
799 | Value *EmitCompare(const BinaryOperator *E, llvm::CmpInst::Predicate UICmpOpc, | ||||
800 | llvm::CmpInst::Predicate SICmpOpc, | ||||
801 | llvm::CmpInst::Predicate FCmpOpc); | ||||
802 | #define VISITCOMP(CODE, UI, SI, FP) \ | ||||
803 | Value *VisitBin##CODE(const BinaryOperator *E) { \ | ||||
804 | return EmitCompare(E, llvm::ICmpInst::UI, llvm::ICmpInst::SI, \ | ||||
805 | llvm::FCmpInst::FP); } | ||||
806 | VISITCOMP(LT, ICMP_ULT, ICMP_SLT, FCMP_OLT) | ||||
807 | VISITCOMP(GT, ICMP_UGT, ICMP_SGT, FCMP_OGT) | ||||
808 | VISITCOMP(LE, ICMP_ULE, ICMP_SLE, FCMP_OLE) | ||||
809 | VISITCOMP(GE, ICMP_UGE, ICMP_SGE, FCMP_OGE) | ||||
810 | VISITCOMP(EQ, ICMP_EQ , ICMP_EQ , FCMP_OEQ) | ||||
811 | VISITCOMP(NE, ICMP_NE , ICMP_NE , FCMP_UNE) | ||||
| |||||
812 | #undef VISITCOMP | ||||
813 | |||||
814 | Value *VisitBinAssign (const BinaryOperator *E); | ||||
815 | |||||
816 | Value *VisitBinLAnd (const BinaryOperator *E); | ||||
817 | Value *VisitBinLOr (const BinaryOperator *E); | ||||
818 | Value *VisitBinComma (const BinaryOperator *E); | ||||
819 | |||||
820 | Value *VisitBinPtrMemD(const Expr *E) { return EmitLoadOfLValue(E); } | ||||
821 | Value *VisitBinPtrMemI(const Expr *E) { return EmitLoadOfLValue(E); } | ||||
822 | |||||
823 | Value *VisitCXXRewrittenBinaryOperator(CXXRewrittenBinaryOperator *E) { | ||||
824 | return Visit(E->getSemanticForm()); | ||||
825 | } | ||||
826 | |||||
827 | // Other Operators. | ||||
828 | Value *VisitBlockExpr(const BlockExpr *BE); | ||||
829 | Value *VisitAbstractConditionalOperator(const AbstractConditionalOperator *); | ||||
830 | Value *VisitChooseExpr(ChooseExpr *CE); | ||||
831 | Value *VisitVAArgExpr(VAArgExpr *VE); | ||||
832 | Value *VisitObjCStringLiteral(const ObjCStringLiteral *E) { | ||||
833 | return CGF.EmitObjCStringLiteral(E); | ||||
834 | } | ||||
835 | Value *VisitObjCBoxedExpr(ObjCBoxedExpr *E) { | ||||
836 | return CGF.EmitObjCBoxedExpr(E); | ||||
837 | } | ||||
838 | Value *VisitObjCArrayLiteral(ObjCArrayLiteral *E) { | ||||
839 | return CGF.EmitObjCArrayLiteral(E); | ||||
840 | } | ||||
841 | Value *VisitObjCDictionaryLiteral(ObjCDictionaryLiteral *E) { | ||||
842 | return CGF.EmitObjCDictionaryLiteral(E); | ||||
843 | } | ||||
844 | Value *VisitAsTypeExpr(AsTypeExpr *CE); | ||||
845 | Value *VisitAtomicExpr(AtomicExpr *AE); | ||||
846 | }; | ||||
847 | } // end anonymous namespace. | ||||
848 | |||||
849 | //===----------------------------------------------------------------------===// | ||||
850 | // Utilities | ||||
851 | //===----------------------------------------------------------------------===// | ||||
852 | |||||
853 | /// EmitConversionToBool - Convert the specified expression value to a | ||||
854 | /// boolean (i1) truth value. This is equivalent to "Val != 0". | ||||
855 | Value *ScalarExprEmitter::EmitConversionToBool(Value *Src, QualType SrcType) { | ||||
856 | assert(SrcType.isCanonical() && "EmitScalarConversion strips typedefs")((SrcType.isCanonical() && "EmitScalarConversion strips typedefs" ) ? static_cast<void> (0) : __assert_fail ("SrcType.isCanonical() && \"EmitScalarConversion strips typedefs\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 856, __PRETTY_FUNCTION__)); | ||||
857 | |||||
858 | if (SrcType->isRealFloatingType()) | ||||
859 | return EmitFloatToBoolConversion(Src); | ||||
860 | |||||
861 | if (const MemberPointerType *MPT = dyn_cast<MemberPointerType>(SrcType)) | ||||
862 | return CGF.CGM.getCXXABI().EmitMemberPointerIsNotNull(CGF, Src, MPT); | ||||
863 | |||||
864 | assert((SrcType->isIntegerType() || isa<llvm::PointerType>(Src->getType())) &&(((SrcType->isIntegerType() || isa<llvm::PointerType> (Src->getType())) && "Unknown scalar type to convert" ) ? static_cast<void> (0) : __assert_fail ("(SrcType->isIntegerType() || isa<llvm::PointerType>(Src->getType())) && \"Unknown scalar type to convert\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 865, __PRETTY_FUNCTION__)) | ||||
865 | "Unknown scalar type to convert")(((SrcType->isIntegerType() || isa<llvm::PointerType> (Src->getType())) && "Unknown scalar type to convert" ) ? static_cast<void> (0) : __assert_fail ("(SrcType->isIntegerType() || isa<llvm::PointerType>(Src->getType())) && \"Unknown scalar type to convert\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 865, __PRETTY_FUNCTION__)); | ||||
866 | |||||
867 | if (isa<llvm::IntegerType>(Src->getType())) | ||||
868 | return EmitIntToBoolConversion(Src); | ||||
869 | |||||
870 | assert(isa<llvm::PointerType>(Src->getType()))((isa<llvm::PointerType>(Src->getType())) ? static_cast <void> (0) : __assert_fail ("isa<llvm::PointerType>(Src->getType())" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 870, __PRETTY_FUNCTION__)); | ||||
871 | return EmitPointerToBoolConversion(Src, SrcType); | ||||
872 | } | ||||
873 | |||||
874 | void ScalarExprEmitter::EmitFloatConversionCheck( | ||||
875 | Value *OrigSrc, QualType OrigSrcType, Value *Src, QualType SrcType, | ||||
876 | QualType DstType, llvm::Type *DstTy, SourceLocation Loc) { | ||||
877 | assert(SrcType->isFloatingType() && "not a conversion from floating point")((SrcType->isFloatingType() && "not a conversion from floating point" ) ? static_cast<void> (0) : __assert_fail ("SrcType->isFloatingType() && \"not a conversion from floating point\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 877, __PRETTY_FUNCTION__)); | ||||
878 | if (!isa<llvm::IntegerType>(DstTy)) | ||||
879 | return; | ||||
880 | |||||
881 | CodeGenFunction::SanitizerScope SanScope(&CGF); | ||||
882 | using llvm::APFloat; | ||||
883 | using llvm::APSInt; | ||||
884 | |||||
885 | llvm::Value *Check = nullptr; | ||||
886 | const llvm::fltSemantics &SrcSema = | ||||
887 | CGF.getContext().getFloatTypeSemantics(OrigSrcType); | ||||
888 | |||||
889 | // Floating-point to integer. This has undefined behavior if the source is | ||||
890 | // +-Inf, NaN, or doesn't fit into the destination type (after truncation | ||||
891 | // to an integer). | ||||
892 | unsigned Width = CGF.getContext().getIntWidth(DstType); | ||||
893 | bool Unsigned = DstType->isUnsignedIntegerOrEnumerationType(); | ||||
894 | |||||
895 | APSInt Min = APSInt::getMinValue(Width, Unsigned); | ||||
896 | APFloat MinSrc(SrcSema, APFloat::uninitialized); | ||||
897 | if (MinSrc.convertFromAPInt(Min, !Unsigned, APFloat::rmTowardZero) & | ||||
898 | APFloat::opOverflow) | ||||
899 | // Don't need an overflow check for lower bound. Just check for | ||||
900 | // -Inf/NaN. | ||||
901 | MinSrc = APFloat::getInf(SrcSema, true); | ||||
902 | else | ||||
903 | // Find the largest value which is too small to represent (before | ||||
904 | // truncation toward zero). | ||||
905 | MinSrc.subtract(APFloat(SrcSema, 1), APFloat::rmTowardNegative); | ||||
906 | |||||
907 | APSInt Max = APSInt::getMaxValue(Width, Unsigned); | ||||
908 | APFloat MaxSrc(SrcSema, APFloat::uninitialized); | ||||
909 | if (MaxSrc.convertFromAPInt(Max, !Unsigned, APFloat::rmTowardZero) & | ||||
910 | APFloat::opOverflow) | ||||
911 | // Don't need an overflow check for upper bound. Just check for | ||||
912 | // +Inf/NaN. | ||||
913 | MaxSrc = APFloat::getInf(SrcSema, false); | ||||
914 | else | ||||
915 | // Find the smallest value which is too large to represent (before | ||||
916 | // truncation toward zero). | ||||
917 | MaxSrc.add(APFloat(SrcSema, 1), APFloat::rmTowardPositive); | ||||
918 | |||||
919 | // If we're converting from __half, convert the range to float to match | ||||
920 | // the type of src. | ||||
921 | if (OrigSrcType->isHalfType()) { | ||||
922 | const llvm::fltSemantics &Sema = | ||||
923 | CGF.getContext().getFloatTypeSemantics(SrcType); | ||||
924 | bool IsInexact; | ||||
925 | MinSrc.convert(Sema, APFloat::rmTowardZero, &IsInexact); | ||||
926 | MaxSrc.convert(Sema, APFloat::rmTowardZero, &IsInexact); | ||||
927 | } | ||||
928 | |||||
929 | llvm::Value *GE = | ||||
930 | Builder.CreateFCmpOGT(Src, llvm::ConstantFP::get(VMContext, MinSrc)); | ||||
931 | llvm::Value *LE = | ||||
932 | Builder.CreateFCmpOLT(Src, llvm::ConstantFP::get(VMContext, MaxSrc)); | ||||
933 | Check = Builder.CreateAnd(GE, LE); | ||||
934 | |||||
935 | llvm::Constant *StaticArgs[] = {CGF.EmitCheckSourceLocation(Loc), | ||||
936 | CGF.EmitCheckTypeDescriptor(OrigSrcType), | ||||
937 | CGF.EmitCheckTypeDescriptor(DstType)}; | ||||
938 | CGF.EmitCheck(std::make_pair(Check, SanitizerKind::FloatCastOverflow), | ||||
939 | SanitizerHandler::FloatCastOverflow, StaticArgs, OrigSrc); | ||||
940 | } | ||||
941 | |||||
942 | // Should be called within CodeGenFunction::SanitizerScope RAII scope. | ||||
943 | // Returns 'i1 false' when the truncation Src -> Dst was lossy. | ||||
944 | static std::pair<ScalarExprEmitter::ImplicitConversionCheckKind, | ||||
945 | std::pair<llvm::Value *, SanitizerMask>> | ||||
946 | EmitIntegerTruncationCheckHelper(Value *Src, QualType SrcType, Value *Dst, | ||||
947 | QualType DstType, CGBuilderTy &Builder) { | ||||
948 | llvm::Type *SrcTy = Src->getType(); | ||||
949 | llvm::Type *DstTy = Dst->getType(); | ||||
950 | (void)DstTy; // Only used in assert() | ||||
951 | |||||
952 | // This should be truncation of integral types. | ||||
953 | assert(Src != Dst)((Src != Dst) ? static_cast<void> (0) : __assert_fail ( "Src != Dst", "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 953, __PRETTY_FUNCTION__)); | ||||
954 | assert(SrcTy->getScalarSizeInBits() > Dst->getType()->getScalarSizeInBits())((SrcTy->getScalarSizeInBits() > Dst->getType()-> getScalarSizeInBits()) ? static_cast<void> (0) : __assert_fail ("SrcTy->getScalarSizeInBits() > Dst->getType()->getScalarSizeInBits()" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 954, __PRETTY_FUNCTION__)); | ||||
955 | assert(isa<llvm::IntegerType>(SrcTy) && isa<llvm::IntegerType>(DstTy) &&((isa<llvm::IntegerType>(SrcTy) && isa<llvm:: IntegerType>(DstTy) && "non-integer llvm type") ? static_cast <void> (0) : __assert_fail ("isa<llvm::IntegerType>(SrcTy) && isa<llvm::IntegerType>(DstTy) && \"non-integer llvm type\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 956, __PRETTY_FUNCTION__)) | ||||
956 | "non-integer llvm type")((isa<llvm::IntegerType>(SrcTy) && isa<llvm:: IntegerType>(DstTy) && "non-integer llvm type") ? static_cast <void> (0) : __assert_fail ("isa<llvm::IntegerType>(SrcTy) && isa<llvm::IntegerType>(DstTy) && \"non-integer llvm type\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 956, __PRETTY_FUNCTION__)); | ||||
957 | |||||
958 | bool SrcSigned = SrcType->isSignedIntegerOrEnumerationType(); | ||||
959 | bool DstSigned = DstType->isSignedIntegerOrEnumerationType(); | ||||
960 | |||||
961 | // If both (src and dst) types are unsigned, then it's an unsigned truncation. | ||||
962 | // Else, it is a signed truncation. | ||||
963 | ScalarExprEmitter::ImplicitConversionCheckKind Kind; | ||||
964 | SanitizerMask Mask; | ||||
965 | if (!SrcSigned && !DstSigned) { | ||||
966 | Kind = ScalarExprEmitter::ICCK_UnsignedIntegerTruncation; | ||||
967 | Mask = SanitizerKind::ImplicitUnsignedIntegerTruncation; | ||||
968 | } else { | ||||
969 | Kind = ScalarExprEmitter::ICCK_SignedIntegerTruncation; | ||||
970 | Mask = SanitizerKind::ImplicitSignedIntegerTruncation; | ||||
971 | } | ||||
972 | |||||
973 | llvm::Value *Check = nullptr; | ||||
974 | // 1. Extend the truncated value back to the same width as the Src. | ||||
975 | Check = Builder.CreateIntCast(Dst, SrcTy, DstSigned, "anyext"); | ||||
976 | // 2. Equality-compare with the original source value | ||||
977 | Check = Builder.CreateICmpEQ(Check, Src, "truncheck"); | ||||
978 | // If the comparison result is 'i1 false', then the truncation was lossy. | ||||
979 | return std::make_pair(Kind, std::make_pair(Check, Mask)); | ||||
980 | } | ||||
981 | |||||
982 | static bool PromotionIsPotentiallyEligibleForImplicitIntegerConversionCheck( | ||||
983 | QualType SrcType, QualType DstType) { | ||||
984 | return SrcType->isIntegerType() && DstType->isIntegerType(); | ||||
985 | } | ||||
986 | |||||
987 | void ScalarExprEmitter::EmitIntegerTruncationCheck(Value *Src, QualType SrcType, | ||||
988 | Value *Dst, QualType DstType, | ||||
989 | SourceLocation Loc) { | ||||
990 | if (!CGF.SanOpts.hasOneOf(SanitizerKind::ImplicitIntegerTruncation)) | ||||
991 | return; | ||||
992 | |||||
993 | // We only care about int->int conversions here. | ||||
994 | // We ignore conversions to/from pointer and/or bool. | ||||
995 | if (!PromotionIsPotentiallyEligibleForImplicitIntegerConversionCheck(SrcType, | ||||
996 | DstType)) | ||||
997 | return; | ||||
998 | |||||
999 | unsigned SrcBits = Src->getType()->getScalarSizeInBits(); | ||||
1000 | unsigned DstBits = Dst->getType()->getScalarSizeInBits(); | ||||
1001 | // This must be truncation. Else we do not care. | ||||
1002 | if (SrcBits <= DstBits) | ||||
1003 | return; | ||||
1004 | |||||
1005 | assert(!DstType->isBooleanType() && "we should not get here with booleans.")((!DstType->isBooleanType() && "we should not get here with booleans." ) ? static_cast<void> (0) : __assert_fail ("!DstType->isBooleanType() && \"we should not get here with booleans.\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 1005, __PRETTY_FUNCTION__)); | ||||
1006 | |||||
1007 | // If the integer sign change sanitizer is enabled, | ||||
1008 | // and we are truncating from larger unsigned type to smaller signed type, | ||||
1009 | // let that next sanitizer deal with it. | ||||
1010 | bool SrcSigned = SrcType->isSignedIntegerOrEnumerationType(); | ||||
1011 | bool DstSigned = DstType->isSignedIntegerOrEnumerationType(); | ||||
1012 | if (CGF.SanOpts.has(SanitizerKind::ImplicitIntegerSignChange) && | ||||
1013 | (!SrcSigned && DstSigned)) | ||||
1014 | return; | ||||
1015 | |||||
1016 | CodeGenFunction::SanitizerScope SanScope(&CGF); | ||||
1017 | |||||
1018 | std::pair<ScalarExprEmitter::ImplicitConversionCheckKind, | ||||
1019 | std::pair<llvm::Value *, SanitizerMask>> | ||||
1020 | Check = | ||||
1021 | EmitIntegerTruncationCheckHelper(Src, SrcType, Dst, DstType, Builder); | ||||
1022 | // If the comparison result is 'i1 false', then the truncation was lossy. | ||||
1023 | |||||
1024 | // Do we care about this type of truncation? | ||||
1025 | if (!CGF.SanOpts.has(Check.second.second)) | ||||
1026 | return; | ||||
1027 | |||||
1028 | llvm::Constant *StaticArgs[] = { | ||||
1029 | CGF.EmitCheckSourceLocation(Loc), CGF.EmitCheckTypeDescriptor(SrcType), | ||||
1030 | CGF.EmitCheckTypeDescriptor(DstType), | ||||
1031 | llvm::ConstantInt::get(Builder.getInt8Ty(), Check.first)}; | ||||
1032 | CGF.EmitCheck(Check.second, SanitizerHandler::ImplicitConversion, StaticArgs, | ||||
1033 | {Src, Dst}); | ||||
1034 | } | ||||
1035 | |||||
1036 | // Should be called within CodeGenFunction::SanitizerScope RAII scope. | ||||
1037 | // Returns 'i1 false' when the conversion Src -> Dst changed the sign. | ||||
1038 | static std::pair<ScalarExprEmitter::ImplicitConversionCheckKind, | ||||
1039 | std::pair<llvm::Value *, SanitizerMask>> | ||||
1040 | EmitIntegerSignChangeCheckHelper(Value *Src, QualType SrcType, Value *Dst, | ||||
1041 | QualType DstType, CGBuilderTy &Builder) { | ||||
1042 | llvm::Type *SrcTy = Src->getType(); | ||||
1043 | llvm::Type *DstTy = Dst->getType(); | ||||
1044 | |||||
1045 | assert(isa<llvm::IntegerType>(SrcTy) && isa<llvm::IntegerType>(DstTy) &&((isa<llvm::IntegerType>(SrcTy) && isa<llvm:: IntegerType>(DstTy) && "non-integer llvm type") ? static_cast <void> (0) : __assert_fail ("isa<llvm::IntegerType>(SrcTy) && isa<llvm::IntegerType>(DstTy) && \"non-integer llvm type\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 1046, __PRETTY_FUNCTION__)) | ||||
1046 | "non-integer llvm type")((isa<llvm::IntegerType>(SrcTy) && isa<llvm:: IntegerType>(DstTy) && "non-integer llvm type") ? static_cast <void> (0) : __assert_fail ("isa<llvm::IntegerType>(SrcTy) && isa<llvm::IntegerType>(DstTy) && \"non-integer llvm type\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 1046, __PRETTY_FUNCTION__)); | ||||
1047 | |||||
1048 | bool SrcSigned = SrcType->isSignedIntegerOrEnumerationType(); | ||||
1049 | bool DstSigned = DstType->isSignedIntegerOrEnumerationType(); | ||||
1050 | (void)SrcSigned; // Only used in assert() | ||||
1051 | (void)DstSigned; // Only used in assert() | ||||
1052 | unsigned SrcBits = SrcTy->getScalarSizeInBits(); | ||||
1053 | unsigned DstBits = DstTy->getScalarSizeInBits(); | ||||
1054 | (void)SrcBits; // Only used in assert() | ||||
1055 | (void)DstBits; // Only used in assert() | ||||
1056 | |||||
1057 | assert(((SrcBits != DstBits) || (SrcSigned != DstSigned)) &&((((SrcBits != DstBits) || (SrcSigned != DstSigned)) && "either the widths should be different, or the signednesses." ) ? static_cast<void> (0) : __assert_fail ("((SrcBits != DstBits) || (SrcSigned != DstSigned)) && \"either the widths should be different, or the signednesses.\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 1058, __PRETTY_FUNCTION__)) | ||||
1058 | "either the widths should be different, or the signednesses.")((((SrcBits != DstBits) || (SrcSigned != DstSigned)) && "either the widths should be different, or the signednesses." ) ? static_cast<void> (0) : __assert_fail ("((SrcBits != DstBits) || (SrcSigned != DstSigned)) && \"either the widths should be different, or the signednesses.\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 1058, __PRETTY_FUNCTION__)); | ||||
1059 | |||||
1060 | // NOTE: zero value is considered to be non-negative. | ||||
1061 | auto EmitIsNegativeTest = [&Builder](Value *V, QualType VType, | ||||
1062 | const char *Name) -> Value * { | ||||
1063 | // Is this value a signed type? | ||||
1064 | bool VSigned = VType->isSignedIntegerOrEnumerationType(); | ||||
1065 | llvm::Type *VTy = V->getType(); | ||||
1066 | if (!VSigned) { | ||||
1067 | // If the value is unsigned, then it is never negative. | ||||
1068 | // FIXME: can we encounter non-scalar VTy here? | ||||
1069 | return llvm::ConstantInt::getFalse(VTy->getContext()); | ||||
1070 | } | ||||
1071 | // Get the zero of the same type with which we will be comparing. | ||||
1072 | llvm::Constant *Zero = llvm::ConstantInt::get(VTy, 0); | ||||
1073 | // %V.isnegative = icmp slt %V, 0 | ||||
1074 | // I.e is %V *strictly* less than zero, does it have negative value? | ||||
1075 | return Builder.CreateICmp(llvm::ICmpInst::ICMP_SLT, V, Zero, | ||||
1076 | llvm::Twine(Name) + "." + V->getName() + | ||||
1077 | ".negativitycheck"); | ||||
1078 | }; | ||||
1079 | |||||
1080 | // 1. Was the old Value negative? | ||||
1081 | llvm::Value *SrcIsNegative = EmitIsNegativeTest(Src, SrcType, "src"); | ||||
1082 | // 2. Is the new Value negative? | ||||
1083 | llvm::Value *DstIsNegative = EmitIsNegativeTest(Dst, DstType, "dst"); | ||||
1084 | // 3. Now, was the 'negativity status' preserved during the conversion? | ||||
1085 | // NOTE: conversion from negative to zero is considered to change the sign. | ||||
1086 | // (We want to get 'false' when the conversion changed the sign) | ||||
1087 | // So we should just equality-compare the negativity statuses. | ||||
1088 | llvm::Value *Check = nullptr; | ||||
1089 | Check = Builder.CreateICmpEQ(SrcIsNegative, DstIsNegative, "signchangecheck"); | ||||
1090 | // If the comparison result is 'false', then the conversion changed the sign. | ||||
1091 | return std::make_pair( | ||||
1092 | ScalarExprEmitter::ICCK_IntegerSignChange, | ||||
1093 | std::make_pair(Check, SanitizerKind::ImplicitIntegerSignChange)); | ||||
1094 | } | ||||
1095 | |||||
1096 | void ScalarExprEmitter::EmitIntegerSignChangeCheck(Value *Src, QualType SrcType, | ||||
1097 | Value *Dst, QualType DstType, | ||||
1098 | SourceLocation Loc) { | ||||
1099 | if (!CGF.SanOpts.has(SanitizerKind::ImplicitIntegerSignChange)) | ||||
1100 | return; | ||||
1101 | |||||
1102 | llvm::Type *SrcTy = Src->getType(); | ||||
1103 | llvm::Type *DstTy = Dst->getType(); | ||||
1104 | |||||
1105 | // We only care about int->int conversions here. | ||||
1106 | // We ignore conversions to/from pointer and/or bool. | ||||
1107 | if (!PromotionIsPotentiallyEligibleForImplicitIntegerConversionCheck(SrcType, | ||||
1108 | DstType)) | ||||
1109 | return; | ||||
1110 | |||||
1111 | bool SrcSigned = SrcType->isSignedIntegerOrEnumerationType(); | ||||
1112 | bool DstSigned = DstType->isSignedIntegerOrEnumerationType(); | ||||
1113 | unsigned SrcBits = SrcTy->getScalarSizeInBits(); | ||||
1114 | unsigned DstBits = DstTy->getScalarSizeInBits(); | ||||
1115 | |||||
1116 | // Now, we do not need to emit the check in *all* of the cases. | ||||
1117 | // We can avoid emitting it in some obvious cases where it would have been | ||||
1118 | // dropped by the opt passes (instcombine) always anyways. | ||||
1119 | // If it's a cast between effectively the same type, no check. | ||||
1120 | // NOTE: this is *not* equivalent to checking the canonical types. | ||||
1121 | if (SrcSigned == DstSigned && SrcBits == DstBits) | ||||
1122 | return; | ||||
1123 | // At least one of the values needs to have signed type. | ||||
1124 | // If both are unsigned, then obviously, neither of them can be negative. | ||||
1125 | if (!SrcSigned && !DstSigned) | ||||
1126 | return; | ||||
1127 | // If the conversion is to *larger* *signed* type, then no check is needed. | ||||
1128 | // Because either sign-extension happens (so the sign will remain), | ||||
1129 | // or zero-extension will happen (the sign bit will be zero.) | ||||
1130 | if ((DstBits > SrcBits) && DstSigned) | ||||
1131 | return; | ||||
1132 | if (CGF.SanOpts.has(SanitizerKind::ImplicitSignedIntegerTruncation) && | ||||
1133 | (SrcBits > DstBits) && SrcSigned) { | ||||
1134 | // If the signed integer truncation sanitizer is enabled, | ||||
1135 | // and this is a truncation from signed type, then no check is needed. | ||||
1136 | // Because here sign change check is interchangeable with truncation check. | ||||
1137 | return; | ||||
1138 | } | ||||
1139 | // That's it. We can't rule out any more cases with the data we have. | ||||
1140 | |||||
1141 | CodeGenFunction::SanitizerScope SanScope(&CGF); | ||||
1142 | |||||
1143 | std::pair<ScalarExprEmitter::ImplicitConversionCheckKind, | ||||
1144 | std::pair<llvm::Value *, SanitizerMask>> | ||||
1145 | Check; | ||||
1146 | |||||
1147 | // Each of these checks needs to return 'false' when an issue was detected. | ||||
1148 | ImplicitConversionCheckKind CheckKind; | ||||
1149 | llvm::SmallVector<std::pair<llvm::Value *, SanitizerMask>, 2> Checks; | ||||
1150 | // So we can 'and' all the checks together, and still get 'false', | ||||
1151 | // if at least one of the checks detected an issue. | ||||
1152 | |||||
1153 | Check = EmitIntegerSignChangeCheckHelper(Src, SrcType, Dst, DstType, Builder); | ||||
1154 | CheckKind = Check.first; | ||||
1155 | Checks.emplace_back(Check.second); | ||||
1156 | |||||
1157 | if (CGF.SanOpts.has(SanitizerKind::ImplicitSignedIntegerTruncation) && | ||||
1158 | (SrcBits > DstBits) && !SrcSigned && DstSigned) { | ||||
1159 | // If the signed integer truncation sanitizer was enabled, | ||||
1160 | // and we are truncating from larger unsigned type to smaller signed type, | ||||
1161 | // let's handle the case we skipped in that check. | ||||
1162 | Check = | ||||
1163 | EmitIntegerTruncationCheckHelper(Src, SrcType, Dst, DstType, Builder); | ||||
1164 | CheckKind = ICCK_SignedIntegerTruncationOrSignChange; | ||||
1165 | Checks.emplace_back(Check.second); | ||||
1166 | // If the comparison result is 'i1 false', then the truncation was lossy. | ||||
1167 | } | ||||
1168 | |||||
1169 | llvm::Constant *StaticArgs[] = { | ||||
1170 | CGF.EmitCheckSourceLocation(Loc), CGF.EmitCheckTypeDescriptor(SrcType), | ||||
1171 | CGF.EmitCheckTypeDescriptor(DstType), | ||||
1172 | llvm::ConstantInt::get(Builder.getInt8Ty(), CheckKind)}; | ||||
1173 | // EmitCheck() will 'and' all the checks together. | ||||
1174 | CGF.EmitCheck(Checks, SanitizerHandler::ImplicitConversion, StaticArgs, | ||||
1175 | {Src, Dst}); | ||||
1176 | } | ||||
1177 | |||||
1178 | /// Emit a conversion from the specified type to the specified destination type, | ||||
1179 | /// both of which are LLVM scalar types. | ||||
1180 | Value *ScalarExprEmitter::EmitScalarConversion(Value *Src, QualType SrcType, | ||||
1181 | QualType DstType, | ||||
1182 | SourceLocation Loc, | ||||
1183 | ScalarConversionOpts Opts) { | ||||
1184 | // All conversions involving fixed point types should be handled by the | ||||
1185 | // EmitFixedPoint family functions. This is done to prevent bloating up this | ||||
1186 | // function more, and although fixed point numbers are represented by | ||||
1187 | // integers, we do not want to follow any logic that assumes they should be | ||||
1188 | // treated as integers. | ||||
1189 | // TODO(leonardchan): When necessary, add another if statement checking for | ||||
1190 | // conversions to fixed point types from other types. | ||||
1191 | if (SrcType->isFixedPointType()) { | ||||
1192 | if (DstType->isBooleanType()) | ||||
1193 | // It is important that we check this before checking if the dest type is | ||||
1194 | // an integer because booleans are technically integer types. | ||||
1195 | // We do not need to check the padding bit on unsigned types if unsigned | ||||
1196 | // padding is enabled because overflow into this bit is undefined | ||||
1197 | // behavior. | ||||
1198 | return Builder.CreateIsNotNull(Src, "tobool"); | ||||
1199 | if (DstType->isFixedPointType() || DstType->isIntegerType()) | ||||
1200 | return EmitFixedPointConversion(Src, SrcType, DstType, Loc); | ||||
1201 | |||||
1202 | llvm_unreachable(::llvm::llvm_unreachable_internal("Unhandled scalar conversion from a fixed point type to another type." , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 1203) | ||||
1203 | "Unhandled scalar conversion from a fixed point type to another type.")::llvm::llvm_unreachable_internal("Unhandled scalar conversion from a fixed point type to another type." , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 1203); | ||||
1204 | } else if (DstType->isFixedPointType()) { | ||||
1205 | if (SrcType->isIntegerType()) | ||||
1206 | // This also includes converting booleans and enums to fixed point types. | ||||
1207 | return EmitFixedPointConversion(Src, SrcType, DstType, Loc); | ||||
1208 | |||||
1209 | llvm_unreachable(::llvm::llvm_unreachable_internal("Unhandled scalar conversion to a fixed point type from another type." , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 1210) | ||||
1210 | "Unhandled scalar conversion to a fixed point type from another type.")::llvm::llvm_unreachable_internal("Unhandled scalar conversion to a fixed point type from another type." , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 1210); | ||||
1211 | } | ||||
1212 | |||||
1213 | QualType NoncanonicalSrcType = SrcType; | ||||
1214 | QualType NoncanonicalDstType = DstType; | ||||
1215 | |||||
1216 | SrcType = CGF.getContext().getCanonicalType(SrcType); | ||||
1217 | DstType = CGF.getContext().getCanonicalType(DstType); | ||||
1218 | if (SrcType == DstType) return Src; | ||||
1219 | |||||
1220 | if (DstType->isVoidType()) return nullptr; | ||||
1221 | |||||
1222 | llvm::Value *OrigSrc = Src; | ||||
1223 | QualType OrigSrcType = SrcType; | ||||
1224 | llvm::Type *SrcTy = Src->getType(); | ||||
1225 | |||||
1226 | // Handle conversions to bool first, they are special: comparisons against 0. | ||||
1227 | if (DstType->isBooleanType()) | ||||
1228 | return EmitConversionToBool(Src, SrcType); | ||||
1229 | |||||
1230 | llvm::Type *DstTy = ConvertType(DstType); | ||||
1231 | |||||
1232 | // Cast from half through float if half isn't a native type. | ||||
1233 | if (SrcType->isHalfType() && !CGF.getContext().getLangOpts().NativeHalfType) { | ||||
1234 | // Cast to FP using the intrinsic if the half type itself isn't supported. | ||||
1235 | if (DstTy->isFloatingPointTy()) { | ||||
1236 | if (CGF.getContext().getTargetInfo().useFP16ConversionIntrinsics()) | ||||
1237 | return Builder.CreateCall( | ||||
1238 | CGF.CGM.getIntrinsic(llvm::Intrinsic::convert_from_fp16, DstTy), | ||||
1239 | Src); | ||||
1240 | } else { | ||||
1241 | // Cast to other types through float, using either the intrinsic or FPExt, | ||||
1242 | // depending on whether the half type itself is supported | ||||
1243 | // (as opposed to operations on half, available with NativeHalfType). | ||||
1244 | if (CGF.getContext().getTargetInfo().useFP16ConversionIntrinsics()) { | ||||
1245 | Src = Builder.CreateCall( | ||||
1246 | CGF.CGM.getIntrinsic(llvm::Intrinsic::convert_from_fp16, | ||||
1247 | CGF.CGM.FloatTy), | ||||
1248 | Src); | ||||
1249 | } else { | ||||
1250 | Src = Builder.CreateFPExt(Src, CGF.CGM.FloatTy, "conv"); | ||||
1251 | } | ||||
1252 | SrcType = CGF.getContext().FloatTy; | ||||
1253 | SrcTy = CGF.FloatTy; | ||||
1254 | } | ||||
1255 | } | ||||
1256 | |||||
1257 | // Ignore conversions like int -> uint. | ||||
1258 | if (SrcTy == DstTy) { | ||||
1259 | if (Opts.EmitImplicitIntegerSignChangeChecks) | ||||
1260 | EmitIntegerSignChangeCheck(Src, NoncanonicalSrcType, Src, | ||||
1261 | NoncanonicalDstType, Loc); | ||||
1262 | |||||
1263 | return Src; | ||||
1264 | } | ||||
1265 | |||||
1266 | // Handle pointer conversions next: pointers can only be converted to/from | ||||
1267 | // other pointers and integers. Check for pointer types in terms of LLVM, as | ||||
1268 | // some native types (like Obj-C id) may map to a pointer type. | ||||
1269 | if (auto DstPT = dyn_cast<llvm::PointerType>(DstTy)) { | ||||
1270 | // The source value may be an integer, or a pointer. | ||||
1271 | if (isa<llvm::PointerType>(SrcTy)) | ||||
1272 | return Builder.CreateBitCast(Src, DstTy, "conv"); | ||||
1273 | |||||
1274 | assert(SrcType->isIntegerType() && "Not ptr->ptr or int->ptr conversion?")((SrcType->isIntegerType() && "Not ptr->ptr or int->ptr conversion?" ) ? static_cast<void> (0) : __assert_fail ("SrcType->isIntegerType() && \"Not ptr->ptr or int->ptr conversion?\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 1274, __PRETTY_FUNCTION__)); | ||||
1275 | // First, convert to the correct width so that we control the kind of | ||||
1276 | // extension. | ||||
1277 | llvm::Type *MiddleTy = CGF.CGM.getDataLayout().getIntPtrType(DstPT); | ||||
1278 | bool InputSigned = SrcType->isSignedIntegerOrEnumerationType(); | ||||
1279 | llvm::Value* IntResult = | ||||
1280 | Builder.CreateIntCast(Src, MiddleTy, InputSigned, "conv"); | ||||
1281 | // Then, cast to pointer. | ||||
1282 | return Builder.CreateIntToPtr(IntResult, DstTy, "conv"); | ||||
1283 | } | ||||
1284 | |||||
1285 | if (isa<llvm::PointerType>(SrcTy)) { | ||||
1286 | // Must be an ptr to int cast. | ||||
1287 | assert(isa<llvm::IntegerType>(DstTy) && "not ptr->int?")((isa<llvm::IntegerType>(DstTy) && "not ptr->int?" ) ? static_cast<void> (0) : __assert_fail ("isa<llvm::IntegerType>(DstTy) && \"not ptr->int?\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 1287, __PRETTY_FUNCTION__)); | ||||
1288 | return Builder.CreatePtrToInt(Src, DstTy, "conv"); | ||||
1289 | } | ||||
1290 | |||||
1291 | // A scalar can be splatted to an extended vector of the same element type | ||||
1292 | if (DstType->isExtVectorType() && !SrcType->isVectorType()) { | ||||
1293 | // Sema should add casts to make sure that the source expression's type is | ||||
1294 | // the same as the vector's element type (sans qualifiers) | ||||
1295 | assert(DstType->castAs<ExtVectorType>()->getElementType().getTypePtr() ==((DstType->castAs<ExtVectorType>()->getElementType ().getTypePtr() == SrcType.getTypePtr() && "Splatted expr doesn't match with vector element type?" ) ? static_cast<void> (0) : __assert_fail ("DstType->castAs<ExtVectorType>()->getElementType().getTypePtr() == SrcType.getTypePtr() && \"Splatted expr doesn't match with vector element type?\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 1297, __PRETTY_FUNCTION__)) | ||||
1296 | SrcType.getTypePtr() &&((DstType->castAs<ExtVectorType>()->getElementType ().getTypePtr() == SrcType.getTypePtr() && "Splatted expr doesn't match with vector element type?" ) ? static_cast<void> (0) : __assert_fail ("DstType->castAs<ExtVectorType>()->getElementType().getTypePtr() == SrcType.getTypePtr() && \"Splatted expr doesn't match with vector element type?\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 1297, __PRETTY_FUNCTION__)) | ||||
1297 | "Splatted expr doesn't match with vector element type?")((DstType->castAs<ExtVectorType>()->getElementType ().getTypePtr() == SrcType.getTypePtr() && "Splatted expr doesn't match with vector element type?" ) ? static_cast<void> (0) : __assert_fail ("DstType->castAs<ExtVectorType>()->getElementType().getTypePtr() == SrcType.getTypePtr() && \"Splatted expr doesn't match with vector element type?\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 1297, __PRETTY_FUNCTION__)); | ||||
1298 | |||||
1299 | // Splat the element across to all elements | ||||
1300 | unsigned NumElements = DstTy->getVectorNumElements(); | ||||
1301 | return Builder.CreateVectorSplat(NumElements, Src, "splat"); | ||||
1302 | } | ||||
1303 | |||||
1304 | if (isa<llvm::VectorType>(SrcTy) || isa<llvm::VectorType>(DstTy)) { | ||||
1305 | // Allow bitcast from vector to integer/fp of the same size. | ||||
1306 | unsigned SrcSize = SrcTy->getPrimitiveSizeInBits(); | ||||
1307 | unsigned DstSize = DstTy->getPrimitiveSizeInBits(); | ||||
1308 | if (SrcSize == DstSize) | ||||
1309 | return Builder.CreateBitCast(Src, DstTy, "conv"); | ||||
1310 | |||||
1311 | // Conversions between vectors of different sizes are not allowed except | ||||
1312 | // when vectors of half are involved. Operations on storage-only half | ||||
1313 | // vectors require promoting half vector operands to float vectors and | ||||
1314 | // truncating the result, which is either an int or float vector, to a | ||||
1315 | // short or half vector. | ||||
1316 | |||||
1317 | // Source and destination are both expected to be vectors. | ||||
1318 | llvm::Type *SrcElementTy = SrcTy->getVectorElementType(); | ||||
1319 | llvm::Type *DstElementTy = DstTy->getVectorElementType(); | ||||
1320 | (void)DstElementTy; | ||||
1321 | |||||
1322 | assert(((SrcElementTy->isIntegerTy() &&((((SrcElementTy->isIntegerTy() && DstElementTy-> isIntegerTy()) || (SrcElementTy->isFloatingPointTy() && DstElementTy->isFloatingPointTy())) && "unexpected conversion between a floating-point vector and an " "integer vector") ? static_cast<void> (0) : __assert_fail ("((SrcElementTy->isIntegerTy() && DstElementTy->isIntegerTy()) || (SrcElementTy->isFloatingPointTy() && DstElementTy->isFloatingPointTy())) && \"unexpected conversion between a floating-point vector and an \" \"integer vector\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 1327, __PRETTY_FUNCTION__)) | ||||
1323 | DstElementTy->isIntegerTy()) ||((((SrcElementTy->isIntegerTy() && DstElementTy-> isIntegerTy()) || (SrcElementTy->isFloatingPointTy() && DstElementTy->isFloatingPointTy())) && "unexpected conversion between a floating-point vector and an " "integer vector") ? static_cast<void> (0) : __assert_fail ("((SrcElementTy->isIntegerTy() && DstElementTy->isIntegerTy()) || (SrcElementTy->isFloatingPointTy() && DstElementTy->isFloatingPointTy())) && \"unexpected conversion between a floating-point vector and an \" \"integer vector\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 1327, __PRETTY_FUNCTION__)) | ||||
1324 | (SrcElementTy->isFloatingPointTy() &&((((SrcElementTy->isIntegerTy() && DstElementTy-> isIntegerTy()) || (SrcElementTy->isFloatingPointTy() && DstElementTy->isFloatingPointTy())) && "unexpected conversion between a floating-point vector and an " "integer vector") ? static_cast<void> (0) : __assert_fail ("((SrcElementTy->isIntegerTy() && DstElementTy->isIntegerTy()) || (SrcElementTy->isFloatingPointTy() && DstElementTy->isFloatingPointTy())) && \"unexpected conversion between a floating-point vector and an \" \"integer vector\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 1327, __PRETTY_FUNCTION__)) | ||||
1325 | DstElementTy->isFloatingPointTy())) &&((((SrcElementTy->isIntegerTy() && DstElementTy-> isIntegerTy()) || (SrcElementTy->isFloatingPointTy() && DstElementTy->isFloatingPointTy())) && "unexpected conversion between a floating-point vector and an " "integer vector") ? static_cast<void> (0) : __assert_fail ("((SrcElementTy->isIntegerTy() && DstElementTy->isIntegerTy()) || (SrcElementTy->isFloatingPointTy() && DstElementTy->isFloatingPointTy())) && \"unexpected conversion between a floating-point vector and an \" \"integer vector\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 1327, __PRETTY_FUNCTION__)) | ||||
1326 | "unexpected conversion between a floating-point vector and an "((((SrcElementTy->isIntegerTy() && DstElementTy-> isIntegerTy()) || (SrcElementTy->isFloatingPointTy() && DstElementTy->isFloatingPointTy())) && "unexpected conversion between a floating-point vector and an " "integer vector") ? static_cast<void> (0) : __assert_fail ("((SrcElementTy->isIntegerTy() && DstElementTy->isIntegerTy()) || (SrcElementTy->isFloatingPointTy() && DstElementTy->isFloatingPointTy())) && \"unexpected conversion between a floating-point vector and an \" \"integer vector\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 1327, __PRETTY_FUNCTION__)) | ||||
1327 | "integer vector")((((SrcElementTy->isIntegerTy() && DstElementTy-> isIntegerTy()) || (SrcElementTy->isFloatingPointTy() && DstElementTy->isFloatingPointTy())) && "unexpected conversion between a floating-point vector and an " "integer vector") ? static_cast<void> (0) : __assert_fail ("((SrcElementTy->isIntegerTy() && DstElementTy->isIntegerTy()) || (SrcElementTy->isFloatingPointTy() && DstElementTy->isFloatingPointTy())) && \"unexpected conversion between a floating-point vector and an \" \"integer vector\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 1327, __PRETTY_FUNCTION__)); | ||||
1328 | |||||
1329 | // Truncate an i32 vector to an i16 vector. | ||||
1330 | if (SrcElementTy->isIntegerTy()) | ||||
1331 | return Builder.CreateIntCast(Src, DstTy, false, "conv"); | ||||
1332 | |||||
1333 | // Truncate a float vector to a half vector. | ||||
1334 | if (SrcSize > DstSize) | ||||
1335 | return Builder.CreateFPTrunc(Src, DstTy, "conv"); | ||||
1336 | |||||
1337 | // Promote a half vector to a float vector. | ||||
1338 | return Builder.CreateFPExt(Src, DstTy, "conv"); | ||||
1339 | } | ||||
1340 | |||||
1341 | // Finally, we have the arithmetic types: real int/float. | ||||
1342 | Value *Res = nullptr; | ||||
1343 | llvm::Type *ResTy = DstTy; | ||||
1344 | |||||
1345 | // An overflowing conversion has undefined behavior if either the source type | ||||
1346 | // or the destination type is a floating-point type. However, we consider the | ||||
1347 | // range of representable values for all floating-point types to be | ||||
1348 | // [-inf,+inf], so no overflow can ever happen when the destination type is a | ||||
1349 | // floating-point type. | ||||
1350 | if (CGF.SanOpts.has(SanitizerKind::FloatCastOverflow) && | ||||
1351 | OrigSrcType->isFloatingType()) | ||||
1352 | EmitFloatConversionCheck(OrigSrc, OrigSrcType, Src, SrcType, DstType, DstTy, | ||||
1353 | Loc); | ||||
1354 | |||||
1355 | // Cast to half through float if half isn't a native type. | ||||
1356 | if (DstType->isHalfType() && !CGF.getContext().getLangOpts().NativeHalfType) { | ||||
1357 | // Make sure we cast in a single step if from another FP type. | ||||
1358 | if (SrcTy->isFloatingPointTy()) { | ||||
1359 | // Use the intrinsic if the half type itself isn't supported | ||||
1360 | // (as opposed to operations on half, available with NativeHalfType). | ||||
1361 | if (CGF.getContext().getTargetInfo().useFP16ConversionIntrinsics()) | ||||
1362 | return Builder.CreateCall( | ||||
1363 | CGF.CGM.getIntrinsic(llvm::Intrinsic::convert_to_fp16, SrcTy), Src); | ||||
1364 | // If the half type is supported, just use an fptrunc. | ||||
1365 | return Builder.CreateFPTrunc(Src, DstTy); | ||||
1366 | } | ||||
1367 | DstTy = CGF.FloatTy; | ||||
1368 | } | ||||
1369 | |||||
1370 | if (isa<llvm::IntegerType>(SrcTy)) { | ||||
1371 | bool InputSigned = SrcType->isSignedIntegerOrEnumerationType(); | ||||
1372 | if (SrcType->isBooleanType() && Opts.TreatBooleanAsSigned) { | ||||
1373 | InputSigned = true; | ||||
1374 | } | ||||
1375 | if (isa<llvm::IntegerType>(DstTy)) | ||||
1376 | Res = Builder.CreateIntCast(Src, DstTy, InputSigned, "conv"); | ||||
1377 | else if (InputSigned) | ||||
1378 | Res = Builder.CreateSIToFP(Src, DstTy, "conv"); | ||||
1379 | else | ||||
1380 | Res = Builder.CreateUIToFP(Src, DstTy, "conv"); | ||||
1381 | } else if (isa<llvm::IntegerType>(DstTy)) { | ||||
1382 | assert(SrcTy->isFloatingPointTy() && "Unknown real conversion")((SrcTy->isFloatingPointTy() && "Unknown real conversion" ) ? static_cast<void> (0) : __assert_fail ("SrcTy->isFloatingPointTy() && \"Unknown real conversion\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 1382, __PRETTY_FUNCTION__)); | ||||
1383 | if (DstType->isSignedIntegerOrEnumerationType()) | ||||
1384 | Res = Builder.CreateFPToSI(Src, DstTy, "conv"); | ||||
1385 | else | ||||
1386 | Res = Builder.CreateFPToUI(Src, DstTy, "conv"); | ||||
1387 | } else { | ||||
1388 | assert(SrcTy->isFloatingPointTy() && DstTy->isFloatingPointTy() &&((SrcTy->isFloatingPointTy() && DstTy->isFloatingPointTy () && "Unknown real conversion") ? static_cast<void > (0) : __assert_fail ("SrcTy->isFloatingPointTy() && DstTy->isFloatingPointTy() && \"Unknown real conversion\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 1389, __PRETTY_FUNCTION__)) | ||||
1389 | "Unknown real conversion")((SrcTy->isFloatingPointTy() && DstTy->isFloatingPointTy () && "Unknown real conversion") ? static_cast<void > (0) : __assert_fail ("SrcTy->isFloatingPointTy() && DstTy->isFloatingPointTy() && \"Unknown real conversion\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 1389, __PRETTY_FUNCTION__)); | ||||
1390 | if (DstTy->getTypeID() < SrcTy->getTypeID()) | ||||
1391 | Res = Builder.CreateFPTrunc(Src, DstTy, "conv"); | ||||
1392 | else | ||||
1393 | Res = Builder.CreateFPExt(Src, DstTy, "conv"); | ||||
1394 | } | ||||
1395 | |||||
1396 | if (DstTy != ResTy) { | ||||
1397 | if (CGF.getContext().getTargetInfo().useFP16ConversionIntrinsics()) { | ||||
1398 | assert(ResTy->isIntegerTy(16) && "Only half FP requires extra conversion")((ResTy->isIntegerTy(16) && "Only half FP requires extra conversion" ) ? static_cast<void> (0) : __assert_fail ("ResTy->isIntegerTy(16) && \"Only half FP requires extra conversion\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 1398, __PRETTY_FUNCTION__)); | ||||
1399 | Res = Builder.CreateCall( | ||||
1400 | CGF.CGM.getIntrinsic(llvm::Intrinsic::convert_to_fp16, CGF.CGM.FloatTy), | ||||
1401 | Res); | ||||
1402 | } else { | ||||
1403 | Res = Builder.CreateFPTrunc(Res, ResTy, "conv"); | ||||
1404 | } | ||||
1405 | } | ||||
1406 | |||||
1407 | if (Opts.EmitImplicitIntegerTruncationChecks) | ||||
1408 | EmitIntegerTruncationCheck(Src, NoncanonicalSrcType, Res, | ||||
1409 | NoncanonicalDstType, Loc); | ||||
1410 | |||||
1411 | if (Opts.EmitImplicitIntegerSignChangeChecks) | ||||
1412 | EmitIntegerSignChangeCheck(Src, NoncanonicalSrcType, Res, | ||||
1413 | NoncanonicalDstType, Loc); | ||||
1414 | |||||
1415 | return Res; | ||||
1416 | } | ||||
1417 | |||||
1418 | Value *ScalarExprEmitter::EmitFixedPointConversion(Value *Src, QualType SrcTy, | ||||
1419 | QualType DstTy, | ||||
1420 | SourceLocation Loc) { | ||||
1421 | FixedPointSemantics SrcFPSema = | ||||
1422 | CGF.getContext().getFixedPointSemantics(SrcTy); | ||||
1423 | FixedPointSemantics DstFPSema = | ||||
1424 | CGF.getContext().getFixedPointSemantics(DstTy); | ||||
1425 | return EmitFixedPointConversion(Src, SrcFPSema, DstFPSema, Loc, | ||||
1426 | DstTy->isIntegerType()); | ||||
1427 | } | ||||
1428 | |||||
1429 | Value *ScalarExprEmitter::EmitFixedPointConversion( | ||||
1430 | Value *Src, FixedPointSemantics &SrcFPSema, FixedPointSemantics &DstFPSema, | ||||
1431 | SourceLocation Loc, bool DstIsInteger) { | ||||
1432 | using llvm::APInt; | ||||
1433 | using llvm::ConstantInt; | ||||
1434 | using llvm::Value; | ||||
1435 | |||||
1436 | unsigned SrcWidth = SrcFPSema.getWidth(); | ||||
1437 | unsigned DstWidth = DstFPSema.getWidth(); | ||||
1438 | unsigned SrcScale = SrcFPSema.getScale(); | ||||
1439 | unsigned DstScale = DstFPSema.getScale(); | ||||
1440 | bool SrcIsSigned = SrcFPSema.isSigned(); | ||||
1441 | bool DstIsSigned = DstFPSema.isSigned(); | ||||
1442 | |||||
1443 | llvm::Type *DstIntTy = Builder.getIntNTy(DstWidth); | ||||
1444 | |||||
1445 | Value *Result = Src; | ||||
1446 | unsigned ResultWidth = SrcWidth; | ||||
1447 | |||||
1448 | // Downscale. | ||||
1449 | if (DstScale < SrcScale) { | ||||
1450 | // When converting to integers, we round towards zero. For negative numbers, | ||||
1451 | // right shifting rounds towards negative infinity. In this case, we can | ||||
1452 | // just round up before shifting. | ||||
1453 | if (DstIsInteger && SrcIsSigned) { | ||||
1454 | Value *Zero = llvm::Constant::getNullValue(Result->getType()); | ||||
1455 | Value *IsNegative = Builder.CreateICmpSLT(Result, Zero); | ||||
1456 | Value *LowBits = ConstantInt::get( | ||||
1457 | CGF.getLLVMContext(), APInt::getLowBitsSet(ResultWidth, SrcScale)); | ||||
1458 | Value *Rounded = Builder.CreateAdd(Result, LowBits); | ||||
1459 | Result = Builder.CreateSelect(IsNegative, Rounded, Result); | ||||
1460 | } | ||||
1461 | |||||
1462 | Result = SrcIsSigned | ||||
1463 | ? Builder.CreateAShr(Result, SrcScale - DstScale, "downscale") | ||||
1464 | : Builder.CreateLShr(Result, SrcScale - DstScale, "downscale"); | ||||
1465 | } | ||||
1466 | |||||
1467 | if (!DstFPSema.isSaturated()) { | ||||
1468 | // Resize. | ||||
1469 | Result = Builder.CreateIntCast(Result, DstIntTy, SrcIsSigned, "resize"); | ||||
1470 | |||||
1471 | // Upscale. | ||||
1472 | if (DstScale > SrcScale) | ||||
1473 | Result = Builder.CreateShl(Result, DstScale - SrcScale, "upscale"); | ||||
1474 | } else { | ||||
1475 | // Adjust the number of fractional bits. | ||||
1476 | if (DstScale > SrcScale) { | ||||
1477 | // Compare to DstWidth to prevent resizing twice. | ||||
1478 | ResultWidth = std::max(SrcWidth + DstScale - SrcScale, DstWidth); | ||||
1479 | llvm::Type *UpscaledTy = Builder.getIntNTy(ResultWidth); | ||||
1480 | Result = Builder.CreateIntCast(Result, UpscaledTy, SrcIsSigned, "resize"); | ||||
1481 | Result = Builder.CreateShl(Result, DstScale - SrcScale, "upscale"); | ||||
1482 | } | ||||
1483 | |||||
1484 | // Handle saturation. | ||||
1485 | bool LessIntBits = DstFPSema.getIntegralBits() < SrcFPSema.getIntegralBits(); | ||||
1486 | if (LessIntBits) { | ||||
1487 | Value *Max = ConstantInt::get( | ||||
1488 | CGF.getLLVMContext(), | ||||
1489 | APFixedPoint::getMax(DstFPSema).getValue().extOrTrunc(ResultWidth)); | ||||
1490 | Value *TooHigh = SrcIsSigned ? Builder.CreateICmpSGT(Result, Max) | ||||
1491 | : Builder.CreateICmpUGT(Result, Max); | ||||
1492 | Result = Builder.CreateSelect(TooHigh, Max, Result, "satmax"); | ||||
1493 | } | ||||
1494 | // Cannot overflow min to dest type if src is unsigned since all fixed | ||||
1495 | // point types can cover the unsigned min of 0. | ||||
1496 | if (SrcIsSigned && (LessIntBits || !DstIsSigned)) { | ||||
1497 | Value *Min = ConstantInt::get( | ||||
1498 | CGF.getLLVMContext(), | ||||
1499 | APFixedPoint::getMin(DstFPSema).getValue().extOrTrunc(ResultWidth)); | ||||
1500 | Value *TooLow = Builder.CreateICmpSLT(Result, Min); | ||||
1501 | Result = Builder.CreateSelect(TooLow, Min, Result, "satmin"); | ||||
1502 | } | ||||
1503 | |||||
1504 | // Resize the integer part to get the final destination size. | ||||
1505 | if (ResultWidth != DstWidth) | ||||
1506 | Result = Builder.CreateIntCast(Result, DstIntTy, SrcIsSigned, "resize"); | ||||
1507 | } | ||||
1508 | return Result; | ||||
1509 | } | ||||
1510 | |||||
1511 | /// Emit a conversion from the specified complex type to the specified | ||||
1512 | /// destination type, where the destination type is an LLVM scalar type. | ||||
1513 | Value *ScalarExprEmitter::EmitComplexToScalarConversion( | ||||
1514 | CodeGenFunction::ComplexPairTy Src, QualType SrcTy, QualType DstTy, | ||||
1515 | SourceLocation Loc) { | ||||
1516 | // Get the source element type. | ||||
1517 | SrcTy = SrcTy->castAs<ComplexType>()->getElementType(); | ||||
1518 | |||||
1519 | // Handle conversions to bool first, they are special: comparisons against 0. | ||||
1520 | if (DstTy->isBooleanType()) { | ||||
1521 | // Complex != 0 -> (Real != 0) | (Imag != 0) | ||||
1522 | Src.first = EmitScalarConversion(Src.first, SrcTy, DstTy, Loc); | ||||
1523 | Src.second = EmitScalarConversion(Src.second, SrcTy, DstTy, Loc); | ||||
1524 | return Builder.CreateOr(Src.first, Src.second, "tobool"); | ||||
1525 | } | ||||
1526 | |||||
1527 | // C99 6.3.1.7p2: "When a value of complex type is converted to a real type, | ||||
1528 | // the imaginary part of the complex value is discarded and the value of the | ||||
1529 | // real part is converted according to the conversion rules for the | ||||
1530 | // corresponding real type. | ||||
1531 | return EmitScalarConversion(Src.first, SrcTy, DstTy, Loc); | ||||
1532 | } | ||||
1533 | |||||
1534 | Value *ScalarExprEmitter::EmitNullValue(QualType Ty) { | ||||
1535 | return CGF.EmitFromMemory(CGF.CGM.EmitNullConstant(Ty), Ty); | ||||
1536 | } | ||||
1537 | |||||
1538 | /// Emit a sanitization check for the given "binary" operation (which | ||||
1539 | /// might actually be a unary increment which has been lowered to a binary | ||||
1540 | /// operation). The check passes if all values in \p Checks (which are \c i1), | ||||
1541 | /// are \c true. | ||||
1542 | void ScalarExprEmitter::EmitBinOpCheck( | ||||
1543 | ArrayRef<std::pair<Value *, SanitizerMask>> Checks, const BinOpInfo &Info) { | ||||
1544 | assert(CGF.IsSanitizerScope)((CGF.IsSanitizerScope) ? static_cast<void> (0) : __assert_fail ("CGF.IsSanitizerScope", "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 1544, __PRETTY_FUNCTION__)); | ||||
1545 | SanitizerHandler Check; | ||||
1546 | SmallVector<llvm::Constant *, 4> StaticData; | ||||
1547 | SmallVector<llvm::Value *, 2> DynamicData; | ||||
1548 | |||||
1549 | BinaryOperatorKind Opcode = Info.Opcode; | ||||
1550 | if (BinaryOperator::isCompoundAssignmentOp(Opcode)) | ||||
1551 | Opcode = BinaryOperator::getOpForCompoundAssignment(Opcode); | ||||
1552 | |||||
1553 | StaticData.push_back(CGF.EmitCheckSourceLocation(Info.E->getExprLoc())); | ||||
1554 | const UnaryOperator *UO = dyn_cast<UnaryOperator>(Info.E); | ||||
1555 | if (UO && UO->getOpcode() == UO_Minus) { | ||||
1556 | Check = SanitizerHandler::NegateOverflow; | ||||
1557 | StaticData.push_back(CGF.EmitCheckTypeDescriptor(UO->getType())); | ||||
1558 | DynamicData.push_back(Info.RHS); | ||||
1559 | } else { | ||||
1560 | if (BinaryOperator::isShiftOp(Opcode)) { | ||||
1561 | // Shift LHS negative or too large, or RHS out of bounds. | ||||
1562 | Check = SanitizerHandler::ShiftOutOfBounds; | ||||
1563 | const BinaryOperator *BO = cast<BinaryOperator>(Info.E); | ||||
1564 | StaticData.push_back( | ||||
1565 | CGF.EmitCheckTypeDescriptor(BO->getLHS()->getType())); | ||||
1566 | StaticData.push_back( | ||||
1567 | CGF.EmitCheckTypeDescriptor(BO->getRHS()->getType())); | ||||
1568 | } else if (Opcode == BO_Div || Opcode == BO_Rem) { | ||||
1569 | // Divide or modulo by zero, or signed overflow (eg INT_MAX / -1). | ||||
1570 | Check = SanitizerHandler::DivremOverflow; | ||||
1571 | StaticData.push_back(CGF.EmitCheckTypeDescriptor(Info.Ty)); | ||||
1572 | } else { | ||||
1573 | // Arithmetic overflow (+, -, *). | ||||
1574 | switch (Opcode) { | ||||
1575 | case BO_Add: Check = SanitizerHandler::AddOverflow; break; | ||||
1576 | case BO_Sub: Check = SanitizerHandler::SubOverflow; break; | ||||
1577 | case BO_Mul: Check = SanitizerHandler::MulOverflow; break; | ||||
1578 | default: llvm_unreachable("unexpected opcode for bin op check")::llvm::llvm_unreachable_internal("unexpected opcode for bin op check" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 1578); | ||||
1579 | } | ||||
1580 | StaticData.push_back(CGF.EmitCheckTypeDescriptor(Info.Ty)); | ||||
1581 | } | ||||
1582 | DynamicData.push_back(Info.LHS); | ||||
1583 | DynamicData.push_back(Info.RHS); | ||||
1584 | } | ||||
1585 | |||||
1586 | CGF.EmitCheck(Checks, Check, StaticData, DynamicData); | ||||
1587 | } | ||||
1588 | |||||
1589 | //===----------------------------------------------------------------------===// | ||||
1590 | // Visitor Methods | ||||
1591 | //===----------------------------------------------------------------------===// | ||||
1592 | |||||
1593 | Value *ScalarExprEmitter::VisitExpr(Expr *E) { | ||||
1594 | CGF.ErrorUnsupported(E, "scalar expression"); | ||||
1595 | if (E->getType()->isVoidType()) | ||||
1596 | return nullptr; | ||||
1597 | return llvm::UndefValue::get(CGF.ConvertType(E->getType())); | ||||
1598 | } | ||||
1599 | |||||
1600 | Value *ScalarExprEmitter::VisitShuffleVectorExpr(ShuffleVectorExpr *E) { | ||||
1601 | // Vector Mask Case | ||||
1602 | if (E->getNumSubExprs() == 2) { | ||||
1603 | Value *LHS = CGF.EmitScalarExpr(E->getExpr(0)); | ||||
1604 | Value *RHS = CGF.EmitScalarExpr(E->getExpr(1)); | ||||
1605 | Value *Mask; | ||||
1606 | |||||
1607 | llvm::VectorType *LTy = cast<llvm::VectorType>(LHS->getType()); | ||||
1608 | unsigned LHSElts = LTy->getNumElements(); | ||||
1609 | |||||
1610 | Mask = RHS; | ||||
1611 | |||||
1612 | llvm::VectorType *MTy = cast<llvm::VectorType>(Mask->getType()); | ||||
1613 | |||||
1614 | // Mask off the high bits of each shuffle index. | ||||
1615 | Value *MaskBits = | ||||
1616 | llvm::ConstantInt::get(MTy, llvm::NextPowerOf2(LHSElts - 1) - 1); | ||||
1617 | Mask = Builder.CreateAnd(Mask, MaskBits, "mask"); | ||||
1618 | |||||
1619 | // newv = undef | ||||
1620 | // mask = mask & maskbits | ||||
1621 | // for each elt | ||||
1622 | // n = extract mask i | ||||
1623 | // x = extract val n | ||||
1624 | // newv = insert newv, x, i | ||||
1625 | llvm::VectorType *RTy = llvm::VectorType::get(LTy->getElementType(), | ||||
1626 | MTy->getNumElements()); | ||||
1627 | Value* NewV = llvm::UndefValue::get(RTy); | ||||
1628 | for (unsigned i = 0, e = MTy->getNumElements(); i != e; ++i) { | ||||
1629 | Value *IIndx = llvm::ConstantInt::get(CGF.SizeTy, i); | ||||
1630 | Value *Indx = Builder.CreateExtractElement(Mask, IIndx, "shuf_idx"); | ||||
1631 | |||||
1632 | Value *VExt = Builder.CreateExtractElement(LHS, Indx, "shuf_elt"); | ||||
1633 | NewV = Builder.CreateInsertElement(NewV, VExt, IIndx, "shuf_ins"); | ||||
1634 | } | ||||
1635 | return NewV; | ||||
1636 | } | ||||
1637 | |||||
1638 | Value* V1 = CGF.EmitScalarExpr(E->getExpr(0)); | ||||
1639 | Value* V2 = CGF.EmitScalarExpr(E->getExpr(1)); | ||||
1640 | |||||
1641 | SmallVector<llvm::Constant*, 32> indices; | ||||
1642 | for (unsigned i = 2; i < E->getNumSubExprs(); ++i) { | ||||
1643 | llvm::APSInt Idx = E->getShuffleMaskIdx(CGF.getContext(), i-2); | ||||
1644 | // Check for -1 and output it as undef in the IR. | ||||
1645 | if (Idx.isSigned() && Idx.isAllOnesValue()) | ||||
1646 | indices.push_back(llvm::UndefValue::get(CGF.Int32Ty)); | ||||
1647 | else | ||||
1648 | indices.push_back(Builder.getInt32(Idx.getZExtValue())); | ||||
1649 | } | ||||
1650 | |||||
1651 | Value *SV = llvm::ConstantVector::get(indices); | ||||
1652 | return Builder.CreateShuffleVector(V1, V2, SV, "shuffle"); | ||||
1653 | } | ||||
1654 | |||||
1655 | Value *ScalarExprEmitter::VisitConvertVectorExpr(ConvertVectorExpr *E) { | ||||
1656 | QualType SrcType = E->getSrcExpr()->getType(), | ||||
1657 | DstType = E->getType(); | ||||
1658 | |||||
1659 | Value *Src = CGF.EmitScalarExpr(E->getSrcExpr()); | ||||
1660 | |||||
1661 | SrcType = CGF.getContext().getCanonicalType(SrcType); | ||||
1662 | DstType = CGF.getContext().getCanonicalType(DstType); | ||||
1663 | if (SrcType == DstType) return Src; | ||||
1664 | |||||
1665 | assert(SrcType->isVectorType() &&((SrcType->isVectorType() && "ConvertVector source type must be a vector" ) ? static_cast<void> (0) : __assert_fail ("SrcType->isVectorType() && \"ConvertVector source type must be a vector\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 1666, __PRETTY_FUNCTION__)) | ||||
1666 | "ConvertVector source type must be a vector")((SrcType->isVectorType() && "ConvertVector source type must be a vector" ) ? static_cast<void> (0) : __assert_fail ("SrcType->isVectorType() && \"ConvertVector source type must be a vector\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 1666, __PRETTY_FUNCTION__)); | ||||
1667 | assert(DstType->isVectorType() &&((DstType->isVectorType() && "ConvertVector destination type must be a vector" ) ? static_cast<void> (0) : __assert_fail ("DstType->isVectorType() && \"ConvertVector destination type must be a vector\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 1668, __PRETTY_FUNCTION__)) | ||||
1668 | "ConvertVector destination type must be a vector")((DstType->isVectorType() && "ConvertVector destination type must be a vector" ) ? static_cast<void> (0) : __assert_fail ("DstType->isVectorType() && \"ConvertVector destination type must be a vector\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 1668, __PRETTY_FUNCTION__)); | ||||
1669 | |||||
1670 | llvm::Type *SrcTy = Src->getType(); | ||||
1671 | llvm::Type *DstTy = ConvertType(DstType); | ||||
1672 | |||||
1673 | // Ignore conversions like int -> uint. | ||||
1674 | if (SrcTy == DstTy) | ||||
1675 | return Src; | ||||
1676 | |||||
1677 | QualType SrcEltType = SrcType->castAs<VectorType>()->getElementType(), | ||||
1678 | DstEltType = DstType->castAs<VectorType>()->getElementType(); | ||||
1679 | |||||
1680 | assert(SrcTy->isVectorTy() &&((SrcTy->isVectorTy() && "ConvertVector source IR type must be a vector" ) ? static_cast<void> (0) : __assert_fail ("SrcTy->isVectorTy() && \"ConvertVector source IR type must be a vector\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 1681, __PRETTY_FUNCTION__)) | ||||
1681 | "ConvertVector source IR type must be a vector")((SrcTy->isVectorTy() && "ConvertVector source IR type must be a vector" ) ? static_cast<void> (0) : __assert_fail ("SrcTy->isVectorTy() && \"ConvertVector source IR type must be a vector\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 1681, __PRETTY_FUNCTION__)); | ||||
1682 | assert(DstTy->isVectorTy() &&((DstTy->isVectorTy() && "ConvertVector destination IR type must be a vector" ) ? static_cast<void> (0) : __assert_fail ("DstTy->isVectorTy() && \"ConvertVector destination IR type must be a vector\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 1683, __PRETTY_FUNCTION__)) | ||||
1683 | "ConvertVector destination IR type must be a vector")((DstTy->isVectorTy() && "ConvertVector destination IR type must be a vector" ) ? static_cast<void> (0) : __assert_fail ("DstTy->isVectorTy() && \"ConvertVector destination IR type must be a vector\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 1683, __PRETTY_FUNCTION__)); | ||||
1684 | |||||
1685 | llvm::Type *SrcEltTy = SrcTy->getVectorElementType(), | ||||
1686 | *DstEltTy = DstTy->getVectorElementType(); | ||||
1687 | |||||
1688 | if (DstEltType->isBooleanType()) { | ||||
1689 | assert((SrcEltTy->isFloatingPointTy() ||(((SrcEltTy->isFloatingPointTy() || isa<llvm::IntegerType >(SrcEltTy)) && "Unknown boolean conversion") ? static_cast <void> (0) : __assert_fail ("(SrcEltTy->isFloatingPointTy() || isa<llvm::IntegerType>(SrcEltTy)) && \"Unknown boolean conversion\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 1690, __PRETTY_FUNCTION__)) | ||||
1690 | isa<llvm::IntegerType>(SrcEltTy)) && "Unknown boolean conversion")(((SrcEltTy->isFloatingPointTy() || isa<llvm::IntegerType >(SrcEltTy)) && "Unknown boolean conversion") ? static_cast <void> (0) : __assert_fail ("(SrcEltTy->isFloatingPointTy() || isa<llvm::IntegerType>(SrcEltTy)) && \"Unknown boolean conversion\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 1690, __PRETTY_FUNCTION__)); | ||||
1691 | |||||
1692 | llvm::Value *Zero = llvm::Constant::getNullValue(SrcTy); | ||||
1693 | if (SrcEltTy->isFloatingPointTy()) { | ||||
1694 | return Builder.CreateFCmpUNE(Src, Zero, "tobool"); | ||||
1695 | } else { | ||||
1696 | return Builder.CreateICmpNE(Src, Zero, "tobool"); | ||||
1697 | } | ||||
1698 | } | ||||
1699 | |||||
1700 | // We have the arithmetic types: real int/float. | ||||
1701 | Value *Res = nullptr; | ||||
1702 | |||||
1703 | if (isa<llvm::IntegerType>(SrcEltTy)) { | ||||
1704 | bool InputSigned = SrcEltType->isSignedIntegerOrEnumerationType(); | ||||
1705 | if (isa<llvm::IntegerType>(DstEltTy)) | ||||
1706 | Res = Builder.CreateIntCast(Src, DstTy, InputSigned, "conv"); | ||||
1707 | else if (InputSigned) | ||||
1708 | Res = Builder.CreateSIToFP(Src, DstTy, "conv"); | ||||
1709 | else | ||||
1710 | Res = Builder.CreateUIToFP(Src, DstTy, "conv"); | ||||
1711 | } else if (isa<llvm::IntegerType>(DstEltTy)) { | ||||
1712 | assert(SrcEltTy->isFloatingPointTy() && "Unknown real conversion")((SrcEltTy->isFloatingPointTy() && "Unknown real conversion" ) ? static_cast<void> (0) : __assert_fail ("SrcEltTy->isFloatingPointTy() && \"Unknown real conversion\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 1712, __PRETTY_FUNCTION__)); | ||||
1713 | if (DstEltType->isSignedIntegerOrEnumerationType()) | ||||
1714 | Res = Builder.CreateFPToSI(Src, DstTy, "conv"); | ||||
1715 | else | ||||
1716 | Res = Builder.CreateFPToUI(Src, DstTy, "conv"); | ||||
1717 | } else { | ||||
1718 | assert(SrcEltTy->isFloatingPointTy() && DstEltTy->isFloatingPointTy() &&((SrcEltTy->isFloatingPointTy() && DstEltTy->isFloatingPointTy () && "Unknown real conversion") ? static_cast<void > (0) : __assert_fail ("SrcEltTy->isFloatingPointTy() && DstEltTy->isFloatingPointTy() && \"Unknown real conversion\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 1719, __PRETTY_FUNCTION__)) | ||||
1719 | "Unknown real conversion")((SrcEltTy->isFloatingPointTy() && DstEltTy->isFloatingPointTy () && "Unknown real conversion") ? static_cast<void > (0) : __assert_fail ("SrcEltTy->isFloatingPointTy() && DstEltTy->isFloatingPointTy() && \"Unknown real conversion\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 1719, __PRETTY_FUNCTION__)); | ||||
1720 | if (DstEltTy->getTypeID() < SrcEltTy->getTypeID()) | ||||
1721 | Res = Builder.CreateFPTrunc(Src, DstTy, "conv"); | ||||
1722 | else | ||||
1723 | Res = Builder.CreateFPExt(Src, DstTy, "conv"); | ||||
1724 | } | ||||
1725 | |||||
1726 | return Res; | ||||
1727 | } | ||||
1728 | |||||
1729 | Value *ScalarExprEmitter::VisitMemberExpr(MemberExpr *E) { | ||||
1730 | if (CodeGenFunction::ConstantEmission Constant = CGF.tryEmitAsConstant(E)) { | ||||
1731 | CGF.EmitIgnoredExpr(E->getBase()); | ||||
1732 | return CGF.emitScalarConstant(Constant, E); | ||||
1733 | } else { | ||||
1734 | Expr::EvalResult Result; | ||||
1735 | if (E->EvaluateAsInt(Result, CGF.getContext(), Expr::SE_AllowSideEffects)) { | ||||
1736 | llvm::APSInt Value = Result.Val.getInt(); | ||||
1737 | CGF.EmitIgnoredExpr(E->getBase()); | ||||
1738 | return Builder.getInt(Value); | ||||
1739 | } | ||||
1740 | } | ||||
1741 | |||||
1742 | return EmitLoadOfLValue(E); | ||||
1743 | } | ||||
1744 | |||||
1745 | Value *ScalarExprEmitter::VisitArraySubscriptExpr(ArraySubscriptExpr *E) { | ||||
1746 | TestAndClearIgnoreResultAssign(); | ||||
1747 | |||||
1748 | // Emit subscript expressions in rvalue context's. For most cases, this just | ||||
1749 | // loads the lvalue formed by the subscript expr. However, we have to be | ||||
1750 | // careful, because the base of a vector subscript is occasionally an rvalue, | ||||
1751 | // so we can't get it as an lvalue. | ||||
1752 | if (!E->getBase()->getType()->isVectorType()) | ||||
1753 | return EmitLoadOfLValue(E); | ||||
1754 | |||||
1755 | // Handle the vector case. The base must be a vector, the index must be an | ||||
1756 | // integer value. | ||||
1757 | Value *Base = Visit(E->getBase()); | ||||
1758 | Value *Idx = Visit(E->getIdx()); | ||||
1759 | QualType IdxTy = E->getIdx()->getType(); | ||||
1760 | |||||
1761 | if (CGF.SanOpts.has(SanitizerKind::ArrayBounds)) | ||||
1762 | CGF.EmitBoundsCheck(E, E->getBase(), Idx, IdxTy, /*Accessed*/true); | ||||
1763 | |||||
1764 | return Builder.CreateExtractElement(Base, Idx, "vecext"); | ||||
1765 | } | ||||
1766 | |||||
1767 | static llvm::Constant *getMaskElt(llvm::ShuffleVectorInst *SVI, unsigned Idx, | ||||
1768 | unsigned Off, llvm::Type *I32Ty) { | ||||
1769 | int MV = SVI->getMaskValue(Idx); | ||||
1770 | if (MV == -1) | ||||
1771 | return llvm::UndefValue::get(I32Ty); | ||||
1772 | return llvm::ConstantInt::get(I32Ty, Off+MV); | ||||
1773 | } | ||||
1774 | |||||
1775 | static llvm::Constant *getAsInt32(llvm::ConstantInt *C, llvm::Type *I32Ty) { | ||||
1776 | if (C->getBitWidth() != 32) { | ||||
1777 | assert(llvm::ConstantInt::isValueValidForType(I32Ty,((llvm::ConstantInt::isValueValidForType(I32Ty, C->getZExtValue ()) && "Index operand too large for shufflevector mask!" ) ? static_cast<void> (0) : __assert_fail ("llvm::ConstantInt::isValueValidForType(I32Ty, C->getZExtValue()) && \"Index operand too large for shufflevector mask!\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 1779, __PRETTY_FUNCTION__)) | ||||
1778 | C->getZExtValue()) &&((llvm::ConstantInt::isValueValidForType(I32Ty, C->getZExtValue ()) && "Index operand too large for shufflevector mask!" ) ? static_cast<void> (0) : __assert_fail ("llvm::ConstantInt::isValueValidForType(I32Ty, C->getZExtValue()) && \"Index operand too large for shufflevector mask!\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 1779, __PRETTY_FUNCTION__)) | ||||
1779 | "Index operand too large for shufflevector mask!")((llvm::ConstantInt::isValueValidForType(I32Ty, C->getZExtValue ()) && "Index operand too large for shufflevector mask!" ) ? static_cast<void> (0) : __assert_fail ("llvm::ConstantInt::isValueValidForType(I32Ty, C->getZExtValue()) && \"Index operand too large for shufflevector mask!\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 1779, __PRETTY_FUNCTION__)); | ||||
1780 | return llvm::ConstantInt::get(I32Ty, C->getZExtValue()); | ||||
1781 | } | ||||
1782 | return C; | ||||
1783 | } | ||||
1784 | |||||
1785 | Value *ScalarExprEmitter::VisitInitListExpr(InitListExpr *E) { | ||||
1786 | bool Ignore = TestAndClearIgnoreResultAssign(); | ||||
1787 | (void)Ignore; | ||||
1788 | assert (Ignore == false && "init list ignored")((Ignore == false && "init list ignored") ? static_cast <void> (0) : __assert_fail ("Ignore == false && \"init list ignored\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 1788, __PRETTY_FUNCTION__)); | ||||
1789 | unsigned NumInitElements = E->getNumInits(); | ||||
1790 | |||||
1791 | if (E->hadArrayRangeDesignator()) | ||||
1792 | CGF.ErrorUnsupported(E, "GNU array range designator extension"); | ||||
1793 | |||||
1794 | llvm::VectorType *VType = | ||||
1795 | dyn_cast<llvm::VectorType>(ConvertType(E->getType())); | ||||
1796 | |||||
1797 | if (!VType) { | ||||
1798 | if (NumInitElements == 0) { | ||||
1799 | // C++11 value-initialization for the scalar. | ||||
1800 | return EmitNullValue(E->getType()); | ||||
1801 | } | ||||
1802 | // We have a scalar in braces. Just use the first element. | ||||
1803 | return Visit(E->getInit(0)); | ||||
1804 | } | ||||
1805 | |||||
1806 | unsigned ResElts = VType->getNumElements(); | ||||
1807 | |||||
1808 | // Loop over initializers collecting the Value for each, and remembering | ||||
1809 | // whether the source was swizzle (ExtVectorElementExpr). This will allow | ||||
1810 | // us to fold the shuffle for the swizzle into the shuffle for the vector | ||||
1811 | // initializer, since LLVM optimizers generally do not want to touch | ||||
1812 | // shuffles. | ||||
1813 | unsigned CurIdx = 0; | ||||
1814 | bool VIsUndefShuffle = false; | ||||
1815 | llvm::Value *V = llvm::UndefValue::get(VType); | ||||
1816 | for (unsigned i = 0; i != NumInitElements; ++i) { | ||||
1817 | Expr *IE = E->getInit(i); | ||||
1818 | Value *Init = Visit(IE); | ||||
1819 | SmallVector<llvm::Constant*, 16> Args; | ||||
1820 | |||||
1821 | llvm::VectorType *VVT = dyn_cast<llvm::VectorType>(Init->getType()); | ||||
1822 | |||||
1823 | // Handle scalar elements. If the scalar initializer is actually one | ||||
1824 | // element of a different vector of the same width, use shuffle instead of | ||||
1825 | // extract+insert. | ||||
1826 | if (!VVT) { | ||||
1827 | if (isa<ExtVectorElementExpr>(IE)) { | ||||
1828 | llvm::ExtractElementInst *EI = cast<llvm::ExtractElementInst>(Init); | ||||
1829 | |||||
1830 | if (EI->getVectorOperandType()->getNumElements() == ResElts) { | ||||
1831 | llvm::ConstantInt *C = cast<llvm::ConstantInt>(EI->getIndexOperand()); | ||||
1832 | Value *LHS = nullptr, *RHS = nullptr; | ||||
1833 | if (CurIdx == 0) { | ||||
1834 | // insert into undef -> shuffle (src, undef) | ||||
1835 | // shufflemask must use an i32 | ||||
1836 | Args.push_back(getAsInt32(C, CGF.Int32Ty)); | ||||
1837 | Args.resize(ResElts, llvm::UndefValue::get(CGF.Int32Ty)); | ||||
1838 | |||||
1839 | LHS = EI->getVectorOperand(); | ||||
1840 | RHS = V; | ||||
1841 | VIsUndefShuffle = true; | ||||
1842 | } else if (VIsUndefShuffle) { | ||||
1843 | // insert into undefshuffle && size match -> shuffle (v, src) | ||||
1844 | llvm::ShuffleVectorInst *SVV = cast<llvm::ShuffleVectorInst>(V); | ||||
1845 | for (unsigned j = 0; j != CurIdx; ++j) | ||||
1846 | Args.push_back(getMaskElt(SVV, j, 0, CGF.Int32Ty)); | ||||
1847 | Args.push_back(Builder.getInt32(ResElts + C->getZExtValue())); | ||||
1848 | Args.resize(ResElts, llvm::UndefValue::get(CGF.Int32Ty)); | ||||
1849 | |||||
1850 | LHS = cast<llvm::ShuffleVectorInst>(V)->getOperand(0); | ||||
1851 | RHS = EI->getVectorOperand(); | ||||
1852 | VIsUndefShuffle = false; | ||||
1853 | } | ||||
1854 | if (!Args.empty()) { | ||||
1855 | llvm::Constant *Mask = llvm::ConstantVector::get(Args); | ||||
1856 | V = Builder.CreateShuffleVector(LHS, RHS, Mask); | ||||
1857 | ++CurIdx; | ||||
1858 | continue; | ||||
1859 | } | ||||
1860 | } | ||||
1861 | } | ||||
1862 | V = Builder.CreateInsertElement(V, Init, Builder.getInt32(CurIdx), | ||||
1863 | "vecinit"); | ||||
1864 | VIsUndefShuffle = false; | ||||
1865 | ++CurIdx; | ||||
1866 | continue; | ||||
1867 | } | ||||
1868 | |||||
1869 | unsigned InitElts = VVT->getNumElements(); | ||||
1870 | |||||
1871 | // If the initializer is an ExtVecEltExpr (a swizzle), and the swizzle's | ||||
1872 | // input is the same width as the vector being constructed, generate an | ||||
1873 | // optimized shuffle of the swizzle input into the result. | ||||
1874 | unsigned Offset = (CurIdx == 0) ? 0 : ResElts; | ||||
1875 | if (isa<ExtVectorElementExpr>(IE)) { | ||||
1876 | llvm::ShuffleVectorInst *SVI = cast<llvm::ShuffleVectorInst>(Init); | ||||
1877 | Value *SVOp = SVI->getOperand(0); | ||||
1878 | llvm::VectorType *OpTy = cast<llvm::VectorType>(SVOp->getType()); | ||||
1879 | |||||
1880 | if (OpTy->getNumElements() == ResElts) { | ||||
1881 | for (unsigned j = 0; j != CurIdx; ++j) { | ||||
1882 | // If the current vector initializer is a shuffle with undef, merge | ||||
1883 | // this shuffle directly into it. | ||||
1884 | if (VIsUndefShuffle) { | ||||
1885 | Args.push_back(getMaskElt(cast<llvm::ShuffleVectorInst>(V), j, 0, | ||||
1886 | CGF.Int32Ty)); | ||||
1887 | } else { | ||||
1888 | Args.push_back(Builder.getInt32(j)); | ||||
1889 | } | ||||
1890 | } | ||||
1891 | for (unsigned j = 0, je = InitElts; j != je; ++j) | ||||
1892 | Args.push_back(getMaskElt(SVI, j, Offset, CGF.Int32Ty)); | ||||
1893 | Args.resize(ResElts, llvm::UndefValue::get(CGF.Int32Ty)); | ||||
1894 | |||||
1895 | if (VIsUndefShuffle) | ||||
1896 | V = cast<llvm::ShuffleVectorInst>(V)->getOperand(0); | ||||
1897 | |||||
1898 | Init = SVOp; | ||||
1899 | } | ||||
1900 | } | ||||
1901 | |||||
1902 | // Extend init to result vector length, and then shuffle its contribution | ||||
1903 | // to the vector initializer into V. | ||||
1904 | if (Args.empty()) { | ||||
1905 | for (unsigned j = 0; j != InitElts; ++j) | ||||
1906 | Args.push_back(Builder.getInt32(j)); | ||||
1907 | Args.resize(ResElts, llvm::UndefValue::get(CGF.Int32Ty)); | ||||
1908 | llvm::Constant *Mask = llvm::ConstantVector::get(Args); | ||||
1909 | Init = Builder.CreateShuffleVector(Init, llvm::UndefValue::get(VVT), | ||||
1910 | Mask, "vext"); | ||||
1911 | |||||
1912 | Args.clear(); | ||||
1913 | for (unsigned j = 0; j != CurIdx; ++j) | ||||
1914 | Args.push_back(Builder.getInt32(j)); | ||||
1915 | for (unsigned j = 0; j != InitElts; ++j) | ||||
1916 | Args.push_back(Builder.getInt32(j+Offset)); | ||||
1917 | Args.resize(ResElts, llvm::UndefValue::get(CGF.Int32Ty)); | ||||
1918 | } | ||||
1919 | |||||
1920 | // If V is undef, make sure it ends up on the RHS of the shuffle to aid | ||||
1921 | // merging subsequent shuffles into this one. | ||||
1922 | if (CurIdx == 0) | ||||
1923 | std::swap(V, Init); | ||||
1924 | llvm::Constant *Mask = llvm::ConstantVector::get(Args); | ||||
1925 | V = Builder.CreateShuffleVector(V, Init, Mask, "vecinit"); | ||||
1926 | VIsUndefShuffle = isa<llvm::UndefValue>(Init); | ||||
1927 | CurIdx += InitElts; | ||||
1928 | } | ||||
1929 | |||||
1930 | // FIXME: evaluate codegen vs. shuffling against constant null vector. | ||||
1931 | // Emit remaining default initializers. | ||||
1932 | llvm::Type *EltTy = VType->getElementType(); | ||||
1933 | |||||
1934 | // Emit remaining default initializers | ||||
1935 | for (/* Do not initialize i*/; CurIdx < ResElts; ++CurIdx) { | ||||
1936 | Value *Idx = Builder.getInt32(CurIdx); | ||||
1937 | llvm::Value *Init = llvm::Constant::getNullValue(EltTy); | ||||
1938 | V = Builder.CreateInsertElement(V, Init, Idx, "vecinit"); | ||||
1939 | } | ||||
1940 | return V; | ||||
1941 | } | ||||
1942 | |||||
1943 | bool CodeGenFunction::ShouldNullCheckClassCastValue(const CastExpr *CE) { | ||||
1944 | const Expr *E = CE->getSubExpr(); | ||||
1945 | |||||
1946 | if (CE->getCastKind() == CK_UncheckedDerivedToBase) | ||||
1947 | return false; | ||||
1948 | |||||
1949 | if (isa<CXXThisExpr>(E->IgnoreParens())) { | ||||
1950 | // We always assume that 'this' is never null. | ||||
1951 | return false; | ||||
1952 | } | ||||
1953 | |||||
1954 | if (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(CE)) { | ||||
1955 | // And that glvalue casts are never null. | ||||
1956 | if (ICE->getValueKind() != VK_RValue) | ||||
1957 | return false; | ||||
1958 | } | ||||
1959 | |||||
1960 | return true; | ||||
1961 | } | ||||
1962 | |||||
1963 | // VisitCastExpr - Emit code for an explicit or implicit cast. Implicit casts | ||||
1964 | // have to handle a more broad range of conversions than explicit casts, as they | ||||
1965 | // handle things like function to ptr-to-function decay etc. | ||||
1966 | Value *ScalarExprEmitter::VisitCastExpr(CastExpr *CE) { | ||||
1967 | Expr *E = CE->getSubExpr(); | ||||
1968 | QualType DestTy = CE->getType(); | ||||
1969 | CastKind Kind = CE->getCastKind(); | ||||
1970 | |||||
1971 | // These cases are generally not written to ignore the result of | ||||
1972 | // evaluating their sub-expressions, so we clear this now. | ||||
1973 | bool Ignored = TestAndClearIgnoreResultAssign(); | ||||
1974 | |||||
1975 | // Since almost all cast kinds apply to scalars, this switch doesn't have | ||||
1976 | // a default case, so the compiler will warn on a missing case. The cases | ||||
1977 | // are in the same order as in the CastKind enum. | ||||
1978 | switch (Kind) { | ||||
1979 | case CK_Dependent: llvm_unreachable("dependent cast kind in IR gen!")::llvm::llvm_unreachable_internal("dependent cast kind in IR gen!" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 1979); | ||||
1980 | case CK_BuiltinFnToFnPtr: | ||||
1981 | llvm_unreachable("builtin functions are handled elsewhere")::llvm::llvm_unreachable_internal("builtin functions are handled elsewhere" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 1981); | ||||
1982 | |||||
1983 | case CK_LValueBitCast: | ||||
1984 | case CK_ObjCObjectLValueCast: { | ||||
1985 | Address Addr = EmitLValue(E).getAddress(CGF); | ||||
1986 | Addr = Builder.CreateElementBitCast(Addr, CGF.ConvertTypeForMem(DestTy)); | ||||
1987 | LValue LV = CGF.MakeAddrLValue(Addr, DestTy); | ||||
1988 | return EmitLoadOfLValue(LV, CE->getExprLoc()); | ||||
1989 | } | ||||
1990 | |||||
1991 | case CK_LValueToRValueBitCast: { | ||||
1992 | LValue SourceLVal = CGF.EmitLValue(E); | ||||
1993 | Address Addr = Builder.CreateElementBitCast(SourceLVal.getAddress(CGF), | ||||
1994 | CGF.ConvertTypeForMem(DestTy)); | ||||
1995 | LValue DestLV = CGF.MakeAddrLValue(Addr, DestTy); | ||||
1996 | DestLV.setTBAAInfo(TBAAAccessInfo::getMayAliasInfo()); | ||||
1997 | return EmitLoadOfLValue(DestLV, CE->getExprLoc()); | ||||
1998 | } | ||||
1999 | |||||
2000 | case CK_CPointerToObjCPointerCast: | ||||
2001 | case CK_BlockPointerToObjCPointerCast: | ||||
2002 | case CK_AnyPointerToBlockPointerCast: | ||||
2003 | case CK_BitCast: { | ||||
2004 | Value *Src = Visit(const_cast<Expr*>(E)); | ||||
2005 | llvm::Type *SrcTy = Src->getType(); | ||||
2006 | llvm::Type *DstTy = ConvertType(DestTy); | ||||
2007 | if (SrcTy->isPtrOrPtrVectorTy() && DstTy->isPtrOrPtrVectorTy() && | ||||
2008 | SrcTy->getPointerAddressSpace() != DstTy->getPointerAddressSpace()) { | ||||
2009 | llvm_unreachable("wrong cast for pointers in different address spaces"::llvm::llvm_unreachable_internal("wrong cast for pointers in different address spaces" "(must be an address space cast)!", "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 2010) | ||||
2010 | "(must be an address space cast)!")::llvm::llvm_unreachable_internal("wrong cast for pointers in different address spaces" "(must be an address space cast)!", "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 2010); | ||||
2011 | } | ||||
2012 | |||||
2013 | if (CGF.SanOpts.has(SanitizerKind::CFIUnrelatedCast)) { | ||||
2014 | if (auto PT = DestTy->getAs<PointerType>()) | ||||
2015 | CGF.EmitVTablePtrCheckForCast(PT->getPointeeType(), Src, | ||||
2016 | /*MayBeNull=*/true, | ||||
2017 | CodeGenFunction::CFITCK_UnrelatedCast, | ||||
2018 | CE->getBeginLoc()); | ||||
2019 | } | ||||
2020 | |||||
2021 | if (CGF.CGM.getCodeGenOpts().StrictVTablePointers) { | ||||
2022 | const QualType SrcType = E->getType(); | ||||
2023 | |||||
2024 | if (SrcType.mayBeNotDynamicClass() && DestTy.mayBeDynamicClass()) { | ||||
2025 | // Casting to pointer that could carry dynamic information (provided by | ||||
2026 | // invariant.group) requires launder. | ||||
2027 | Src = Builder.CreateLaunderInvariantGroup(Src); | ||||
2028 | } else if (SrcType.mayBeDynamicClass() && DestTy.mayBeNotDynamicClass()) { | ||||
2029 | // Casting to pointer that does not carry dynamic information (provided | ||||
2030 | // by invariant.group) requires stripping it. Note that we don't do it | ||||
2031 | // if the source could not be dynamic type and destination could be | ||||
2032 | // dynamic because dynamic information is already laundered. It is | ||||
2033 | // because launder(strip(src)) == launder(src), so there is no need to | ||||
2034 | // add extra strip before launder. | ||||
2035 | Src = Builder.CreateStripInvariantGroup(Src); | ||||
2036 | } | ||||
2037 | } | ||||
2038 | |||||
2039 | // Update heapallocsite metadata when there is an explicit cast. | ||||
2040 | if (llvm::CallInst *CI = dyn_cast<llvm::CallInst>(Src)) | ||||
2041 | if (CI->getMetadata("heapallocsite") && isa<ExplicitCastExpr>(CE)) | ||||
2042 | CGF.getDebugInfo()-> | ||||
2043 | addHeapAllocSiteMetadata(CI, CE->getType(), CE->getExprLoc()); | ||||
2044 | |||||
2045 | return Builder.CreateBitCast(Src, DstTy); | ||||
2046 | } | ||||
2047 | case CK_AddressSpaceConversion: { | ||||
2048 | Expr::EvalResult Result; | ||||
2049 | if (E->EvaluateAsRValue(Result, CGF.getContext()) && | ||||
2050 | Result.Val.isNullPointer()) { | ||||
2051 | // If E has side effect, it is emitted even if its final result is a | ||||
2052 | // null pointer. In that case, a DCE pass should be able to | ||||
2053 | // eliminate the useless instructions emitted during translating E. | ||||
2054 | if (Result.HasSideEffects) | ||||
2055 | Visit(E); | ||||
2056 | return CGF.CGM.getNullPointer(cast<llvm::PointerType>( | ||||
2057 | ConvertType(DestTy)), DestTy); | ||||
2058 | } | ||||
2059 | // Since target may map different address spaces in AST to the same address | ||||
2060 | // space, an address space conversion may end up as a bitcast. | ||||
2061 | return CGF.CGM.getTargetCodeGenInfo().performAddrSpaceCast( | ||||
2062 | CGF, Visit(E), E->getType()->getPointeeType().getAddressSpace(), | ||||
2063 | DestTy->getPointeeType().getAddressSpace(), ConvertType(DestTy)); | ||||
2064 | } | ||||
2065 | case CK_AtomicToNonAtomic: | ||||
2066 | case CK_NonAtomicToAtomic: | ||||
2067 | case CK_NoOp: | ||||
2068 | case CK_UserDefinedConversion: | ||||
2069 | return Visit(const_cast<Expr*>(E)); | ||||
2070 | |||||
2071 | case CK_BaseToDerived: { | ||||
2072 | const CXXRecordDecl *DerivedClassDecl = DestTy->getPointeeCXXRecordDecl(); | ||||
2073 | assert(DerivedClassDecl && "BaseToDerived arg isn't a C++ object pointer!")((DerivedClassDecl && "BaseToDerived arg isn't a C++ object pointer!" ) ? static_cast<void> (0) : __assert_fail ("DerivedClassDecl && \"BaseToDerived arg isn't a C++ object pointer!\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 2073, __PRETTY_FUNCTION__)); | ||||
2074 | |||||
2075 | Address Base = CGF.EmitPointerWithAlignment(E); | ||||
2076 | Address Derived = | ||||
2077 | CGF.GetAddressOfDerivedClass(Base, DerivedClassDecl, | ||||
2078 | CE->path_begin(), CE->path_end(), | ||||
2079 | CGF.ShouldNullCheckClassCastValue(CE)); | ||||
2080 | |||||
2081 | // C++11 [expr.static.cast]p11: Behavior is undefined if a downcast is | ||||
2082 | // performed and the object is not of the derived type. | ||||
2083 | if (CGF.sanitizePerformTypeCheck()) | ||||
2084 | CGF.EmitTypeCheck(CodeGenFunction::TCK_DowncastPointer, CE->getExprLoc(), | ||||
2085 | Derived.getPointer(), DestTy->getPointeeType()); | ||||
2086 | |||||
2087 | if (CGF.SanOpts.has(SanitizerKind::CFIDerivedCast)) | ||||
2088 | CGF.EmitVTablePtrCheckForCast( | ||||
2089 | DestTy->getPointeeType(), Derived.getPointer(), | ||||
2090 | /*MayBeNull=*/true, CodeGenFunction::CFITCK_DerivedCast, | ||||
2091 | CE->getBeginLoc()); | ||||
2092 | |||||
2093 | return Derived.getPointer(); | ||||
2094 | } | ||||
2095 | case CK_UncheckedDerivedToBase: | ||||
2096 | case CK_DerivedToBase: { | ||||
2097 | // The EmitPointerWithAlignment path does this fine; just discard | ||||
2098 | // the alignment. | ||||
2099 | return CGF.EmitPointerWithAlignment(CE).getPointer(); | ||||
2100 | } | ||||
2101 | |||||
2102 | case CK_Dynamic: { | ||||
2103 | Address V = CGF.EmitPointerWithAlignment(E); | ||||
2104 | const CXXDynamicCastExpr *DCE = cast<CXXDynamicCastExpr>(CE); | ||||
2105 | return CGF.EmitDynamicCast(V, DCE); | ||||
2106 | } | ||||
2107 | |||||
2108 | case CK_ArrayToPointerDecay: | ||||
2109 | return CGF.EmitArrayToPointerDecay(E).getPointer(); | ||||
2110 | case CK_FunctionToPointerDecay: | ||||
2111 | return EmitLValue(E).getPointer(CGF); | ||||
2112 | |||||
2113 | case CK_NullToPointer: | ||||
2114 | if (MustVisitNullValue(E)) | ||||
2115 | CGF.EmitIgnoredExpr(E); | ||||
2116 | |||||
2117 | return CGF.CGM.getNullPointer(cast<llvm::PointerType>(ConvertType(DestTy)), | ||||
2118 | DestTy); | ||||
2119 | |||||
2120 | case CK_NullToMemberPointer: { | ||||
2121 | if (MustVisitNullValue(E)) | ||||
2122 | CGF.EmitIgnoredExpr(E); | ||||
2123 | |||||
2124 | const MemberPointerType *MPT = CE->getType()->getAs<MemberPointerType>(); | ||||
2125 | return CGF.CGM.getCXXABI().EmitNullMemberPointer(MPT); | ||||
2126 | } | ||||
2127 | |||||
2128 | case CK_ReinterpretMemberPointer: | ||||
2129 | case CK_BaseToDerivedMemberPointer: | ||||
2130 | case CK_DerivedToBaseMemberPointer: { | ||||
2131 | Value *Src = Visit(E); | ||||
2132 | |||||
2133 | // Note that the AST doesn't distinguish between checked and | ||||
2134 | // unchecked member pointer conversions, so we always have to | ||||
2135 | // implement checked conversions here. This is inefficient when | ||||
2136 | // actual control flow may be required in order to perform the | ||||
2137 | // check, which it is for data member pointers (but not member | ||||
2138 | // function pointers on Itanium and ARM). | ||||
2139 | return CGF.CGM.getCXXABI().EmitMemberPointerConversion(CGF, CE, Src); | ||||
2140 | } | ||||
2141 | |||||
2142 | case CK_ARCProduceObject: | ||||
2143 | return CGF.EmitARCRetainScalarExpr(E); | ||||
2144 | case CK_ARCConsumeObject: | ||||
2145 | return CGF.EmitObjCConsumeObject(E->getType(), Visit(E)); | ||||
2146 | case CK_ARCReclaimReturnedObject: | ||||
2147 | return CGF.EmitARCReclaimReturnedObject(E, /*allowUnsafe*/ Ignored); | ||||
2148 | case CK_ARCExtendBlockObject: | ||||
2149 | return CGF.EmitARCExtendBlockObject(E); | ||||
2150 | |||||
2151 | case CK_CopyAndAutoreleaseBlockObject: | ||||
2152 | return CGF.EmitBlockCopyAndAutorelease(Visit(E), E->getType()); | ||||
2153 | |||||
2154 | case CK_FloatingRealToComplex: | ||||
2155 | case CK_FloatingComplexCast: | ||||
2156 | case CK_IntegralRealToComplex: | ||||
2157 | case CK_IntegralComplexCast: | ||||
2158 | case CK_IntegralComplexToFloatingComplex: | ||||
2159 | case CK_FloatingComplexToIntegralComplex: | ||||
2160 | case CK_ConstructorConversion: | ||||
2161 | case CK_ToUnion: | ||||
2162 | llvm_unreachable("scalar cast to non-scalar value")::llvm::llvm_unreachable_internal("scalar cast to non-scalar value" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 2162); | ||||
2163 | |||||
2164 | case CK_LValueToRValue: | ||||
2165 | assert(CGF.getContext().hasSameUnqualifiedType(E->getType(), DestTy))((CGF.getContext().hasSameUnqualifiedType(E->getType(), DestTy )) ? static_cast<void> (0) : __assert_fail ("CGF.getContext().hasSameUnqualifiedType(E->getType(), DestTy)" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 2165, __PRETTY_FUNCTION__)); | ||||
2166 | assert(E->isGLValue() && "lvalue-to-rvalue applied to r-value!")((E->isGLValue() && "lvalue-to-rvalue applied to r-value!" ) ? static_cast<void> (0) : __assert_fail ("E->isGLValue() && \"lvalue-to-rvalue applied to r-value!\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 2166, __PRETTY_FUNCTION__)); | ||||
2167 | return Visit(const_cast<Expr*>(E)); | ||||
2168 | |||||
2169 | case CK_IntegralToPointer: { | ||||
2170 | Value *Src = Visit(const_cast<Expr*>(E)); | ||||
2171 | |||||
2172 | // First, convert to the correct width so that we control the kind of | ||||
2173 | // extension. | ||||
2174 | auto DestLLVMTy = ConvertType(DestTy); | ||||
2175 | llvm::Type *MiddleTy = CGF.CGM.getDataLayout().getIntPtrType(DestLLVMTy); | ||||
2176 | bool InputSigned = E->getType()->isSignedIntegerOrEnumerationType(); | ||||
2177 | llvm::Value* IntResult = | ||||
2178 | Builder.CreateIntCast(Src, MiddleTy, InputSigned, "conv"); | ||||
2179 | |||||
2180 | auto *IntToPtr = Builder.CreateIntToPtr(IntResult, DestLLVMTy); | ||||
2181 | |||||
2182 | if (CGF.CGM.getCodeGenOpts().StrictVTablePointers) { | ||||
2183 | // Going from integer to pointer that could be dynamic requires reloading | ||||
2184 | // dynamic information from invariant.group. | ||||
2185 | if (DestTy.mayBeDynamicClass()) | ||||
2186 | IntToPtr = Builder.CreateLaunderInvariantGroup(IntToPtr); | ||||
2187 | } | ||||
2188 | return IntToPtr; | ||||
2189 | } | ||||
2190 | case CK_PointerToIntegral: { | ||||
2191 | assert(!DestTy->isBooleanType() && "bool should use PointerToBool")((!DestTy->isBooleanType() && "bool should use PointerToBool" ) ? static_cast<void> (0) : __assert_fail ("!DestTy->isBooleanType() && \"bool should use PointerToBool\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 2191, __PRETTY_FUNCTION__)); | ||||
2192 | auto *PtrExpr = Visit(E); | ||||
2193 | |||||
2194 | if (CGF.CGM.getCodeGenOpts().StrictVTablePointers) { | ||||
2195 | const QualType SrcType = E->getType(); | ||||
2196 | |||||
2197 | // Casting to integer requires stripping dynamic information as it does | ||||
2198 | // not carries it. | ||||
2199 | if (SrcType.mayBeDynamicClass()) | ||||
2200 | PtrExpr = Builder.CreateStripInvariantGroup(PtrExpr); | ||||
2201 | } | ||||
2202 | |||||
2203 | return Builder.CreatePtrToInt(PtrExpr, ConvertType(DestTy)); | ||||
2204 | } | ||||
2205 | case CK_ToVoid: { | ||||
2206 | CGF.EmitIgnoredExpr(E); | ||||
2207 | return nullptr; | ||||
2208 | } | ||||
2209 | case CK_VectorSplat: { | ||||
2210 | llvm::Type *DstTy = ConvertType(DestTy); | ||||
2211 | Value *Elt = Visit(const_cast<Expr*>(E)); | ||||
2212 | // Splat the element across to all elements | ||||
2213 | unsigned NumElements = DstTy->getVectorNumElements(); | ||||
2214 | return Builder.CreateVectorSplat(NumElements, Elt, "splat"); | ||||
2215 | } | ||||
2216 | |||||
2217 | case CK_FixedPointCast: | ||||
2218 | return EmitScalarConversion(Visit(E), E->getType(), DestTy, | ||||
2219 | CE->getExprLoc()); | ||||
2220 | |||||
2221 | case CK_FixedPointToBoolean: | ||||
2222 | assert(E->getType()->isFixedPointType() &&((E->getType()->isFixedPointType() && "Expected src type to be fixed point type" ) ? static_cast<void> (0) : __assert_fail ("E->getType()->isFixedPointType() && \"Expected src type to be fixed point type\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 2223, __PRETTY_FUNCTION__)) | ||||
2223 | "Expected src type to be fixed point type")((E->getType()->isFixedPointType() && "Expected src type to be fixed point type" ) ? static_cast<void> (0) : __assert_fail ("E->getType()->isFixedPointType() && \"Expected src type to be fixed point type\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 2223, __PRETTY_FUNCTION__)); | ||||
2224 | assert(DestTy->isBooleanType() && "Expected dest type to be boolean type")((DestTy->isBooleanType() && "Expected dest type to be boolean type" ) ? static_cast<void> (0) : __assert_fail ("DestTy->isBooleanType() && \"Expected dest type to be boolean type\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 2224, __PRETTY_FUNCTION__)); | ||||
2225 | return EmitScalarConversion(Visit(E), E->getType(), DestTy, | ||||
2226 | CE->getExprLoc()); | ||||
2227 | |||||
2228 | case CK_FixedPointToIntegral: | ||||
2229 | assert(E->getType()->isFixedPointType() &&((E->getType()->isFixedPointType() && "Expected src type to be fixed point type" ) ? static_cast<void> (0) : __assert_fail ("E->getType()->isFixedPointType() && \"Expected src type to be fixed point type\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 2230, __PRETTY_FUNCTION__)) | ||||
2230 | "Expected src type to be fixed point type")((E->getType()->isFixedPointType() && "Expected src type to be fixed point type" ) ? static_cast<void> (0) : __assert_fail ("E->getType()->isFixedPointType() && \"Expected src type to be fixed point type\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 2230, __PRETTY_FUNCTION__)); | ||||
2231 | assert(DestTy->isIntegerType() && "Expected dest type to be an integer")((DestTy->isIntegerType() && "Expected dest type to be an integer" ) ? static_cast<void> (0) : __assert_fail ("DestTy->isIntegerType() && \"Expected dest type to be an integer\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 2231, __PRETTY_FUNCTION__)); | ||||
2232 | return EmitScalarConversion(Visit(E), E->getType(), DestTy, | ||||
2233 | CE->getExprLoc()); | ||||
2234 | |||||
2235 | case CK_IntegralToFixedPoint: | ||||
2236 | assert(E->getType()->isIntegerType() &&((E->getType()->isIntegerType() && "Expected src type to be an integer" ) ? static_cast<void> (0) : __assert_fail ("E->getType()->isIntegerType() && \"Expected src type to be an integer\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 2237, __PRETTY_FUNCTION__)) | ||||
2237 | "Expected src type to be an integer")((E->getType()->isIntegerType() && "Expected src type to be an integer" ) ? static_cast<void> (0) : __assert_fail ("E->getType()->isIntegerType() && \"Expected src type to be an integer\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 2237, __PRETTY_FUNCTION__)); | ||||
2238 | assert(DestTy->isFixedPointType() &&((DestTy->isFixedPointType() && "Expected dest type to be fixed point type" ) ? static_cast<void> (0) : __assert_fail ("DestTy->isFixedPointType() && \"Expected dest type to be fixed point type\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 2239, __PRETTY_FUNCTION__)) | ||||
2239 | "Expected dest type to be fixed point type")((DestTy->isFixedPointType() && "Expected dest type to be fixed point type" ) ? static_cast<void> (0) : __assert_fail ("DestTy->isFixedPointType() && \"Expected dest type to be fixed point type\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 2239, __PRETTY_FUNCTION__)); | ||||
2240 | return EmitScalarConversion(Visit(E), E->getType(), DestTy, | ||||
2241 | CE->getExprLoc()); | ||||
2242 | |||||
2243 | case CK_IntegralCast: { | ||||
2244 | ScalarConversionOpts Opts; | ||||
2245 | if (auto *ICE = dyn_cast<ImplicitCastExpr>(CE)) { | ||||
2246 | if (!ICE->isPartOfExplicitCast()) | ||||
2247 | Opts = ScalarConversionOpts(CGF.SanOpts); | ||||
2248 | } | ||||
2249 | return EmitScalarConversion(Visit(E), E->getType(), DestTy, | ||||
2250 | CE->getExprLoc(), Opts); | ||||
2251 | } | ||||
2252 | case CK_IntegralToFloating: | ||||
2253 | case CK_FloatingToIntegral: | ||||
2254 | case CK_FloatingCast: | ||||
2255 | return EmitScalarConversion(Visit(E), E->getType(), DestTy, | ||||
2256 | CE->getExprLoc()); | ||||
2257 | case CK_BooleanToSignedIntegral: { | ||||
2258 | ScalarConversionOpts Opts; | ||||
2259 | Opts.TreatBooleanAsSigned = true; | ||||
2260 | return EmitScalarConversion(Visit(E), E->getType(), DestTy, | ||||
2261 | CE->getExprLoc(), Opts); | ||||
2262 | } | ||||
2263 | case CK_IntegralToBoolean: | ||||
2264 | return EmitIntToBoolConversion(Visit(E)); | ||||
2265 | case CK_PointerToBoolean: | ||||
2266 | return EmitPointerToBoolConversion(Visit(E), E->getType()); | ||||
2267 | case CK_FloatingToBoolean: | ||||
2268 | return EmitFloatToBoolConversion(Visit(E)); | ||||
2269 | case CK_MemberPointerToBoolean: { | ||||
2270 | llvm::Value *MemPtr = Visit(E); | ||||
2271 | const MemberPointerType *MPT = E->getType()->getAs<MemberPointerType>(); | ||||
2272 | return CGF.CGM.getCXXABI().EmitMemberPointerIsNotNull(CGF, MemPtr, MPT); | ||||
2273 | } | ||||
2274 | |||||
2275 | case CK_FloatingComplexToReal: | ||||
2276 | case CK_IntegralComplexToReal: | ||||
2277 | return CGF.EmitComplexExpr(E, false, true).first; | ||||
2278 | |||||
2279 | case CK_FloatingComplexToBoolean: | ||||
2280 | case CK_IntegralComplexToBoolean: { | ||||
2281 | CodeGenFunction::ComplexPairTy V = CGF.EmitComplexExpr(E); | ||||
2282 | |||||
2283 | // TODO: kill this function off, inline appropriate case here | ||||
2284 | return EmitComplexToScalarConversion(V, E->getType(), DestTy, | ||||
2285 | CE->getExprLoc()); | ||||
2286 | } | ||||
2287 | |||||
2288 | case CK_ZeroToOCLOpaqueType: { | ||||
2289 | assert((DestTy->isEventT() || DestTy->isQueueT() ||(((DestTy->isEventT() || DestTy->isQueueT() || DestTy-> isOCLIntelSubgroupAVCType()) && "CK_ZeroToOCLEvent cast on non-event type" ) ? static_cast<void> (0) : __assert_fail ("(DestTy->isEventT() || DestTy->isQueueT() || DestTy->isOCLIntelSubgroupAVCType()) && \"CK_ZeroToOCLEvent cast on non-event type\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 2291, __PRETTY_FUNCTION__)) | ||||
2290 | DestTy->isOCLIntelSubgroupAVCType()) &&(((DestTy->isEventT() || DestTy->isQueueT() || DestTy-> isOCLIntelSubgroupAVCType()) && "CK_ZeroToOCLEvent cast on non-event type" ) ? static_cast<void> (0) : __assert_fail ("(DestTy->isEventT() || DestTy->isQueueT() || DestTy->isOCLIntelSubgroupAVCType()) && \"CK_ZeroToOCLEvent cast on non-event type\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 2291, __PRETTY_FUNCTION__)) | ||||
2291 | "CK_ZeroToOCLEvent cast on non-event type")(((DestTy->isEventT() || DestTy->isQueueT() || DestTy-> isOCLIntelSubgroupAVCType()) && "CK_ZeroToOCLEvent cast on non-event type" ) ? static_cast<void> (0) : __assert_fail ("(DestTy->isEventT() || DestTy->isQueueT() || DestTy->isOCLIntelSubgroupAVCType()) && \"CK_ZeroToOCLEvent cast on non-event type\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 2291, __PRETTY_FUNCTION__)); | ||||
2292 | return llvm::Constant::getNullValue(ConvertType(DestTy)); | ||||
2293 | } | ||||
2294 | |||||
2295 | case CK_IntToOCLSampler: | ||||
2296 | return CGF.CGM.createOpenCLIntToSamplerConversion(E, CGF); | ||||
2297 | |||||
2298 | } // end of switch | ||||
2299 | |||||
2300 | llvm_unreachable("unknown scalar cast")::llvm::llvm_unreachable_internal("unknown scalar cast", "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 2300); | ||||
2301 | } | ||||
2302 | |||||
2303 | Value *ScalarExprEmitter::VisitStmtExpr(const StmtExpr *E) { | ||||
2304 | CodeGenFunction::StmtExprEvaluation eval(CGF); | ||||
2305 | Address RetAlloca = CGF.EmitCompoundStmt(*E->getSubStmt(), | ||||
2306 | !E->getType()->isVoidType()); | ||||
2307 | if (!RetAlloca.isValid()) | ||||
2308 | return nullptr; | ||||
2309 | return CGF.EmitLoadOfScalar(CGF.MakeAddrLValue(RetAlloca, E->getType()), | ||||
2310 | E->getExprLoc()); | ||||
2311 | } | ||||
2312 | |||||
2313 | Value *ScalarExprEmitter::VisitExprWithCleanups(ExprWithCleanups *E) { | ||||
2314 | CGF.enterFullExpression(E); | ||||
2315 | CodeGenFunction::RunCleanupsScope Scope(CGF); | ||||
2316 | Value *V = Visit(E->getSubExpr()); | ||||
2317 | // Defend against dominance problems caused by jumps out of expression | ||||
2318 | // evaluation through the shared cleanup block. | ||||
2319 | Scope.ForceCleanup({&V}); | ||||
2320 | return V; | ||||
2321 | } | ||||
2322 | |||||
2323 | //===----------------------------------------------------------------------===// | ||||
2324 | // Unary Operators | ||||
2325 | //===----------------------------------------------------------------------===// | ||||
2326 | |||||
2327 | static BinOpInfo createBinOpInfoFromIncDec(const UnaryOperator *E, | ||||
2328 | llvm::Value *InVal, bool IsInc) { | ||||
2329 | BinOpInfo BinOp; | ||||
2330 | BinOp.LHS = InVal; | ||||
2331 | BinOp.RHS = llvm::ConstantInt::get(InVal->getType(), 1, false); | ||||
2332 | BinOp.Ty = E->getType(); | ||||
2333 | BinOp.Opcode = IsInc ? BO_Add : BO_Sub; | ||||
2334 | // FIXME: once UnaryOperator carries FPFeatures, copy it here. | ||||
2335 | BinOp.E = E; | ||||
2336 | return BinOp; | ||||
2337 | } | ||||
2338 | |||||
2339 | llvm::Value *ScalarExprEmitter::EmitIncDecConsiderOverflowBehavior( | ||||
2340 | const UnaryOperator *E, llvm::Value *InVal, bool IsInc) { | ||||
2341 | llvm::Value *Amount = | ||||
2342 | llvm::ConstantInt::get(InVal->getType(), IsInc ? 1 : -1, true); | ||||
2343 | StringRef Name = IsInc ? "inc" : "dec"; | ||||
2344 | switch (CGF.getLangOpts().getSignedOverflowBehavior()) { | ||||
2345 | case LangOptions::SOB_Defined: | ||||
2346 | return Builder.CreateAdd(InVal, Amount, Name); | ||||
2347 | case LangOptions::SOB_Undefined: | ||||
2348 | if (!CGF.SanOpts.has(SanitizerKind::SignedIntegerOverflow)) | ||||
2349 | return Builder.CreateNSWAdd(InVal, Amount, Name); | ||||
2350 | LLVM_FALLTHROUGH[[gnu::fallthrough]]; | ||||
2351 | case LangOptions::SOB_Trapping: | ||||
2352 | if (!E->canOverflow()) | ||||
2353 | return Builder.CreateNSWAdd(InVal, Amount, Name); | ||||
2354 | return EmitOverflowCheckedBinOp(createBinOpInfoFromIncDec(E, InVal, IsInc)); | ||||
2355 | } | ||||
2356 | llvm_unreachable("Unknown SignedOverflowBehaviorTy")::llvm::llvm_unreachable_internal("Unknown SignedOverflowBehaviorTy" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 2356); | ||||
2357 | } | ||||
2358 | |||||
2359 | namespace { | ||||
2360 | /// Handles check and update for lastprivate conditional variables. | ||||
2361 | class OMPLastprivateConditionalUpdateRAII { | ||||
2362 | private: | ||||
2363 | CodeGenFunction &CGF; | ||||
2364 | const UnaryOperator *E; | ||||
2365 | |||||
2366 | public: | ||||
2367 | OMPLastprivateConditionalUpdateRAII(CodeGenFunction &CGF, | ||||
2368 | const UnaryOperator *E) | ||||
2369 | : CGF(CGF), E(E) {} | ||||
2370 | ~OMPLastprivateConditionalUpdateRAII() { | ||||
2371 | if (CGF.getLangOpts().OpenMP) | ||||
2372 | CGF.CGM.getOpenMPRuntime().checkAndEmitLastprivateConditional( | ||||
2373 | CGF, E->getSubExpr()); | ||||
2374 | } | ||||
2375 | }; | ||||
2376 | } // namespace | ||||
2377 | |||||
2378 | llvm::Value * | ||||
2379 | ScalarExprEmitter::EmitScalarPrePostIncDec(const UnaryOperator *E, LValue LV, | ||||
2380 | bool isInc, bool isPre) { | ||||
2381 | OMPLastprivateConditionalUpdateRAII OMPRegion(CGF, E); | ||||
2382 | QualType type = E->getSubExpr()->getType(); | ||||
2383 | llvm::PHINode *atomicPHI = nullptr; | ||||
2384 | llvm::Value *value; | ||||
2385 | llvm::Value *input; | ||||
2386 | |||||
2387 | int amount = (isInc ? 1 : -1); | ||||
2388 | bool isSubtraction = !isInc; | ||||
2389 | |||||
2390 | if (const AtomicType *atomicTy = type->getAs<AtomicType>()) { | ||||
2391 | type = atomicTy->getValueType(); | ||||
2392 | if (isInc && type->isBooleanType()) { | ||||
2393 | llvm::Value *True = CGF.EmitToMemory(Builder.getTrue(), type); | ||||
2394 | if (isPre) { | ||||
2395 | Builder.CreateStore(True, LV.getAddress(CGF), LV.isVolatileQualified()) | ||||
2396 | ->setAtomic(llvm::AtomicOrdering::SequentiallyConsistent); | ||||
2397 | return Builder.getTrue(); | ||||
2398 | } | ||||
2399 | // For atomic bool increment, we just store true and return it for | ||||
2400 | // preincrement, do an atomic swap with true for postincrement | ||||
2401 | return Builder.CreateAtomicRMW( | ||||
2402 | llvm::AtomicRMWInst::Xchg, LV.getPointer(CGF), True, | ||||
2403 | llvm::AtomicOrdering::SequentiallyConsistent); | ||||
2404 | } | ||||
2405 | // Special case for atomic increment / decrement on integers, emit | ||||
2406 | // atomicrmw instructions. We skip this if we want to be doing overflow | ||||
2407 | // checking, and fall into the slow path with the atomic cmpxchg loop. | ||||
2408 | if (!type->isBooleanType() && type->isIntegerType() && | ||||
2409 | !(type->isUnsignedIntegerType() && | ||||
2410 | CGF.SanOpts.has(SanitizerKind::UnsignedIntegerOverflow)) && | ||||
2411 | CGF.getLangOpts().getSignedOverflowBehavior() != | ||||
2412 | LangOptions::SOB_Trapping) { | ||||
2413 | llvm::AtomicRMWInst::BinOp aop = isInc ? llvm::AtomicRMWInst::Add : | ||||
2414 | llvm::AtomicRMWInst::Sub; | ||||
2415 | llvm::Instruction::BinaryOps op = isInc ? llvm::Instruction::Add : | ||||
2416 | llvm::Instruction::Sub; | ||||
2417 | llvm::Value *amt = CGF.EmitToMemory( | ||||
2418 | llvm::ConstantInt::get(ConvertType(type), 1, true), type); | ||||
2419 | llvm::Value *old = | ||||
2420 | Builder.CreateAtomicRMW(aop, LV.getPointer(CGF), amt, | ||||
2421 | llvm::AtomicOrdering::SequentiallyConsistent); | ||||
2422 | return isPre ? Builder.CreateBinOp(op, old, amt) : old; | ||||
2423 | } | ||||
2424 | value = EmitLoadOfLValue(LV, E->getExprLoc()); | ||||
2425 | input = value; | ||||
2426 | // For every other atomic operation, we need to emit a load-op-cmpxchg loop | ||||
2427 | llvm::BasicBlock *startBB = Builder.GetInsertBlock(); | ||||
2428 | llvm::BasicBlock *opBB = CGF.createBasicBlock("atomic_op", CGF.CurFn); | ||||
2429 | value = CGF.EmitToMemory(value, type); | ||||
2430 | Builder.CreateBr(opBB); | ||||
2431 | Builder.SetInsertPoint(opBB); | ||||
2432 | atomicPHI = Builder.CreatePHI(value->getType(), 2); | ||||
2433 | atomicPHI->addIncoming(value, startBB); | ||||
2434 | value = atomicPHI; | ||||
2435 | } else { | ||||
2436 | value = EmitLoadOfLValue(LV, E->getExprLoc()); | ||||
2437 | input = value; | ||||
2438 | } | ||||
2439 | |||||
2440 | // Special case of integer increment that we have to check first: bool++. | ||||
2441 | // Due to promotion rules, we get: | ||||
2442 | // bool++ -> bool = bool + 1 | ||||
2443 | // -> bool = (int)bool + 1 | ||||
2444 | // -> bool = ((int)bool + 1 != 0) | ||||
2445 | // An interesting aspect of this is that increment is always true. | ||||
2446 | // Decrement does not have this property. | ||||
2447 | if (isInc && type->isBooleanType()) { | ||||
2448 | value = Builder.getTrue(); | ||||
2449 | |||||
2450 | // Most common case by far: integer increment. | ||||
2451 | } else if (type->isIntegerType()) { | ||||
2452 | QualType promotedType; | ||||
2453 | bool canPerformLossyDemotionCheck = false; | ||||
2454 | if (type->isPromotableIntegerType()) { | ||||
2455 | promotedType = CGF.getContext().getPromotedIntegerType(type); | ||||
2456 | assert(promotedType != type && "Shouldn't promote to the same type.")((promotedType != type && "Shouldn't promote to the same type." ) ? static_cast<void> (0) : __assert_fail ("promotedType != type && \"Shouldn't promote to the same type.\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 2456, __PRETTY_FUNCTION__)); | ||||
2457 | canPerformLossyDemotionCheck = true; | ||||
2458 | canPerformLossyDemotionCheck &= | ||||
2459 | CGF.getContext().getCanonicalType(type) != | ||||
2460 | CGF.getContext().getCanonicalType(promotedType); | ||||
2461 | canPerformLossyDemotionCheck &= | ||||
2462 | PromotionIsPotentiallyEligibleForImplicitIntegerConversionCheck( | ||||
2463 | type, promotedType); | ||||
2464 | assert((!canPerformLossyDemotionCheck ||(((!canPerformLossyDemotionCheck || type->isSignedIntegerOrEnumerationType () || promotedType->isSignedIntegerOrEnumerationType() || ConvertType (type)->getScalarSizeInBits() == ConvertType(promotedType) ->getScalarSizeInBits()) && "The following check expects that if we do promotion to different " "underlying canonical type, at least one of the types (either " "base or promoted) will be signed, or the bitwidths will match." ) ? static_cast<void> (0) : __assert_fail ("(!canPerformLossyDemotionCheck || type->isSignedIntegerOrEnumerationType() || promotedType->isSignedIntegerOrEnumerationType() || ConvertType(type)->getScalarSizeInBits() == ConvertType(promotedType)->getScalarSizeInBits()) && \"The following check expects that if we do promotion to different \" \"underlying canonical type, at least one of the types (either \" \"base or promoted) will be signed, or the bitwidths will match.\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 2471, __PRETTY_FUNCTION__)) | ||||
2465 | type->isSignedIntegerOrEnumerationType() ||(((!canPerformLossyDemotionCheck || type->isSignedIntegerOrEnumerationType () || promotedType->isSignedIntegerOrEnumerationType() || ConvertType (type)->getScalarSizeInBits() == ConvertType(promotedType) ->getScalarSizeInBits()) && "The following check expects that if we do promotion to different " "underlying canonical type, at least one of the types (either " "base or promoted) will be signed, or the bitwidths will match." ) ? static_cast<void> (0) : __assert_fail ("(!canPerformLossyDemotionCheck || type->isSignedIntegerOrEnumerationType() || promotedType->isSignedIntegerOrEnumerationType() || ConvertType(type)->getScalarSizeInBits() == ConvertType(promotedType)->getScalarSizeInBits()) && \"The following check expects that if we do promotion to different \" \"underlying canonical type, at least one of the types (either \" \"base or promoted) will be signed, or the bitwidths will match.\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 2471, __PRETTY_FUNCTION__)) | ||||
2466 | promotedType->isSignedIntegerOrEnumerationType() ||(((!canPerformLossyDemotionCheck || type->isSignedIntegerOrEnumerationType () || promotedType->isSignedIntegerOrEnumerationType() || ConvertType (type)->getScalarSizeInBits() == ConvertType(promotedType) ->getScalarSizeInBits()) && "The following check expects that if we do promotion to different " "underlying canonical type, at least one of the types (either " "base or promoted) will be signed, or the bitwidths will match." ) ? static_cast<void> (0) : __assert_fail ("(!canPerformLossyDemotionCheck || type->isSignedIntegerOrEnumerationType() || promotedType->isSignedIntegerOrEnumerationType() || ConvertType(type)->getScalarSizeInBits() == ConvertType(promotedType)->getScalarSizeInBits()) && \"The following check expects that if we do promotion to different \" \"underlying canonical type, at least one of the types (either \" \"base or promoted) will be signed, or the bitwidths will match.\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 2471, __PRETTY_FUNCTION__)) | ||||
2467 | ConvertType(type)->getScalarSizeInBits() ==(((!canPerformLossyDemotionCheck || type->isSignedIntegerOrEnumerationType () || promotedType->isSignedIntegerOrEnumerationType() || ConvertType (type)->getScalarSizeInBits() == ConvertType(promotedType) ->getScalarSizeInBits()) && "The following check expects that if we do promotion to different " "underlying canonical type, at least one of the types (either " "base or promoted) will be signed, or the bitwidths will match." ) ? static_cast<void> (0) : __assert_fail ("(!canPerformLossyDemotionCheck || type->isSignedIntegerOrEnumerationType() || promotedType->isSignedIntegerOrEnumerationType() || ConvertType(type)->getScalarSizeInBits() == ConvertType(promotedType)->getScalarSizeInBits()) && \"The following check expects that if we do promotion to different \" \"underlying canonical type, at least one of the types (either \" \"base or promoted) will be signed, or the bitwidths will match.\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 2471, __PRETTY_FUNCTION__)) | ||||
2468 | ConvertType(promotedType)->getScalarSizeInBits()) &&(((!canPerformLossyDemotionCheck || type->isSignedIntegerOrEnumerationType () || promotedType->isSignedIntegerOrEnumerationType() || ConvertType (type)->getScalarSizeInBits() == ConvertType(promotedType) ->getScalarSizeInBits()) && "The following check expects that if we do promotion to different " "underlying canonical type, at least one of the types (either " "base or promoted) will be signed, or the bitwidths will match." ) ? static_cast<void> (0) : __assert_fail ("(!canPerformLossyDemotionCheck || type->isSignedIntegerOrEnumerationType() || promotedType->isSignedIntegerOrEnumerationType() || ConvertType(type)->getScalarSizeInBits() == ConvertType(promotedType)->getScalarSizeInBits()) && \"The following check expects that if we do promotion to different \" \"underlying canonical type, at least one of the types (either \" \"base or promoted) will be signed, or the bitwidths will match.\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 2471, __PRETTY_FUNCTION__)) | ||||
2469 | "The following check expects that if we do promotion to different "(((!canPerformLossyDemotionCheck || type->isSignedIntegerOrEnumerationType () || promotedType->isSignedIntegerOrEnumerationType() || ConvertType (type)->getScalarSizeInBits() == ConvertType(promotedType) ->getScalarSizeInBits()) && "The following check expects that if we do promotion to different " "underlying canonical type, at least one of the types (either " "base or promoted) will be signed, or the bitwidths will match." ) ? static_cast<void> (0) : __assert_fail ("(!canPerformLossyDemotionCheck || type->isSignedIntegerOrEnumerationType() || promotedType->isSignedIntegerOrEnumerationType() || ConvertType(type)->getScalarSizeInBits() == ConvertType(promotedType)->getScalarSizeInBits()) && \"The following check expects that if we do promotion to different \" \"underlying canonical type, at least one of the types (either \" \"base or promoted) will be signed, or the bitwidths will match.\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 2471, __PRETTY_FUNCTION__)) | ||||
2470 | "underlying canonical type, at least one of the types (either "(((!canPerformLossyDemotionCheck || type->isSignedIntegerOrEnumerationType () || promotedType->isSignedIntegerOrEnumerationType() || ConvertType (type)->getScalarSizeInBits() == ConvertType(promotedType) ->getScalarSizeInBits()) && "The following check expects that if we do promotion to different " "underlying canonical type, at least one of the types (either " "base or promoted) will be signed, or the bitwidths will match." ) ? static_cast<void> (0) : __assert_fail ("(!canPerformLossyDemotionCheck || type->isSignedIntegerOrEnumerationType() || promotedType->isSignedIntegerOrEnumerationType() || ConvertType(type)->getScalarSizeInBits() == ConvertType(promotedType)->getScalarSizeInBits()) && \"The following check expects that if we do promotion to different \" \"underlying canonical type, at least one of the types (either \" \"base or promoted) will be signed, or the bitwidths will match.\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 2471, __PRETTY_FUNCTION__)) | ||||
2471 | "base or promoted) will be signed, or the bitwidths will match.")(((!canPerformLossyDemotionCheck || type->isSignedIntegerOrEnumerationType () || promotedType->isSignedIntegerOrEnumerationType() || ConvertType (type)->getScalarSizeInBits() == ConvertType(promotedType) ->getScalarSizeInBits()) && "The following check expects that if we do promotion to different " "underlying canonical type, at least one of the types (either " "base or promoted) will be signed, or the bitwidths will match." ) ? static_cast<void> (0) : __assert_fail ("(!canPerformLossyDemotionCheck || type->isSignedIntegerOrEnumerationType() || promotedType->isSignedIntegerOrEnumerationType() || ConvertType(type)->getScalarSizeInBits() == ConvertType(promotedType)->getScalarSizeInBits()) && \"The following check expects that if we do promotion to different \" \"underlying canonical type, at least one of the types (either \" \"base or promoted) will be signed, or the bitwidths will match.\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 2471, __PRETTY_FUNCTION__)); | ||||
2472 | } | ||||
2473 | if (CGF.SanOpts.hasOneOf( | ||||
2474 | SanitizerKind::ImplicitIntegerArithmeticValueChange) && | ||||
2475 | canPerformLossyDemotionCheck) { | ||||
2476 | // While `x += 1` (for `x` with width less than int) is modeled as | ||||
2477 | // promotion+arithmetics+demotion, and we can catch lossy demotion with | ||||
2478 | // ease; inc/dec with width less than int can't overflow because of | ||||
2479 | // promotion rules, so we omit promotion+demotion, which means that we can | ||||
2480 | // not catch lossy "demotion". Because we still want to catch these cases | ||||
2481 | // when the sanitizer is enabled, we perform the promotion, then perform | ||||
2482 | // the increment/decrement in the wider type, and finally | ||||
2483 | // perform the demotion. This will catch lossy demotions. | ||||
2484 | |||||
2485 | value = EmitScalarConversion(value, type, promotedType, E->getExprLoc()); | ||||
2486 | Value *amt = llvm::ConstantInt::get(value->getType(), amount, true); | ||||
2487 | value = Builder.CreateAdd(value, amt, isInc ? "inc" : "dec"); | ||||
2488 | // Do pass non-default ScalarConversionOpts so that sanitizer check is | ||||
2489 | // emitted. | ||||
2490 | value = EmitScalarConversion(value, promotedType, type, E->getExprLoc(), | ||||
2491 | ScalarConversionOpts(CGF.SanOpts)); | ||||
2492 | |||||
2493 | // Note that signed integer inc/dec with width less than int can't | ||||
2494 | // overflow because of promotion rules; we're just eliding a few steps | ||||
2495 | // here. | ||||
2496 | } else if (E->canOverflow() && type->isSignedIntegerOrEnumerationType()) { | ||||
2497 | value = EmitIncDecConsiderOverflowBehavior(E, value, isInc); | ||||
2498 | } else if (E->canOverflow() && type->isUnsignedIntegerType() && | ||||
2499 | CGF.SanOpts.has(SanitizerKind::UnsignedIntegerOverflow)) { | ||||
2500 | value = | ||||
2501 | EmitOverflowCheckedBinOp(createBinOpInfoFromIncDec(E, value, isInc)); | ||||
2502 | } else { | ||||
2503 | llvm::Value *amt = llvm::ConstantInt::get(value->getType(), amount, true); | ||||
2504 | value = Builder.CreateAdd(value, amt, isInc ? "inc" : "dec"); | ||||
2505 | } | ||||
2506 | |||||
2507 | // Next most common: pointer increment. | ||||
2508 | } else if (const PointerType *ptr = type->getAs<PointerType>()) { | ||||
2509 | QualType type = ptr->getPointeeType(); | ||||
2510 | |||||
2511 | // VLA types don't have constant size. | ||||
2512 | if (const VariableArrayType *vla | ||||
2513 | = CGF.getContext().getAsVariableArrayType(type)) { | ||||
2514 | llvm::Value *numElts = CGF.getVLASize(vla).NumElts; | ||||
2515 | if (!isInc) numElts = Builder.CreateNSWNeg(numElts, "vla.negsize"); | ||||
2516 | if (CGF.getLangOpts().isSignedOverflowDefined()) | ||||
2517 | value = Builder.CreateGEP(value, numElts, "vla.inc"); | ||||
2518 | else | ||||
2519 | value = CGF.EmitCheckedInBoundsGEP( | ||||
2520 | value, numElts, /*SignedIndices=*/false, isSubtraction, | ||||
2521 | E->getExprLoc(), "vla.inc"); | ||||
2522 | |||||
2523 | // Arithmetic on function pointers (!) is just +-1. | ||||
2524 | } else if (type->isFunctionType()) { | ||||
2525 | llvm::Value *amt = Builder.getInt32(amount); | ||||
2526 | |||||
2527 | value = CGF.EmitCastToVoidPtr(value); | ||||
2528 | if (CGF.getLangOpts().isSignedOverflowDefined()) | ||||
2529 | value = Builder.CreateGEP(value, amt, "incdec.funcptr"); | ||||
2530 | else | ||||
2531 | value = CGF.EmitCheckedInBoundsGEP(value, amt, /*SignedIndices=*/false, | ||||
2532 | isSubtraction, E->getExprLoc(), | ||||
2533 | "incdec.funcptr"); | ||||
2534 | value = Builder.CreateBitCast(value, input->getType()); | ||||
2535 | |||||
2536 | // For everything else, we can just do a simple increment. | ||||
2537 | } else { | ||||
2538 | llvm::Value *amt = Builder.getInt32(amount); | ||||
2539 | if (CGF.getLangOpts().isSignedOverflowDefined()) | ||||
2540 | value = Builder.CreateGEP(value, amt, "incdec.ptr"); | ||||
2541 | else | ||||
2542 | value = CGF.EmitCheckedInBoundsGEP(value, amt, /*SignedIndices=*/false, | ||||
2543 | isSubtraction, E->getExprLoc(), | ||||
2544 | "incdec.ptr"); | ||||
2545 | } | ||||
2546 | |||||
2547 | // Vector increment/decrement. | ||||
2548 | } else if (type->isVectorType()) { | ||||
2549 | if (type->hasIntegerRepresentation()) { | ||||
2550 | llvm::Value *amt = llvm::ConstantInt::get(value->getType(), amount); | ||||
2551 | |||||
2552 | value = Builder.CreateAdd(value, amt, isInc ? "inc" : "dec"); | ||||
2553 | } else { | ||||
2554 | value = Builder.CreateFAdd( | ||||
2555 | value, | ||||
2556 | llvm::ConstantFP::get(value->getType(), amount), | ||||
2557 | isInc ? "inc" : "dec"); | ||||
2558 | } | ||||
2559 | |||||
2560 | // Floating point. | ||||
2561 | } else if (type->isRealFloatingType()) { | ||||
2562 | // Add the inc/dec to the real part. | ||||
2563 | llvm::Value *amt; | ||||
2564 | |||||
2565 | if (type->isHalfType() && !CGF.getContext().getLangOpts().NativeHalfType) { | ||||
2566 | // Another special case: half FP increment should be done via float | ||||
2567 | if (CGF.getContext().getTargetInfo().useFP16ConversionIntrinsics()) { | ||||
2568 | value = Builder.CreateCall( | ||||
2569 | CGF.CGM.getIntrinsic(llvm::Intrinsic::convert_from_fp16, | ||||
2570 | CGF.CGM.FloatTy), | ||||
2571 | input, "incdec.conv"); | ||||
2572 | } else { | ||||
2573 | value = Builder.CreateFPExt(input, CGF.CGM.FloatTy, "incdec.conv"); | ||||
2574 | } | ||||
2575 | } | ||||
2576 | |||||
2577 | if (value->getType()->isFloatTy()) | ||||
2578 | amt = llvm::ConstantFP::get(VMContext, | ||||
2579 | llvm::APFloat(static_cast<float>(amount))); | ||||
2580 | else if (value->getType()->isDoubleTy()) | ||||
2581 | amt = llvm::ConstantFP::get(VMContext, | ||||
2582 | llvm::APFloat(static_cast<double>(amount))); | ||||
2583 | else { | ||||
2584 | // Remaining types are Half, LongDouble or __float128. Convert from float. | ||||
2585 | llvm::APFloat F(static_cast<float>(amount)); | ||||
2586 | bool ignored; | ||||
2587 | const llvm::fltSemantics *FS; | ||||
2588 | // Don't use getFloatTypeSemantics because Half isn't | ||||
2589 | // necessarily represented using the "half" LLVM type. | ||||
2590 | if (value->getType()->isFP128Ty()) | ||||
2591 | FS = &CGF.getTarget().getFloat128Format(); | ||||
2592 | else if (value->getType()->isHalfTy()) | ||||
2593 | FS = &CGF.getTarget().getHalfFormat(); | ||||
2594 | else | ||||
2595 | FS = &CGF.getTarget().getLongDoubleFormat(); | ||||
2596 | F.convert(*FS, llvm::APFloat::rmTowardZero, &ignored); | ||||
2597 | amt = llvm::ConstantFP::get(VMContext, F); | ||||
2598 | } | ||||
2599 | value = Builder.CreateFAdd(value, amt, isInc ? "inc" : "dec"); | ||||
2600 | |||||
2601 | if (type->isHalfType() && !CGF.getContext().getLangOpts().NativeHalfType) { | ||||
2602 | if (CGF.getContext().getTargetInfo().useFP16ConversionIntrinsics()) { | ||||
2603 | value = Builder.CreateCall( | ||||
2604 | CGF.CGM.getIntrinsic(llvm::Intrinsic::convert_to_fp16, | ||||
2605 | CGF.CGM.FloatTy), | ||||
2606 | value, "incdec.conv"); | ||||
2607 | } else { | ||||
2608 | value = Builder.CreateFPTrunc(value, input->getType(), "incdec.conv"); | ||||
2609 | } | ||||
2610 | } | ||||
2611 | |||||
2612 | // Objective-C pointer types. | ||||
2613 | } else { | ||||
2614 | const ObjCObjectPointerType *OPT = type->castAs<ObjCObjectPointerType>(); | ||||
2615 | value = CGF.EmitCastToVoidPtr(value); | ||||
2616 | |||||
2617 | CharUnits size = CGF.getContext().getTypeSizeInChars(OPT->getObjectType()); | ||||
2618 | if (!isInc) size = -size; | ||||
2619 | llvm::Value *sizeValue = | ||||
2620 | llvm::ConstantInt::get(CGF.SizeTy, size.getQuantity()); | ||||
2621 | |||||
2622 | if (CGF.getLangOpts().isSignedOverflowDefined()) | ||||
2623 | value = Builder.CreateGEP(value, sizeValue, "incdec.objptr"); | ||||
2624 | else | ||||
2625 | value = CGF.EmitCheckedInBoundsGEP(value, sizeValue, | ||||
2626 | /*SignedIndices=*/false, isSubtraction, | ||||
2627 | E->getExprLoc(), "incdec.objptr"); | ||||
2628 | value = Builder.CreateBitCast(value, input->getType()); | ||||
2629 | } | ||||
2630 | |||||
2631 | if (atomicPHI) { | ||||
2632 | llvm::BasicBlock *curBlock = Builder.GetInsertBlock(); | ||||
2633 | llvm::BasicBlock *contBB = CGF.createBasicBlock("atomic_cont", CGF.CurFn); | ||||
2634 | auto Pair = CGF.EmitAtomicCompareExchange( | ||||
2635 | LV, RValue::get(atomicPHI), RValue::get(value), E->getExprLoc()); | ||||
2636 | llvm::Value *old = CGF.EmitToMemory(Pair.first.getScalarVal(), type); | ||||
2637 | llvm::Value *success = Pair.second; | ||||
2638 | atomicPHI->addIncoming(old, curBlock); | ||||
2639 | Builder.CreateCondBr(success, contBB, atomicPHI->getParent()); | ||||
2640 | Builder.SetInsertPoint(contBB); | ||||
2641 | return isPre ? value : input; | ||||
2642 | } | ||||
2643 | |||||
2644 | // Store the updated result through the lvalue. | ||||
2645 | if (LV.isBitField()) | ||||
2646 | CGF.EmitStoreThroughBitfieldLValue(RValue::get(value), LV, &value); | ||||
2647 | else | ||||
2648 | CGF.EmitStoreThroughLValue(RValue::get(value), LV); | ||||
2649 | |||||
2650 | // If this is a postinc, return the value read from memory, otherwise use the | ||||
2651 | // updated value. | ||||
2652 | return isPre ? value : input; | ||||
2653 | } | ||||
2654 | |||||
2655 | |||||
2656 | |||||
2657 | Value *ScalarExprEmitter::VisitUnaryMinus(const UnaryOperator *E) { | ||||
2658 | TestAndClearIgnoreResultAssign(); | ||||
2659 | Value *Op = Visit(E->getSubExpr()); | ||||
2660 | |||||
2661 | // Generate a unary FNeg for FP ops. | ||||
2662 | if (Op->getType()->isFPOrFPVectorTy()) | ||||
2663 | return Builder.CreateFNeg(Op, "fneg"); | ||||
2664 | |||||
2665 | // Emit unary minus with EmitSub so we handle overflow cases etc. | ||||
2666 | BinOpInfo BinOp; | ||||
2667 | BinOp.RHS = Op; | ||||
2668 | BinOp.LHS = llvm::Constant::getNullValue(BinOp.RHS->getType()); | ||||
2669 | BinOp.Ty = E->getType(); | ||||
2670 | BinOp.Opcode = BO_Sub; | ||||
2671 | // FIXME: once UnaryOperator carries FPFeatures, copy it here. | ||||
2672 | BinOp.E = E; | ||||
2673 | return EmitSub(BinOp); | ||||
2674 | } | ||||
2675 | |||||
2676 | Value *ScalarExprEmitter::VisitUnaryNot(const UnaryOperator *E) { | ||||
2677 | TestAndClearIgnoreResultAssign(); | ||||
2678 | Value *Op = Visit(E->getSubExpr()); | ||||
2679 | return Builder.CreateNot(Op, "neg"); | ||||
2680 | } | ||||
2681 | |||||
2682 | Value *ScalarExprEmitter::VisitUnaryLNot(const UnaryOperator *E) { | ||||
2683 | // Perform vector logical not on comparison with zero vector. | ||||
2684 | if (E->getType()->isExtVectorType()) { | ||||
2685 | Value *Oper = Visit(E->getSubExpr()); | ||||
2686 | Value *Zero = llvm::Constant::getNullValue(Oper->getType()); | ||||
2687 | Value *Result; | ||||
2688 | if (Oper->getType()->isFPOrFPVectorTy()) | ||||
2689 | Result = Builder.CreateFCmp(llvm::CmpInst::FCMP_OEQ, Oper, Zero, "cmp"); | ||||
2690 | else | ||||
2691 | Result = Builder.CreateICmp(llvm::CmpInst::ICMP_EQ, Oper, Zero, "cmp"); | ||||
2692 | return Builder.CreateSExt(Result, ConvertType(E->getType()), "sext"); | ||||
2693 | } | ||||
2694 | |||||
2695 | // Compare operand to zero. | ||||
2696 | Value *BoolVal = CGF.EvaluateExprAsBool(E->getSubExpr()); | ||||
2697 | |||||
2698 | // Invert value. | ||||
2699 | // TODO: Could dynamically modify easy computations here. For example, if | ||||
2700 | // the operand is an icmp ne, turn into icmp eq. | ||||
2701 | BoolVal = Builder.CreateNot(BoolVal, "lnot"); | ||||
2702 | |||||
2703 | // ZExt result to the expr type. | ||||
2704 | return Builder.CreateZExt(BoolVal, ConvertType(E->getType()), "lnot.ext"); | ||||
2705 | } | ||||
2706 | |||||
2707 | Value *ScalarExprEmitter::VisitOffsetOfExpr(OffsetOfExpr *E) { | ||||
2708 | // Try folding the offsetof to a constant. | ||||
2709 | Expr::EvalResult EVResult; | ||||
2710 | if (E->EvaluateAsInt(EVResult, CGF.getContext())) { | ||||
2711 | llvm::APSInt Value = EVResult.Val.getInt(); | ||||
2712 | return Builder.getInt(Value); | ||||
2713 | } | ||||
2714 | |||||
2715 | // Loop over the components of the offsetof to compute the value. | ||||
2716 | unsigned n = E->getNumComponents(); | ||||
2717 | llvm::Type* ResultType = ConvertType(E->getType()); | ||||
2718 | llvm::Value* Result = llvm::Constant::getNullValue(ResultType); | ||||
2719 | QualType CurrentType = E->getTypeSourceInfo()->getType(); | ||||
2720 | for (unsigned i = 0; i != n; ++i) { | ||||
2721 | OffsetOfNode ON = E->getComponent(i); | ||||
2722 | llvm::Value *Offset = nullptr; | ||||
2723 | switch (ON.getKind()) { | ||||
2724 | case OffsetOfNode::Array: { | ||||
2725 | // Compute the index | ||||
2726 | Expr *IdxExpr = E->getIndexExpr(ON.getArrayExprIndex()); | ||||
2727 | llvm::Value* Idx = CGF.EmitScalarExpr(IdxExpr); | ||||
2728 | bool IdxSigned = IdxExpr->getType()->isSignedIntegerOrEnumerationType(); | ||||
2729 | Idx = Builder.CreateIntCast(Idx, ResultType, IdxSigned, "conv"); | ||||
2730 | |||||
2731 | // Save the element type | ||||
2732 | CurrentType = | ||||
2733 | CGF.getContext().getAsArrayType(CurrentType)->getElementType(); | ||||
2734 | |||||
2735 | // Compute the element size | ||||
2736 | llvm::Value* ElemSize = llvm::ConstantInt::get(ResultType, | ||||
2737 | CGF.getContext().getTypeSizeInChars(CurrentType).getQuantity()); | ||||
2738 | |||||
2739 | // Multiply out to compute the result | ||||
2740 | Offset = Builder.CreateMul(Idx, ElemSize); | ||||
2741 | break; | ||||
2742 | } | ||||
2743 | |||||
2744 | case OffsetOfNode::Field: { | ||||
2745 | FieldDecl *MemberDecl = ON.getField(); | ||||
2746 | RecordDecl *RD = CurrentType->castAs<RecordType>()->getDecl(); | ||||
2747 | const ASTRecordLayout &RL = CGF.getContext().getASTRecordLayout(RD); | ||||
2748 | |||||
2749 | // Compute the index of the field in its parent. | ||||
2750 | unsigned i = 0; | ||||
2751 | // FIXME: It would be nice if we didn't have to loop here! | ||||
2752 | for (RecordDecl::field_iterator Field = RD->field_begin(), | ||||
2753 | FieldEnd = RD->field_end(); | ||||
2754 | Field != FieldEnd; ++Field, ++i) { | ||||
2755 | if (*Field == MemberDecl) | ||||
2756 | break; | ||||
2757 | } | ||||
2758 | assert(i < RL.getFieldCount() && "offsetof field in wrong type")((i < RL.getFieldCount() && "offsetof field in wrong type" ) ? static_cast<void> (0) : __assert_fail ("i < RL.getFieldCount() && \"offsetof field in wrong type\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 2758, __PRETTY_FUNCTION__)); | ||||
2759 | |||||
2760 | // Compute the offset to the field | ||||
2761 | int64_t OffsetInt = RL.getFieldOffset(i) / | ||||
2762 | CGF.getContext().getCharWidth(); | ||||
2763 | Offset = llvm::ConstantInt::get(ResultType, OffsetInt); | ||||
2764 | |||||
2765 | // Save the element type. | ||||
2766 | CurrentType = MemberDecl->getType(); | ||||
2767 | break; | ||||
2768 | } | ||||
2769 | |||||
2770 | case OffsetOfNode::Identifier: | ||||
2771 | llvm_unreachable("dependent __builtin_offsetof")::llvm::llvm_unreachable_internal("dependent __builtin_offsetof" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 2771); | ||||
2772 | |||||
2773 | case OffsetOfNode::Base: { | ||||
2774 | if (ON.getBase()->isVirtual()) { | ||||
2775 | CGF.ErrorUnsupported(E, "virtual base in offsetof"); | ||||
2776 | continue; | ||||
2777 | } | ||||
2778 | |||||
2779 | RecordDecl *RD = CurrentType->castAs<RecordType>()->getDecl(); | ||||
2780 | const ASTRecordLayout &RL = CGF.getContext().getASTRecordLayout(RD); | ||||
2781 | |||||
2782 | // Save the element type. | ||||
2783 | CurrentType = ON.getBase()->getType(); | ||||
2784 | |||||
2785 | // Compute the offset to the base. | ||||
2786 | const RecordType *BaseRT = CurrentType->getAs<RecordType>(); | ||||
2787 | CXXRecordDecl *BaseRD = cast<CXXRecordDecl>(BaseRT->getDecl()); | ||||
2788 | CharUnits OffsetInt = RL.getBaseClassOffset(BaseRD); | ||||
2789 | Offset = llvm::ConstantInt::get(ResultType, OffsetInt.getQuantity()); | ||||
2790 | break; | ||||
2791 | } | ||||
2792 | } | ||||
2793 | Result = Builder.CreateAdd(Result, Offset); | ||||
2794 | } | ||||
2795 | return Result; | ||||
2796 | } | ||||
2797 | |||||
2798 | /// VisitUnaryExprOrTypeTraitExpr - Return the size or alignment of the type of | ||||
2799 | /// argument of the sizeof expression as an integer. | ||||
2800 | Value * | ||||
2801 | ScalarExprEmitter::VisitUnaryExprOrTypeTraitExpr( | ||||
2802 | const UnaryExprOrTypeTraitExpr *E) { | ||||
2803 | QualType TypeToSize = E->getTypeOfArgument(); | ||||
2804 | if (E->getKind() == UETT_SizeOf) { | ||||
2805 | if (const VariableArrayType *VAT = | ||||
2806 | CGF.getContext().getAsVariableArrayType(TypeToSize)) { | ||||
2807 | if (E->isArgumentType()) { | ||||
2808 | // sizeof(type) - make sure to emit the VLA size. | ||||
2809 | CGF.EmitVariablyModifiedType(TypeToSize); | ||||
2810 | } else { | ||||
2811 | // C99 6.5.3.4p2: If the argument is an expression of type | ||||
2812 | // VLA, it is evaluated. | ||||
2813 | CGF.EmitIgnoredExpr(E->getArgumentExpr()); | ||||
2814 | } | ||||
2815 | |||||
2816 | auto VlaSize = CGF.getVLASize(VAT); | ||||
2817 | llvm::Value *size = VlaSize.NumElts; | ||||
2818 | |||||
2819 | // Scale the number of non-VLA elements by the non-VLA element size. | ||||
2820 | CharUnits eltSize = CGF.getContext().getTypeSizeInChars(VlaSize.Type); | ||||
2821 | if (!eltSize.isOne()) | ||||
2822 | size = CGF.Builder.CreateNUWMul(CGF.CGM.getSize(eltSize), size); | ||||
2823 | |||||
2824 | return size; | ||||
2825 | } | ||||
2826 | } else if (E->getKind() == UETT_OpenMPRequiredSimdAlign) { | ||||
2827 | auto Alignment = | ||||
2828 | CGF.getContext() | ||||
2829 | .toCharUnitsFromBits(CGF.getContext().getOpenMPDefaultSimdAlign( | ||||
2830 | E->getTypeOfArgument()->getPointeeType())) | ||||
2831 | .getQuantity(); | ||||
2832 | return llvm::ConstantInt::get(CGF.SizeTy, Alignment); | ||||
2833 | } | ||||
2834 | |||||
2835 | // If this isn't sizeof(vla), the result must be constant; use the constant | ||||
2836 | // folding logic so we don't have to duplicate it here. | ||||
2837 | return Builder.getInt(E->EvaluateKnownConstInt(CGF.getContext())); | ||||
2838 | } | ||||
2839 | |||||
2840 | Value *ScalarExprEmitter::VisitUnaryReal(const UnaryOperator *E) { | ||||
2841 | Expr *Op = E->getSubExpr(); | ||||
2842 | if (Op->getType()->isAnyComplexType()) { | ||||
2843 | // If it's an l-value, load through the appropriate subobject l-value. | ||||
2844 | // Note that we have to ask E because Op might be an l-value that | ||||
2845 | // this won't work for, e.g. an Obj-C property. | ||||
2846 | if (E->isGLValue()) | ||||
2847 | return CGF.EmitLoadOfLValue(CGF.EmitLValue(E), | ||||
2848 | E->getExprLoc()).getScalarVal(); | ||||
2849 | |||||
2850 | // Otherwise, calculate and project. | ||||
2851 | return CGF.EmitComplexExpr(Op, false, true).first; | ||||
2852 | } | ||||
2853 | |||||
2854 | return Visit(Op); | ||||
2855 | } | ||||
2856 | |||||
2857 | Value *ScalarExprEmitter::VisitUnaryImag(const UnaryOperator *E) { | ||||
2858 | Expr *Op = E->getSubExpr(); | ||||
2859 | if (Op->getType()->isAnyComplexType()) { | ||||
2860 | // If it's an l-value, load through the appropriate subobject l-value. | ||||
2861 | // Note that we have to ask E because Op might be an l-value that | ||||
2862 | // this won't work for, e.g. an Obj-C property. | ||||
2863 | if (Op->isGLValue()) | ||||
2864 | return CGF.EmitLoadOfLValue(CGF.EmitLValue(E), | ||||
2865 | E->getExprLoc()).getScalarVal(); | ||||
2866 | |||||
2867 | // Otherwise, calculate and project. | ||||
2868 | return CGF.EmitComplexExpr(Op, true, false).second; | ||||
2869 | } | ||||
2870 | |||||
2871 | // __imag on a scalar returns zero. Emit the subexpr to ensure side | ||||
2872 | // effects are evaluated, but not the actual value. | ||||
2873 | if (Op->isGLValue()) | ||||
2874 | CGF.EmitLValue(Op); | ||||
2875 | else | ||||
2876 | CGF.EmitScalarExpr(Op, true); | ||||
2877 | return llvm::Constant::getNullValue(ConvertType(E->getType())); | ||||
2878 | } | ||||
2879 | |||||
2880 | //===----------------------------------------------------------------------===// | ||||
2881 | // Binary Operators | ||||
2882 | //===----------------------------------------------------------------------===// | ||||
2883 | |||||
2884 | BinOpInfo ScalarExprEmitter::EmitBinOps(const BinaryOperator *E) { | ||||
2885 | TestAndClearIgnoreResultAssign(); | ||||
2886 | BinOpInfo Result; | ||||
2887 | Result.LHS = Visit(E->getLHS()); | ||||
2888 | Result.RHS = Visit(E->getRHS()); | ||||
2889 | Result.Ty = E->getType(); | ||||
2890 | Result.Opcode = E->getOpcode(); | ||||
2891 | Result.FPFeatures = E->getFPFeatures(); | ||||
2892 | Result.E = E; | ||||
2893 | return Result; | ||||
2894 | } | ||||
2895 | |||||
2896 | LValue ScalarExprEmitter::EmitCompoundAssignLValue( | ||||
2897 | const CompoundAssignOperator *E, | ||||
2898 | Value *(ScalarExprEmitter::*Func)(const BinOpInfo &), | ||||
2899 | Value *&Result) { | ||||
2900 | QualType LHSTy = E->getLHS()->getType(); | ||||
2901 | BinOpInfo OpInfo; | ||||
2902 | |||||
2903 | if (E->getComputationResultType()->isAnyComplexType()) | ||||
2904 | return CGF.EmitScalarCompoundAssignWithComplex(E, Result); | ||||
2905 | |||||
2906 | // Emit the RHS first. __block variables need to have the rhs evaluated | ||||
2907 | // first, plus this should improve codegen a little. | ||||
2908 | OpInfo.RHS = Visit(E->getRHS()); | ||||
2909 | OpInfo.Ty = E->getComputationResultType(); | ||||
2910 | OpInfo.Opcode = E->getOpcode(); | ||||
2911 | OpInfo.FPFeatures = E->getFPFeatures(); | ||||
2912 | OpInfo.E = E; | ||||
2913 | // Load/convert the LHS. | ||||
2914 | LValue LHSLV = EmitCheckedLValue(E->getLHS(), CodeGenFunction::TCK_Store); | ||||
2915 | |||||
2916 | llvm::PHINode *atomicPHI = nullptr; | ||||
2917 | if (const AtomicType *atomicTy = LHSTy->getAs<AtomicType>()) { | ||||
2918 | QualType type = atomicTy->getValueType(); | ||||
2919 | if (!type->isBooleanType() && type->isIntegerType() && | ||||
2920 | !(type->isUnsignedIntegerType() && | ||||
2921 | CGF.SanOpts.has(SanitizerKind::UnsignedIntegerOverflow)) && | ||||
2922 | CGF.getLangOpts().getSignedOverflowBehavior() != | ||||
2923 | LangOptions::SOB_Trapping) { | ||||
2924 | llvm::AtomicRMWInst::BinOp AtomicOp = llvm::AtomicRMWInst::BAD_BINOP; | ||||
2925 | llvm::Instruction::BinaryOps Op; | ||||
2926 | switch (OpInfo.Opcode) { | ||||
2927 | // We don't have atomicrmw operands for *, %, /, <<, >> | ||||
2928 | case BO_MulAssign: case BO_DivAssign: | ||||
2929 | case BO_RemAssign: | ||||
2930 | case BO_ShlAssign: | ||||
2931 | case BO_ShrAssign: | ||||
2932 | break; | ||||
2933 | case BO_AddAssign: | ||||
2934 | AtomicOp = llvm::AtomicRMWInst::Add; | ||||
2935 | Op = llvm::Instruction::Add; | ||||
2936 | break; | ||||
2937 | case BO_SubAssign: | ||||
2938 | AtomicOp = llvm::AtomicRMWInst::Sub; | ||||
2939 | Op = llvm::Instruction::Sub; | ||||
2940 | break; | ||||
2941 | case BO_AndAssign: | ||||
2942 | AtomicOp = llvm::AtomicRMWInst::And; | ||||
2943 | Op = llvm::Instruction::And; | ||||
2944 | break; | ||||
2945 | case BO_XorAssign: | ||||
2946 | AtomicOp = llvm::AtomicRMWInst::Xor; | ||||
2947 | Op = llvm::Instruction::Xor; | ||||
2948 | break; | ||||
2949 | case BO_OrAssign: | ||||
2950 | AtomicOp = llvm::AtomicRMWInst::Or; | ||||
2951 | Op = llvm::Instruction::Or; | ||||
2952 | break; | ||||
2953 | default: | ||||
2954 | llvm_unreachable("Invalid compound assignment type")::llvm::llvm_unreachable_internal("Invalid compound assignment type" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 2954); | ||||
2955 | } | ||||
2956 | if (AtomicOp != llvm::AtomicRMWInst::BAD_BINOP) { | ||||
2957 | llvm::Value *Amt = CGF.EmitToMemory( | ||||
2958 | EmitScalarConversion(OpInfo.RHS, E->getRHS()->getType(), LHSTy, | ||||
2959 | E->getExprLoc()), | ||||
2960 | LHSTy); | ||||
2961 | Value *OldVal = Builder.CreateAtomicRMW( | ||||
2962 | AtomicOp, LHSLV.getPointer(CGF), Amt, | ||||
2963 | llvm::AtomicOrdering::SequentiallyConsistent); | ||||
2964 | |||||
2965 | // Since operation is atomic, the result type is guaranteed to be the | ||||
2966 | // same as the input in LLVM terms. | ||||
2967 | Result = Builder.CreateBinOp(Op, OldVal, Amt); | ||||
2968 | return LHSLV; | ||||
2969 | } | ||||
2970 | } | ||||
2971 | // FIXME: For floating point types, we should be saving and restoring the | ||||
2972 | // floating point environment in the loop. | ||||
2973 | llvm::BasicBlock *startBB = Builder.GetInsertBlock(); | ||||
2974 | llvm::BasicBlock *opBB = CGF.createBasicBlock("atomic_op", CGF.CurFn); | ||||
2975 | OpInfo.LHS = EmitLoadOfLValue(LHSLV, E->getExprLoc()); | ||||
2976 | OpInfo.LHS = CGF.EmitToMemory(OpInfo.LHS, type); | ||||
2977 | Builder.CreateBr(opBB); | ||||
2978 | Builder.SetInsertPoint(opBB); | ||||
2979 | atomicPHI = Builder.CreatePHI(OpInfo.LHS->getType(), 2); | ||||
2980 | atomicPHI->addIncoming(OpInfo.LHS, startBB); | ||||
2981 | OpInfo.LHS = atomicPHI; | ||||
2982 | } | ||||
2983 | else | ||||
2984 | OpInfo.LHS = EmitLoadOfLValue(LHSLV, E->getExprLoc()); | ||||
2985 | |||||
2986 | SourceLocation Loc = E->getExprLoc(); | ||||
2987 | OpInfo.LHS = | ||||
2988 | EmitScalarConversion(OpInfo.LHS, LHSTy, E->getComputationLHSType(), Loc); | ||||
2989 | |||||
2990 | // Expand the binary operator. | ||||
2991 | Result = (this->*Func)(OpInfo); | ||||
2992 | |||||
2993 | // Convert the result back to the LHS type, | ||||
2994 | // potentially with Implicit Conversion sanitizer check. | ||||
2995 | Result = EmitScalarConversion(Result, E->getComputationResultType(), LHSTy, | ||||
2996 | Loc, ScalarConversionOpts(CGF.SanOpts)); | ||||
2997 | |||||
2998 | if (atomicPHI) { | ||||
2999 | llvm::BasicBlock *curBlock = Builder.GetInsertBlock(); | ||||
3000 | llvm::BasicBlock *contBB = CGF.createBasicBlock("atomic_cont", CGF.CurFn); | ||||
3001 | auto Pair = CGF.EmitAtomicCompareExchange( | ||||
3002 | LHSLV, RValue::get(atomicPHI), RValue::get(Result), E->getExprLoc()); | ||||
3003 | llvm::Value *old = CGF.EmitToMemory(Pair.first.getScalarVal(), LHSTy); | ||||
3004 | llvm::Value *success = Pair.second; | ||||
3005 | atomicPHI->addIncoming(old, curBlock); | ||||
3006 | Builder.CreateCondBr(success, contBB, atomicPHI->getParent()); | ||||
3007 | Builder.SetInsertPoint(contBB); | ||||
3008 | return LHSLV; | ||||
3009 | } | ||||
3010 | |||||
3011 | // Store the result value into the LHS lvalue. Bit-fields are handled | ||||
3012 | // specially because the result is altered by the store, i.e., [C99 6.5.16p1] | ||||
3013 | // 'An assignment expression has the value of the left operand after the | ||||
3014 | // assignment...'. | ||||
3015 | if (LHSLV.isBitField()) | ||||
3016 | CGF.EmitStoreThroughBitfieldLValue(RValue::get(Result), LHSLV, &Result); | ||||
3017 | else | ||||
3018 | CGF.EmitStoreThroughLValue(RValue::get(Result), LHSLV); | ||||
3019 | |||||
3020 | if (CGF.getLangOpts().OpenMP) | ||||
3021 | CGF.CGM.getOpenMPRuntime().checkAndEmitLastprivateConditional(CGF, | ||||
3022 | E->getLHS()); | ||||
3023 | return LHSLV; | ||||
3024 | } | ||||
3025 | |||||
3026 | Value *ScalarExprEmitter::EmitCompoundAssign(const CompoundAssignOperator *E, | ||||
3027 | Value *(ScalarExprEmitter::*Func)(const BinOpInfo &)) { | ||||
3028 | bool Ignore = TestAndClearIgnoreResultAssign(); | ||||
3029 | Value *RHS = nullptr; | ||||
3030 | LValue LHS = EmitCompoundAssignLValue(E, Func, RHS); | ||||
3031 | |||||
3032 | // If the result is clearly ignored, return now. | ||||
3033 | if (Ignore) | ||||
3034 | return nullptr; | ||||
3035 | |||||
3036 | // The result of an assignment in C is the assigned r-value. | ||||
3037 | if (!CGF.getLangOpts().CPlusPlus) | ||||
3038 | return RHS; | ||||
3039 | |||||
3040 | // If the lvalue is non-volatile, return the computed value of the assignment. | ||||
3041 | if (!LHS.isVolatileQualified()) | ||||
3042 | return RHS; | ||||
3043 | |||||
3044 | // Otherwise, reload the value. | ||||
3045 | return EmitLoadOfLValue(LHS, E->getExprLoc()); | ||||
3046 | } | ||||
3047 | |||||
3048 | void ScalarExprEmitter::EmitUndefinedBehaviorIntegerDivAndRemCheck( | ||||
3049 | const BinOpInfo &Ops, llvm::Value *Zero, bool isDiv) { | ||||
3050 | SmallVector<std::pair<llvm::Value *, SanitizerMask>, 2> Checks; | ||||
3051 | |||||
3052 | if (CGF.SanOpts.has(SanitizerKind::IntegerDivideByZero)) { | ||||
3053 | Checks.push_back(std::make_pair(Builder.CreateICmpNE(Ops.RHS, Zero), | ||||
3054 | SanitizerKind::IntegerDivideByZero)); | ||||
3055 | } | ||||
3056 | |||||
3057 | const auto *BO = cast<BinaryOperator>(Ops.E); | ||||
3058 | if (CGF.SanOpts.has(SanitizerKind::SignedIntegerOverflow) && | ||||
3059 | Ops.Ty->hasSignedIntegerRepresentation() && | ||||
3060 | !IsWidenedIntegerOp(CGF.getContext(), BO->getLHS()) && | ||||
3061 | Ops.mayHaveIntegerOverflow()) { | ||||
3062 | llvm::IntegerType *Ty = cast<llvm::IntegerType>(Zero->getType()); | ||||
3063 | |||||
3064 | llvm::Value *IntMin = | ||||
3065 | Builder.getInt(llvm::APInt::getSignedMinValue(Ty->getBitWidth())); | ||||
3066 | llvm::Value *NegOne = llvm::ConstantInt::get(Ty, -1ULL); | ||||
3067 | |||||
3068 | llvm::Value *LHSCmp = Builder.CreateICmpNE(Ops.LHS, IntMin); | ||||
3069 | llvm::Value *RHSCmp = Builder.CreateICmpNE(Ops.RHS, NegOne); | ||||
3070 | llvm::Value *NotOverflow = Builder.CreateOr(LHSCmp, RHSCmp, "or"); | ||||
3071 | Checks.push_back( | ||||
3072 | std::make_pair(NotOverflow, SanitizerKind::SignedIntegerOverflow)); | ||||
3073 | } | ||||
3074 | |||||
3075 | if (Checks.size() > 0) | ||||
3076 | EmitBinOpCheck(Checks, Ops); | ||||
3077 | } | ||||
3078 | |||||
3079 | Value *ScalarExprEmitter::EmitDiv(const BinOpInfo &Ops) { | ||||
3080 | { | ||||
3081 | CodeGenFunction::SanitizerScope SanScope(&CGF); | ||||
3082 | if ((CGF.SanOpts.has(SanitizerKind::IntegerDivideByZero) || | ||||
3083 | CGF.SanOpts.has(SanitizerKind::SignedIntegerOverflow)) && | ||||
3084 | Ops.Ty->isIntegerType() && | ||||
3085 | (Ops.mayHaveIntegerDivisionByZero() || Ops.mayHaveIntegerOverflow())) { | ||||
3086 | llvm::Value *Zero = llvm::Constant::getNullValue(ConvertType(Ops.Ty)); | ||||
3087 | EmitUndefinedBehaviorIntegerDivAndRemCheck(Ops, Zero, true); | ||||
3088 | } else if (CGF.SanOpts.has(SanitizerKind::FloatDivideByZero) && | ||||
3089 | Ops.Ty->isRealFloatingType() && | ||||
3090 | Ops.mayHaveFloatDivisionByZero()) { | ||||
3091 | llvm::Value *Zero = llvm::Constant::getNullValue(ConvertType(Ops.Ty)); | ||||
3092 | llvm::Value *NonZero = Builder.CreateFCmpUNE(Ops.RHS, Zero); | ||||
3093 | EmitBinOpCheck(std::make_pair(NonZero, SanitizerKind::FloatDivideByZero), | ||||
3094 | Ops); | ||||
3095 | } | ||||
3096 | } | ||||
3097 | |||||
3098 | if (Ops.LHS->getType()->isFPOrFPVectorTy()) { | ||||
3099 | llvm::Value *Val = Builder.CreateFDiv(Ops.LHS, Ops.RHS, "div"); | ||||
3100 | if (CGF.getLangOpts().OpenCL && | ||||
3101 | !CGF.CGM.getCodeGenOpts().CorrectlyRoundedDivSqrt) { | ||||
3102 | // OpenCL v1.1 s7.4: minimum accuracy of single precision / is 2.5ulp | ||||
3103 | // OpenCL v1.2 s5.6.4.2: The -cl-fp32-correctly-rounded-divide-sqrt | ||||
3104 | // build option allows an application to specify that single precision | ||||
3105 | // floating-point divide (x/y and 1/x) and sqrt used in the program | ||||
3106 | // source are correctly rounded. | ||||
3107 | llvm::Type *ValTy = Val->getType(); | ||||
3108 | if (ValTy->isFloatTy() || | ||||
3109 | (isa<llvm::VectorType>(ValTy) && | ||||
3110 | cast<llvm::VectorType>(ValTy)->getElementType()->isFloatTy())) | ||||
3111 | CGF.SetFPAccuracy(Val, 2.5); | ||||
3112 | } | ||||
3113 | return Val; | ||||
3114 | } | ||||
3115 | else if (Ops.Ty->hasUnsignedIntegerRepresentation()) | ||||
3116 | return Builder.CreateUDiv(Ops.LHS, Ops.RHS, "div"); | ||||
3117 | else | ||||
3118 | return Builder.CreateSDiv(Ops.LHS, Ops.RHS, "div"); | ||||
3119 | } | ||||
3120 | |||||
3121 | Value *ScalarExprEmitter::EmitRem(const BinOpInfo &Ops) { | ||||
3122 | // Rem in C can't be a floating point type: C99 6.5.5p2. | ||||
3123 | if ((CGF.SanOpts.has(SanitizerKind::IntegerDivideByZero) || | ||||
3124 | CGF.SanOpts.has(SanitizerKind::SignedIntegerOverflow)) && | ||||
3125 | Ops.Ty->isIntegerType() && | ||||
3126 | (Ops.mayHaveIntegerDivisionByZero() || Ops.mayHaveIntegerOverflow())) { | ||||
3127 | CodeGenFunction::SanitizerScope SanScope(&CGF); | ||||
3128 | llvm::Value *Zero = llvm::Constant::getNullValue(ConvertType(Ops.Ty)); | ||||
3129 | EmitUndefinedBehaviorIntegerDivAndRemCheck(Ops, Zero, false); | ||||
3130 | } | ||||
3131 | |||||
3132 | if (Ops.Ty->hasUnsignedIntegerRepresentation()) | ||||
3133 | return Builder.CreateURem(Ops.LHS, Ops.RHS, "rem"); | ||||
3134 | else | ||||
3135 | return Builder.CreateSRem(Ops.LHS, Ops.RHS, "rem"); | ||||
3136 | } | ||||
3137 | |||||
3138 | Value *ScalarExprEmitter::EmitOverflowCheckedBinOp(const BinOpInfo &Ops) { | ||||
3139 | unsigned IID; | ||||
3140 | unsigned OpID = 0; | ||||
3141 | |||||
3142 | bool isSigned = Ops.Ty->isSignedIntegerOrEnumerationType(); | ||||
3143 | switch (Ops.Opcode) { | ||||
3144 | case BO_Add: | ||||
3145 | case BO_AddAssign: | ||||
3146 | OpID = 1; | ||||
3147 | IID = isSigned ? llvm::Intrinsic::sadd_with_overflow : | ||||
3148 | llvm::Intrinsic::uadd_with_overflow; | ||||
3149 | break; | ||||
3150 | case BO_Sub: | ||||
3151 | case BO_SubAssign: | ||||
3152 | OpID = 2; | ||||
3153 | IID = isSigned ? llvm::Intrinsic::ssub_with_overflow : | ||||
3154 | llvm::Intrinsic::usub_with_overflow; | ||||
3155 | break; | ||||
3156 | case BO_Mul: | ||||
3157 | case BO_MulAssign: | ||||
3158 | OpID = 3; | ||||
3159 | IID = isSigned ? llvm::Intrinsic::smul_with_overflow : | ||||
3160 | llvm::Intrinsic::umul_with_overflow; | ||||
3161 | break; | ||||
3162 | default: | ||||
3163 | llvm_unreachable("Unsupported operation for overflow detection")::llvm::llvm_unreachable_internal("Unsupported operation for overflow detection" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 3163); | ||||
3164 | } | ||||
3165 | OpID <<= 1; | ||||
3166 | if (isSigned) | ||||
3167 | OpID |= 1; | ||||
3168 | |||||
3169 | CodeGenFunction::SanitizerScope SanScope(&CGF); | ||||
3170 | llvm::Type *opTy = CGF.CGM.getTypes().ConvertType(Ops.Ty); | ||||
3171 | |||||
3172 | llvm::Function *intrinsic = CGF.CGM.getIntrinsic(IID, opTy); | ||||
3173 | |||||
3174 | Value *resultAndOverflow = Builder.CreateCall(intrinsic, {Ops.LHS, Ops.RHS}); | ||||
3175 | Value *result = Builder.CreateExtractValue(resultAndOverflow, 0); | ||||
3176 | Value *overflow = Builder.CreateExtractValue(resultAndOverflow, 1); | ||||
3177 | |||||
3178 | // Handle overflow with llvm.trap if no custom handler has been specified. | ||||
3179 | const std::string *handlerName = | ||||
3180 | &CGF.getLangOpts().OverflowHandler; | ||||
3181 | if (handlerName->empty()) { | ||||
3182 | // If the signed-integer-overflow sanitizer is enabled, emit a call to its | ||||
3183 | // runtime. Otherwise, this is a -ftrapv check, so just emit a trap. | ||||
3184 | if (!isSigned || CGF.SanOpts.has(SanitizerKind::SignedIntegerOverflow)) { | ||||
3185 | llvm::Value *NotOverflow = Builder.CreateNot(overflow); | ||||
3186 | SanitizerMask Kind = isSigned ? SanitizerKind::SignedIntegerOverflow | ||||
3187 | : SanitizerKind::UnsignedIntegerOverflow; | ||||
3188 | EmitBinOpCheck(std::make_pair(NotOverflow, Kind), Ops); | ||||
3189 | } else | ||||
3190 | CGF.EmitTrapCheck(Builder.CreateNot(overflow)); | ||||
3191 | return result; | ||||
3192 | } | ||||
3193 | |||||
3194 | // Branch in case of overflow. | ||||
3195 | llvm::BasicBlock *initialBB = Builder.GetInsertBlock(); | ||||
3196 | llvm::BasicBlock *continueBB = | ||||
3197 | CGF.createBasicBlock("nooverflow", CGF.CurFn, initialBB->getNextNode()); | ||||
3198 | llvm::BasicBlock *overflowBB = CGF.createBasicBlock("overflow", CGF.CurFn); | ||||
3199 | |||||
3200 | Builder.CreateCondBr(overflow, overflowBB, continueBB); | ||||
3201 | |||||
3202 | // If an overflow handler is set, then we want to call it and then use its | ||||
3203 | // result, if it returns. | ||||
3204 | Builder.SetInsertPoint(overflowBB); | ||||
3205 | |||||
3206 | // Get the overflow handler. | ||||
3207 | llvm::Type *Int8Ty = CGF.Int8Ty; | ||||
3208 | llvm::Type *argTypes[] = { CGF.Int64Ty, CGF.Int64Ty, Int8Ty, Int8Ty }; | ||||
3209 | llvm::FunctionType *handlerTy = | ||||
3210 | llvm::FunctionType::get(CGF.Int64Ty, argTypes, true); | ||||
3211 | llvm::FunctionCallee handler = | ||||
3212 | CGF.CGM.CreateRuntimeFunction(handlerTy, *handlerName); | ||||
3213 | |||||
3214 | // Sign extend the args to 64-bit, so that we can use the same handler for | ||||
3215 | // all types of overflow. | ||||
3216 | llvm::Value *lhs = Builder.CreateSExt(Ops.LHS, CGF.Int64Ty); | ||||
3217 | llvm::Value *rhs = Builder.CreateSExt(Ops.RHS, CGF.Int64Ty); | ||||
3218 | |||||
3219 | // Call the handler with the two arguments, the operation, and the size of | ||||
3220 | // the result. | ||||
3221 | llvm::Value *handlerArgs[] = { | ||||
3222 | lhs, | ||||
3223 | rhs, | ||||
3224 | Builder.getInt8(OpID), | ||||
3225 | Builder.getInt8(cast<llvm::IntegerType>(opTy)->getBitWidth()) | ||||
3226 | }; | ||||
3227 | llvm::Value *handlerResult = | ||||
3228 | CGF.EmitNounwindRuntimeCall(handler, handlerArgs); | ||||
3229 | |||||
3230 | // Truncate the result back to the desired size. | ||||
3231 | handlerResult = Builder.CreateTrunc(handlerResult, opTy); | ||||
3232 | Builder.CreateBr(continueBB); | ||||
3233 | |||||
3234 | Builder.SetInsertPoint(continueBB); | ||||
3235 | llvm::PHINode *phi = Builder.CreatePHI(opTy, 2); | ||||
3236 | phi->addIncoming(result, initialBB); | ||||
3237 | phi->addIncoming(handlerResult, overflowBB); | ||||
3238 | |||||
3239 | return phi; | ||||
3240 | } | ||||
3241 | |||||
3242 | /// Emit pointer + index arithmetic. | ||||
3243 | static Value *emitPointerArithmetic(CodeGenFunction &CGF, | ||||
3244 | const BinOpInfo &op, | ||||
3245 | bool isSubtraction) { | ||||
3246 | // Must have binary (not unary) expr here. Unary pointer | ||||
3247 | // increment/decrement doesn't use this path. | ||||
3248 | const BinaryOperator *expr = cast<BinaryOperator>(op.E); | ||||
3249 | |||||
3250 | Value *pointer = op.LHS; | ||||
3251 | Expr *pointerOperand = expr->getLHS(); | ||||
3252 | Value *index = op.RHS; | ||||
3253 | Expr *indexOperand = expr->getRHS(); | ||||
3254 | |||||
3255 | // In a subtraction, the LHS is always the pointer. | ||||
3256 | if (!isSubtraction && !pointer->getType()->isPointerTy()) { | ||||
3257 | std::swap(pointer, index); | ||||
3258 | std::swap(pointerOperand, indexOperand); | ||||
3259 | } | ||||
3260 | |||||
3261 | bool isSigned = indexOperand->getType()->isSignedIntegerOrEnumerationType(); | ||||
3262 | |||||
3263 | unsigned width = cast<llvm::IntegerType>(index->getType())->getBitWidth(); | ||||
3264 | auto &DL = CGF.CGM.getDataLayout(); | ||||
3265 | auto PtrTy = cast<llvm::PointerType>(pointer->getType()); | ||||
3266 | |||||
3267 | // Some versions of glibc and gcc use idioms (particularly in their malloc | ||||
3268 | // routines) that add a pointer-sized integer (known to be a pointer value) | ||||
3269 | // to a null pointer in order to cast the value back to an integer or as | ||||
3270 | // part of a pointer alignment algorithm. This is undefined behavior, but | ||||
3271 | // we'd like to be able to compile programs that use it. | ||||
3272 | // | ||||
3273 | // Normally, we'd generate a GEP with a null-pointer base here in response | ||||
3274 | // to that code, but it's also UB to dereference a pointer created that | ||||
3275 | // way. Instead (as an acknowledged hack to tolerate the idiom) we will | ||||
3276 | // generate a direct cast of the integer value to a pointer. | ||||
3277 | // | ||||
3278 | // The idiom (p = nullptr + N) is not met if any of the following are true: | ||||
3279 | // | ||||
3280 | // The operation is subtraction. | ||||
3281 | // The index is not pointer-sized. | ||||
3282 | // The pointer type is not byte-sized. | ||||
3283 | // | ||||
3284 | if (BinaryOperator::isNullPointerArithmeticExtension(CGF.getContext(), | ||||
3285 | op.Opcode, | ||||
3286 | expr->getLHS(), | ||||
3287 | expr->getRHS())) | ||||
3288 | return CGF.Builder.CreateIntToPtr(index, pointer->getType()); | ||||
3289 | |||||
3290 | if (width != DL.getIndexTypeSizeInBits(PtrTy)) { | ||||
3291 | // Zero-extend or sign-extend the pointer value according to | ||||
3292 | // whether the index is signed or not. | ||||
3293 | index = CGF.Builder.CreateIntCast(index, DL.getIndexType(PtrTy), isSigned, | ||||
3294 | "idx.ext"); | ||||
3295 | } | ||||
3296 | |||||
3297 | // If this is subtraction, negate the index. | ||||
3298 | if (isSubtraction) | ||||
3299 | index = CGF.Builder.CreateNeg(index, "idx.neg"); | ||||
3300 | |||||
3301 | if (CGF.SanOpts.has(SanitizerKind::ArrayBounds)) | ||||
3302 | CGF.EmitBoundsCheck(op.E, pointerOperand, index, indexOperand->getType(), | ||||
3303 | /*Accessed*/ false); | ||||
3304 | |||||
3305 | const PointerType *pointerType | ||||
3306 | = pointerOperand->getType()->getAs<PointerType>(); | ||||
3307 | if (!pointerType) { | ||||
3308 | QualType objectType = pointerOperand->getType() | ||||
3309 | ->castAs<ObjCObjectPointerType>() | ||||
3310 | ->getPointeeType(); | ||||
3311 | llvm::Value *objectSize | ||||
3312 | = CGF.CGM.getSize(CGF.getContext().getTypeSizeInChars(objectType)); | ||||
3313 | |||||
3314 | index = CGF.Builder.CreateMul(index, objectSize); | ||||
3315 | |||||
3316 | Value *result = CGF.Builder.CreateBitCast(pointer, CGF.VoidPtrTy); | ||||
3317 | result = CGF.Builder.CreateGEP(result, index, "add.ptr"); | ||||
3318 | return CGF.Builder.CreateBitCast(result, pointer->getType()); | ||||
3319 | } | ||||
3320 | |||||
3321 | QualType elementType = pointerType->getPointeeType(); | ||||
3322 | if (const VariableArrayType *vla | ||||
3323 | = CGF.getContext().getAsVariableArrayType(elementType)) { | ||||
3324 | // The element count here is the total number of non-VLA elements. | ||||
3325 | llvm::Value *numElements = CGF.getVLASize(vla).NumElts; | ||||
3326 | |||||
3327 | // Effectively, the multiply by the VLA size is part of the GEP. | ||||
3328 | // GEP indexes are signed, and scaling an index isn't permitted to | ||||
3329 | // signed-overflow, so we use the same semantics for our explicit | ||||
3330 | // multiply. We suppress this if overflow is not undefined behavior. | ||||
3331 | if (CGF.getLangOpts().isSignedOverflowDefined()) { | ||||
3332 | index = CGF.Builder.CreateMul(index, numElements, "vla.index"); | ||||
3333 | pointer = CGF.Builder.CreateGEP(pointer, index, "add.ptr"); | ||||
3334 | } else { | ||||
3335 | index = CGF.Builder.CreateNSWMul(index, numElements, "vla.index"); | ||||
3336 | pointer = | ||||
3337 | CGF.EmitCheckedInBoundsGEP(pointer, index, isSigned, isSubtraction, | ||||
3338 | op.E->getExprLoc(), "add.ptr"); | ||||
3339 | } | ||||
3340 | return pointer; | ||||
3341 | } | ||||
3342 | |||||
3343 | // Explicitly handle GNU void* and function pointer arithmetic extensions. The | ||||
3344 | // GNU void* casts amount to no-ops since our void* type is i8*, but this is | ||||
3345 | // future proof. | ||||
3346 | if (elementType->isVoidType() || elementType->isFunctionType()) { | ||||
3347 | Value *result = CGF.EmitCastToVoidPtr(pointer); | ||||
3348 | result = CGF.Builder.CreateGEP(result, index, "add.ptr"); | ||||
3349 | return CGF.Builder.CreateBitCast(result, pointer->getType()); | ||||
3350 | } | ||||
3351 | |||||
3352 | if (CGF.getLangOpts().isSignedOverflowDefined()) | ||||
3353 | return CGF.Builder.CreateGEP(pointer, index, "add.ptr"); | ||||
3354 | |||||
3355 | return CGF.EmitCheckedInBoundsGEP(pointer, index, isSigned, isSubtraction, | ||||
3356 | op.E->getExprLoc(), "add.ptr"); | ||||
3357 | } | ||||
3358 | |||||
3359 | // Construct an fmuladd intrinsic to represent a fused mul-add of MulOp and | ||||
3360 | // Addend. Use negMul and negAdd to negate the first operand of the Mul or | ||||
3361 | // the add operand respectively. This allows fmuladd to represent a*b-c, or | ||||
3362 | // c-a*b. Patterns in LLVM should catch the negated forms and translate them to | ||||
3363 | // efficient operations. | ||||
3364 | static Value* buildFMulAdd(llvm::BinaryOperator *MulOp, Value *Addend, | ||||
3365 | const CodeGenFunction &CGF, CGBuilderTy &Builder, | ||||
3366 | bool negMul, bool negAdd) { | ||||
3367 | assert(!(negMul && negAdd) && "Only one of negMul and negAdd should be set.")((!(negMul && negAdd) && "Only one of negMul and negAdd should be set." ) ? static_cast<void> (0) : __assert_fail ("!(negMul && negAdd) && \"Only one of negMul and negAdd should be set.\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 3367, __PRETTY_FUNCTION__)); | ||||
3368 | |||||
3369 | Value *MulOp0 = MulOp->getOperand(0); | ||||
3370 | Value *MulOp1 = MulOp->getOperand(1); | ||||
3371 | if (negMul) | ||||
3372 | MulOp0 = Builder.CreateFNeg(MulOp0, "neg"); | ||||
3373 | if (negAdd) | ||||
3374 | Addend = Builder.CreateFNeg(Addend, "neg"); | ||||
3375 | |||||
3376 | Value *FMulAdd = Builder.CreateCall( | ||||
3377 | CGF.CGM.getIntrinsic(llvm::Intrinsic::fmuladd, Addend->getType()), | ||||
3378 | {MulOp0, MulOp1, Addend}); | ||||
3379 | MulOp->eraseFromParent(); | ||||
3380 | |||||
3381 | return FMulAdd; | ||||
3382 | } | ||||
3383 | |||||
3384 | // Check whether it would be legal to emit an fmuladd intrinsic call to | ||||
3385 | // represent op and if so, build the fmuladd. | ||||
3386 | // | ||||
3387 | // Checks that (a) the operation is fusable, and (b) -ffp-contract=on. | ||||
3388 | // Does NOT check the type of the operation - it's assumed that this function | ||||
3389 | // will be called from contexts where it's known that the type is contractable. | ||||
3390 | static Value* tryEmitFMulAdd(const BinOpInfo &op, | ||||
3391 | const CodeGenFunction &CGF, CGBuilderTy &Builder, | ||||
3392 | bool isSub=false) { | ||||
3393 | |||||
3394 | assert((op.Opcode == BO_Add || op.Opcode == BO_AddAssign ||(((op.Opcode == BO_Add || op.Opcode == BO_AddAssign || op.Opcode == BO_Sub || op.Opcode == BO_SubAssign) && "Only fadd/fsub can be the root of an fmuladd." ) ? static_cast<void> (0) : __assert_fail ("(op.Opcode == BO_Add || op.Opcode == BO_AddAssign || op.Opcode == BO_Sub || op.Opcode == BO_SubAssign) && \"Only fadd/fsub can be the root of an fmuladd.\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 3396, __PRETTY_FUNCTION__)) | ||||
3395 | op.Opcode == BO_Sub || op.Opcode == BO_SubAssign) &&(((op.Opcode == BO_Add || op.Opcode == BO_AddAssign || op.Opcode == BO_Sub || op.Opcode == BO_SubAssign) && "Only fadd/fsub can be the root of an fmuladd." ) ? static_cast<void> (0) : __assert_fail ("(op.Opcode == BO_Add || op.Opcode == BO_AddAssign || op.Opcode == BO_Sub || op.Opcode == BO_SubAssign) && \"Only fadd/fsub can be the root of an fmuladd.\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 3396, __PRETTY_FUNCTION__)) | ||||
3396 | "Only fadd/fsub can be the root of an fmuladd.")(((op.Opcode == BO_Add || op.Opcode == BO_AddAssign || op.Opcode == BO_Sub || op.Opcode == BO_SubAssign) && "Only fadd/fsub can be the root of an fmuladd." ) ? static_cast<void> (0) : __assert_fail ("(op.Opcode == BO_Add || op.Opcode == BO_AddAssign || op.Opcode == BO_Sub || op.Opcode == BO_SubAssign) && \"Only fadd/fsub can be the root of an fmuladd.\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 3396, __PRETTY_FUNCTION__)); | ||||
3397 | |||||
3398 | // Check whether this op is marked as fusable. | ||||
3399 | if (!op.FPFeatures.allowFPContractWithinStatement()) | ||||
3400 | return nullptr; | ||||
3401 | |||||
3402 | // We have a potentially fusable op. Look for a mul on one of the operands. | ||||
3403 | // Also, make sure that the mul result isn't used directly. In that case, | ||||
3404 | // there's no point creating a muladd operation. | ||||
3405 | if (auto *LHSBinOp = dyn_cast<llvm::BinaryOperator>(op.LHS)) { | ||||
3406 | if (LHSBinOp->getOpcode() == llvm::Instruction::FMul && | ||||
3407 | LHSBinOp->use_empty()) | ||||
3408 | return buildFMulAdd(LHSBinOp, op.RHS, CGF, Builder, false, isSub); | ||||
3409 | } | ||||
3410 | if (auto *RHSBinOp = dyn_cast<llvm::BinaryOperator>(op.RHS)) { | ||||
3411 | if (RHSBinOp->getOpcode() == llvm::Instruction::FMul && | ||||
3412 | RHSBinOp->use_empty()) | ||||
3413 | return buildFMulAdd(RHSBinOp, op.LHS, CGF, Builder, isSub, false); | ||||
3414 | } | ||||
3415 | |||||
3416 | return nullptr; | ||||
3417 | } | ||||
3418 | |||||
3419 | Value *ScalarExprEmitter::EmitAdd(const BinOpInfo &op) { | ||||
3420 | if (op.LHS->getType()->isPointerTy() || | ||||
3421 | op.RHS->getType()->isPointerTy()) | ||||
3422 | return emitPointerArithmetic(CGF, op, CodeGenFunction::NotSubtraction); | ||||
3423 | |||||
3424 | if (op.Ty->isSignedIntegerOrEnumerationType()) { | ||||
3425 | switch (CGF.getLangOpts().getSignedOverflowBehavior()) { | ||||
3426 | case LangOptions::SOB_Defined: | ||||
3427 | return Builder.CreateAdd(op.LHS, op.RHS, "add"); | ||||
3428 | case LangOptions::SOB_Undefined: | ||||
3429 | if (!CGF.SanOpts.has(SanitizerKind::SignedIntegerOverflow)) | ||||
3430 | return Builder.CreateNSWAdd(op.LHS, op.RHS, "add"); | ||||
3431 | LLVM_FALLTHROUGH[[gnu::fallthrough]]; | ||||
3432 | case LangOptions::SOB_Trapping: | ||||
3433 | if (CanElideOverflowCheck(CGF.getContext(), op)) | ||||
3434 | return Builder.CreateNSWAdd(op.LHS, op.RHS, "add"); | ||||
3435 | return EmitOverflowCheckedBinOp(op); | ||||
3436 | } | ||||
3437 | } | ||||
3438 | |||||
3439 | if (op.Ty->isUnsignedIntegerType() && | ||||
3440 | CGF.SanOpts.has(SanitizerKind::UnsignedIntegerOverflow) && | ||||
3441 | !CanElideOverflowCheck(CGF.getContext(), op)) | ||||
3442 | return EmitOverflowCheckedBinOp(op); | ||||
3443 | |||||
3444 | if (op.LHS->getType()->isFPOrFPVectorTy()) { | ||||
3445 | // Try to form an fmuladd. | ||||
3446 | if (Value *FMulAdd = tryEmitFMulAdd(op, CGF, Builder)) | ||||
3447 | return FMulAdd; | ||||
3448 | |||||
3449 | Value *V = Builder.CreateFAdd(op.LHS, op.RHS, "add"); | ||||
3450 | return propagateFMFlags(V, op); | ||||
3451 | } | ||||
3452 | |||||
3453 | if (op.isFixedPointBinOp()) | ||||
3454 | return EmitFixedPointBinOp(op); | ||||
3455 | |||||
3456 | return Builder.CreateAdd(op.LHS, op.RHS, "add"); | ||||
3457 | } | ||||
3458 | |||||
3459 | /// The resulting value must be calculated with exact precision, so the operands | ||||
3460 | /// may not be the same type. | ||||
3461 | Value *ScalarExprEmitter::EmitFixedPointBinOp(const BinOpInfo &op) { | ||||
3462 | using llvm::APSInt; | ||||
3463 | using llvm::ConstantInt; | ||||
3464 | |||||
3465 | const auto *BinOp = cast<BinaryOperator>(op.E); | ||||
3466 | |||||
3467 | // The result is a fixed point type and at least one of the operands is fixed | ||||
3468 | // point while the other is either fixed point or an int. This resulting type | ||||
3469 | // should be determined by Sema::handleFixedPointConversions(). | ||||
3470 | QualType ResultTy = op.Ty; | ||||
3471 | QualType LHSTy = BinOp->getLHS()->getType(); | ||||
3472 | QualType RHSTy = BinOp->getRHS()->getType(); | ||||
3473 | ASTContext &Ctx = CGF.getContext(); | ||||
3474 | Value *LHS = op.LHS; | ||||
3475 | Value *RHS = op.RHS; | ||||
3476 | |||||
3477 | auto LHSFixedSema = Ctx.getFixedPointSemantics(LHSTy); | ||||
3478 | auto RHSFixedSema = Ctx.getFixedPointSemantics(RHSTy); | ||||
3479 | auto ResultFixedSema = Ctx.getFixedPointSemantics(ResultTy); | ||||
3480 | auto CommonFixedSema = LHSFixedSema.getCommonSemantics(RHSFixedSema); | ||||
3481 | |||||
3482 | // Convert the operands to the full precision type. | ||||
3483 | Value *FullLHS = EmitFixedPointConversion(LHS, LHSFixedSema, CommonFixedSema, | ||||
3484 | BinOp->getExprLoc()); | ||||
3485 | Value *FullRHS = EmitFixedPointConversion(RHS, RHSFixedSema, CommonFixedSema, | ||||
3486 | BinOp->getExprLoc()); | ||||
3487 | |||||
3488 | // Perform the actual addition. | ||||
3489 | Value *Result; | ||||
3490 | switch (BinOp->getOpcode()) { | ||||
3491 | case BO_Add: { | ||||
3492 | if (ResultFixedSema.isSaturated()) { | ||||
3493 | llvm::Intrinsic::ID IID = ResultFixedSema.isSigned() | ||||
3494 | ? llvm::Intrinsic::sadd_sat | ||||
3495 | : llvm::Intrinsic::uadd_sat; | ||||
3496 | Result = Builder.CreateBinaryIntrinsic(IID, FullLHS, FullRHS); | ||||
3497 | } else { | ||||
3498 | Result = Builder.CreateAdd(FullLHS, FullRHS); | ||||
3499 | } | ||||
3500 | break; | ||||
3501 | } | ||||
3502 | case BO_Sub: { | ||||
3503 | if (ResultFixedSema.isSaturated()) { | ||||
3504 | llvm::Intrinsic::ID IID = ResultFixedSema.isSigned() | ||||
3505 | ? llvm::Intrinsic::ssub_sat | ||||
3506 | : llvm::Intrinsic::usub_sat; | ||||
3507 | Result = Builder.CreateBinaryIntrinsic(IID, FullLHS, FullRHS); | ||||
3508 | } else { | ||||
3509 | Result = Builder.CreateSub(FullLHS, FullRHS); | ||||
3510 | } | ||||
3511 | break; | ||||
3512 | } | ||||
3513 | case BO_LT: | ||||
3514 | return CommonFixedSema.isSigned() ? Builder.CreateICmpSLT(FullLHS, FullRHS) | ||||
3515 | : Builder.CreateICmpULT(FullLHS, FullRHS); | ||||
3516 | case BO_GT: | ||||
3517 | return CommonFixedSema.isSigned() ? Builder.CreateICmpSGT(FullLHS, FullRHS) | ||||
3518 | : Builder.CreateICmpUGT(FullLHS, FullRHS); | ||||
3519 | case BO_LE: | ||||
3520 | return CommonFixedSema.isSigned() ? Builder.CreateICmpSLE(FullLHS, FullRHS) | ||||
3521 | : Builder.CreateICmpULE(FullLHS, FullRHS); | ||||
3522 | case BO_GE: | ||||
3523 | return CommonFixedSema.isSigned() ? Builder.CreateICmpSGE(FullLHS, FullRHS) | ||||
3524 | : Builder.CreateICmpUGE(FullLHS, FullRHS); | ||||
3525 | case BO_EQ: | ||||
3526 | // For equality operations, we assume any padding bits on unsigned types are | ||||
3527 | // zero'd out. They could be overwritten through non-saturating operations | ||||
3528 | // that cause overflow, but this leads to undefined behavior. | ||||
3529 | return Builder.CreateICmpEQ(FullLHS, FullRHS); | ||||
3530 | case BO_NE: | ||||
3531 | return Builder.CreateICmpNE(FullLHS, FullRHS); | ||||
3532 | case BO_Mul: | ||||
3533 | case BO_Div: | ||||
3534 | case BO_Shl: | ||||
3535 | case BO_Shr: | ||||
3536 | case BO_Cmp: | ||||
3537 | case BO_LAnd: | ||||
3538 | case BO_LOr: | ||||
3539 | case BO_MulAssign: | ||||
3540 | case BO_DivAssign: | ||||
3541 | case BO_AddAssign: | ||||
3542 | case BO_SubAssign: | ||||
3543 | case BO_ShlAssign: | ||||
3544 | case BO_ShrAssign: | ||||
3545 | llvm_unreachable("Found unimplemented fixed point binary operation")::llvm::llvm_unreachable_internal("Found unimplemented fixed point binary operation" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 3545); | ||||
3546 | case BO_PtrMemD: | ||||
3547 | case BO_PtrMemI: | ||||
3548 | case BO_Rem: | ||||
3549 | case BO_Xor: | ||||
3550 | case BO_And: | ||||
3551 | case BO_Or: | ||||
3552 | case BO_Assign: | ||||
3553 | case BO_RemAssign: | ||||
3554 | case BO_AndAssign: | ||||
3555 | case BO_XorAssign: | ||||
3556 | case BO_OrAssign: | ||||
3557 | case BO_Comma: | ||||
3558 | llvm_unreachable("Found unsupported binary operation for fixed point types.")::llvm::llvm_unreachable_internal("Found unsupported binary operation for fixed point types." , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 3558); | ||||
3559 | } | ||||
3560 | |||||
3561 | // Convert to the result type. | ||||
3562 | return EmitFixedPointConversion(Result, CommonFixedSema, ResultFixedSema, | ||||
3563 | BinOp->getExprLoc()); | ||||
3564 | } | ||||
3565 | |||||
3566 | Value *ScalarExprEmitter::EmitSub(const BinOpInfo &op) { | ||||
3567 | // The LHS is always a pointer if either side is. | ||||
3568 | if (!op.LHS->getType()->isPointerTy()) { | ||||
3569 | if (op.Ty->isSignedIntegerOrEnumerationType()) { | ||||
3570 | switch (CGF.getLangOpts().getSignedOverflowBehavior()) { | ||||
3571 | case LangOptions::SOB_Defined: | ||||
3572 | return Builder.CreateSub(op.LHS, op.RHS, "sub"); | ||||
3573 | case LangOptions::SOB_Undefined: | ||||
3574 | if (!CGF.SanOpts.has(SanitizerKind::SignedIntegerOverflow)) | ||||
3575 | return Builder.CreateNSWSub(op.LHS, op.RHS, "sub"); | ||||
3576 | LLVM_FALLTHROUGH[[gnu::fallthrough]]; | ||||
3577 | case LangOptions::SOB_Trapping: | ||||
3578 | if (CanElideOverflowCheck(CGF.getContext(), op)) | ||||
3579 | return Builder.CreateNSWSub(op.LHS, op.RHS, "sub"); | ||||
3580 | return EmitOverflowCheckedBinOp(op); | ||||
3581 | } | ||||
3582 | } | ||||
3583 | |||||
3584 | if (op.Ty->isUnsignedIntegerType() && | ||||
3585 | CGF.SanOpts.has(SanitizerKind::UnsignedIntegerOverflow) && | ||||
3586 | !CanElideOverflowCheck(CGF.getContext(), op)) | ||||
3587 | return EmitOverflowCheckedBinOp(op); | ||||
3588 | |||||
3589 | if (op.LHS->getType()->isFPOrFPVectorTy()) { | ||||
3590 | // Try to form an fmuladd. | ||||
3591 | if (Value *FMulAdd = tryEmitFMulAdd(op, CGF, Builder, true)) | ||||
3592 | return FMulAdd; | ||||
3593 | Value *V = Builder.CreateFSub(op.LHS, op.RHS, "sub"); | ||||
3594 | return propagateFMFlags(V, op); | ||||
3595 | } | ||||
3596 | |||||
3597 | if (op.isFixedPointBinOp()) | ||||
3598 | return EmitFixedPointBinOp(op); | ||||
3599 | |||||
3600 | return Builder.CreateSub(op.LHS, op.RHS, "sub"); | ||||
3601 | } | ||||
3602 | |||||
3603 | // If the RHS is not a pointer, then we have normal pointer | ||||
3604 | // arithmetic. | ||||
3605 | if (!op.RHS->getType()->isPointerTy()) | ||||
3606 | return emitPointerArithmetic(CGF, op, CodeGenFunction::IsSubtraction); | ||||
3607 | |||||
3608 | // Otherwise, this is a pointer subtraction. | ||||
3609 | |||||
3610 | // Do the raw subtraction part. | ||||
3611 | llvm::Value *LHS | ||||
3612 | = Builder.CreatePtrToInt(op.LHS, CGF.PtrDiffTy, "sub.ptr.lhs.cast"); | ||||
3613 | llvm::Value *RHS | ||||
3614 | = Builder.CreatePtrToInt(op.RHS, CGF.PtrDiffTy, "sub.ptr.rhs.cast"); | ||||
3615 | Value *diffInChars = Builder.CreateSub(LHS, RHS, "sub.ptr.sub"); | ||||
3616 | |||||
3617 | // Okay, figure out the element size. | ||||
3618 | const BinaryOperator *expr = cast<BinaryOperator>(op.E); | ||||
3619 | QualType elementType = expr->getLHS()->getType()->getPointeeType(); | ||||
3620 | |||||
3621 | llvm::Value *divisor = nullptr; | ||||
3622 | |||||
3623 | // For a variable-length array, this is going to be non-constant. | ||||
3624 | if (const VariableArrayType *vla | ||||
3625 | = CGF.getContext().getAsVariableArrayType(elementType)) { | ||||
3626 | auto VlaSize = CGF.getVLASize(vla); | ||||
3627 | elementType = VlaSize.Type; | ||||
3628 | divisor = VlaSize.NumElts; | ||||
3629 | |||||
3630 | // Scale the number of non-VLA elements by the non-VLA element size. | ||||
3631 | CharUnits eltSize = CGF.getContext().getTypeSizeInChars(elementType); | ||||
3632 | if (!eltSize.isOne()) | ||||
3633 | divisor = CGF.Builder.CreateNUWMul(CGF.CGM.getSize(eltSize), divisor); | ||||
3634 | |||||
3635 | // For everything elese, we can just compute it, safe in the | ||||
3636 | // assumption that Sema won't let anything through that we can't | ||||
3637 | // safely compute the size of. | ||||
3638 | } else { | ||||
3639 | CharUnits elementSize; | ||||
3640 | // Handle GCC extension for pointer arithmetic on void* and | ||||
3641 | // function pointer types. | ||||
3642 | if (elementType->isVoidType() || elementType->isFunctionType()) | ||||
3643 | elementSize = CharUnits::One(); | ||||
3644 | else | ||||
3645 | elementSize = CGF.getContext().getTypeSizeInChars(elementType); | ||||
3646 | |||||
3647 | // Don't even emit the divide for element size of 1. | ||||
3648 | if (elementSize.isOne()) | ||||
3649 | return diffInChars; | ||||
3650 | |||||
3651 | divisor = CGF.CGM.getSize(elementSize); | ||||
3652 | } | ||||
3653 | |||||
3654 | // Otherwise, do a full sdiv. This uses the "exact" form of sdiv, since | ||||
3655 | // pointer difference in C is only defined in the case where both operands | ||||
3656 | // are pointing to elements of an array. | ||||
3657 | return Builder.CreateExactSDiv(diffInChars, divisor, "sub.ptr.div"); | ||||
3658 | } | ||||
3659 | |||||
3660 | Value *ScalarExprEmitter::GetWidthMinusOneValue(Value* LHS,Value* RHS) { | ||||
3661 | llvm::IntegerType *Ty; | ||||
3662 | if (llvm::VectorType *VT = dyn_cast<llvm::VectorType>(LHS->getType())) | ||||
3663 | Ty = cast<llvm::IntegerType>(VT->getElementType()); | ||||
3664 | else | ||||
3665 | Ty = cast<llvm::IntegerType>(LHS->getType()); | ||||
3666 | return llvm::ConstantInt::get(RHS->getType(), Ty->getBitWidth() - 1); | ||||
3667 | } | ||||
3668 | |||||
3669 | Value *ScalarExprEmitter::EmitShl(const BinOpInfo &Ops) { | ||||
3670 | // LLVM requires the LHS and RHS to be the same type: promote or truncate the | ||||
3671 | // RHS to the same size as the LHS. | ||||
3672 | Value *RHS = Ops.RHS; | ||||
3673 | if (Ops.LHS->getType() != RHS->getType()) | ||||
3674 | RHS = Builder.CreateIntCast(RHS, Ops.LHS->getType(), false, "sh_prom"); | ||||
3675 | |||||
3676 | bool SanitizeBase = CGF.SanOpts.has(SanitizerKind::ShiftBase) && | ||||
3677 | Ops.Ty->hasSignedIntegerRepresentation() && | ||||
3678 | !CGF.getLangOpts().isSignedOverflowDefined() && | ||||
3679 | !CGF.getLangOpts().CPlusPlus2a; | ||||
3680 | bool SanitizeExponent = CGF.SanOpts.has(SanitizerKind::ShiftExponent); | ||||
3681 | // OpenCL 6.3j: shift values are effectively % word size of LHS. | ||||
3682 | if (CGF.getLangOpts().OpenCL) | ||||
3683 | RHS = | ||||
3684 | Builder.CreateAnd(RHS, GetWidthMinusOneValue(Ops.LHS, RHS), "shl.mask"); | ||||
3685 | else if ((SanitizeBase || SanitizeExponent) && | ||||
3686 | isa<llvm::IntegerType>(Ops.LHS->getType())) { | ||||
3687 | CodeGenFunction::SanitizerScope SanScope(&CGF); | ||||
3688 | SmallVector<std::pair<Value *, SanitizerMask>, 2> Checks; | ||||
3689 | llvm::Value *WidthMinusOne = GetWidthMinusOneValue(Ops.LHS, Ops.RHS); | ||||
3690 | llvm::Value *ValidExponent = Builder.CreateICmpULE(Ops.RHS, WidthMinusOne); | ||||
3691 | |||||
3692 | if (SanitizeExponent) { | ||||
3693 | Checks.push_back( | ||||
3694 | std::make_pair(ValidExponent, SanitizerKind::ShiftExponent)); | ||||
3695 | } | ||||
3696 | |||||
3697 | if (SanitizeBase) { | ||||
3698 | // Check whether we are shifting any non-zero bits off the top of the | ||||
3699 | // integer. We only emit this check if exponent is valid - otherwise | ||||
3700 | // instructions below will have undefined behavior themselves. | ||||
3701 | llvm::BasicBlock *Orig = Builder.GetInsertBlock(); | ||||
3702 | llvm::BasicBlock *Cont = CGF.createBasicBlock("cont"); | ||||
3703 | llvm::BasicBlock *CheckShiftBase = CGF.createBasicBlock("check"); | ||||
3704 | Builder.CreateCondBr(ValidExponent, CheckShiftBase, Cont); | ||||
3705 | llvm::Value *PromotedWidthMinusOne = | ||||
3706 | (RHS == Ops.RHS) ? WidthMinusOne | ||||
3707 | : GetWidthMinusOneValue(Ops.LHS, RHS); | ||||
3708 | CGF.EmitBlock(CheckShiftBase); | ||||
3709 | llvm::Value *BitsShiftedOff = Builder.CreateLShr( | ||||
3710 | Ops.LHS, Builder.CreateSub(PromotedWidthMinusOne, RHS, "shl.zeros", | ||||
3711 | /*NUW*/ true, /*NSW*/ true), | ||||
3712 | "shl.check"); | ||||
3713 | if (CGF.getLangOpts().CPlusPlus) { | ||||
3714 | // In C99, we are not permitted to shift a 1 bit into the sign bit. | ||||
3715 | // Under C++11's rules, shifting a 1 bit into the sign bit is | ||||
3716 | // OK, but shifting a 1 bit out of it is not. (C89 and C++03 don't | ||||
3717 | // define signed left shifts, so we use the C99 and C++11 rules there). | ||||
3718 | llvm::Value *One = llvm::ConstantInt::get(BitsShiftedOff->getType(), 1); | ||||
3719 | BitsShiftedOff = Builder.CreateLShr(BitsShiftedOff, One); | ||||
3720 | } | ||||
3721 | llvm::Value *Zero = llvm::ConstantInt::get(BitsShiftedOff->getType(), 0); | ||||
3722 | llvm::Value *ValidBase = Builder.CreateICmpEQ(BitsShiftedOff, Zero); | ||||
3723 | CGF.EmitBlock(Cont); | ||||
3724 | llvm::PHINode *BaseCheck = Builder.CreatePHI(ValidBase->getType(), 2); | ||||
3725 | BaseCheck->addIncoming(Builder.getTrue(), Orig); | ||||
3726 | BaseCheck->addIncoming(ValidBase, CheckShiftBase); | ||||
3727 | Checks.push_back(std::make_pair(BaseCheck, SanitizerKind::ShiftBase)); | ||||
3728 | } | ||||
3729 | |||||
3730 | assert(!Checks.empty())((!Checks.empty()) ? static_cast<void> (0) : __assert_fail ("!Checks.empty()", "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 3730, __PRETTY_FUNCTION__)); | ||||
3731 | EmitBinOpCheck(Checks, Ops); | ||||
3732 | } | ||||
3733 | |||||
3734 | return Builder.CreateShl(Ops.LHS, RHS, "shl"); | ||||
3735 | } | ||||
3736 | |||||
3737 | Value *ScalarExprEmitter::EmitShr(const BinOpInfo &Ops) { | ||||
3738 | // LLVM requires the LHS and RHS to be the same type: promote or truncate the | ||||
3739 | // RHS to the same size as the LHS. | ||||
3740 | Value *RHS = Ops.RHS; | ||||
3741 | if (Ops.LHS->getType() != RHS->getType()) | ||||
3742 | RHS = Builder.CreateIntCast(RHS, Ops.LHS->getType(), false, "sh_prom"); | ||||
3743 | |||||
3744 | // OpenCL 6.3j: shift values are effectively % word size of LHS. | ||||
3745 | if (CGF.getLangOpts().OpenCL) | ||||
3746 | RHS = | ||||
3747 | Builder.CreateAnd(RHS, GetWidthMinusOneValue(Ops.LHS, RHS), "shr.mask"); | ||||
3748 | else if (CGF.SanOpts.has(SanitizerKind::ShiftExponent) && | ||||
3749 | isa<llvm::IntegerType>(Ops.LHS->getType())) { | ||||
3750 | CodeGenFunction::SanitizerScope SanScope(&CGF); | ||||
3751 | llvm::Value *Valid = | ||||
3752 | Builder.CreateICmpULE(RHS, GetWidthMinusOneValue(Ops.LHS, RHS)); | ||||
3753 | EmitBinOpCheck(std::make_pair(Valid, SanitizerKind::ShiftExponent), Ops); | ||||
3754 | } | ||||
3755 | |||||
3756 | if (Ops.Ty->hasUnsignedIntegerRepresentation()) | ||||
3757 | return Builder.CreateLShr(Ops.LHS, RHS, "shr"); | ||||
3758 | return Builder.CreateAShr(Ops.LHS, RHS, "shr"); | ||||
3759 | } | ||||
3760 | |||||
3761 | enum IntrinsicType { VCMPEQ, VCMPGT }; | ||||
3762 | // return corresponding comparison intrinsic for given vector type | ||||
3763 | static llvm::Intrinsic::ID GetIntrinsic(IntrinsicType IT, | ||||
3764 | BuiltinType::Kind ElemKind) { | ||||
3765 | switch (ElemKind) { | ||||
3766 | default: llvm_unreachable("unexpected element type")::llvm::llvm_unreachable_internal("unexpected element type", "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 3766); | ||||
3767 | case BuiltinType::Char_U: | ||||
3768 | case BuiltinType::UChar: | ||||
3769 | return (IT == VCMPEQ) ? llvm::Intrinsic::ppc_altivec_vcmpequb_p : | ||||
3770 | llvm::Intrinsic::ppc_altivec_vcmpgtub_p; | ||||
3771 | case BuiltinType::Char_S: | ||||
3772 | case BuiltinType::SChar: | ||||
3773 | return (IT == VCMPEQ) ? llvm::Intrinsic::ppc_altivec_vcmpequb_p : | ||||
3774 | llvm::Intrinsic::ppc_altivec_vcmpgtsb_p; | ||||
3775 | case BuiltinType::UShort: | ||||
3776 | return (IT == VCMPEQ) ? llvm::Intrinsic::ppc_altivec_vcmpequh_p : | ||||
3777 | llvm::Intrinsic::ppc_altivec_vcmpgtuh_p; | ||||
3778 | case BuiltinType::Short: | ||||
3779 | return (IT == VCMPEQ) ? llvm::Intrinsic::ppc_altivec_vcmpequh_p : | ||||
3780 | llvm::Intrinsic::ppc_altivec_vcmpgtsh_p; | ||||
3781 | case BuiltinType::UInt: | ||||
3782 | return (IT == VCMPEQ) ? llvm::Intrinsic::ppc_altivec_vcmpequw_p : | ||||
3783 | llvm::Intrinsic::ppc_altivec_vcmpgtuw_p; | ||||
3784 | case BuiltinType::Int: | ||||
3785 | return (IT == VCMPEQ) ? llvm::Intrinsic::ppc_altivec_vcmpequw_p : | ||||
3786 | llvm::Intrinsic::ppc_altivec_vcmpgtsw_p; | ||||
3787 | case BuiltinType::ULong: | ||||
3788 | case BuiltinType::ULongLong: | ||||
3789 | return (IT == VCMPEQ) ? llvm::Intrinsic::ppc_altivec_vcmpequd_p : | ||||
3790 | llvm::Intrinsic::ppc_altivec_vcmpgtud_p; | ||||
3791 | case BuiltinType::Long: | ||||
3792 | case BuiltinType::LongLong: | ||||
3793 | return (IT == VCMPEQ) ? llvm::Intrinsic::ppc_altivec_vcmpequd_p : | ||||
3794 | llvm::Intrinsic::ppc_altivec_vcmpgtsd_p; | ||||
3795 | case BuiltinType::Float: | ||||
3796 | return (IT == VCMPEQ) ? llvm::Intrinsic::ppc_altivec_vcmpeqfp_p : | ||||
3797 | llvm::Intrinsic::ppc_altivec_vcmpgtfp_p; | ||||
3798 | case BuiltinType::Double: | ||||
3799 | return (IT == VCMPEQ) ? llvm::Intrinsic::ppc_vsx_xvcmpeqdp_p : | ||||
3800 | llvm::Intrinsic::ppc_vsx_xvcmpgtdp_p; | ||||
3801 | } | ||||
3802 | } | ||||
3803 | |||||
3804 | Value *ScalarExprEmitter::EmitCompare(const BinaryOperator *E, | ||||
3805 | llvm::CmpInst::Predicate UICmpOpc, | ||||
3806 | llvm::CmpInst::Predicate SICmpOpc, | ||||
3807 | llvm::CmpInst::Predicate FCmpOpc) { | ||||
3808 | TestAndClearIgnoreResultAssign(); | ||||
3809 | Value *Result; | ||||
3810 | QualType LHSTy = E->getLHS()->getType(); | ||||
3811 | QualType RHSTy = E->getRHS()->getType(); | ||||
3812 | if (const MemberPointerType *MPT
| ||||
3813 | assert(E->getOpcode() == BO_EQ ||((E->getOpcode() == BO_EQ || E->getOpcode() == BO_NE) ? static_cast<void> (0) : __assert_fail ("E->getOpcode() == BO_EQ || E->getOpcode() == BO_NE" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 3814, __PRETTY_FUNCTION__)) | ||||
3814 | E->getOpcode() == BO_NE)((E->getOpcode() == BO_EQ || E->getOpcode() == BO_NE) ? static_cast<void> (0) : __assert_fail ("E->getOpcode() == BO_EQ || E->getOpcode() == BO_NE" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 3814, __PRETTY_FUNCTION__)); | ||||
3815 | Value *LHS = CGF.EmitScalarExpr(E->getLHS()); | ||||
3816 | Value *RHS = CGF.EmitScalarExpr(E->getRHS()); | ||||
3817 | Result = CGF.CGM.getCXXABI().EmitMemberPointerComparison( | ||||
3818 | CGF, LHS, RHS, MPT, E->getOpcode() == BO_NE); | ||||
3819 | } else if (!LHSTy->isAnyComplexType() && !RHSTy->isAnyComplexType()) { | ||||
3820 | BinOpInfo BOInfo = EmitBinOps(E); | ||||
3821 | Value *LHS = BOInfo.LHS; | ||||
3822 | Value *RHS = BOInfo.RHS; | ||||
3823 | |||||
3824 | // If AltiVec, the comparison results in a numeric type, so we use | ||||
3825 | // intrinsics comparing vectors and giving 0 or 1 as a result | ||||
3826 | if (LHSTy->isVectorType() && !E->getType()->isVectorType()) { | ||||
3827 | // constants for mapping CR6 register bits to predicate result | ||||
3828 | enum { CR6_EQ=0, CR6_EQ_REV, CR6_LT, CR6_LT_REV } CR6; | ||||
3829 | |||||
3830 | llvm::Intrinsic::ID ID = llvm::Intrinsic::not_intrinsic; | ||||
3831 | |||||
3832 | // in several cases vector arguments order will be reversed | ||||
3833 | Value *FirstVecArg = LHS, | ||||
3834 | *SecondVecArg = RHS; | ||||
3835 | |||||
3836 | QualType ElTy = LHSTy->castAs<VectorType>()->getElementType(); | ||||
3837 | const BuiltinType *BTy = ElTy->getAs<BuiltinType>(); | ||||
3838 | BuiltinType::Kind ElementKind = BTy->getKind(); | ||||
| |||||
3839 | |||||
3840 | switch(E->getOpcode()) { | ||||
3841 | default: llvm_unreachable("is not a comparison operation")::llvm::llvm_unreachable_internal("is not a comparison operation" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 3841); | ||||
3842 | case BO_EQ: | ||||
3843 | CR6 = CR6_LT; | ||||
3844 | ID = GetIntrinsic(VCMPEQ, ElementKind); | ||||
3845 | break; | ||||
3846 | case BO_NE: | ||||
3847 | CR6 = CR6_EQ; | ||||
3848 | ID = GetIntrinsic(VCMPEQ, ElementKind); | ||||
3849 | break; | ||||
3850 | case BO_LT: | ||||
3851 | CR6 = CR6_LT; | ||||
3852 | ID = GetIntrinsic(VCMPGT, ElementKind); | ||||
3853 | std::swap(FirstVecArg, SecondVecArg); | ||||
3854 | break; | ||||
3855 | case BO_GT: | ||||
3856 | CR6 = CR6_LT; | ||||
3857 | ID = GetIntrinsic(VCMPGT, ElementKind); | ||||
3858 | break; | ||||
3859 | case BO_LE: | ||||
3860 | if (ElementKind == BuiltinType::Float) { | ||||
3861 | CR6 = CR6_LT; | ||||
3862 | ID = llvm::Intrinsic::ppc_altivec_vcmpgefp_p; | ||||
3863 | std::swap(FirstVecArg, SecondVecArg); | ||||
3864 | } | ||||
3865 | else { | ||||
3866 | CR6 = CR6_EQ; | ||||
3867 | ID = GetIntrinsic(VCMPGT, ElementKind); | ||||
3868 | } | ||||
3869 | break; | ||||
3870 | case BO_GE: | ||||
3871 | if (ElementKind == BuiltinType::Float) { | ||||
3872 | CR6 = CR6_LT; | ||||
3873 | ID = llvm::Intrinsic::ppc_altivec_vcmpgefp_p; | ||||
3874 | } | ||||
3875 | else { | ||||
3876 | CR6 = CR6_EQ; | ||||
3877 | ID = GetIntrinsic(VCMPGT, ElementKind); | ||||
3878 | std::swap(FirstVecArg, SecondVecArg); | ||||
3879 | } | ||||
3880 | break; | ||||
3881 | } | ||||
3882 | |||||
3883 | Value *CR6Param = Builder.getInt32(CR6); | ||||
3884 | llvm::Function *F = CGF.CGM.getIntrinsic(ID); | ||||
3885 | Result = Builder.CreateCall(F, {CR6Param, FirstVecArg, SecondVecArg}); | ||||
3886 | |||||
3887 | // The result type of intrinsic may not be same as E->getType(). | ||||
3888 | // If E->getType() is not BoolTy, EmitScalarConversion will do the | ||||
3889 | // conversion work. If E->getType() is BoolTy, EmitScalarConversion will | ||||
3890 | // do nothing, if ResultTy is not i1 at the same time, it will cause | ||||
3891 | // crash later. | ||||
3892 | llvm::IntegerType *ResultTy = cast<llvm::IntegerType>(Result->getType()); | ||||
3893 | if (ResultTy->getBitWidth() > 1 && | ||||
3894 | E->getType() == CGF.getContext().BoolTy) | ||||
3895 | Result = Builder.CreateTrunc(Result, Builder.getInt1Ty()); | ||||
3896 | return EmitScalarConversion(Result, CGF.getContext().BoolTy, E->getType(), | ||||
3897 | E->getExprLoc()); | ||||
3898 | } | ||||
3899 | |||||
3900 | if (BOInfo.isFixedPointBinOp()) { | ||||
3901 | Result = EmitFixedPointBinOp(BOInfo); | ||||
3902 | } else if (LHS->getType()->isFPOrFPVectorTy()) { | ||||
3903 | Result = Builder.CreateFCmp(FCmpOpc, LHS, RHS, "cmp"); | ||||
3904 | } else if (LHSTy->hasSignedIntegerRepresentation()) { | ||||
3905 | Result = Builder.CreateICmp(SICmpOpc, LHS, RHS, "cmp"); | ||||
3906 | } else { | ||||
3907 | // Unsigned integers and pointers. | ||||
3908 | |||||
3909 | if (CGF.CGM.getCodeGenOpts().StrictVTablePointers && | ||||
3910 | !isa<llvm::ConstantPointerNull>(LHS) && | ||||
3911 | !isa<llvm::ConstantPointerNull>(RHS)) { | ||||
3912 | |||||
3913 | // Dynamic information is required to be stripped for comparisons, | ||||
3914 | // because it could leak the dynamic information. Based on comparisons | ||||
3915 | // of pointers to dynamic objects, the optimizer can replace one pointer | ||||
3916 | // with another, which might be incorrect in presence of invariant | ||||
3917 | // groups. Comparison with null is safe because null does not carry any | ||||
3918 | // dynamic information. | ||||
3919 | if (LHSTy.mayBeDynamicClass()) | ||||
3920 | LHS = Builder.CreateStripInvariantGroup(LHS); | ||||
3921 | if (RHSTy.mayBeDynamicClass()) | ||||
3922 | RHS = Builder.CreateStripInvariantGroup(RHS); | ||||
3923 | } | ||||
3924 | |||||
3925 | Result = Builder.CreateICmp(UICmpOpc, LHS, RHS, "cmp"); | ||||
3926 | } | ||||
3927 | |||||
3928 | // If this is a vector comparison, sign extend the result to the appropriate | ||||
3929 | // vector integer type and return it (don't convert to bool). | ||||
3930 | if (LHSTy->isVectorType()) | ||||
3931 | return Builder.CreateSExt(Result, ConvertType(E->getType()), "sext"); | ||||
3932 | |||||
3933 | } else { | ||||
3934 | // Complex Comparison: can only be an equality comparison. | ||||
3935 | CodeGenFunction::ComplexPairTy LHS, RHS; | ||||
3936 | QualType CETy; | ||||
3937 | if (auto *CTy = LHSTy->getAs<ComplexType>()) { | ||||
3938 | LHS = CGF.EmitComplexExpr(E->getLHS()); | ||||
3939 | CETy = CTy->getElementType(); | ||||
3940 | } else { | ||||
3941 | LHS.first = Visit(E->getLHS()); | ||||
3942 | LHS.second = llvm::Constant::getNullValue(LHS.first->getType()); | ||||
3943 | CETy = LHSTy; | ||||
3944 | } | ||||
3945 | if (auto *CTy = RHSTy->getAs<ComplexType>()) { | ||||
3946 | RHS = CGF.EmitComplexExpr(E->getRHS()); | ||||
3947 | assert(CGF.getContext().hasSameUnqualifiedType(CETy,((CGF.getContext().hasSameUnqualifiedType(CETy, CTy->getElementType ()) && "The element types must always match.") ? static_cast <void> (0) : __assert_fail ("CGF.getContext().hasSameUnqualifiedType(CETy, CTy->getElementType()) && \"The element types must always match.\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 3949, __PRETTY_FUNCTION__)) | ||||
3948 | CTy->getElementType()) &&((CGF.getContext().hasSameUnqualifiedType(CETy, CTy->getElementType ()) && "The element types must always match.") ? static_cast <void> (0) : __assert_fail ("CGF.getContext().hasSameUnqualifiedType(CETy, CTy->getElementType()) && \"The element types must always match.\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 3949, __PRETTY_FUNCTION__)) | ||||
3949 | "The element types must always match.")((CGF.getContext().hasSameUnqualifiedType(CETy, CTy->getElementType ()) && "The element types must always match.") ? static_cast <void> (0) : __assert_fail ("CGF.getContext().hasSameUnqualifiedType(CETy, CTy->getElementType()) && \"The element types must always match.\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 3949, __PRETTY_FUNCTION__)); | ||||
3950 | (void)CTy; | ||||
3951 | } else { | ||||
3952 | RHS.first = Visit(E->getRHS()); | ||||
3953 | RHS.second = llvm::Constant::getNullValue(RHS.first->getType()); | ||||
3954 | assert(CGF.getContext().hasSameUnqualifiedType(CETy, RHSTy) &&((CGF.getContext().hasSameUnqualifiedType(CETy, RHSTy) && "The element types must always match.") ? static_cast<void > (0) : __assert_fail ("CGF.getContext().hasSameUnqualifiedType(CETy, RHSTy) && \"The element types must always match.\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 3955, __PRETTY_FUNCTION__)) | ||||
3955 | "The element types must always match.")((CGF.getContext().hasSameUnqualifiedType(CETy, RHSTy) && "The element types must always match.") ? static_cast<void > (0) : __assert_fail ("CGF.getContext().hasSameUnqualifiedType(CETy, RHSTy) && \"The element types must always match.\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 3955, __PRETTY_FUNCTION__)); | ||||
3956 | } | ||||
3957 | |||||
3958 | Value *ResultR, *ResultI; | ||||
3959 | if (CETy->isRealFloatingType()) { | ||||
3960 | ResultR = Builder.CreateFCmp(FCmpOpc, LHS.first, RHS.first, "cmp.r"); | ||||
3961 | ResultI = Builder.CreateFCmp(FCmpOpc, LHS.second, RHS.second, "cmp.i"); | ||||
3962 | } else { | ||||
3963 | // Complex comparisons can only be equality comparisons. As such, signed | ||||
3964 | // and unsigned opcodes are the same. | ||||
3965 | ResultR = Builder.CreateICmp(UICmpOpc, LHS.first, RHS.first, "cmp.r"); | ||||
3966 | ResultI = Builder.CreateICmp(UICmpOpc, LHS.second, RHS.second, "cmp.i"); | ||||
3967 | } | ||||
3968 | |||||
3969 | if (E->getOpcode() == BO_EQ) { | ||||
3970 | Result = Builder.CreateAnd(ResultR, ResultI, "and.ri"); | ||||
3971 | } else { | ||||
3972 | assert(E->getOpcode() == BO_NE &&((E->getOpcode() == BO_NE && "Complex comparison other than == or != ?" ) ? static_cast<void> (0) : __assert_fail ("E->getOpcode() == BO_NE && \"Complex comparison other than == or != ?\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 3973, __PRETTY_FUNCTION__)) | ||||
3973 | "Complex comparison other than == or != ?")((E->getOpcode() == BO_NE && "Complex comparison other than == or != ?" ) ? static_cast<void> (0) : __assert_fail ("E->getOpcode() == BO_NE && \"Complex comparison other than == or != ?\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 3973, __PRETTY_FUNCTION__)); | ||||
3974 | Result = Builder.CreateOr(ResultR, ResultI, "or.ri"); | ||||
3975 | } | ||||
3976 | } | ||||
3977 | |||||
3978 | return EmitScalarConversion(Result, CGF.getContext().BoolTy, E->getType(), | ||||
3979 | E->getExprLoc()); | ||||
3980 | } | ||||
3981 | |||||
3982 | Value *ScalarExprEmitter::VisitBinAssign(const BinaryOperator *E) { | ||||
3983 | bool Ignore = TestAndClearIgnoreResultAssign(); | ||||
3984 | |||||
3985 | Value *RHS; | ||||
3986 | LValue LHS; | ||||
3987 | |||||
3988 | switch (E->getLHS()->getType().getObjCLifetime()) { | ||||
3989 | case Qualifiers::OCL_Strong: | ||||
3990 | std::tie(LHS, RHS) = CGF.EmitARCStoreStrong(E, Ignore); | ||||
3991 | break; | ||||
3992 | |||||
3993 | case Qualifiers::OCL_Autoreleasing: | ||||
3994 | std::tie(LHS, RHS) = CGF.EmitARCStoreAutoreleasing(E); | ||||
3995 | break; | ||||
3996 | |||||
3997 | case Qualifiers::OCL_ExplicitNone: | ||||
3998 | std::tie(LHS, RHS) = CGF.EmitARCStoreUnsafeUnretained(E, Ignore); | ||||
3999 | break; | ||||
4000 | |||||
4001 | case Qualifiers::OCL_Weak: | ||||
4002 | RHS = Visit(E->getRHS()); | ||||
4003 | LHS = EmitCheckedLValue(E->getLHS(), CodeGenFunction::TCK_Store); | ||||
4004 | RHS = CGF.EmitARCStoreWeak(LHS.getAddress(CGF), RHS, Ignore); | ||||
4005 | break; | ||||
4006 | |||||
4007 | case Qualifiers::OCL_None: | ||||
4008 | // __block variables need to have the rhs evaluated first, plus | ||||
4009 | // this should improve codegen just a little. | ||||
4010 | RHS = Visit(E->getRHS()); | ||||
4011 | LHS = EmitCheckedLValue(E->getLHS(), CodeGenFunction::TCK_Store); | ||||
4012 | |||||
4013 | // Store the value into the LHS. Bit-fields are handled specially | ||||
4014 | // because the result is altered by the store, i.e., [C99 6.5.16p1] | ||||
4015 | // 'An assignment expression has the value of the left operand after | ||||
4016 | // the assignment...'. | ||||
4017 | if (LHS.isBitField()) { | ||||
4018 | CGF.EmitStoreThroughBitfieldLValue(RValue::get(RHS), LHS, &RHS); | ||||
4019 | } else { | ||||
4020 | CGF.EmitNullabilityCheck(LHS, RHS, E->getExprLoc()); | ||||
4021 | CGF.EmitStoreThroughLValue(RValue::get(RHS), LHS); | ||||
4022 | } | ||||
4023 | } | ||||
4024 | |||||
4025 | // If the result is clearly ignored, return now. | ||||
4026 | if (Ignore) | ||||
4027 | return nullptr; | ||||
4028 | |||||
4029 | // The result of an assignment in C is the assigned r-value. | ||||
4030 | if (!CGF.getLangOpts().CPlusPlus) | ||||
4031 | return RHS; | ||||
4032 | |||||
4033 | // If the lvalue is non-volatile, return the computed value of the assignment. | ||||
4034 | if (!LHS.isVolatileQualified()) | ||||
4035 | return RHS; | ||||
4036 | |||||
4037 | // Otherwise, reload the value. | ||||
4038 | return EmitLoadOfLValue(LHS, E->getExprLoc()); | ||||
4039 | } | ||||
4040 | |||||
4041 | Value *ScalarExprEmitter::VisitBinLAnd(const BinaryOperator *E) { | ||||
4042 | // Perform vector logical and on comparisons with zero vectors. | ||||
4043 | if (E->getType()->isVectorType()) { | ||||
4044 | CGF.incrementProfileCounter(E); | ||||
4045 | |||||
4046 | Value *LHS = Visit(E->getLHS()); | ||||
4047 | Value *RHS = Visit(E->getRHS()); | ||||
4048 | Value *Zero = llvm::ConstantAggregateZero::get(LHS->getType()); | ||||
4049 | if (LHS->getType()->isFPOrFPVectorTy()) { | ||||
4050 | LHS = Builder.CreateFCmp(llvm::CmpInst::FCMP_UNE, LHS, Zero, "cmp"); | ||||
4051 | RHS = Builder.CreateFCmp(llvm::CmpInst::FCMP_UNE, RHS, Zero, "cmp"); | ||||
4052 | } else { | ||||
4053 | LHS = Builder.CreateICmp(llvm::CmpInst::ICMP_NE, LHS, Zero, "cmp"); | ||||
4054 | RHS = Builder.CreateICmp(llvm::CmpInst::ICMP_NE, RHS, Zero, "cmp"); | ||||
4055 | } | ||||
4056 | Value *And = Builder.CreateAnd(LHS, RHS); | ||||
4057 | return Builder.CreateSExt(And, ConvertType(E->getType()), "sext"); | ||||
4058 | } | ||||
4059 | |||||
4060 | llvm::Type *ResTy = ConvertType(E->getType()); | ||||
4061 | |||||
4062 | // If we have 0 && RHS, see if we can elide RHS, if so, just return 0. | ||||
4063 | // If we have 1 && X, just emit X without inserting the control flow. | ||||
4064 | bool LHSCondVal; | ||||
4065 | if (CGF.ConstantFoldsToSimpleInteger(E->getLHS(), LHSCondVal)) { | ||||
4066 | if (LHSCondVal) { // If we have 1 && X, just emit X. | ||||
4067 | CGF.incrementProfileCounter(E); | ||||
4068 | |||||
4069 | Value *RHSCond = CGF.EvaluateExprAsBool(E->getRHS()); | ||||
4070 | // ZExt result to int or bool. | ||||
4071 | return Builder.CreateZExtOrBitCast(RHSCond, ResTy, "land.ext"); | ||||
4072 | } | ||||
4073 | |||||
4074 | // 0 && RHS: If it is safe, just elide the RHS, and return 0/false. | ||||
4075 | if (!CGF.ContainsLabel(E->getRHS())) | ||||
4076 | return llvm::Constant::getNullValue(ResTy); | ||||
4077 | } | ||||
4078 | |||||
4079 | llvm::BasicBlock *ContBlock = CGF.createBasicBlock("land.end"); | ||||
4080 | llvm::BasicBlock *RHSBlock = CGF.createBasicBlock("land.rhs"); | ||||
4081 | |||||
4082 | CodeGenFunction::ConditionalEvaluation eval(CGF); | ||||
4083 | |||||
4084 | // Branch on the LHS first. If it is false, go to the failure (cont) block. | ||||
4085 | CGF.EmitBranchOnBoolExpr(E->getLHS(), RHSBlock, ContBlock, | ||||
4086 | CGF.getProfileCount(E->getRHS())); | ||||
4087 | |||||
4088 | // Any edges into the ContBlock are now from an (indeterminate number of) | ||||
4089 | // edges from this first condition. All of these values will be false. Start | ||||
4090 | // setting up the PHI node in the Cont Block for this. | ||||
4091 | llvm::PHINode *PN = llvm::PHINode::Create(llvm::Type::getInt1Ty(VMContext), 2, | ||||
4092 | "", ContBlock); | ||||
4093 | for (llvm::pred_iterator PI = pred_begin(ContBlock), PE = pred_end(ContBlock); | ||||
4094 | PI != PE; ++PI) | ||||
4095 | PN->addIncoming(llvm::ConstantInt::getFalse(VMContext), *PI); | ||||
4096 | |||||
4097 | eval.begin(CGF); | ||||
4098 | CGF.EmitBlock(RHSBlock); | ||||
4099 | CGF.incrementProfileCounter(E); | ||||
4100 | Value *RHSCond = CGF.EvaluateExprAsBool(E->getRHS()); | ||||
4101 | eval.end(CGF); | ||||
4102 | |||||
4103 | // Reaquire the RHS block, as there may be subblocks inserted. | ||||
4104 | RHSBlock = Builder.GetInsertBlock(); | ||||
4105 | |||||
4106 | // Emit an unconditional branch from this block to ContBlock. | ||||
4107 | { | ||||
4108 | // There is no need to emit line number for unconditional branch. | ||||
4109 | auto NL = ApplyDebugLocation::CreateEmpty(CGF); | ||||
4110 | CGF.EmitBlock(ContBlock); | ||||
4111 | } | ||||
4112 | // Insert an entry into the phi node for the edge with the value of RHSCond. | ||||
4113 | PN->addIncoming(RHSCond, RHSBlock); | ||||
4114 | |||||
4115 | // Artificial location to preserve the scope information | ||||
4116 | { | ||||
4117 | auto NL = ApplyDebugLocation::CreateArtificial(CGF); | ||||
4118 | PN->setDebugLoc(Builder.getCurrentDebugLocation()); | ||||
4119 | } | ||||
4120 | |||||
4121 | // ZExt result to int. | ||||
4122 | return Builder.CreateZExtOrBitCast(PN, ResTy, "land.ext"); | ||||
4123 | } | ||||
4124 | |||||
4125 | Value *ScalarExprEmitter::VisitBinLOr(const BinaryOperator *E) { | ||||
4126 | // Perform vector logical or on comparisons with zero vectors. | ||||
4127 | if (E->getType()->isVectorType()) { | ||||
4128 | CGF.incrementProfileCounter(E); | ||||
4129 | |||||
4130 | Value *LHS = Visit(E->getLHS()); | ||||
4131 | Value *RHS = Visit(E->getRHS()); | ||||
4132 | Value *Zero = llvm::ConstantAggregateZero::get(LHS->getType()); | ||||
4133 | if (LHS->getType()->isFPOrFPVectorTy()) { | ||||
4134 | LHS = Builder.CreateFCmp(llvm::CmpInst::FCMP_UNE, LHS, Zero, "cmp"); | ||||
4135 | RHS = Builder.CreateFCmp(llvm::CmpInst::FCMP_UNE, RHS, Zero, "cmp"); | ||||
4136 | } else { | ||||
4137 | LHS = Builder.CreateICmp(llvm::CmpInst::ICMP_NE, LHS, Zero, "cmp"); | ||||
4138 | RHS = Builder.CreateICmp(llvm::CmpInst::ICMP_NE, RHS, Zero, "cmp"); | ||||
4139 | } | ||||
4140 | Value *Or = Builder.CreateOr(LHS, RHS); | ||||
4141 | return Builder.CreateSExt(Or, ConvertType(E->getType()), "sext"); | ||||
4142 | } | ||||
4143 | |||||
4144 | llvm::Type *ResTy = ConvertType(E->getType()); | ||||
4145 | |||||
4146 | // If we have 1 || RHS, see if we can elide RHS, if so, just return 1. | ||||
4147 | // If we have 0 || X, just emit X without inserting the control flow. | ||||
4148 | bool LHSCondVal; | ||||
4149 | if (CGF.ConstantFoldsToSimpleInteger(E->getLHS(), LHSCondVal)) { | ||||
4150 | if (!LHSCondVal) { // If we have 0 || X, just emit X. | ||||
4151 | CGF.incrementProfileCounter(E); | ||||
4152 | |||||
4153 | Value *RHSCond = CGF.EvaluateExprAsBool(E->getRHS()); | ||||
4154 | // ZExt result to int or bool. | ||||
4155 | return Builder.CreateZExtOrBitCast(RHSCond, ResTy, "lor.ext"); | ||||
4156 | } | ||||
4157 | |||||
4158 | // 1 || RHS: If it is safe, just elide the RHS, and return 1/true. | ||||
4159 | if (!CGF.ContainsLabel(E->getRHS())) | ||||
4160 | return llvm::ConstantInt::get(ResTy, 1); | ||||
4161 | } | ||||
4162 | |||||
4163 | llvm::BasicBlock *ContBlock = CGF.createBasicBlock("lor.end"); | ||||
4164 | llvm::BasicBlock *RHSBlock = CGF.createBasicBlock("lor.rhs"); | ||||
4165 | |||||
4166 | CodeGenFunction::ConditionalEvaluation eval(CGF); | ||||
4167 | |||||
4168 | // Branch on the LHS first. If it is true, go to the success (cont) block. | ||||
4169 | CGF.EmitBranchOnBoolExpr(E->getLHS(), ContBlock, RHSBlock, | ||||
4170 | CGF.getCurrentProfileCount() - | ||||
4171 | CGF.getProfileCount(E->getRHS())); | ||||
4172 | |||||
4173 | // Any edges into the ContBlock are now from an (indeterminate number of) | ||||
4174 | // edges from this first condition. All of these values will be true. Start | ||||
4175 | // setting up the PHI node in the Cont Block for this. | ||||
4176 | llvm::PHINode *PN = llvm::PHINode::Create(llvm::Type::getInt1Ty(VMContext), 2, | ||||
4177 | "", ContBlock); | ||||
4178 | for (llvm::pred_iterator PI = pred_begin(ContBlock), PE = pred_end(ContBlock); | ||||
4179 | PI != PE; ++PI) | ||||
4180 | PN->addIncoming(llvm::ConstantInt::getTrue(VMContext), *PI); | ||||
4181 | |||||
4182 | eval.begin(CGF); | ||||
4183 | |||||
4184 | // Emit the RHS condition as a bool value. | ||||
4185 | CGF.EmitBlock(RHSBlock); | ||||
4186 | CGF.incrementProfileCounter(E); | ||||
4187 | Value *RHSCond = CGF.EvaluateExprAsBool(E->getRHS()); | ||||
4188 | |||||
4189 | eval.end(CGF); | ||||
4190 | |||||
4191 | // Reaquire the RHS block, as there may be subblocks inserted. | ||||
4192 | RHSBlock = Builder.GetInsertBlock(); | ||||
4193 | |||||
4194 | // Emit an unconditional branch from this block to ContBlock. Insert an entry | ||||
4195 | // into the phi node for the edge with the value of RHSCond. | ||||
4196 | CGF.EmitBlock(ContBlock); | ||||
4197 | PN->addIncoming(RHSCond, RHSBlock); | ||||
4198 | |||||
4199 | // ZExt result to int. | ||||
4200 | return Builder.CreateZExtOrBitCast(PN, ResTy, "lor.ext"); | ||||
4201 | } | ||||
4202 | |||||
4203 | Value *ScalarExprEmitter::VisitBinComma(const BinaryOperator *E) { | ||||
4204 | CGF.EmitIgnoredExpr(E->getLHS()); | ||||
4205 | CGF.EnsureInsertPoint(); | ||||
4206 | return Visit(E->getRHS()); | ||||
4207 | } | ||||
4208 | |||||
4209 | //===----------------------------------------------------------------------===// | ||||
4210 | // Other Operators | ||||
4211 | //===----------------------------------------------------------------------===// | ||||
4212 | |||||
4213 | /// isCheapEnoughToEvaluateUnconditionally - Return true if the specified | ||||
4214 | /// expression is cheap enough and side-effect-free enough to evaluate | ||||
4215 | /// unconditionally instead of conditionally. This is used to convert control | ||||
4216 | /// flow into selects in some cases. | ||||
4217 | static bool isCheapEnoughToEvaluateUnconditionally(const Expr *E, | ||||
4218 | CodeGenFunction &CGF) { | ||||
4219 | // Anything that is an integer or floating point constant is fine. | ||||
4220 | return E->IgnoreParens()->isEvaluatable(CGF.getContext()); | ||||
4221 | |||||
4222 | // Even non-volatile automatic variables can't be evaluated unconditionally. | ||||
4223 | // Referencing a thread_local may cause non-trivial initialization work to | ||||
4224 | // occur. If we're inside a lambda and one of the variables is from the scope | ||||
4225 | // outside the lambda, that function may have returned already. Reading its | ||||
4226 | // locals is a bad idea. Also, these reads may introduce races there didn't | ||||
4227 | // exist in the source-level program. | ||||
4228 | } | ||||
4229 | |||||
4230 | |||||
4231 | Value *ScalarExprEmitter:: | ||||
4232 | VisitAbstractConditionalOperator(const AbstractConditionalOperator *E) { | ||||
4233 | TestAndClearIgnoreResultAssign(); | ||||
4234 | |||||
4235 | // Bind the common expression if necessary. | ||||
4236 | CodeGenFunction::OpaqueValueMapping binding(CGF, E); | ||||
4237 | |||||
4238 | Expr *condExpr = E->getCond(); | ||||
4239 | Expr *lhsExpr = E->getTrueExpr(); | ||||
4240 | Expr *rhsExpr = E->getFalseExpr(); | ||||
4241 | |||||
4242 | // If the condition constant folds and can be elided, try to avoid emitting | ||||
4243 | // the condition and the dead arm. | ||||
4244 | bool CondExprBool; | ||||
4245 | if (CGF.ConstantFoldsToSimpleInteger(condExpr, CondExprBool)) { | ||||
4246 | Expr *live = lhsExpr, *dead = rhsExpr; | ||||
4247 | if (!CondExprBool) std::swap(live, dead); | ||||
4248 | |||||
4249 | // If the dead side doesn't have labels we need, just emit the Live part. | ||||
4250 | if (!CGF.ContainsLabel(dead)) { | ||||
4251 | if (CondExprBool) | ||||
4252 | CGF.incrementProfileCounter(E); | ||||
4253 | Value *Result = Visit(live); | ||||
4254 | |||||
4255 | // If the live part is a throw expression, it acts like it has a void | ||||
4256 | // type, so evaluating it returns a null Value*. However, a conditional | ||||
4257 | // with non-void type must return a non-null Value*. | ||||
4258 | if (!Result && !E->getType()->isVoidType()) | ||||
4259 | Result = llvm::UndefValue::get(CGF.ConvertType(E->getType())); | ||||
4260 | |||||
4261 | return Result; | ||||
4262 | } | ||||
4263 | } | ||||
4264 | |||||
4265 | // OpenCL: If the condition is a vector, we can treat this condition like | ||||
4266 | // the select function. | ||||
4267 | if (CGF.getLangOpts().OpenCL | ||||
4268 | && condExpr->getType()->isVectorType()) { | ||||
4269 | CGF.incrementProfileCounter(E); | ||||
4270 | |||||
4271 | llvm::Value *CondV = CGF.EmitScalarExpr(condExpr); | ||||
4272 | llvm::Value *LHS = Visit(lhsExpr); | ||||
4273 | llvm::Value *RHS = Visit(rhsExpr); | ||||
4274 | |||||
4275 | llvm::Type *condType = ConvertType(condExpr->getType()); | ||||
4276 | llvm::VectorType *vecTy = cast<llvm::VectorType>(condType); | ||||
4277 | |||||
4278 | unsigned numElem = vecTy->getNumElements(); | ||||
4279 | llvm::Type *elemType = vecTy->getElementType(); | ||||
4280 | |||||
4281 | llvm::Value *zeroVec = llvm::Constant::getNullValue(vecTy); | ||||
4282 | llvm::Value *TestMSB = Builder.CreateICmpSLT(CondV, zeroVec); | ||||
4283 | llvm::Value *tmp = Builder.CreateSExt(TestMSB, | ||||
4284 | llvm::VectorType::get(elemType, | ||||
4285 | numElem), | ||||
4286 | "sext"); | ||||
4287 | llvm::Value *tmp2 = Builder.CreateNot(tmp); | ||||
4288 | |||||
4289 | // Cast float to int to perform ANDs if necessary. | ||||
4290 | llvm::Value *RHSTmp = RHS; | ||||
4291 | llvm::Value *LHSTmp = LHS; | ||||
4292 | bool wasCast = false; | ||||
4293 | llvm::VectorType *rhsVTy = cast<llvm::VectorType>(RHS->getType()); | ||||
4294 | if (rhsVTy->getElementType()->isFloatingPointTy()) { | ||||
4295 | RHSTmp = Builder.CreateBitCast(RHS, tmp2->getType()); | ||||
4296 | LHSTmp = Builder.CreateBitCast(LHS, tmp->getType()); | ||||
4297 | wasCast = true; | ||||
4298 | } | ||||
4299 | |||||
4300 | llvm::Value *tmp3 = Builder.CreateAnd(RHSTmp, tmp2); | ||||
4301 | llvm::Value *tmp4 = Builder.CreateAnd(LHSTmp, tmp); | ||||
4302 | llvm::Value *tmp5 = Builder.CreateOr(tmp3, tmp4, "cond"); | ||||
4303 | if (wasCast) | ||||
4304 | tmp5 = Builder.CreateBitCast(tmp5, RHS->getType()); | ||||
4305 | |||||
4306 | return tmp5; | ||||
4307 | } | ||||
4308 | |||||
4309 | // If this is a really simple expression (like x ? 4 : 5), emit this as a | ||||
4310 | // select instead of as control flow. We can only do this if it is cheap and | ||||
4311 | // safe to evaluate the LHS and RHS unconditionally. | ||||
4312 | if (isCheapEnoughToEvaluateUnconditionally(lhsExpr, CGF) && | ||||
4313 | isCheapEnoughToEvaluateUnconditionally(rhsExpr, CGF)) { | ||||
4314 | llvm::Value *CondV = CGF.EvaluateExprAsBool(condExpr); | ||||
4315 | llvm::Value *StepV = Builder.CreateZExtOrBitCast(CondV, CGF.Int64Ty); | ||||
4316 | |||||
4317 | CGF.incrementProfileCounter(E, StepV); | ||||
4318 | |||||
4319 | llvm::Value *LHS = Visit(lhsExpr); | ||||
4320 | llvm::Value *RHS = Visit(rhsExpr); | ||||
4321 | if (!LHS) { | ||||
4322 | // If the conditional has void type, make sure we return a null Value*. | ||||
4323 | assert(!RHS && "LHS and RHS types must match")((!RHS && "LHS and RHS types must match") ? static_cast <void> (0) : __assert_fail ("!RHS && \"LHS and RHS types must match\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 4323, __PRETTY_FUNCTION__)); | ||||
4324 | return nullptr; | ||||
4325 | } | ||||
4326 | return Builder.CreateSelect(CondV, LHS, RHS, "cond"); | ||||
4327 | } | ||||
4328 | |||||
4329 | llvm::BasicBlock *LHSBlock = CGF.createBasicBlock("cond.true"); | ||||
4330 | llvm::BasicBlock *RHSBlock = CGF.createBasicBlock("cond.false"); | ||||
4331 | llvm::BasicBlock *ContBlock = CGF.createBasicBlock("cond.end"); | ||||
4332 | |||||
4333 | CodeGenFunction::ConditionalEvaluation eval(CGF); | ||||
4334 | CGF.EmitBranchOnBoolExpr(condExpr, LHSBlock, RHSBlock, | ||||
4335 | CGF.getProfileCount(lhsExpr)); | ||||
4336 | |||||
4337 | CGF.EmitBlock(LHSBlock); | ||||
4338 | CGF.incrementProfileCounter(E); | ||||
4339 | eval.begin(CGF); | ||||
4340 | Value *LHS = Visit(lhsExpr); | ||||
4341 | eval.end(CGF); | ||||
4342 | |||||
4343 | LHSBlock = Builder.GetInsertBlock(); | ||||
4344 | Builder.CreateBr(ContBlock); | ||||
4345 | |||||
4346 | CGF.EmitBlock(RHSBlock); | ||||
4347 | eval.begin(CGF); | ||||
4348 | Value *RHS = Visit(rhsExpr); | ||||
4349 | eval.end(CGF); | ||||
4350 | |||||
4351 | RHSBlock = Builder.GetInsertBlock(); | ||||
4352 | CGF.EmitBlock(ContBlock); | ||||
4353 | |||||
4354 | // If the LHS or RHS is a throw expression, it will be legitimately null. | ||||
4355 | if (!LHS) | ||||
4356 | return RHS; | ||||
4357 | if (!RHS) | ||||
4358 | return LHS; | ||||
4359 | |||||
4360 | // Create a PHI node for the real part. | ||||
4361 | llvm::PHINode *PN = Builder.CreatePHI(LHS->getType(), 2, "cond"); | ||||
4362 | PN->addIncoming(LHS, LHSBlock); | ||||
4363 | PN->addIncoming(RHS, RHSBlock); | ||||
4364 | return PN; | ||||
4365 | } | ||||
4366 | |||||
4367 | Value *ScalarExprEmitter::VisitChooseExpr(ChooseExpr *E) { | ||||
4368 | return Visit(E->getChosenSubExpr()); | ||||
4369 | } | ||||
4370 | |||||
4371 | Value *ScalarExprEmitter::VisitVAArgExpr(VAArgExpr *VE) { | ||||
4372 | QualType Ty = VE->getType(); | ||||
4373 | |||||
4374 | if (Ty->isVariablyModifiedType()) | ||||
4375 | CGF.EmitVariablyModifiedType(Ty); | ||||
4376 | |||||
4377 | Address ArgValue = Address::invalid(); | ||||
4378 | Address ArgPtr = CGF.EmitVAArg(VE, ArgValue); | ||||
4379 | |||||
4380 | llvm::Type *ArgTy = ConvertType(VE->getType()); | ||||
4381 | |||||
4382 | // If EmitVAArg fails, emit an error. | ||||
4383 | if (!ArgPtr.isValid()) { | ||||
4384 | CGF.ErrorUnsupported(VE, "va_arg expression"); | ||||
4385 | return llvm::UndefValue::get(ArgTy); | ||||
4386 | } | ||||
4387 | |||||
4388 | // FIXME Volatility. | ||||
4389 | llvm::Value *Val = Builder.CreateLoad(ArgPtr); | ||||
4390 | |||||
4391 | // If EmitVAArg promoted the type, we must truncate it. | ||||
4392 | if (ArgTy != Val->getType()) { | ||||
4393 | if (ArgTy->isPointerTy() && !Val->getType()->isPointerTy()) | ||||
4394 | Val = Builder.CreateIntToPtr(Val, ArgTy); | ||||
4395 | else | ||||
4396 | Val = Builder.CreateTrunc(Val, ArgTy); | ||||
4397 | } | ||||
4398 | |||||
4399 | return Val; | ||||
4400 | } | ||||
4401 | |||||
4402 | Value *ScalarExprEmitter::VisitBlockExpr(const BlockExpr *block) { | ||||
4403 | return CGF.EmitBlockLiteral(block); | ||||
4404 | } | ||||
4405 | |||||
4406 | // Convert a vec3 to vec4, or vice versa. | ||||
4407 | static Value *ConvertVec3AndVec4(CGBuilderTy &Builder, CodeGenFunction &CGF, | ||||
4408 | Value *Src, unsigned NumElementsDst) { | ||||
4409 | llvm::Value *UnV = llvm::UndefValue::get(Src->getType()); | ||||
4410 | SmallVector<llvm::Constant*, 4> Args; | ||||
4411 | Args.push_back(Builder.getInt32(0)); | ||||
4412 | Args.push_back(Builder.getInt32(1)); | ||||
4413 | Args.push_back(Builder.getInt32(2)); | ||||
4414 | if (NumElementsDst == 4) | ||||
4415 | Args.push_back(llvm::UndefValue::get(CGF.Int32Ty)); | ||||
4416 | llvm::Constant *Mask = llvm::ConstantVector::get(Args); | ||||
4417 | return Builder.CreateShuffleVector(Src, UnV, Mask); | ||||
4418 | } | ||||
4419 | |||||
4420 | // Create cast instructions for converting LLVM value \p Src to LLVM type \p | ||||
4421 | // DstTy. \p Src has the same size as \p DstTy. Both are single value types | ||||
4422 | // but could be scalar or vectors of different lengths, and either can be | ||||
4423 | // pointer. | ||||
4424 | // There are 4 cases: | ||||
4425 | // 1. non-pointer -> non-pointer : needs 1 bitcast | ||||
4426 | // 2. pointer -> pointer : needs 1 bitcast or addrspacecast | ||||
4427 | // 3. pointer -> non-pointer | ||||
4428 | // a) pointer -> intptr_t : needs 1 ptrtoint | ||||
4429 | // b) pointer -> non-intptr_t : needs 1 ptrtoint then 1 bitcast | ||||
4430 | // 4. non-pointer -> pointer | ||||
4431 | // a) intptr_t -> pointer : needs 1 inttoptr | ||||
4432 | // b) non-intptr_t -> pointer : needs 1 bitcast then 1 inttoptr | ||||
4433 | // Note: for cases 3b and 4b two casts are required since LLVM casts do not | ||||
4434 | // allow casting directly between pointer types and non-integer non-pointer | ||||
4435 | // types. | ||||
4436 | static Value *createCastsForTypeOfSameSize(CGBuilderTy &Builder, | ||||
4437 | const llvm::DataLayout &DL, | ||||
4438 | Value *Src, llvm::Type *DstTy, | ||||
4439 | StringRef Name = "") { | ||||
4440 | auto SrcTy = Src->getType(); | ||||
4441 | |||||
4442 | // Case 1. | ||||
4443 | if (!SrcTy->isPointerTy() && !DstTy->isPointerTy()) | ||||
4444 | return Builder.CreateBitCast(Src, DstTy, Name); | ||||
4445 | |||||
4446 | // Case 2. | ||||
4447 | if (SrcTy->isPointerTy() && DstTy->isPointerTy()) | ||||
4448 | return Builder.CreatePointerBitCastOrAddrSpaceCast(Src, DstTy, Name); | ||||
4449 | |||||
4450 | // Case 3. | ||||
4451 | if (SrcTy->isPointerTy() && !DstTy->isPointerTy()) { | ||||
4452 | // Case 3b. | ||||
4453 | if (!DstTy->isIntegerTy()) | ||||
4454 | Src = Builder.CreatePtrToInt(Src, DL.getIntPtrType(SrcTy)); | ||||
4455 | // Cases 3a and 3b. | ||||
4456 | return Builder.CreateBitOrPointerCast(Src, DstTy, Name); | ||||
4457 | } | ||||
4458 | |||||
4459 | // Case 4b. | ||||
4460 | if (!SrcTy->isIntegerTy()) | ||||
4461 | Src = Builder.CreateBitCast(Src, DL.getIntPtrType(DstTy)); | ||||
4462 | // Cases 4a and 4b. | ||||
4463 | return Builder.CreateIntToPtr(Src, DstTy, Name); | ||||
4464 | } | ||||
4465 | |||||
4466 | Value *ScalarExprEmitter::VisitAsTypeExpr(AsTypeExpr *E) { | ||||
4467 | Value *Src = CGF.EmitScalarExpr(E->getSrcExpr()); | ||||
4468 | llvm::Type *DstTy = ConvertType(E->getType()); | ||||
4469 | |||||
4470 | llvm::Type *SrcTy = Src->getType(); | ||||
4471 | unsigned NumElementsSrc = isa<llvm::VectorType>(SrcTy) ? | ||||
4472 | cast<llvm::VectorType>(SrcTy)->getNumElements() : 0; | ||||
4473 | unsigned NumElementsDst = isa<llvm::VectorType>(DstTy) ? | ||||
4474 | cast<llvm::VectorType>(DstTy)->getNumElements() : 0; | ||||
4475 | |||||
4476 | // Going from vec3 to non-vec3 is a special case and requires a shuffle | ||||
4477 | // vector to get a vec4, then a bitcast if the target type is different. | ||||
4478 | if (NumElementsSrc == 3 && NumElementsDst != 3) { | ||||
4479 | Src = ConvertVec3AndVec4(Builder, CGF, Src, 4); | ||||
4480 | |||||
4481 | if (!CGF.CGM.getCodeGenOpts().PreserveVec3Type) { | ||||
4482 | Src = createCastsForTypeOfSameSize(Builder, CGF.CGM.getDataLayout(), Src, | ||||
4483 | DstTy); | ||||
4484 | } | ||||
4485 | |||||
4486 | Src->setName("astype"); | ||||
4487 | return Src; | ||||
4488 | } | ||||
4489 | |||||
4490 | // Going from non-vec3 to vec3 is a special case and requires a bitcast | ||||
4491 | // to vec4 if the original type is not vec4, then a shuffle vector to | ||||
4492 | // get a vec3. | ||||
4493 | if (NumElementsSrc != 3 && NumElementsDst == 3) { | ||||
4494 | if (!CGF.CGM.getCodeGenOpts().PreserveVec3Type) { | ||||
4495 | auto Vec4Ty = llvm::VectorType::get(DstTy->getVectorElementType(), 4); | ||||
4496 | Src = createCastsForTypeOfSameSize(Builder, CGF.CGM.getDataLayout(), Src, | ||||
4497 | Vec4Ty); | ||||
4498 | } | ||||
4499 | |||||
4500 | Src = ConvertVec3AndVec4(Builder, CGF, Src, 3); | ||||
4501 | Src->setName("astype"); | ||||
4502 | return Src; | ||||
4503 | } | ||||
4504 | |||||
4505 | return createCastsForTypeOfSameSize(Builder, CGF.CGM.getDataLayout(), | ||||
4506 | Src, DstTy, "astype"); | ||||
4507 | } | ||||
4508 | |||||
4509 | Value *ScalarExprEmitter::VisitAtomicExpr(AtomicExpr *E) { | ||||
4510 | return CGF.EmitAtomicExpr(E).getScalarVal(); | ||||
4511 | } | ||||
4512 | |||||
4513 | //===----------------------------------------------------------------------===// | ||||
4514 | // Entry Point into this File | ||||
4515 | //===----------------------------------------------------------------------===// | ||||
4516 | |||||
4517 | /// Emit the computation of the specified expression of scalar type, ignoring | ||||
4518 | /// the result. | ||||
4519 | Value *CodeGenFunction::EmitScalarExpr(const Expr *E, bool IgnoreResultAssign) { | ||||
4520 | assert(E && hasScalarEvaluationKind(E->getType()) &&((E && hasScalarEvaluationKind(E->getType()) && "Invalid scalar expression to emit") ? static_cast<void> (0) : __assert_fail ("E && hasScalarEvaluationKind(E->getType()) && \"Invalid scalar expression to emit\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 4521, __PRETTY_FUNCTION__)) | ||||
4521 | "Invalid scalar expression to emit")((E && hasScalarEvaluationKind(E->getType()) && "Invalid scalar expression to emit") ? static_cast<void> (0) : __assert_fail ("E && hasScalarEvaluationKind(E->getType()) && \"Invalid scalar expression to emit\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 4521, __PRETTY_FUNCTION__)); | ||||
4522 | |||||
4523 | return ScalarExprEmitter(*this, IgnoreResultAssign) | ||||
4524 | .Visit(const_cast<Expr *>(E)); | ||||
4525 | } | ||||
4526 | |||||
4527 | /// Emit a conversion from the specified type to the specified destination type, | ||||
4528 | /// both of which are LLVM scalar types. | ||||
4529 | Value *CodeGenFunction::EmitScalarConversion(Value *Src, QualType SrcTy, | ||||
4530 | QualType DstTy, | ||||
4531 | SourceLocation Loc) { | ||||
4532 | assert(hasScalarEvaluationKind(SrcTy) && hasScalarEvaluationKind(DstTy) &&((hasScalarEvaluationKind(SrcTy) && hasScalarEvaluationKind (DstTy) && "Invalid scalar expression to emit") ? static_cast <void> (0) : __assert_fail ("hasScalarEvaluationKind(SrcTy) && hasScalarEvaluationKind(DstTy) && \"Invalid scalar expression to emit\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 4533, __PRETTY_FUNCTION__)) | ||||
4533 | "Invalid scalar expression to emit")((hasScalarEvaluationKind(SrcTy) && hasScalarEvaluationKind (DstTy) && "Invalid scalar expression to emit") ? static_cast <void> (0) : __assert_fail ("hasScalarEvaluationKind(SrcTy) && hasScalarEvaluationKind(DstTy) && \"Invalid scalar expression to emit\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 4533, __PRETTY_FUNCTION__)); | ||||
4534 | return ScalarExprEmitter(*this).EmitScalarConversion(Src, SrcTy, DstTy, Loc); | ||||
4535 | } | ||||
4536 | |||||
4537 | /// Emit a conversion from the specified complex type to the specified | ||||
4538 | /// destination type, where the destination type is an LLVM scalar type. | ||||
4539 | Value *CodeGenFunction::EmitComplexToScalarConversion(ComplexPairTy Src, | ||||
4540 | QualType SrcTy, | ||||
4541 | QualType DstTy, | ||||
4542 | SourceLocation Loc) { | ||||
4543 | assert(SrcTy->isAnyComplexType() && hasScalarEvaluationKind(DstTy) &&((SrcTy->isAnyComplexType() && hasScalarEvaluationKind (DstTy) && "Invalid complex -> scalar conversion") ? static_cast<void> (0) : __assert_fail ("SrcTy->isAnyComplexType() && hasScalarEvaluationKind(DstTy) && \"Invalid complex -> scalar conversion\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 4544, __PRETTY_FUNCTION__)) | ||||
4544 | "Invalid complex -> scalar conversion")((SrcTy->isAnyComplexType() && hasScalarEvaluationKind (DstTy) && "Invalid complex -> scalar conversion") ? static_cast<void> (0) : __assert_fail ("SrcTy->isAnyComplexType() && hasScalarEvaluationKind(DstTy) && \"Invalid complex -> scalar conversion\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 4544, __PRETTY_FUNCTION__)); | ||||
4545 | return ScalarExprEmitter(*this) | ||||
4546 | .EmitComplexToScalarConversion(Src, SrcTy, DstTy, Loc); | ||||
4547 | } | ||||
4548 | |||||
4549 | |||||
4550 | llvm::Value *CodeGenFunction:: | ||||
4551 | EmitScalarPrePostIncDec(const UnaryOperator *E, LValue LV, | ||||
4552 | bool isInc, bool isPre) { | ||||
4553 | return ScalarExprEmitter(*this).EmitScalarPrePostIncDec(E, LV, isInc, isPre); | ||||
4554 | } | ||||
4555 | |||||
4556 | LValue CodeGenFunction::EmitObjCIsaExpr(const ObjCIsaExpr *E) { | ||||
4557 | // object->isa or (*object).isa | ||||
4558 | // Generate code as for: *(Class*)object | ||||
4559 | |||||
4560 | Expr *BaseExpr = E->getBase(); | ||||
4561 | Address Addr = Address::invalid(); | ||||
4562 | if (BaseExpr->isRValue()) { | ||||
4563 | Addr = Address(EmitScalarExpr(BaseExpr), getPointerAlign()); | ||||
4564 | } else { | ||||
4565 | Addr = EmitLValue(BaseExpr).getAddress(*this); | ||||
4566 | } | ||||
4567 | |||||
4568 | // Cast the address to Class*. | ||||
4569 | Addr = Builder.CreateElementBitCast(Addr, ConvertType(E->getType())); | ||||
4570 | return MakeAddrLValue(Addr, E->getType()); | ||||
4571 | } | ||||
4572 | |||||
4573 | |||||
4574 | LValue CodeGenFunction::EmitCompoundAssignmentLValue( | ||||
4575 | const CompoundAssignOperator *E) { | ||||
4576 | ScalarExprEmitter Scalar(*this); | ||||
4577 | Value *Result = nullptr; | ||||
4578 | switch (E->getOpcode()) { | ||||
4579 | #define COMPOUND_OP(Op) \ | ||||
4580 | case BO_##Op##Assign: \ | ||||
4581 | return Scalar.EmitCompoundAssignLValue(E, &ScalarExprEmitter::Emit##Op, \ | ||||
4582 | Result) | ||||
4583 | COMPOUND_OP(Mul); | ||||
4584 | COMPOUND_OP(Div); | ||||
4585 | COMPOUND_OP(Rem); | ||||
4586 | COMPOUND_OP(Add); | ||||
4587 | COMPOUND_OP(Sub); | ||||
4588 | COMPOUND_OP(Shl); | ||||
4589 | COMPOUND_OP(Shr); | ||||
4590 | COMPOUND_OP(And); | ||||
4591 | COMPOUND_OP(Xor); | ||||
4592 | COMPOUND_OP(Or); | ||||
4593 | #undef COMPOUND_OP | ||||
4594 | |||||
4595 | case BO_PtrMemD: | ||||
4596 | case BO_PtrMemI: | ||||
4597 | case BO_Mul: | ||||
4598 | case BO_Div: | ||||
4599 | case BO_Rem: | ||||
4600 | case BO_Add: | ||||
4601 | case BO_Sub: | ||||
4602 | case BO_Shl: | ||||
4603 | case BO_Shr: | ||||
4604 | case BO_LT: | ||||
4605 | case BO_GT: | ||||
4606 | case BO_LE: | ||||
4607 | case BO_GE: | ||||
4608 | case BO_EQ: | ||||
4609 | case BO_NE: | ||||
4610 | case BO_Cmp: | ||||
4611 | case BO_And: | ||||
4612 | case BO_Xor: | ||||
4613 | case BO_Or: | ||||
4614 | case BO_LAnd: | ||||
4615 | case BO_LOr: | ||||
4616 | case BO_Assign: | ||||
4617 | case BO_Comma: | ||||
4618 | llvm_unreachable("Not valid compound assignment operators")::llvm::llvm_unreachable_internal("Not valid compound assignment operators" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 4618); | ||||
4619 | } | ||||
4620 | |||||
4621 | llvm_unreachable("Unhandled compound assignment operator")::llvm::llvm_unreachable_internal("Unhandled compound assignment operator" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 4621); | ||||
4622 | } | ||||
4623 | |||||
4624 | struct GEPOffsetAndOverflow { | ||||
4625 | // The total (signed) byte offset for the GEP. | ||||
4626 | llvm::Value *TotalOffset; | ||||
4627 | // The offset overflow flag - true if the total offset overflows. | ||||
4628 | llvm::Value *OffsetOverflows; | ||||
4629 | }; | ||||
4630 | |||||
4631 | /// Evaluate given GEPVal, which is either an inbounds GEP, or a constant, | ||||
4632 | /// and compute the total offset it applies from it's base pointer BasePtr. | ||||
4633 | /// Returns offset in bytes and a boolean flag whether an overflow happened | ||||
4634 | /// during evaluation. | ||||
4635 | static GEPOffsetAndOverflow EmitGEPOffsetInBytes(Value *BasePtr, Value *GEPVal, | ||||
4636 | llvm::LLVMContext &VMContext, | ||||
4637 | CodeGenModule &CGM, | ||||
4638 | CGBuilderTy Builder) { | ||||
4639 | const auto &DL = CGM.getDataLayout(); | ||||
4640 | |||||
4641 | // The total (signed) byte offset for the GEP. | ||||
4642 | llvm::Value *TotalOffset = nullptr; | ||||
4643 | |||||
4644 | // Was the GEP already reduced to a constant? | ||||
4645 | if (isa<llvm::Constant>(GEPVal)) { | ||||
4646 | // Compute the offset by casting both pointers to integers and subtracting: | ||||
4647 | // GEPVal = BasePtr + ptr(Offset) <--> Offset = int(GEPVal) - int(BasePtr) | ||||
4648 | Value *BasePtr_int = | ||||
4649 | Builder.CreatePtrToInt(BasePtr, DL.getIntPtrType(BasePtr->getType())); | ||||
4650 | Value *GEPVal_int = | ||||
4651 | Builder.CreatePtrToInt(GEPVal, DL.getIntPtrType(GEPVal->getType())); | ||||
4652 | TotalOffset = Builder.CreateSub(GEPVal_int, BasePtr_int); | ||||
4653 | return {TotalOffset, /*OffsetOverflows=*/Builder.getFalse()}; | ||||
4654 | } | ||||
4655 | |||||
4656 | auto *GEP = cast<llvm::GEPOperator>(GEPVal); | ||||
4657 | assert(GEP->getPointerOperand() == BasePtr &&((GEP->getPointerOperand() == BasePtr && "BasePtr must be the the base of the GEP." ) ? static_cast<void> (0) : __assert_fail ("GEP->getPointerOperand() == BasePtr && \"BasePtr must be the the base of the GEP.\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 4658, __PRETTY_FUNCTION__)) | ||||
4658 | "BasePtr must be the the base of the GEP.")((GEP->getPointerOperand() == BasePtr && "BasePtr must be the the base of the GEP." ) ? static_cast<void> (0) : __assert_fail ("GEP->getPointerOperand() == BasePtr && \"BasePtr must be the the base of the GEP.\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 4658, __PRETTY_FUNCTION__)); | ||||
4659 | assert(GEP->isInBounds() && "Expected inbounds GEP")((GEP->isInBounds() && "Expected inbounds GEP") ? static_cast <void> (0) : __assert_fail ("GEP->isInBounds() && \"Expected inbounds GEP\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 4659, __PRETTY_FUNCTION__)); | ||||
4660 | |||||
4661 | auto *IntPtrTy = DL.getIntPtrType(GEP->getPointerOperandType()); | ||||
4662 | |||||
4663 | // Grab references to the signed add/mul overflow intrinsics for intptr_t. | ||||
4664 | auto *Zero = llvm::ConstantInt::getNullValue(IntPtrTy); | ||||
4665 | auto *SAddIntrinsic = | ||||
4666 | CGM.getIntrinsic(llvm::Intrinsic::sadd_with_overflow, IntPtrTy); | ||||
4667 | auto *SMulIntrinsic = | ||||
4668 | CGM.getIntrinsic(llvm::Intrinsic::smul_with_overflow, IntPtrTy); | ||||
4669 | |||||
4670 | // The offset overflow flag - true if the total offset overflows. | ||||
4671 | llvm::Value *OffsetOverflows = Builder.getFalse(); | ||||
4672 | |||||
4673 | /// Return the result of the given binary operation. | ||||
4674 | auto eval = [&](BinaryOperator::Opcode Opcode, llvm::Value *LHS, | ||||
4675 | llvm::Value *RHS) -> llvm::Value * { | ||||
4676 | assert((Opcode == BO_Add || Opcode == BO_Mul) && "Can't eval binop")(((Opcode == BO_Add || Opcode == BO_Mul) && "Can't eval binop" ) ? static_cast<void> (0) : __assert_fail ("(Opcode == BO_Add || Opcode == BO_Mul) && \"Can't eval binop\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 4676, __PRETTY_FUNCTION__)); | ||||
4677 | |||||
4678 | // If the operands are constants, return a constant result. | ||||
4679 | if (auto *LHSCI = dyn_cast<llvm::ConstantInt>(LHS)) { | ||||
4680 | if (auto *RHSCI = dyn_cast<llvm::ConstantInt>(RHS)) { | ||||
4681 | llvm::APInt N; | ||||
4682 | bool HasOverflow = mayHaveIntegerOverflow(LHSCI, RHSCI, Opcode, | ||||
4683 | /*Signed=*/true, N); | ||||
4684 | if (HasOverflow) | ||||
4685 | OffsetOverflows = Builder.getTrue(); | ||||
4686 | return llvm::ConstantInt::get(VMContext, N); | ||||
4687 | } | ||||
4688 | } | ||||
4689 | |||||
4690 | // Otherwise, compute the result with checked arithmetic. | ||||
4691 | auto *ResultAndOverflow = Builder.CreateCall( | ||||
4692 | (Opcode == BO_Add) ? SAddIntrinsic : SMulIntrinsic, {LHS, RHS}); | ||||
4693 | OffsetOverflows = Builder.CreateOr( | ||||
4694 | Builder.CreateExtractValue(ResultAndOverflow, 1), OffsetOverflows); | ||||
4695 | return Builder.CreateExtractValue(ResultAndOverflow, 0); | ||||
4696 | }; | ||||
4697 | |||||
4698 | // Determine the total byte offset by looking at each GEP operand. | ||||
4699 | for (auto GTI = llvm::gep_type_begin(GEP), GTE = llvm::gep_type_end(GEP); | ||||
4700 | GTI != GTE; ++GTI) { | ||||
4701 | llvm::Value *LocalOffset; | ||||
4702 | auto *Index = GTI.getOperand(); | ||||
4703 | // Compute the local offset contributed by this indexing step: | ||||
4704 | if (auto *STy = GTI.getStructTypeOrNull()) { | ||||
4705 | // For struct indexing, the local offset is the byte position of the | ||||
4706 | // specified field. | ||||
4707 | unsigned FieldNo = cast<llvm::ConstantInt>(Index)->getZExtValue(); | ||||
4708 | LocalOffset = llvm::ConstantInt::get( | ||||
4709 | IntPtrTy, DL.getStructLayout(STy)->getElementOffset(FieldNo)); | ||||
4710 | } else { | ||||
4711 | // Otherwise this is array-like indexing. The local offset is the index | ||||
4712 | // multiplied by the element size. | ||||
4713 | auto *ElementSize = llvm::ConstantInt::get( | ||||
4714 | IntPtrTy, DL.getTypeAllocSize(GTI.getIndexedType())); | ||||
4715 | auto *IndexS = Builder.CreateIntCast(Index, IntPtrTy, /*isSigned=*/true); | ||||
4716 | LocalOffset = eval(BO_Mul, ElementSize, IndexS); | ||||
4717 | } | ||||
4718 | |||||
4719 | // If this is the first offset, set it as the total offset. Otherwise, add | ||||
4720 | // the local offset into the running total. | ||||
4721 | if (!TotalOffset || TotalOffset == Zero) | ||||
4722 | TotalOffset = LocalOffset; | ||||
4723 | else | ||||
4724 | TotalOffset = eval(BO_Add, TotalOffset, LocalOffset); | ||||
4725 | } | ||||
4726 | |||||
4727 | return {TotalOffset, OffsetOverflows}; | ||||
4728 | } | ||||
4729 | |||||
4730 | Value * | ||||
4731 | CodeGenFunction::EmitCheckedInBoundsGEP(Value *Ptr, ArrayRef<Value *> IdxList, | ||||
4732 | bool SignedIndices, bool IsSubtraction, | ||||
4733 | SourceLocation Loc, const Twine &Name) { | ||||
4734 | Value *GEPVal = Builder.CreateInBoundsGEP(Ptr, IdxList, Name); | ||||
4735 | |||||
4736 | // If the pointer overflow sanitizer isn't enabled, do nothing. | ||||
4737 | if (!SanOpts.has(SanitizerKind::PointerOverflow)) | ||||
4738 | return GEPVal; | ||||
4739 | |||||
4740 | llvm::Type *PtrTy = Ptr->getType(); | ||||
4741 | |||||
4742 | // Perform nullptr-and-offset check unless the nullptr is defined. | ||||
4743 | bool PerformNullCheck = !NullPointerIsDefined( | ||||
4744 | Builder.GetInsertBlock()->getParent(), PtrTy->getPointerAddressSpace()); | ||||
4745 | // Check for overflows unless the GEP got constant-folded, | ||||
4746 | // and only in the default address space | ||||
4747 | bool PerformOverflowCheck = | ||||
4748 | !isa<llvm::Constant>(GEPVal) && PtrTy->getPointerAddressSpace() == 0; | ||||
4749 | |||||
4750 | if (!(PerformNullCheck || PerformOverflowCheck)) | ||||
4751 | return GEPVal; | ||||
4752 | |||||
4753 | const auto &DL = CGM.getDataLayout(); | ||||
4754 | |||||
4755 | SanitizerScope SanScope(this); | ||||
4756 | llvm::Type *IntPtrTy = DL.getIntPtrType(PtrTy); | ||||
4757 | |||||
4758 | GEPOffsetAndOverflow EvaluatedGEP = | ||||
4759 | EmitGEPOffsetInBytes(Ptr, GEPVal, getLLVMContext(), CGM, Builder); | ||||
4760 | |||||
4761 | assert((!isa<llvm::Constant>(EvaluatedGEP.TotalOffset) ||(((!isa<llvm::Constant>(EvaluatedGEP.TotalOffset) || EvaluatedGEP .OffsetOverflows == Builder.getFalse()) && "If the offset got constant-folded, we don't expect that there was an " "overflow.") ? static_cast<void> (0) : __assert_fail ( "(!isa<llvm::Constant>(EvaluatedGEP.TotalOffset) || EvaluatedGEP.OffsetOverflows == Builder.getFalse()) && \"If the offset got constant-folded, we don't expect that there was an \" \"overflow.\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 4764, __PRETTY_FUNCTION__)) | ||||
4762 | EvaluatedGEP.OffsetOverflows == Builder.getFalse()) &&(((!isa<llvm::Constant>(EvaluatedGEP.TotalOffset) || EvaluatedGEP .OffsetOverflows == Builder.getFalse()) && "If the offset got constant-folded, we don't expect that there was an " "overflow.") ? static_cast<void> (0) : __assert_fail ( "(!isa<llvm::Constant>(EvaluatedGEP.TotalOffset) || EvaluatedGEP.OffsetOverflows == Builder.getFalse()) && \"If the offset got constant-folded, we don't expect that there was an \" \"overflow.\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 4764, __PRETTY_FUNCTION__)) | ||||
4763 | "If the offset got constant-folded, we don't expect that there was an "(((!isa<llvm::Constant>(EvaluatedGEP.TotalOffset) || EvaluatedGEP .OffsetOverflows == Builder.getFalse()) && "If the offset got constant-folded, we don't expect that there was an " "overflow.") ? static_cast<void> (0) : __assert_fail ( "(!isa<llvm::Constant>(EvaluatedGEP.TotalOffset) || EvaluatedGEP.OffsetOverflows == Builder.getFalse()) && \"If the offset got constant-folded, we don't expect that there was an \" \"overflow.\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 4764, __PRETTY_FUNCTION__)) | ||||
4764 | "overflow.")(((!isa<llvm::Constant>(EvaluatedGEP.TotalOffset) || EvaluatedGEP .OffsetOverflows == Builder.getFalse()) && "If the offset got constant-folded, we don't expect that there was an " "overflow.") ? static_cast<void> (0) : __assert_fail ( "(!isa<llvm::Constant>(EvaluatedGEP.TotalOffset) || EvaluatedGEP.OffsetOverflows == Builder.getFalse()) && \"If the offset got constant-folded, we don't expect that there was an \" \"overflow.\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 4764, __PRETTY_FUNCTION__)); | ||||
4765 | |||||
4766 | auto *Zero = llvm::ConstantInt::getNullValue(IntPtrTy); | ||||
4767 | |||||
4768 | // Common case: if the total offset is zero, and we are using C++ semantics, | ||||
4769 | // where nullptr+0 is defined, don't emit a check. | ||||
4770 | if (EvaluatedGEP.TotalOffset == Zero && CGM.getLangOpts().CPlusPlus) | ||||
4771 | return GEPVal; | ||||
4772 | |||||
4773 | // Now that we've computed the total offset, add it to the base pointer (with | ||||
4774 | // wrapping semantics). | ||||
4775 | auto *IntPtr = Builder.CreatePtrToInt(Ptr, IntPtrTy); | ||||
4776 | auto *ComputedGEP = Builder.CreateAdd(IntPtr, EvaluatedGEP.TotalOffset); | ||||
4777 | |||||
4778 | llvm::SmallVector<std::pair<llvm::Value *, SanitizerMask>, 2> Checks; | ||||
4779 | |||||
4780 | if (PerformNullCheck) { | ||||
4781 | // In C++, if the base pointer evaluates to a null pointer value, | ||||
4782 | // the only valid pointer this inbounds GEP can produce is also | ||||
4783 | // a null pointer, so the offset must also evaluate to zero. | ||||
4784 | // Likewise, if we have non-zero base pointer, we can not get null pointer | ||||
4785 | // as a result, so the offset can not be -intptr_t(BasePtr). | ||||
4786 | // In other words, both pointers are either null, or both are non-null, | ||||
4787 | // or the behaviour is undefined. | ||||
4788 | // | ||||
4789 | // C, however, is more strict in this regard, and gives more | ||||
4790 | // optimization opportunities: in C, additionally, nullptr+0 is undefined. | ||||
4791 | // So both the input to the 'gep inbounds' AND the output must not be null. | ||||
4792 | auto *BaseIsNotNullptr = Builder.CreateIsNotNull(Ptr); | ||||
4793 | auto *ResultIsNotNullptr = Builder.CreateIsNotNull(ComputedGEP); | ||||
4794 | auto *Valid = | ||||
4795 | CGM.getLangOpts().CPlusPlus | ||||
4796 | ? Builder.CreateICmpEQ(BaseIsNotNullptr, ResultIsNotNullptr) | ||||
4797 | : Builder.CreateAnd(BaseIsNotNullptr, ResultIsNotNullptr); | ||||
4798 | Checks.emplace_back(Valid, SanitizerKind::PointerOverflow); | ||||
4799 | } | ||||
4800 | |||||
4801 | if (PerformOverflowCheck) { | ||||
4802 | // The GEP is valid if: | ||||
4803 | // 1) The total offset doesn't overflow, and | ||||
4804 | // 2) The sign of the difference between the computed address and the base | ||||
4805 | // pointer matches the sign of the total offset. | ||||
4806 | llvm::Value *ValidGEP; | ||||
4807 | auto *NoOffsetOverflow = Builder.CreateNot(EvaluatedGEP.OffsetOverflows); | ||||
4808 | if (SignedIndices) { | ||||
4809 | // GEP is computed as `unsigned base + signed offset`, therefore: | ||||
4810 | // * If offset was positive, then the computed pointer can not be | ||||
4811 | // [unsigned] less than the base pointer, unless it overflowed. | ||||
4812 | // * If offset was negative, then the computed pointer can not be | ||||
4813 | // [unsigned] greater than the bas pointere, unless it overflowed. | ||||
4814 | auto *PosOrZeroValid = Builder.CreateICmpUGE(ComputedGEP, IntPtr); | ||||
4815 | auto *PosOrZeroOffset = | ||||
4816 | Builder.CreateICmpSGE(EvaluatedGEP.TotalOffset, Zero); | ||||
4817 | llvm::Value *NegValid = Builder.CreateICmpULT(ComputedGEP, IntPtr); | ||||
4818 | ValidGEP = | ||||
4819 | Builder.CreateSelect(PosOrZeroOffset, PosOrZeroValid, NegValid); | ||||
4820 | } else if (!IsSubtraction) { | ||||
4821 | // GEP is computed as `unsigned base + unsigned offset`, therefore the | ||||
4822 | // computed pointer can not be [unsigned] less than base pointer, | ||||
4823 | // unless there was an overflow. | ||||
4824 | // Equivalent to `@llvm.uadd.with.overflow(%base, %offset)`. | ||||
4825 | ValidGEP = Builder.CreateICmpUGE(ComputedGEP, IntPtr); | ||||
4826 | } else { | ||||
4827 | // GEP is computed as `unsigned base - unsigned offset`, therefore the | ||||
4828 | // computed pointer can not be [unsigned] greater than base pointer, | ||||
4829 | // unless there was an overflow. | ||||
4830 | // Equivalent to `@llvm.usub.with.overflow(%base, sub(0, %offset))`. | ||||
4831 | ValidGEP = Builder.CreateICmpULE(ComputedGEP, IntPtr); | ||||
4832 | } | ||||
4833 | ValidGEP = Builder.CreateAnd(ValidGEP, NoOffsetOverflow); | ||||
4834 | Checks.emplace_back(ValidGEP, SanitizerKind::PointerOverflow); | ||||
4835 | } | ||||
4836 | |||||
4837 | assert(!Checks.empty() && "Should have produced some checks.")((!Checks.empty() && "Should have produced some checks." ) ? static_cast<void> (0) : __assert_fail ("!Checks.empty() && \"Should have produced some checks.\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/lib/CodeGen/CGExprScalar.cpp" , 4837, __PRETTY_FUNCTION__)); | ||||
4838 | |||||
4839 | llvm::Constant *StaticArgs[] = {EmitCheckSourceLocation(Loc)}; | ||||
4840 | // Pass the computed GEP to the runtime to avoid emitting poisoned arguments. | ||||
4841 | llvm::Value *DynamicArgs[] = {IntPtr, ComputedGEP}; | ||||
4842 | EmitCheck(Checks, SanitizerHandler::PointerOverflow, StaticArgs, DynamicArgs); | ||||
4843 | |||||
4844 | return GEPVal; | ||||
4845 | } |
1 | //===- Type.h - C Language Family Type Representation -----------*- 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 | /// \file |
10 | /// C Language Family Type Representation |
11 | /// |
12 | /// This file defines the clang::Type interface and subclasses, used to |
13 | /// represent types for languages in the C family. |
14 | // |
15 | //===----------------------------------------------------------------------===// |
16 | |
17 | #ifndef LLVM_CLANG_AST_TYPE_H |
18 | #define LLVM_CLANG_AST_TYPE_H |
19 | |
20 | #include "clang/AST/NestedNameSpecifier.h" |
21 | #include "clang/AST/TemplateName.h" |
22 | #include "clang/Basic/AddressSpaces.h" |
23 | #include "clang/Basic/AttrKinds.h" |
24 | #include "clang/Basic/Diagnostic.h" |
25 | #include "clang/Basic/ExceptionSpecificationType.h" |
26 | #include "clang/Basic/LLVM.h" |
27 | #include "clang/Basic/Linkage.h" |
28 | #include "clang/Basic/PartialDiagnostic.h" |
29 | #include "clang/Basic/SourceLocation.h" |
30 | #include "clang/Basic/Specifiers.h" |
31 | #include "clang/Basic/Visibility.h" |
32 | #include "llvm/ADT/APInt.h" |
33 | #include "llvm/ADT/APSInt.h" |
34 | #include "llvm/ADT/ArrayRef.h" |
35 | #include "llvm/ADT/FoldingSet.h" |
36 | #include "llvm/ADT/None.h" |
37 | #include "llvm/ADT/Optional.h" |
38 | #include "llvm/ADT/PointerIntPair.h" |
39 | #include "llvm/ADT/PointerUnion.h" |
40 | #include "llvm/ADT/StringRef.h" |
41 | #include "llvm/ADT/Twine.h" |
42 | #include "llvm/ADT/iterator_range.h" |
43 | #include "llvm/Support/Casting.h" |
44 | #include "llvm/Support/Compiler.h" |
45 | #include "llvm/Support/ErrorHandling.h" |
46 | #include "llvm/Support/PointerLikeTypeTraits.h" |
47 | #include "llvm/Support/type_traits.h" |
48 | #include "llvm/Support/TrailingObjects.h" |
49 | #include <cassert> |
50 | #include <cstddef> |
51 | #include <cstdint> |
52 | #include <cstring> |
53 | #include <string> |
54 | #include <type_traits> |
55 | #include <utility> |
56 | |
57 | namespace clang { |
58 | |
59 | class ExtQuals; |
60 | class QualType; |
61 | class TagDecl; |
62 | class Type; |
63 | |
64 | enum { |
65 | TypeAlignmentInBits = 4, |
66 | TypeAlignment = 1 << TypeAlignmentInBits |
67 | }; |
68 | |
69 | namespace serialization { |
70 | template <class T> class AbstractTypeReader; |
71 | template <class T> class AbstractTypeWriter; |
72 | } |
73 | |
74 | } // namespace clang |
75 | |
76 | namespace llvm { |
77 | |
78 | template <typename T> |
79 | struct PointerLikeTypeTraits; |
80 | template<> |
81 | struct PointerLikeTypeTraits< ::clang::Type*> { |
82 | static inline void *getAsVoidPointer(::clang::Type *P) { return P; } |
83 | |
84 | static inline ::clang::Type *getFromVoidPointer(void *P) { |
85 | return static_cast< ::clang::Type*>(P); |
86 | } |
87 | |
88 | enum { NumLowBitsAvailable = clang::TypeAlignmentInBits }; |
89 | }; |
90 | |
91 | template<> |
92 | struct PointerLikeTypeTraits< ::clang::ExtQuals*> { |
93 | static inline void *getAsVoidPointer(::clang::ExtQuals *P) { return P; } |
94 | |
95 | static inline ::clang::ExtQuals *getFromVoidPointer(void *P) { |
96 | return static_cast< ::clang::ExtQuals*>(P); |
97 | } |
98 | |
99 | enum { NumLowBitsAvailable = clang::TypeAlignmentInBits }; |
100 | }; |
101 | |
102 | } // namespace llvm |
103 | |
104 | namespace clang { |
105 | |
106 | class ASTContext; |
107 | template <typename> class CanQual; |
108 | class CXXRecordDecl; |
109 | class DeclContext; |
110 | class EnumDecl; |
111 | class Expr; |
112 | class ExtQualsTypeCommonBase; |
113 | class FunctionDecl; |
114 | class IdentifierInfo; |
115 | class NamedDecl; |
116 | class ObjCInterfaceDecl; |
117 | class ObjCProtocolDecl; |
118 | class ObjCTypeParamDecl; |
119 | struct PrintingPolicy; |
120 | class RecordDecl; |
121 | class Stmt; |
122 | class TagDecl; |
123 | class TemplateArgument; |
124 | class TemplateArgumentListInfo; |
125 | class TemplateArgumentLoc; |
126 | class TemplateTypeParmDecl; |
127 | class TypedefNameDecl; |
128 | class UnresolvedUsingTypenameDecl; |
129 | |
130 | using CanQualType = CanQual<Type>; |
131 | |
132 | // Provide forward declarations for all of the *Type classes. |
133 | #define TYPE(Class, Base) class Class##Type; |
134 | #include "clang/AST/TypeNodes.inc" |
135 | |
136 | /// The collection of all-type qualifiers we support. |
137 | /// Clang supports five independent qualifiers: |
138 | /// * C99: const, volatile, and restrict |
139 | /// * MS: __unaligned |
140 | /// * Embedded C (TR18037): address spaces |
141 | /// * Objective C: the GC attributes (none, weak, or strong) |
142 | class Qualifiers { |
143 | public: |
144 | enum TQ { // NOTE: These flags must be kept in sync with DeclSpec::TQ. |
145 | Const = 0x1, |
146 | Restrict = 0x2, |
147 | Volatile = 0x4, |
148 | CVRMask = Const | Volatile | Restrict |
149 | }; |
150 | |
151 | enum GC { |
152 | GCNone = 0, |
153 | Weak, |
154 | Strong |
155 | }; |
156 | |
157 | enum ObjCLifetime { |
158 | /// There is no lifetime qualification on this type. |
159 | OCL_None, |
160 | |
161 | /// This object can be modified without requiring retains or |
162 | /// releases. |
163 | OCL_ExplicitNone, |
164 | |
165 | /// Assigning into this object requires the old value to be |
166 | /// released and the new value to be retained. The timing of the |
167 | /// release of the old value is inexact: it may be moved to |
168 | /// immediately after the last known point where the value is |
169 | /// live. |
170 | OCL_Strong, |
171 | |
172 | /// Reading or writing from this object requires a barrier call. |
173 | OCL_Weak, |
174 | |
175 | /// Assigning into this object requires a lifetime extension. |
176 | OCL_Autoreleasing |
177 | }; |
178 | |
179 | enum { |
180 | /// The maximum supported address space number. |
181 | /// 23 bits should be enough for anyone. |
182 | MaxAddressSpace = 0x7fffffu, |
183 | |
184 | /// The width of the "fast" qualifier mask. |
185 | FastWidth = 3, |
186 | |
187 | /// The fast qualifier mask. |
188 | FastMask = (1 << FastWidth) - 1 |
189 | }; |
190 | |
191 | /// Returns the common set of qualifiers while removing them from |
192 | /// the given sets. |
193 | static Qualifiers removeCommonQualifiers(Qualifiers &L, Qualifiers &R) { |
194 | // If both are only CVR-qualified, bit operations are sufficient. |
195 | if (!(L.Mask & ~CVRMask) && !(R.Mask & ~CVRMask)) { |
196 | Qualifiers Q; |
197 | Q.Mask = L.Mask & R.Mask; |
198 | L.Mask &= ~Q.Mask; |
199 | R.Mask &= ~Q.Mask; |
200 | return Q; |
201 | } |
202 | |
203 | Qualifiers Q; |
204 | unsigned CommonCRV = L.getCVRQualifiers() & R.getCVRQualifiers(); |
205 | Q.addCVRQualifiers(CommonCRV); |
206 | L.removeCVRQualifiers(CommonCRV); |
207 | R.removeCVRQualifiers(CommonCRV); |
208 | |
209 | if (L.getObjCGCAttr() == R.getObjCGCAttr()) { |
210 | Q.setObjCGCAttr(L.getObjCGCAttr()); |
211 | L.removeObjCGCAttr(); |
212 | R.removeObjCGCAttr(); |
213 | } |
214 | |
215 | if (L.getObjCLifetime() == R.getObjCLifetime()) { |
216 | Q.setObjCLifetime(L.getObjCLifetime()); |
217 | L.removeObjCLifetime(); |
218 | R.removeObjCLifetime(); |
219 | } |
220 | |
221 | if (L.getAddressSpace() == R.getAddressSpace()) { |
222 | Q.setAddressSpace(L.getAddressSpace()); |
223 | L.removeAddressSpace(); |
224 | R.removeAddressSpace(); |
225 | } |
226 | return Q; |
227 | } |
228 | |
229 | static Qualifiers fromFastMask(unsigned Mask) { |
230 | Qualifiers Qs; |
231 | Qs.addFastQualifiers(Mask); |
232 | return Qs; |
233 | } |
234 | |
235 | static Qualifiers fromCVRMask(unsigned CVR) { |
236 | Qualifiers Qs; |
237 | Qs.addCVRQualifiers(CVR); |
238 | return Qs; |
239 | } |
240 | |
241 | static Qualifiers fromCVRUMask(unsigned CVRU) { |
242 | Qualifiers Qs; |
243 | Qs.addCVRUQualifiers(CVRU); |
244 | return Qs; |
245 | } |
246 | |
247 | // Deserialize qualifiers from an opaque representation. |
248 | static Qualifiers fromOpaqueValue(unsigned opaque) { |
249 | Qualifiers Qs; |
250 | Qs.Mask = opaque; |
251 | return Qs; |
252 | } |
253 | |
254 | // Serialize these qualifiers into an opaque representation. |
255 | unsigned getAsOpaqueValue() const { |
256 | return Mask; |
257 | } |
258 | |
259 | bool hasConst() const { return Mask & Const; } |
260 | bool hasOnlyConst() const { return Mask == Const; } |
261 | void removeConst() { Mask &= ~Const; } |
262 | void addConst() { Mask |= Const; } |
263 | |
264 | bool hasVolatile() const { return Mask & Volatile; } |
265 | bool hasOnlyVolatile() const { return Mask == Volatile; } |
266 | void removeVolatile() { Mask &= ~Volatile; } |
267 | void addVolatile() { Mask |= Volatile; } |
268 | |
269 | bool hasRestrict() const { return Mask & Restrict; } |
270 | bool hasOnlyRestrict() const { return Mask == Restrict; } |
271 | void removeRestrict() { Mask &= ~Restrict; } |
272 | void addRestrict() { Mask |= Restrict; } |
273 | |
274 | bool hasCVRQualifiers() const { return getCVRQualifiers(); } |
275 | unsigned getCVRQualifiers() const { return Mask & CVRMask; } |
276 | unsigned getCVRUQualifiers() const { return Mask & (CVRMask | UMask); } |
277 | |
278 | void setCVRQualifiers(unsigned mask) { |
279 | assert(!(mask & ~CVRMask) && "bitmask contains non-CVR bits")((!(mask & ~CVRMask) && "bitmask contains non-CVR bits" ) ? static_cast<void> (0) : __assert_fail ("!(mask & ~CVRMask) && \"bitmask contains non-CVR bits\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 279, __PRETTY_FUNCTION__)); |
280 | Mask = (Mask & ~CVRMask) | mask; |
281 | } |
282 | void removeCVRQualifiers(unsigned mask) { |
283 | assert(!(mask & ~CVRMask) && "bitmask contains non-CVR bits")((!(mask & ~CVRMask) && "bitmask contains non-CVR bits" ) ? static_cast<void> (0) : __assert_fail ("!(mask & ~CVRMask) && \"bitmask contains non-CVR bits\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 283, __PRETTY_FUNCTION__)); |
284 | Mask &= ~mask; |
285 | } |
286 | void removeCVRQualifiers() { |
287 | removeCVRQualifiers(CVRMask); |
288 | } |
289 | void addCVRQualifiers(unsigned mask) { |
290 | assert(!(mask & ~CVRMask) && "bitmask contains non-CVR bits")((!(mask & ~CVRMask) && "bitmask contains non-CVR bits" ) ? static_cast<void> (0) : __assert_fail ("!(mask & ~CVRMask) && \"bitmask contains non-CVR bits\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 290, __PRETTY_FUNCTION__)); |
291 | Mask |= mask; |
292 | } |
293 | void addCVRUQualifiers(unsigned mask) { |
294 | assert(!(mask & ~CVRMask & ~UMask) && "bitmask contains non-CVRU bits")((!(mask & ~CVRMask & ~UMask) && "bitmask contains non-CVRU bits" ) ? static_cast<void> (0) : __assert_fail ("!(mask & ~CVRMask & ~UMask) && \"bitmask contains non-CVRU bits\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 294, __PRETTY_FUNCTION__)); |
295 | Mask |= mask; |
296 | } |
297 | |
298 | bool hasUnaligned() const { return Mask & UMask; } |
299 | void setUnaligned(bool flag) { |
300 | Mask = (Mask & ~UMask) | (flag ? UMask : 0); |
301 | } |
302 | void removeUnaligned() { Mask &= ~UMask; } |
303 | void addUnaligned() { Mask |= UMask; } |
304 | |
305 | bool hasObjCGCAttr() const { return Mask & GCAttrMask; } |
306 | GC getObjCGCAttr() const { return GC((Mask & GCAttrMask) >> GCAttrShift); } |
307 | void setObjCGCAttr(GC type) { |
308 | Mask = (Mask & ~GCAttrMask) | (type << GCAttrShift); |
309 | } |
310 | void removeObjCGCAttr() { setObjCGCAttr(GCNone); } |
311 | void addObjCGCAttr(GC type) { |
312 | assert(type)((type) ? static_cast<void> (0) : __assert_fail ("type" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 312, __PRETTY_FUNCTION__)); |
313 | setObjCGCAttr(type); |
314 | } |
315 | Qualifiers withoutObjCGCAttr() const { |
316 | Qualifiers qs = *this; |
317 | qs.removeObjCGCAttr(); |
318 | return qs; |
319 | } |
320 | Qualifiers withoutObjCLifetime() const { |
321 | Qualifiers qs = *this; |
322 | qs.removeObjCLifetime(); |
323 | return qs; |
324 | } |
325 | Qualifiers withoutAddressSpace() const { |
326 | Qualifiers qs = *this; |
327 | qs.removeAddressSpace(); |
328 | return qs; |
329 | } |
330 | |
331 | bool hasObjCLifetime() const { return Mask & LifetimeMask; } |
332 | ObjCLifetime getObjCLifetime() const { |
333 | return ObjCLifetime((Mask & LifetimeMask) >> LifetimeShift); |
334 | } |
335 | void setObjCLifetime(ObjCLifetime type) { |
336 | Mask = (Mask & ~LifetimeMask) | (type << LifetimeShift); |
337 | } |
338 | void removeObjCLifetime() { setObjCLifetime(OCL_None); } |
339 | void addObjCLifetime(ObjCLifetime type) { |
340 | assert(type)((type) ? static_cast<void> (0) : __assert_fail ("type" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 340, __PRETTY_FUNCTION__)); |
341 | assert(!hasObjCLifetime())((!hasObjCLifetime()) ? static_cast<void> (0) : __assert_fail ("!hasObjCLifetime()", "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 341, __PRETTY_FUNCTION__)); |
342 | Mask |= (type << LifetimeShift); |
343 | } |
344 | |
345 | /// True if the lifetime is neither None or ExplicitNone. |
346 | bool hasNonTrivialObjCLifetime() const { |
347 | ObjCLifetime lifetime = getObjCLifetime(); |
348 | return (lifetime > OCL_ExplicitNone); |
349 | } |
350 | |
351 | /// True if the lifetime is either strong or weak. |
352 | bool hasStrongOrWeakObjCLifetime() const { |
353 | ObjCLifetime lifetime = getObjCLifetime(); |
354 | return (lifetime == OCL_Strong || lifetime == OCL_Weak); |
355 | } |
356 | |
357 | bool hasAddressSpace() const { return Mask & AddressSpaceMask; } |
358 | LangAS getAddressSpace() const { |
359 | return static_cast<LangAS>(Mask >> AddressSpaceShift); |
360 | } |
361 | bool hasTargetSpecificAddressSpace() const { |
362 | return isTargetAddressSpace(getAddressSpace()); |
363 | } |
364 | /// Get the address space attribute value to be printed by diagnostics. |
365 | unsigned getAddressSpaceAttributePrintValue() const { |
366 | auto Addr = getAddressSpace(); |
367 | // This function is not supposed to be used with language specific |
368 | // address spaces. If that happens, the diagnostic message should consider |
369 | // printing the QualType instead of the address space value. |
370 | assert(Addr == LangAS::Default || hasTargetSpecificAddressSpace())((Addr == LangAS::Default || hasTargetSpecificAddressSpace()) ? static_cast<void> (0) : __assert_fail ("Addr == LangAS::Default || hasTargetSpecificAddressSpace()" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 370, __PRETTY_FUNCTION__)); |
371 | if (Addr != LangAS::Default) |
372 | return toTargetAddressSpace(Addr); |
373 | // TODO: The diagnostic messages where Addr may be 0 should be fixed |
374 | // since it cannot differentiate the situation where 0 denotes the default |
375 | // address space or user specified __attribute__((address_space(0))). |
376 | return 0; |
377 | } |
378 | void setAddressSpace(LangAS space) { |
379 | assert((unsigned)space <= MaxAddressSpace)(((unsigned)space <= MaxAddressSpace) ? static_cast<void > (0) : __assert_fail ("(unsigned)space <= MaxAddressSpace" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 379, __PRETTY_FUNCTION__)); |
380 | Mask = (Mask & ~AddressSpaceMask) |
381 | | (((uint32_t) space) << AddressSpaceShift); |
382 | } |
383 | void removeAddressSpace() { setAddressSpace(LangAS::Default); } |
384 | void addAddressSpace(LangAS space) { |
385 | assert(space != LangAS::Default)((space != LangAS::Default) ? static_cast<void> (0) : __assert_fail ("space != LangAS::Default", "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 385, __PRETTY_FUNCTION__)); |
386 | setAddressSpace(space); |
387 | } |
388 | |
389 | // Fast qualifiers are those that can be allocated directly |
390 | // on a QualType object. |
391 | bool hasFastQualifiers() const { return getFastQualifiers(); } |
392 | unsigned getFastQualifiers() const { return Mask & FastMask; } |
393 | void setFastQualifiers(unsigned mask) { |
394 | assert(!(mask & ~FastMask) && "bitmask contains non-fast qualifier bits")((!(mask & ~FastMask) && "bitmask contains non-fast qualifier bits" ) ? static_cast<void> (0) : __assert_fail ("!(mask & ~FastMask) && \"bitmask contains non-fast qualifier bits\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 394, __PRETTY_FUNCTION__)); |
395 | Mask = (Mask & ~FastMask) | mask; |
396 | } |
397 | void removeFastQualifiers(unsigned mask) { |
398 | assert(!(mask & ~FastMask) && "bitmask contains non-fast qualifier bits")((!(mask & ~FastMask) && "bitmask contains non-fast qualifier bits" ) ? static_cast<void> (0) : __assert_fail ("!(mask & ~FastMask) && \"bitmask contains non-fast qualifier bits\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 398, __PRETTY_FUNCTION__)); |
399 | Mask &= ~mask; |
400 | } |
401 | void removeFastQualifiers() { |
402 | removeFastQualifiers(FastMask); |
403 | } |
404 | void addFastQualifiers(unsigned mask) { |
405 | assert(!(mask & ~FastMask) && "bitmask contains non-fast qualifier bits")((!(mask & ~FastMask) && "bitmask contains non-fast qualifier bits" ) ? static_cast<void> (0) : __assert_fail ("!(mask & ~FastMask) && \"bitmask contains non-fast qualifier bits\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 405, __PRETTY_FUNCTION__)); |
406 | Mask |= mask; |
407 | } |
408 | |
409 | /// Return true if the set contains any qualifiers which require an ExtQuals |
410 | /// node to be allocated. |
411 | bool hasNonFastQualifiers() const { return Mask & ~FastMask; } |
412 | Qualifiers getNonFastQualifiers() const { |
413 | Qualifiers Quals = *this; |
414 | Quals.setFastQualifiers(0); |
415 | return Quals; |
416 | } |
417 | |
418 | /// Return true if the set contains any qualifiers. |
419 | bool hasQualifiers() const { return Mask; } |
420 | bool empty() const { return !Mask; } |
421 | |
422 | /// Add the qualifiers from the given set to this set. |
423 | void addQualifiers(Qualifiers Q) { |
424 | // If the other set doesn't have any non-boolean qualifiers, just |
425 | // bit-or it in. |
426 | if (!(Q.Mask & ~CVRMask)) |
427 | Mask |= Q.Mask; |
428 | else { |
429 | Mask |= (Q.Mask & CVRMask); |
430 | if (Q.hasAddressSpace()) |
431 | addAddressSpace(Q.getAddressSpace()); |
432 | if (Q.hasObjCGCAttr()) |
433 | addObjCGCAttr(Q.getObjCGCAttr()); |
434 | if (Q.hasObjCLifetime()) |
435 | addObjCLifetime(Q.getObjCLifetime()); |
436 | } |
437 | } |
438 | |
439 | /// Remove the qualifiers from the given set from this set. |
440 | void removeQualifiers(Qualifiers Q) { |
441 | // If the other set doesn't have any non-boolean qualifiers, just |
442 | // bit-and the inverse in. |
443 | if (!(Q.Mask & ~CVRMask)) |
444 | Mask &= ~Q.Mask; |
445 | else { |
446 | Mask &= ~(Q.Mask & CVRMask); |
447 | if (getObjCGCAttr() == Q.getObjCGCAttr()) |
448 | removeObjCGCAttr(); |
449 | if (getObjCLifetime() == Q.getObjCLifetime()) |
450 | removeObjCLifetime(); |
451 | if (getAddressSpace() == Q.getAddressSpace()) |
452 | removeAddressSpace(); |
453 | } |
454 | } |
455 | |
456 | /// Add the qualifiers from the given set to this set, given that |
457 | /// they don't conflict. |
458 | void addConsistentQualifiers(Qualifiers qs) { |
459 | assert(getAddressSpace() == qs.getAddressSpace() ||((getAddressSpace() == qs.getAddressSpace() || !hasAddressSpace () || !qs.hasAddressSpace()) ? static_cast<void> (0) : __assert_fail ("getAddressSpace() == qs.getAddressSpace() || !hasAddressSpace() || !qs.hasAddressSpace()" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 460, __PRETTY_FUNCTION__)) |
460 | !hasAddressSpace() || !qs.hasAddressSpace())((getAddressSpace() == qs.getAddressSpace() || !hasAddressSpace () || !qs.hasAddressSpace()) ? static_cast<void> (0) : __assert_fail ("getAddressSpace() == qs.getAddressSpace() || !hasAddressSpace() || !qs.hasAddressSpace()" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 460, __PRETTY_FUNCTION__)); |
461 | assert(getObjCGCAttr() == qs.getObjCGCAttr() ||((getObjCGCAttr() == qs.getObjCGCAttr() || !hasObjCGCAttr() || !qs.hasObjCGCAttr()) ? static_cast<void> (0) : __assert_fail ("getObjCGCAttr() == qs.getObjCGCAttr() || !hasObjCGCAttr() || !qs.hasObjCGCAttr()" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 462, __PRETTY_FUNCTION__)) |
462 | !hasObjCGCAttr() || !qs.hasObjCGCAttr())((getObjCGCAttr() == qs.getObjCGCAttr() || !hasObjCGCAttr() || !qs.hasObjCGCAttr()) ? static_cast<void> (0) : __assert_fail ("getObjCGCAttr() == qs.getObjCGCAttr() || !hasObjCGCAttr() || !qs.hasObjCGCAttr()" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 462, __PRETTY_FUNCTION__)); |
463 | assert(getObjCLifetime() == qs.getObjCLifetime() ||((getObjCLifetime() == qs.getObjCLifetime() || !hasObjCLifetime () || !qs.hasObjCLifetime()) ? static_cast<void> (0) : __assert_fail ("getObjCLifetime() == qs.getObjCLifetime() || !hasObjCLifetime() || !qs.hasObjCLifetime()" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 464, __PRETTY_FUNCTION__)) |
464 | !hasObjCLifetime() || !qs.hasObjCLifetime())((getObjCLifetime() == qs.getObjCLifetime() || !hasObjCLifetime () || !qs.hasObjCLifetime()) ? static_cast<void> (0) : __assert_fail ("getObjCLifetime() == qs.getObjCLifetime() || !hasObjCLifetime() || !qs.hasObjCLifetime()" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 464, __PRETTY_FUNCTION__)); |
465 | Mask |= qs.Mask; |
466 | } |
467 | |
468 | /// Returns true if address space A is equal to or a superset of B. |
469 | /// OpenCL v2.0 defines conversion rules (OpenCLC v2.0 s6.5.5) and notion of |
470 | /// overlapping address spaces. |
471 | /// CL1.1 or CL1.2: |
472 | /// every address space is a superset of itself. |
473 | /// CL2.0 adds: |
474 | /// __generic is a superset of any address space except for __constant. |
475 | static bool isAddressSpaceSupersetOf(LangAS A, LangAS B) { |
476 | // Address spaces must match exactly. |
477 | return A == B || |
478 | // Otherwise in OpenCLC v2.0 s6.5.5: every address space except |
479 | // for __constant can be used as __generic. |
480 | (A == LangAS::opencl_generic && B != LangAS::opencl_constant) || |
481 | // Consider pointer size address spaces to be equivalent to default. |
482 | ((isPtrSizeAddressSpace(A) || A == LangAS::Default) && |
483 | (isPtrSizeAddressSpace(B) || B == LangAS::Default)); |
484 | } |
485 | |
486 | /// Returns true if the address space in these qualifiers is equal to or |
487 | /// a superset of the address space in the argument qualifiers. |
488 | bool isAddressSpaceSupersetOf(Qualifiers other) const { |
489 | return isAddressSpaceSupersetOf(getAddressSpace(), other.getAddressSpace()); |
490 | } |
491 | |
492 | /// Determines if these qualifiers compatibly include another set. |
493 | /// Generally this answers the question of whether an object with the other |
494 | /// qualifiers can be safely used as an object with these qualifiers. |
495 | bool compatiblyIncludes(Qualifiers other) const { |
496 | return isAddressSpaceSupersetOf(other) && |
497 | // ObjC GC qualifiers can match, be added, or be removed, but can't |
498 | // be changed. |
499 | (getObjCGCAttr() == other.getObjCGCAttr() || !hasObjCGCAttr() || |
500 | !other.hasObjCGCAttr()) && |
501 | // ObjC lifetime qualifiers must match exactly. |
502 | getObjCLifetime() == other.getObjCLifetime() && |
503 | // CVR qualifiers may subset. |
504 | (((Mask & CVRMask) | (other.Mask & CVRMask)) == (Mask & CVRMask)) && |
505 | // U qualifier may superset. |
506 | (!other.hasUnaligned() || hasUnaligned()); |
507 | } |
508 | |
509 | /// Determines if these qualifiers compatibly include another set of |
510 | /// qualifiers from the narrow perspective of Objective-C ARC lifetime. |
511 | /// |
512 | /// One set of Objective-C lifetime qualifiers compatibly includes the other |
513 | /// if the lifetime qualifiers match, or if both are non-__weak and the |
514 | /// including set also contains the 'const' qualifier, or both are non-__weak |
515 | /// and one is None (which can only happen in non-ARC modes). |
516 | bool compatiblyIncludesObjCLifetime(Qualifiers other) const { |
517 | if (getObjCLifetime() == other.getObjCLifetime()) |
518 | return true; |
519 | |
520 | if (getObjCLifetime() == OCL_Weak || other.getObjCLifetime() == OCL_Weak) |
521 | return false; |
522 | |
523 | if (getObjCLifetime() == OCL_None || other.getObjCLifetime() == OCL_None) |
524 | return true; |
525 | |
526 | return hasConst(); |
527 | } |
528 | |
529 | /// Determine whether this set of qualifiers is a strict superset of |
530 | /// another set of qualifiers, not considering qualifier compatibility. |
531 | bool isStrictSupersetOf(Qualifiers Other) const; |
532 | |
533 | bool operator==(Qualifiers Other) const { return Mask == Other.Mask; } |
534 | bool operator!=(Qualifiers Other) const { return Mask != Other.Mask; } |
535 | |
536 | explicit operator bool() const { return hasQualifiers(); } |
537 | |
538 | Qualifiers &operator+=(Qualifiers R) { |
539 | addQualifiers(R); |
540 | return *this; |
541 | } |
542 | |
543 | // Union two qualifier sets. If an enumerated qualifier appears |
544 | // in both sets, use the one from the right. |
545 | friend Qualifiers operator+(Qualifiers L, Qualifiers R) { |
546 | L += R; |
547 | return L; |
548 | } |
549 | |
550 | Qualifiers &operator-=(Qualifiers R) { |
551 | removeQualifiers(R); |
552 | return *this; |
553 | } |
554 | |
555 | /// Compute the difference between two qualifier sets. |
556 | friend Qualifiers operator-(Qualifiers L, Qualifiers R) { |
557 | L -= R; |
558 | return L; |
559 | } |
560 | |
561 | std::string getAsString() const; |
562 | std::string getAsString(const PrintingPolicy &Policy) const; |
563 | |
564 | static std::string getAddrSpaceAsString(LangAS AS); |
565 | |
566 | bool isEmptyWhenPrinted(const PrintingPolicy &Policy) const; |
567 | void print(raw_ostream &OS, const PrintingPolicy &Policy, |
568 | bool appendSpaceIfNonEmpty = false) const; |
569 | |
570 | void Profile(llvm::FoldingSetNodeID &ID) const { |
571 | ID.AddInteger(Mask); |
572 | } |
573 | |
574 | private: |
575 | // bits: |0 1 2|3|4 .. 5|6 .. 8|9 ... 31| |
576 | // |C R V|U|GCAttr|Lifetime|AddressSpace| |
577 | uint32_t Mask = 0; |
578 | |
579 | static const uint32_t UMask = 0x8; |
580 | static const uint32_t UShift = 3; |
581 | static const uint32_t GCAttrMask = 0x30; |
582 | static const uint32_t GCAttrShift = 4; |
583 | static const uint32_t LifetimeMask = 0x1C0; |
584 | static const uint32_t LifetimeShift = 6; |
585 | static const uint32_t AddressSpaceMask = |
586 | ~(CVRMask | UMask | GCAttrMask | LifetimeMask); |
587 | static const uint32_t AddressSpaceShift = 9; |
588 | }; |
589 | |
590 | /// A std::pair-like structure for storing a qualified type split |
591 | /// into its local qualifiers and its locally-unqualified type. |
592 | struct SplitQualType { |
593 | /// The locally-unqualified type. |
594 | const Type *Ty = nullptr; |
595 | |
596 | /// The local qualifiers. |
597 | Qualifiers Quals; |
598 | |
599 | SplitQualType() = default; |
600 | SplitQualType(const Type *ty, Qualifiers qs) : Ty(ty), Quals(qs) {} |
601 | |
602 | SplitQualType getSingleStepDesugaredType() const; // end of this file |
603 | |
604 | // Make std::tie work. |
605 | std::pair<const Type *,Qualifiers> asPair() const { |
606 | return std::pair<const Type *, Qualifiers>(Ty, Quals); |
607 | } |
608 | |
609 | friend bool operator==(SplitQualType a, SplitQualType b) { |
610 | return a.Ty == b.Ty && a.Quals == b.Quals; |
611 | } |
612 | friend bool operator!=(SplitQualType a, SplitQualType b) { |
613 | return a.Ty != b.Ty || a.Quals != b.Quals; |
614 | } |
615 | }; |
616 | |
617 | /// The kind of type we are substituting Objective-C type arguments into. |
618 | /// |
619 | /// The kind of substitution affects the replacement of type parameters when |
620 | /// no concrete type information is provided, e.g., when dealing with an |
621 | /// unspecialized type. |
622 | enum class ObjCSubstitutionContext { |
623 | /// An ordinary type. |
624 | Ordinary, |
625 | |
626 | /// The result type of a method or function. |
627 | Result, |
628 | |
629 | /// The parameter type of a method or function. |
630 | Parameter, |
631 | |
632 | /// The type of a property. |
633 | Property, |
634 | |
635 | /// The superclass of a type. |
636 | Superclass, |
637 | }; |
638 | |
639 | /// A (possibly-)qualified type. |
640 | /// |
641 | /// For efficiency, we don't store CV-qualified types as nodes on their |
642 | /// own: instead each reference to a type stores the qualifiers. This |
643 | /// greatly reduces the number of nodes we need to allocate for types (for |
644 | /// example we only need one for 'int', 'const int', 'volatile int', |
645 | /// 'const volatile int', etc). |
646 | /// |
647 | /// As an added efficiency bonus, instead of making this a pair, we |
648 | /// just store the two bits we care about in the low bits of the |
649 | /// pointer. To handle the packing/unpacking, we make QualType be a |
650 | /// simple wrapper class that acts like a smart pointer. A third bit |
651 | /// indicates whether there are extended qualifiers present, in which |
652 | /// case the pointer points to a special structure. |
653 | class QualType { |
654 | friend class QualifierCollector; |
655 | |
656 | // Thankfully, these are efficiently composable. |
657 | llvm::PointerIntPair<llvm::PointerUnion<const Type *, const ExtQuals *>, |
658 | Qualifiers::FastWidth> Value; |
659 | |
660 | const ExtQuals *getExtQualsUnsafe() const { |
661 | return Value.getPointer().get<const ExtQuals*>(); |
662 | } |
663 | |
664 | const Type *getTypePtrUnsafe() const { |
665 | return Value.getPointer().get<const Type*>(); |
666 | } |
667 | |
668 | const ExtQualsTypeCommonBase *getCommonPtr() const { |
669 | assert(!isNull() && "Cannot retrieve a NULL type pointer")((!isNull() && "Cannot retrieve a NULL type pointer") ? static_cast<void> (0) : __assert_fail ("!isNull() && \"Cannot retrieve a NULL type pointer\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 669, __PRETTY_FUNCTION__)); |
670 | auto CommonPtrVal = reinterpret_cast<uintptr_t>(Value.getOpaqueValue()); |
671 | CommonPtrVal &= ~(uintptr_t)((1 << TypeAlignmentInBits) - 1); |
672 | return reinterpret_cast<ExtQualsTypeCommonBase*>(CommonPtrVal); |
673 | } |
674 | |
675 | public: |
676 | QualType() = default; |
677 | QualType(const Type *Ptr, unsigned Quals) : Value(Ptr, Quals) {} |
678 | QualType(const ExtQuals *Ptr, unsigned Quals) : Value(Ptr, Quals) {} |
679 | |
680 | unsigned getLocalFastQualifiers() const { return Value.getInt(); } |
681 | void setLocalFastQualifiers(unsigned Quals) { Value.setInt(Quals); } |
682 | |
683 | /// Retrieves a pointer to the underlying (unqualified) type. |
684 | /// |
685 | /// This function requires that the type not be NULL. If the type might be |
686 | /// NULL, use the (slightly less efficient) \c getTypePtrOrNull(). |
687 | const Type *getTypePtr() const; |
688 | |
689 | const Type *getTypePtrOrNull() const; |
690 | |
691 | /// Retrieves a pointer to the name of the base type. |
692 | const IdentifierInfo *getBaseTypeIdentifier() const; |
693 | |
694 | /// Divides a QualType into its unqualified type and a set of local |
695 | /// qualifiers. |
696 | SplitQualType split() const; |
697 | |
698 | void *getAsOpaquePtr() const { return Value.getOpaqueValue(); } |
699 | |
700 | static QualType getFromOpaquePtr(const void *Ptr) { |
701 | QualType T; |
702 | T.Value.setFromOpaqueValue(const_cast<void*>(Ptr)); |
703 | return T; |
704 | } |
705 | |
706 | const Type &operator*() const { |
707 | return *getTypePtr(); |
708 | } |
709 | |
710 | const Type *operator->() const { |
711 | return getTypePtr(); |
712 | } |
713 | |
714 | bool isCanonical() const; |
715 | bool isCanonicalAsParam() const; |
716 | |
717 | /// Return true if this QualType doesn't point to a type yet. |
718 | bool isNull() const { |
719 | return Value.getPointer().isNull(); |
720 | } |
721 | |
722 | /// Determine whether this particular QualType instance has the |
723 | /// "const" qualifier set, without looking through typedefs that may have |
724 | /// added "const" at a different level. |
725 | bool isLocalConstQualified() const { |
726 | return (getLocalFastQualifiers() & Qualifiers::Const); |
727 | } |
728 | |
729 | /// Determine whether this type is const-qualified. |
730 | bool isConstQualified() const; |
731 | |
732 | /// Determine whether this particular QualType instance has the |
733 | /// "restrict" qualifier set, without looking through typedefs that may have |
734 | /// added "restrict" at a different level. |
735 | bool isLocalRestrictQualified() const { |
736 | return (getLocalFastQualifiers() & Qualifiers::Restrict); |
737 | } |
738 | |
739 | /// Determine whether this type is restrict-qualified. |
740 | bool isRestrictQualified() const; |
741 | |
742 | /// Determine whether this particular QualType instance has the |
743 | /// "volatile" qualifier set, without looking through typedefs that may have |
744 | /// added "volatile" at a different level. |
745 | bool isLocalVolatileQualified() const { |
746 | return (getLocalFastQualifiers() & Qualifiers::Volatile); |
747 | } |
748 | |
749 | /// Determine whether this type is volatile-qualified. |
750 | bool isVolatileQualified() const; |
751 | |
752 | /// Determine whether this particular QualType instance has any |
753 | /// qualifiers, without looking through any typedefs that might add |
754 | /// qualifiers at a different level. |
755 | bool hasLocalQualifiers() const { |
756 | return getLocalFastQualifiers() || hasLocalNonFastQualifiers(); |
757 | } |
758 | |
759 | /// Determine whether this type has any qualifiers. |
760 | bool hasQualifiers() const; |
761 | |
762 | /// Determine whether this particular QualType instance has any |
763 | /// "non-fast" qualifiers, e.g., those that are stored in an ExtQualType |
764 | /// instance. |
765 | bool hasLocalNonFastQualifiers() const { |
766 | return Value.getPointer().is<const ExtQuals*>(); |
767 | } |
768 | |
769 | /// Retrieve the set of qualifiers local to this particular QualType |
770 | /// instance, not including any qualifiers acquired through typedefs or |
771 | /// other sugar. |
772 | Qualifiers getLocalQualifiers() const; |
773 | |
774 | /// Retrieve the set of qualifiers applied to this type. |
775 | Qualifiers getQualifiers() const; |
776 | |
777 | /// Retrieve the set of CVR (const-volatile-restrict) qualifiers |
778 | /// local to this particular QualType instance, not including any qualifiers |
779 | /// acquired through typedefs or other sugar. |
780 | unsigned getLocalCVRQualifiers() const { |
781 | return getLocalFastQualifiers(); |
782 | } |
783 | |
784 | /// Retrieve the set of CVR (const-volatile-restrict) qualifiers |
785 | /// applied to this type. |
786 | unsigned getCVRQualifiers() const; |
787 | |
788 | bool isConstant(const ASTContext& Ctx) const { |
789 | return QualType::isConstant(*this, Ctx); |
790 | } |
791 | |
792 | /// Determine whether this is a Plain Old Data (POD) type (C++ 3.9p10). |
793 | bool isPODType(const ASTContext &Context) const; |
794 | |
795 | /// Return true if this is a POD type according to the rules of the C++98 |
796 | /// standard, regardless of the current compilation's language. |
797 | bool isCXX98PODType(const ASTContext &Context) const; |
798 | |
799 | /// Return true if this is a POD type according to the more relaxed rules |
800 | /// of the C++11 standard, regardless of the current compilation's language. |
801 | /// (C++0x [basic.types]p9). Note that, unlike |
802 | /// CXXRecordDecl::isCXX11StandardLayout, this takes DRs into account. |
803 | bool isCXX11PODType(const ASTContext &Context) const; |
804 | |
805 | /// Return true if this is a trivial type per (C++0x [basic.types]p9) |
806 | bool isTrivialType(const ASTContext &Context) const; |
807 | |
808 | /// Return true if this is a trivially copyable type (C++0x [basic.types]p9) |
809 | bool isTriviallyCopyableType(const ASTContext &Context) const; |
810 | |
811 | |
812 | /// Returns true if it is a class and it might be dynamic. |
813 | bool mayBeDynamicClass() const; |
814 | |
815 | /// Returns true if it is not a class or if the class might not be dynamic. |
816 | bool mayBeNotDynamicClass() const; |
817 | |
818 | // Don't promise in the API that anything besides 'const' can be |
819 | // easily added. |
820 | |
821 | /// Add the `const` type qualifier to this QualType. |
822 | void addConst() { |
823 | addFastQualifiers(Qualifiers::Const); |
824 | } |
825 | QualType withConst() const { |
826 | return withFastQualifiers(Qualifiers::Const); |
827 | } |
828 | |
829 | /// Add the `volatile` type qualifier to this QualType. |
830 | void addVolatile() { |
831 | addFastQualifiers(Qualifiers::Volatile); |
832 | } |
833 | QualType withVolatile() const { |
834 | return withFastQualifiers(Qualifiers::Volatile); |
835 | } |
836 | |
837 | /// Add the `restrict` qualifier to this QualType. |
838 | void addRestrict() { |
839 | addFastQualifiers(Qualifiers::Restrict); |
840 | } |
841 | QualType withRestrict() const { |
842 | return withFastQualifiers(Qualifiers::Restrict); |
843 | } |
844 | |
845 | QualType withCVRQualifiers(unsigned CVR) const { |
846 | return withFastQualifiers(CVR); |
847 | } |
848 | |
849 | void addFastQualifiers(unsigned TQs) { |
850 | assert(!(TQs & ~Qualifiers::FastMask)((!(TQs & ~Qualifiers::FastMask) && "non-fast qualifier bits set in mask!" ) ? static_cast<void> (0) : __assert_fail ("!(TQs & ~Qualifiers::FastMask) && \"non-fast qualifier bits set in mask!\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 851, __PRETTY_FUNCTION__)) |
851 | && "non-fast qualifier bits set in mask!")((!(TQs & ~Qualifiers::FastMask) && "non-fast qualifier bits set in mask!" ) ? static_cast<void> (0) : __assert_fail ("!(TQs & ~Qualifiers::FastMask) && \"non-fast qualifier bits set in mask!\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 851, __PRETTY_FUNCTION__)); |
852 | Value.setInt(Value.getInt() | TQs); |
853 | } |
854 | |
855 | void removeLocalConst(); |
856 | void removeLocalVolatile(); |
857 | void removeLocalRestrict(); |
858 | void removeLocalCVRQualifiers(unsigned Mask); |
859 | |
860 | void removeLocalFastQualifiers() { Value.setInt(0); } |
861 | void removeLocalFastQualifiers(unsigned Mask) { |
862 | assert(!(Mask & ~Qualifiers::FastMask) && "mask has non-fast qualifiers")((!(Mask & ~Qualifiers::FastMask) && "mask has non-fast qualifiers" ) ? static_cast<void> (0) : __assert_fail ("!(Mask & ~Qualifiers::FastMask) && \"mask has non-fast qualifiers\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 862, __PRETTY_FUNCTION__)); |
863 | Value.setInt(Value.getInt() & ~Mask); |
864 | } |
865 | |
866 | // Creates a type with the given qualifiers in addition to any |
867 | // qualifiers already on this type. |
868 | QualType withFastQualifiers(unsigned TQs) const { |
869 | QualType T = *this; |
870 | T.addFastQualifiers(TQs); |
871 | return T; |
872 | } |
873 | |
874 | // Creates a type with exactly the given fast qualifiers, removing |
875 | // any existing fast qualifiers. |
876 | QualType withExactLocalFastQualifiers(unsigned TQs) const { |
877 | return withoutLocalFastQualifiers().withFastQualifiers(TQs); |
878 | } |
879 | |
880 | // Removes fast qualifiers, but leaves any extended qualifiers in place. |
881 | QualType withoutLocalFastQualifiers() const { |
882 | QualType T = *this; |
883 | T.removeLocalFastQualifiers(); |
884 | return T; |
885 | } |
886 | |
887 | QualType getCanonicalType() const; |
888 | |
889 | /// Return this type with all of the instance-specific qualifiers |
890 | /// removed, but without removing any qualifiers that may have been applied |
891 | /// through typedefs. |
892 | QualType getLocalUnqualifiedType() const { return QualType(getTypePtr(), 0); } |
893 | |
894 | /// Retrieve the unqualified variant of the given type, |
895 | /// removing as little sugar as possible. |
896 | /// |
897 | /// This routine looks through various kinds of sugar to find the |
898 | /// least-desugared type that is unqualified. For example, given: |
899 | /// |
900 | /// \code |
901 | /// typedef int Integer; |
902 | /// typedef const Integer CInteger; |
903 | /// typedef CInteger DifferenceType; |
904 | /// \endcode |
905 | /// |
906 | /// Executing \c getUnqualifiedType() on the type \c DifferenceType will |
907 | /// desugar until we hit the type \c Integer, which has no qualifiers on it. |
908 | /// |
909 | /// The resulting type might still be qualified if it's sugar for an array |
910 | /// type. To strip qualifiers even from within a sugared array type, use |
911 | /// ASTContext::getUnqualifiedArrayType. |
912 | inline QualType getUnqualifiedType() const; |
913 | |
914 | /// Retrieve the unqualified variant of the given type, removing as little |
915 | /// sugar as possible. |
916 | /// |
917 | /// Like getUnqualifiedType(), but also returns the set of |
918 | /// qualifiers that were built up. |
919 | /// |
920 | /// The resulting type might still be qualified if it's sugar for an array |
921 | /// type. To strip qualifiers even from within a sugared array type, use |
922 | /// ASTContext::getUnqualifiedArrayType. |
923 | inline SplitQualType getSplitUnqualifiedType() const; |
924 | |
925 | /// Determine whether this type is more qualified than the other |
926 | /// given type, requiring exact equality for non-CVR qualifiers. |
927 | bool isMoreQualifiedThan(QualType Other) const; |
928 | |
929 | /// Determine whether this type is at least as qualified as the other |
930 | /// given type, requiring exact equality for non-CVR qualifiers. |
931 | bool isAtLeastAsQualifiedAs(QualType Other) const; |
932 | |
933 | QualType getNonReferenceType() const; |
934 | |
935 | /// Determine the type of a (typically non-lvalue) expression with the |
936 | /// specified result type. |
937 | /// |
938 | /// This routine should be used for expressions for which the return type is |
939 | /// explicitly specified (e.g., in a cast or call) and isn't necessarily |
940 | /// an lvalue. It removes a top-level reference (since there are no |
941 | /// expressions of reference type) and deletes top-level cvr-qualifiers |
942 | /// from non-class types (in C++) or all types (in C). |
943 | QualType getNonLValueExprType(const ASTContext &Context) const; |
944 | |
945 | /// Return the specified type with any "sugar" removed from |
946 | /// the type. This takes off typedefs, typeof's etc. If the outer level of |
947 | /// the type is already concrete, it returns it unmodified. This is similar |
948 | /// to getting the canonical type, but it doesn't remove *all* typedefs. For |
949 | /// example, it returns "T*" as "T*", (not as "int*"), because the pointer is |
950 | /// concrete. |
951 | /// |
952 | /// Qualifiers are left in place. |
953 | QualType getDesugaredType(const ASTContext &Context) const { |
954 | return getDesugaredType(*this, Context); |
955 | } |
956 | |
957 | SplitQualType getSplitDesugaredType() const { |
958 | return getSplitDesugaredType(*this); |
959 | } |
960 | |
961 | /// Return the specified type with one level of "sugar" removed from |
962 | /// the type. |
963 | /// |
964 | /// This routine takes off the first typedef, typeof, etc. If the outer level |
965 | /// of the type is already concrete, it returns it unmodified. |
966 | QualType getSingleStepDesugaredType(const ASTContext &Context) const { |
967 | return getSingleStepDesugaredTypeImpl(*this, Context); |
968 | } |
969 | |
970 | /// Returns the specified type after dropping any |
971 | /// outer-level parentheses. |
972 | QualType IgnoreParens() const { |
973 | if (isa<ParenType>(*this)) |
974 | return QualType::IgnoreParens(*this); |
975 | return *this; |
976 | } |
977 | |
978 | /// Indicate whether the specified types and qualifiers are identical. |
979 | friend bool operator==(const QualType &LHS, const QualType &RHS) { |
980 | return LHS.Value == RHS.Value; |
981 | } |
982 | friend bool operator!=(const QualType &LHS, const QualType &RHS) { |
983 | return LHS.Value != RHS.Value; |
984 | } |
985 | friend bool operator<(const QualType &LHS, const QualType &RHS) { |
986 | return LHS.Value < RHS.Value; |
987 | } |
988 | |
989 | static std::string getAsString(SplitQualType split, |
990 | const PrintingPolicy &Policy) { |
991 | return getAsString(split.Ty, split.Quals, Policy); |
992 | } |
993 | static std::string getAsString(const Type *ty, Qualifiers qs, |
994 | const PrintingPolicy &Policy); |
995 | |
996 | std::string getAsString() const; |
997 | std::string getAsString(const PrintingPolicy &Policy) const; |
998 | |
999 | void print(raw_ostream &OS, const PrintingPolicy &Policy, |
1000 | const Twine &PlaceHolder = Twine(), |
1001 | unsigned Indentation = 0) const; |
1002 | |
1003 | static void print(SplitQualType split, raw_ostream &OS, |
1004 | const PrintingPolicy &policy, const Twine &PlaceHolder, |
1005 | unsigned Indentation = 0) { |
1006 | return print(split.Ty, split.Quals, OS, policy, PlaceHolder, Indentation); |
1007 | } |
1008 | |
1009 | static void print(const Type *ty, Qualifiers qs, |
1010 | raw_ostream &OS, const PrintingPolicy &policy, |
1011 | const Twine &PlaceHolder, |
1012 | unsigned Indentation = 0); |
1013 | |
1014 | void getAsStringInternal(std::string &Str, |
1015 | const PrintingPolicy &Policy) const; |
1016 | |
1017 | static void getAsStringInternal(SplitQualType split, std::string &out, |
1018 | const PrintingPolicy &policy) { |
1019 | return getAsStringInternal(split.Ty, split.Quals, out, policy); |
1020 | } |
1021 | |
1022 | static void getAsStringInternal(const Type *ty, Qualifiers qs, |
1023 | std::string &out, |
1024 | const PrintingPolicy &policy); |
1025 | |
1026 | class StreamedQualTypeHelper { |
1027 | const QualType &T; |
1028 | const PrintingPolicy &Policy; |
1029 | const Twine &PlaceHolder; |
1030 | unsigned Indentation; |
1031 | |
1032 | public: |
1033 | StreamedQualTypeHelper(const QualType &T, const PrintingPolicy &Policy, |
1034 | const Twine &PlaceHolder, unsigned Indentation) |
1035 | : T(T), Policy(Policy), PlaceHolder(PlaceHolder), |
1036 | Indentation(Indentation) {} |
1037 | |
1038 | friend raw_ostream &operator<<(raw_ostream &OS, |
1039 | const StreamedQualTypeHelper &SQT) { |
1040 | SQT.T.print(OS, SQT.Policy, SQT.PlaceHolder, SQT.Indentation); |
1041 | return OS; |
1042 | } |
1043 | }; |
1044 | |
1045 | StreamedQualTypeHelper stream(const PrintingPolicy &Policy, |
1046 | const Twine &PlaceHolder = Twine(), |
1047 | unsigned Indentation = 0) const { |
1048 | return StreamedQualTypeHelper(*this, Policy, PlaceHolder, Indentation); |
1049 | } |
1050 | |
1051 | void dump(const char *s) const; |
1052 | void dump() const; |
1053 | void dump(llvm::raw_ostream &OS) const; |
1054 | |
1055 | void Profile(llvm::FoldingSetNodeID &ID) const { |
1056 | ID.AddPointer(getAsOpaquePtr()); |
1057 | } |
1058 | |
1059 | /// Check if this type has any address space qualifier. |
1060 | inline bool hasAddressSpace() const; |
1061 | |
1062 | /// Return the address space of this type. |
1063 | inline LangAS getAddressSpace() const; |
1064 | |
1065 | /// Returns gc attribute of this type. |
1066 | inline Qualifiers::GC getObjCGCAttr() const; |
1067 | |
1068 | /// true when Type is objc's weak. |
1069 | bool isObjCGCWeak() const { |
1070 | return getObjCGCAttr() == Qualifiers::Weak; |
1071 | } |
1072 | |
1073 | /// true when Type is objc's strong. |
1074 | bool isObjCGCStrong() const { |
1075 | return getObjCGCAttr() == Qualifiers::Strong; |
1076 | } |
1077 | |
1078 | /// Returns lifetime attribute of this type. |
1079 | Qualifiers::ObjCLifetime getObjCLifetime() const { |
1080 | return getQualifiers().getObjCLifetime(); |
1081 | } |
1082 | |
1083 | bool hasNonTrivialObjCLifetime() const { |
1084 | return getQualifiers().hasNonTrivialObjCLifetime(); |
1085 | } |
1086 | |
1087 | bool hasStrongOrWeakObjCLifetime() const { |
1088 | return getQualifiers().hasStrongOrWeakObjCLifetime(); |
1089 | } |
1090 | |
1091 | // true when Type is objc's weak and weak is enabled but ARC isn't. |
1092 | bool isNonWeakInMRRWithObjCWeak(const ASTContext &Context) const; |
1093 | |
1094 | enum PrimitiveDefaultInitializeKind { |
1095 | /// The type does not fall into any of the following categories. Note that |
1096 | /// this case is zero-valued so that values of this enum can be used as a |
1097 | /// boolean condition for non-triviality. |
1098 | PDIK_Trivial, |
1099 | |
1100 | /// The type is an Objective-C retainable pointer type that is qualified |
1101 | /// with the ARC __strong qualifier. |
1102 | PDIK_ARCStrong, |
1103 | |
1104 | /// The type is an Objective-C retainable pointer type that is qualified |
1105 | /// with the ARC __weak qualifier. |
1106 | PDIK_ARCWeak, |
1107 | |
1108 | /// The type is a struct containing a field whose type is not PCK_Trivial. |
1109 | PDIK_Struct |
1110 | }; |
1111 | |
1112 | /// Functions to query basic properties of non-trivial C struct types. |
1113 | |
1114 | /// Check if this is a non-trivial type that would cause a C struct |
1115 | /// transitively containing this type to be non-trivial to default initialize |
1116 | /// and return the kind. |
1117 | PrimitiveDefaultInitializeKind |
1118 | isNonTrivialToPrimitiveDefaultInitialize() const; |
1119 | |
1120 | enum PrimitiveCopyKind { |
1121 | /// The type does not fall into any of the following categories. Note that |
1122 | /// this case is zero-valued so that values of this enum can be used as a |
1123 | /// boolean condition for non-triviality. |
1124 | PCK_Trivial, |
1125 | |
1126 | /// The type would be trivial except that it is volatile-qualified. Types |
1127 | /// that fall into one of the other non-trivial cases may additionally be |
1128 | /// volatile-qualified. |
1129 | PCK_VolatileTrivial, |
1130 | |
1131 | /// The type is an Objective-C retainable pointer type that is qualified |
1132 | /// with the ARC __strong qualifier. |
1133 | PCK_ARCStrong, |
1134 | |
1135 | /// The type is an Objective-C retainable pointer type that is qualified |
1136 | /// with the ARC __weak qualifier. |
1137 | PCK_ARCWeak, |
1138 | |
1139 | /// The type is a struct containing a field whose type is neither |
1140 | /// PCK_Trivial nor PCK_VolatileTrivial. |
1141 | /// Note that a C++ struct type does not necessarily match this; C++ copying |
1142 | /// semantics are too complex to express here, in part because they depend |
1143 | /// on the exact constructor or assignment operator that is chosen by |
1144 | /// overload resolution to do the copy. |
1145 | PCK_Struct |
1146 | }; |
1147 | |
1148 | /// Check if this is a non-trivial type that would cause a C struct |
1149 | /// transitively containing this type to be non-trivial to copy and return the |
1150 | /// kind. |
1151 | PrimitiveCopyKind isNonTrivialToPrimitiveCopy() const; |
1152 | |
1153 | /// Check if this is a non-trivial type that would cause a C struct |
1154 | /// transitively containing this type to be non-trivial to destructively |
1155 | /// move and return the kind. Destructive move in this context is a C++-style |
1156 | /// move in which the source object is placed in a valid but unspecified state |
1157 | /// after it is moved, as opposed to a truly destructive move in which the |
1158 | /// source object is placed in an uninitialized state. |
1159 | PrimitiveCopyKind isNonTrivialToPrimitiveDestructiveMove() const; |
1160 | |
1161 | enum DestructionKind { |
1162 | DK_none, |
1163 | DK_cxx_destructor, |
1164 | DK_objc_strong_lifetime, |
1165 | DK_objc_weak_lifetime, |
1166 | DK_nontrivial_c_struct |
1167 | }; |
1168 | |
1169 | /// Returns a nonzero value if objects of this type require |
1170 | /// non-trivial work to clean up after. Non-zero because it's |
1171 | /// conceivable that qualifiers (objc_gc(weak)?) could make |
1172 | /// something require destruction. |
1173 | DestructionKind isDestructedType() const { |
1174 | return isDestructedTypeImpl(*this); |
1175 | } |
1176 | |
1177 | /// Check if this is or contains a C union that is non-trivial to |
1178 | /// default-initialize, which is a union that has a member that is non-trivial |
1179 | /// to default-initialize. If this returns true, |
1180 | /// isNonTrivialToPrimitiveDefaultInitialize returns PDIK_Struct. |
1181 | bool hasNonTrivialToPrimitiveDefaultInitializeCUnion() const; |
1182 | |
1183 | /// Check if this is or contains a C union that is non-trivial to destruct, |
1184 | /// which is a union that has a member that is non-trivial to destruct. If |
1185 | /// this returns true, isDestructedType returns DK_nontrivial_c_struct. |
1186 | bool hasNonTrivialToPrimitiveDestructCUnion() const; |
1187 | |
1188 | /// Check if this is or contains a C union that is non-trivial to copy, which |
1189 | /// is a union that has a member that is non-trivial to copy. If this returns |
1190 | /// true, isNonTrivialToPrimitiveCopy returns PCK_Struct. |
1191 | bool hasNonTrivialToPrimitiveCopyCUnion() const; |
1192 | |
1193 | /// Determine whether expressions of the given type are forbidden |
1194 | /// from being lvalues in C. |
1195 | /// |
1196 | /// The expression types that are forbidden to be lvalues are: |
1197 | /// - 'void', but not qualified void |
1198 | /// - function types |
1199 | /// |
1200 | /// The exact rule here is C99 6.3.2.1: |
1201 | /// An lvalue is an expression with an object type or an incomplete |
1202 | /// type other than void. |
1203 | bool isCForbiddenLValueType() const; |
1204 | |
1205 | /// Substitute type arguments for the Objective-C type parameters used in the |
1206 | /// subject type. |
1207 | /// |
1208 | /// \param ctx ASTContext in which the type exists. |
1209 | /// |
1210 | /// \param typeArgs The type arguments that will be substituted for the |
1211 | /// Objective-C type parameters in the subject type, which are generally |
1212 | /// computed via \c Type::getObjCSubstitutions. If empty, the type |
1213 | /// parameters will be replaced with their bounds or id/Class, as appropriate |
1214 | /// for the context. |
1215 | /// |
1216 | /// \param context The context in which the subject type was written. |
1217 | /// |
1218 | /// \returns the resulting type. |
1219 | QualType substObjCTypeArgs(ASTContext &ctx, |
1220 | ArrayRef<QualType> typeArgs, |
1221 | ObjCSubstitutionContext context) const; |
1222 | |
1223 | /// Substitute type arguments from an object type for the Objective-C type |
1224 | /// parameters used in the subject type. |
1225 | /// |
1226 | /// This operation combines the computation of type arguments for |
1227 | /// substitution (\c Type::getObjCSubstitutions) with the actual process of |
1228 | /// substitution (\c QualType::substObjCTypeArgs) for the convenience of |
1229 | /// callers that need to perform a single substitution in isolation. |
1230 | /// |
1231 | /// \param objectType The type of the object whose member type we're |
1232 | /// substituting into. For example, this might be the receiver of a message |
1233 | /// or the base of a property access. |
1234 | /// |
1235 | /// \param dc The declaration context from which the subject type was |
1236 | /// retrieved, which indicates (for example) which type parameters should |
1237 | /// be substituted. |
1238 | /// |
1239 | /// \param context The context in which the subject type was written. |
1240 | /// |
1241 | /// \returns the subject type after replacing all of the Objective-C type |
1242 | /// parameters with their corresponding arguments. |
1243 | QualType substObjCMemberType(QualType objectType, |
1244 | const DeclContext *dc, |
1245 | ObjCSubstitutionContext context) const; |
1246 | |
1247 | /// Strip Objective-C "__kindof" types from the given type. |
1248 | QualType stripObjCKindOfType(const ASTContext &ctx) const; |
1249 | |
1250 | /// Remove all qualifiers including _Atomic. |
1251 | QualType getAtomicUnqualifiedType() const; |
1252 | |
1253 | private: |
1254 | // These methods are implemented in a separate translation unit; |
1255 | // "static"-ize them to avoid creating temporary QualTypes in the |
1256 | // caller. |
1257 | static bool isConstant(QualType T, const ASTContext& Ctx); |
1258 | static QualType getDesugaredType(QualType T, const ASTContext &Context); |
1259 | static SplitQualType getSplitDesugaredType(QualType T); |
1260 | static SplitQualType getSplitUnqualifiedTypeImpl(QualType type); |
1261 | static QualType getSingleStepDesugaredTypeImpl(QualType type, |
1262 | const ASTContext &C); |
1263 | static QualType IgnoreParens(QualType T); |
1264 | static DestructionKind isDestructedTypeImpl(QualType type); |
1265 | |
1266 | /// Check if \param RD is or contains a non-trivial C union. |
1267 | static bool hasNonTrivialToPrimitiveDefaultInitializeCUnion(const RecordDecl *RD); |
1268 | static bool hasNonTrivialToPrimitiveDestructCUnion(const RecordDecl *RD); |
1269 | static bool hasNonTrivialToPrimitiveCopyCUnion(const RecordDecl *RD); |
1270 | }; |
1271 | |
1272 | } // namespace clang |
1273 | |
1274 | namespace llvm { |
1275 | |
1276 | /// Implement simplify_type for QualType, so that we can dyn_cast from QualType |
1277 | /// to a specific Type class. |
1278 | template<> struct simplify_type< ::clang::QualType> { |
1279 | using SimpleType = const ::clang::Type *; |
1280 | |
1281 | static SimpleType getSimplifiedValue(::clang::QualType Val) { |
1282 | return Val.getTypePtr(); |
1283 | } |
1284 | }; |
1285 | |
1286 | // Teach SmallPtrSet that QualType is "basically a pointer". |
1287 | template<> |
1288 | struct PointerLikeTypeTraits<clang::QualType> { |
1289 | static inline void *getAsVoidPointer(clang::QualType P) { |
1290 | return P.getAsOpaquePtr(); |
1291 | } |
1292 | |
1293 | static inline clang::QualType getFromVoidPointer(void *P) { |
1294 | return clang::QualType::getFromOpaquePtr(P); |
1295 | } |
1296 | |
1297 | // Various qualifiers go in low bits. |
1298 | enum { NumLowBitsAvailable = 0 }; |
1299 | }; |
1300 | |
1301 | } // namespace llvm |
1302 | |
1303 | namespace clang { |
1304 | |
1305 | /// Base class that is common to both the \c ExtQuals and \c Type |
1306 | /// classes, which allows \c QualType to access the common fields between the |
1307 | /// two. |
1308 | class ExtQualsTypeCommonBase { |
1309 | friend class ExtQuals; |
1310 | friend class QualType; |
1311 | friend class Type; |
1312 | |
1313 | /// The "base" type of an extended qualifiers type (\c ExtQuals) or |
1314 | /// a self-referential pointer (for \c Type). |
1315 | /// |
1316 | /// This pointer allows an efficient mapping from a QualType to its |
1317 | /// underlying type pointer. |
1318 | const Type *const BaseType; |
1319 | |
1320 | /// The canonical type of this type. A QualType. |
1321 | QualType CanonicalType; |
1322 | |
1323 | ExtQualsTypeCommonBase(const Type *baseType, QualType canon) |
1324 | : BaseType(baseType), CanonicalType(canon) {} |
1325 | }; |
1326 | |
1327 | /// We can encode up to four bits in the low bits of a |
1328 | /// type pointer, but there are many more type qualifiers that we want |
1329 | /// to be able to apply to an arbitrary type. Therefore we have this |
1330 | /// struct, intended to be heap-allocated and used by QualType to |
1331 | /// store qualifiers. |
1332 | /// |
1333 | /// The current design tags the 'const', 'restrict', and 'volatile' qualifiers |
1334 | /// in three low bits on the QualType pointer; a fourth bit records whether |
1335 | /// the pointer is an ExtQuals node. The extended qualifiers (address spaces, |
1336 | /// Objective-C GC attributes) are much more rare. |
1337 | class ExtQuals : public ExtQualsTypeCommonBase, public llvm::FoldingSetNode { |
1338 | // NOTE: changing the fast qualifiers should be straightforward as |
1339 | // long as you don't make 'const' non-fast. |
1340 | // 1. Qualifiers: |
1341 | // a) Modify the bitmasks (Qualifiers::TQ and DeclSpec::TQ). |
1342 | // Fast qualifiers must occupy the low-order bits. |
1343 | // b) Update Qualifiers::FastWidth and FastMask. |
1344 | // 2. QualType: |
1345 | // a) Update is{Volatile,Restrict}Qualified(), defined inline. |
1346 | // b) Update remove{Volatile,Restrict}, defined near the end of |
1347 | // this header. |
1348 | // 3. ASTContext: |
1349 | // a) Update get{Volatile,Restrict}Type. |
1350 | |
1351 | /// The immutable set of qualifiers applied by this node. Always contains |
1352 | /// extended qualifiers. |
1353 | Qualifiers Quals; |
1354 | |
1355 | ExtQuals *this_() { return this; } |
1356 | |
1357 | public: |
1358 | ExtQuals(const Type *baseType, QualType canon, Qualifiers quals) |
1359 | : ExtQualsTypeCommonBase(baseType, |
1360 | canon.isNull() ? QualType(this_(), 0) : canon), |
1361 | Quals(quals) { |
1362 | assert(Quals.hasNonFastQualifiers()((Quals.hasNonFastQualifiers() && "ExtQuals created with no fast qualifiers" ) ? static_cast<void> (0) : __assert_fail ("Quals.hasNonFastQualifiers() && \"ExtQuals created with no fast qualifiers\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 1363, __PRETTY_FUNCTION__)) |
1363 | && "ExtQuals created with no fast qualifiers")((Quals.hasNonFastQualifiers() && "ExtQuals created with no fast qualifiers" ) ? static_cast<void> (0) : __assert_fail ("Quals.hasNonFastQualifiers() && \"ExtQuals created with no fast qualifiers\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 1363, __PRETTY_FUNCTION__)); |
1364 | assert(!Quals.hasFastQualifiers()((!Quals.hasFastQualifiers() && "ExtQuals created with fast qualifiers" ) ? static_cast<void> (0) : __assert_fail ("!Quals.hasFastQualifiers() && \"ExtQuals created with fast qualifiers\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 1365, __PRETTY_FUNCTION__)) |
1365 | && "ExtQuals created with fast qualifiers")((!Quals.hasFastQualifiers() && "ExtQuals created with fast qualifiers" ) ? static_cast<void> (0) : __assert_fail ("!Quals.hasFastQualifiers() && \"ExtQuals created with fast qualifiers\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 1365, __PRETTY_FUNCTION__)); |
1366 | } |
1367 | |
1368 | Qualifiers getQualifiers() const { return Quals; } |
1369 | |
1370 | bool hasObjCGCAttr() const { return Quals.hasObjCGCAttr(); } |
1371 | Qualifiers::GC getObjCGCAttr() const { return Quals.getObjCGCAttr(); } |
1372 | |
1373 | bool hasObjCLifetime() const { return Quals.hasObjCLifetime(); } |
1374 | Qualifiers::ObjCLifetime getObjCLifetime() const { |
1375 | return Quals.getObjCLifetime(); |
1376 | } |
1377 | |
1378 | bool hasAddressSpace() const { return Quals.hasAddressSpace(); } |
1379 | LangAS getAddressSpace() const { return Quals.getAddressSpace(); } |
1380 | |
1381 | const Type *getBaseType() const { return BaseType; } |
1382 | |
1383 | public: |
1384 | void Profile(llvm::FoldingSetNodeID &ID) const { |
1385 | Profile(ID, getBaseType(), Quals); |
1386 | } |
1387 | |
1388 | static void Profile(llvm::FoldingSetNodeID &ID, |
1389 | const Type *BaseType, |
1390 | Qualifiers Quals) { |
1391 | assert(!Quals.hasFastQualifiers() && "fast qualifiers in ExtQuals hash!")((!Quals.hasFastQualifiers() && "fast qualifiers in ExtQuals hash!" ) ? static_cast<void> (0) : __assert_fail ("!Quals.hasFastQualifiers() && \"fast qualifiers in ExtQuals hash!\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 1391, __PRETTY_FUNCTION__)); |
1392 | ID.AddPointer(BaseType); |
1393 | Quals.Profile(ID); |
1394 | } |
1395 | }; |
1396 | |
1397 | /// The kind of C++11 ref-qualifier associated with a function type. |
1398 | /// This determines whether a member function's "this" object can be an |
1399 | /// lvalue, rvalue, or neither. |
1400 | enum RefQualifierKind { |
1401 | /// No ref-qualifier was provided. |
1402 | RQ_None = 0, |
1403 | |
1404 | /// An lvalue ref-qualifier was provided (\c &). |
1405 | RQ_LValue, |
1406 | |
1407 | /// An rvalue ref-qualifier was provided (\c &&). |
1408 | RQ_RValue |
1409 | }; |
1410 | |
1411 | /// Which keyword(s) were used to create an AutoType. |
1412 | enum class AutoTypeKeyword { |
1413 | /// auto |
1414 | Auto, |
1415 | |
1416 | /// decltype(auto) |
1417 | DecltypeAuto, |
1418 | |
1419 | /// __auto_type (GNU extension) |
1420 | GNUAutoType |
1421 | }; |
1422 | |
1423 | /// The base class of the type hierarchy. |
1424 | /// |
1425 | /// A central concept with types is that each type always has a canonical |
1426 | /// type. A canonical type is the type with any typedef names stripped out |
1427 | /// of it or the types it references. For example, consider: |
1428 | /// |
1429 | /// typedef int foo; |
1430 | /// typedef foo* bar; |
1431 | /// 'int *' 'foo *' 'bar' |
1432 | /// |
1433 | /// There will be a Type object created for 'int'. Since int is canonical, its |
1434 | /// CanonicalType pointer points to itself. There is also a Type for 'foo' (a |
1435 | /// TypedefType). Its CanonicalType pointer points to the 'int' Type. Next |
1436 | /// there is a PointerType that represents 'int*', which, like 'int', is |
1437 | /// canonical. Finally, there is a PointerType type for 'foo*' whose canonical |
1438 | /// type is 'int*', and there is a TypedefType for 'bar', whose canonical type |
1439 | /// is also 'int*'. |
1440 | /// |
1441 | /// Non-canonical types are useful for emitting diagnostics, without losing |
1442 | /// information about typedefs being used. Canonical types are useful for type |
1443 | /// comparisons (they allow by-pointer equality tests) and useful for reasoning |
1444 | /// about whether something has a particular form (e.g. is a function type), |
1445 | /// because they implicitly, recursively, strip all typedefs out of a type. |
1446 | /// |
1447 | /// Types, once created, are immutable. |
1448 | /// |
1449 | class alignas(8) Type : public ExtQualsTypeCommonBase { |
1450 | public: |
1451 | enum TypeClass { |
1452 | #define TYPE(Class, Base) Class, |
1453 | #define LAST_TYPE(Class) TypeLast = Class |
1454 | #define ABSTRACT_TYPE(Class, Base) |
1455 | #include "clang/AST/TypeNodes.inc" |
1456 | }; |
1457 | |
1458 | private: |
1459 | /// Bitfields required by the Type class. |
1460 | class TypeBitfields { |
1461 | friend class Type; |
1462 | template <class T> friend class TypePropertyCache; |
1463 | |
1464 | /// TypeClass bitfield - Enum that specifies what subclass this belongs to. |
1465 | unsigned TC : 8; |
1466 | |
1467 | /// Whether this type is a dependent type (C++ [temp.dep.type]). |
1468 | unsigned Dependent : 1; |
1469 | |
1470 | /// Whether this type somehow involves a template parameter, even |
1471 | /// if the resolution of the type does not depend on a template parameter. |
1472 | unsigned InstantiationDependent : 1; |
1473 | |
1474 | /// Whether this type is a variably-modified type (C99 6.7.5). |
1475 | unsigned VariablyModified : 1; |
1476 | |
1477 | /// Whether this type contains an unexpanded parameter pack |
1478 | /// (for C++11 variadic templates). |
1479 | unsigned ContainsUnexpandedParameterPack : 1; |
1480 | |
1481 | /// True if the cache (i.e. the bitfields here starting with |
1482 | /// 'Cache') is valid. |
1483 | mutable unsigned CacheValid : 1; |
1484 | |
1485 | /// Linkage of this type. |
1486 | mutable unsigned CachedLinkage : 3; |
1487 | |
1488 | /// Whether this type involves and local or unnamed types. |
1489 | mutable unsigned CachedLocalOrUnnamed : 1; |
1490 | |
1491 | /// Whether this type comes from an AST file. |
1492 | mutable unsigned FromAST : 1; |
1493 | |
1494 | bool isCacheValid() const { |
1495 | return CacheValid; |
1496 | } |
1497 | |
1498 | Linkage getLinkage() const { |
1499 | assert(isCacheValid() && "getting linkage from invalid cache")((isCacheValid() && "getting linkage from invalid cache" ) ? static_cast<void> (0) : __assert_fail ("isCacheValid() && \"getting linkage from invalid cache\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 1499, __PRETTY_FUNCTION__)); |
1500 | return static_cast<Linkage>(CachedLinkage); |
1501 | } |
1502 | |
1503 | bool hasLocalOrUnnamedType() const { |
1504 | assert(isCacheValid() && "getting linkage from invalid cache")((isCacheValid() && "getting linkage from invalid cache" ) ? static_cast<void> (0) : __assert_fail ("isCacheValid() && \"getting linkage from invalid cache\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 1504, __PRETTY_FUNCTION__)); |
1505 | return CachedLocalOrUnnamed; |
1506 | } |
1507 | }; |
1508 | enum { NumTypeBits = 18 }; |
1509 | |
1510 | protected: |
1511 | // These classes allow subclasses to somewhat cleanly pack bitfields |
1512 | // into Type. |
1513 | |
1514 | class ArrayTypeBitfields { |
1515 | friend class ArrayType; |
1516 | |
1517 | unsigned : NumTypeBits; |
1518 | |
1519 | /// CVR qualifiers from declarations like |
1520 | /// 'int X[static restrict 4]'. For function parameters only. |
1521 | unsigned IndexTypeQuals : 3; |
1522 | |
1523 | /// Storage class qualifiers from declarations like |
1524 | /// 'int X[static restrict 4]'. For function parameters only. |
1525 | /// Actually an ArrayType::ArraySizeModifier. |
1526 | unsigned SizeModifier : 3; |
1527 | }; |
1528 | |
1529 | class ConstantArrayTypeBitfields { |
1530 | friend class ConstantArrayType; |
1531 | |
1532 | unsigned : NumTypeBits + 3 + 3; |
1533 | |
1534 | /// Whether we have a stored size expression. |
1535 | unsigned HasStoredSizeExpr : 1; |
1536 | }; |
1537 | |
1538 | class BuiltinTypeBitfields { |
1539 | friend class BuiltinType; |
1540 | |
1541 | unsigned : NumTypeBits; |
1542 | |
1543 | /// The kind (BuiltinType::Kind) of builtin type this is. |
1544 | unsigned Kind : 8; |
1545 | }; |
1546 | |
1547 | /// FunctionTypeBitfields store various bits belonging to FunctionProtoType. |
1548 | /// Only common bits are stored here. Additional uncommon bits are stored |
1549 | /// in a trailing object after FunctionProtoType. |
1550 | class FunctionTypeBitfields { |
1551 | friend class FunctionProtoType; |
1552 | friend class FunctionType; |
1553 | |
1554 | unsigned : NumTypeBits; |
1555 | |
1556 | /// Extra information which affects how the function is called, like |
1557 | /// regparm and the calling convention. |
1558 | unsigned ExtInfo : 12; |
1559 | |
1560 | /// The ref-qualifier associated with a \c FunctionProtoType. |
1561 | /// |
1562 | /// This is a value of type \c RefQualifierKind. |
1563 | unsigned RefQualifier : 2; |
1564 | |
1565 | /// Used only by FunctionProtoType, put here to pack with the |
1566 | /// other bitfields. |
1567 | /// The qualifiers are part of FunctionProtoType because... |
1568 | /// |
1569 | /// C++ 8.3.5p4: The return type, the parameter type list and the |
1570 | /// cv-qualifier-seq, [...], are part of the function type. |
1571 | unsigned FastTypeQuals : Qualifiers::FastWidth; |
1572 | /// Whether this function has extended Qualifiers. |
1573 | unsigned HasExtQuals : 1; |
1574 | |
1575 | /// The number of parameters this function has, not counting '...'. |
1576 | /// According to [implimits] 8 bits should be enough here but this is |
1577 | /// somewhat easy to exceed with metaprogramming and so we would like to |
1578 | /// keep NumParams as wide as reasonably possible. |
1579 | unsigned NumParams : 16; |
1580 | |
1581 | /// The type of exception specification this function has. |
1582 | unsigned ExceptionSpecType : 4; |
1583 | |
1584 | /// Whether this function has extended parameter information. |
1585 | unsigned HasExtParameterInfos : 1; |
1586 | |
1587 | /// Whether the function is variadic. |
1588 | unsigned Variadic : 1; |
1589 | |
1590 | /// Whether this function has a trailing return type. |
1591 | unsigned HasTrailingReturn : 1; |
1592 | }; |
1593 | |
1594 | class ObjCObjectTypeBitfields { |
1595 | friend class ObjCObjectType; |
1596 | |
1597 | unsigned : NumTypeBits; |
1598 | |
1599 | /// The number of type arguments stored directly on this object type. |
1600 | unsigned NumTypeArgs : 7; |
1601 | |
1602 | /// The number of protocols stored directly on this object type. |
1603 | unsigned NumProtocols : 6; |
1604 | |
1605 | /// Whether this is a "kindof" type. |
1606 | unsigned IsKindOf : 1; |
1607 | }; |
1608 | |
1609 | class ReferenceTypeBitfields { |
1610 | friend class ReferenceType; |
1611 | |
1612 | unsigned : NumTypeBits; |
1613 | |
1614 | /// True if the type was originally spelled with an lvalue sigil. |
1615 | /// This is never true of rvalue references but can also be false |
1616 | /// on lvalue references because of C++0x [dcl.typedef]p9, |
1617 | /// as follows: |
1618 | /// |
1619 | /// typedef int &ref; // lvalue, spelled lvalue |
1620 | /// typedef int &&rvref; // rvalue |
1621 | /// ref &a; // lvalue, inner ref, spelled lvalue |
1622 | /// ref &&a; // lvalue, inner ref |
1623 | /// rvref &a; // lvalue, inner ref, spelled lvalue |
1624 | /// rvref &&a; // rvalue, inner ref |
1625 | unsigned SpelledAsLValue : 1; |
1626 | |
1627 | /// True if the inner type is a reference type. This only happens |
1628 | /// in non-canonical forms. |
1629 | unsigned InnerRef : 1; |
1630 | }; |
1631 | |
1632 | class TypeWithKeywordBitfields { |
1633 | friend class TypeWithKeyword; |
1634 | |
1635 | unsigned : NumTypeBits; |
1636 | |
1637 | /// An ElaboratedTypeKeyword. 8 bits for efficient access. |
1638 | unsigned Keyword : 8; |
1639 | }; |
1640 | |
1641 | enum { NumTypeWithKeywordBits = 8 }; |
1642 | |
1643 | class ElaboratedTypeBitfields { |
1644 | friend class ElaboratedType; |
1645 | |
1646 | unsigned : NumTypeBits; |
1647 | unsigned : NumTypeWithKeywordBits; |
1648 | |
1649 | /// Whether the ElaboratedType has a trailing OwnedTagDecl. |
1650 | unsigned HasOwnedTagDecl : 1; |
1651 | }; |
1652 | |
1653 | class VectorTypeBitfields { |
1654 | friend class VectorType; |
1655 | friend class DependentVectorType; |
1656 | |
1657 | unsigned : NumTypeBits; |
1658 | |
1659 | /// The kind of vector, either a generic vector type or some |
1660 | /// target-specific vector type such as for AltiVec or Neon. |
1661 | unsigned VecKind : 3; |
1662 | |
1663 | /// The number of elements in the vector. |
1664 | unsigned NumElements : 29 - NumTypeBits; |
1665 | |
1666 | enum { MaxNumElements = (1 << (29 - NumTypeBits)) - 1 }; |
1667 | }; |
1668 | |
1669 | class AttributedTypeBitfields { |
1670 | friend class AttributedType; |
1671 | |
1672 | unsigned : NumTypeBits; |
1673 | |
1674 | /// An AttributedType::Kind |
1675 | unsigned AttrKind : 32 - NumTypeBits; |
1676 | }; |
1677 | |
1678 | class AutoTypeBitfields { |
1679 | friend class AutoType; |
1680 | |
1681 | unsigned : NumTypeBits; |
1682 | |
1683 | /// Was this placeholder type spelled as 'auto', 'decltype(auto)', |
1684 | /// or '__auto_type'? AutoTypeKeyword value. |
1685 | unsigned Keyword : 2; |
1686 | }; |
1687 | |
1688 | class SubstTemplateTypeParmPackTypeBitfields { |
1689 | friend class SubstTemplateTypeParmPackType; |
1690 | |
1691 | unsigned : NumTypeBits; |
1692 | |
1693 | /// The number of template arguments in \c Arguments, which is |
1694 | /// expected to be able to hold at least 1024 according to [implimits]. |
1695 | /// However as this limit is somewhat easy to hit with template |
1696 | /// metaprogramming we'd prefer to keep it as large as possible. |
1697 | /// At the moment it has been left as a non-bitfield since this type |
1698 | /// safely fits in 64 bits as an unsigned, so there is no reason to |
1699 | /// introduce the performance impact of a bitfield. |
1700 | unsigned NumArgs; |
1701 | }; |
1702 | |
1703 | class TemplateSpecializationTypeBitfields { |
1704 | friend class TemplateSpecializationType; |
1705 | |
1706 | unsigned : NumTypeBits; |
1707 | |
1708 | /// Whether this template specialization type is a substituted type alias. |
1709 | unsigned TypeAlias : 1; |
1710 | |
1711 | /// The number of template arguments named in this class template |
1712 | /// specialization, which is expected to be able to hold at least 1024 |
1713 | /// according to [implimits]. However, as this limit is somewhat easy to |
1714 | /// hit with template metaprogramming we'd prefer to keep it as large |
1715 | /// as possible. At the moment it has been left as a non-bitfield since |
1716 | /// this type safely fits in 64 bits as an unsigned, so there is no reason |
1717 | /// to introduce the performance impact of a bitfield. |
1718 | unsigned NumArgs; |
1719 | }; |
1720 | |
1721 | class DependentTemplateSpecializationTypeBitfields { |
1722 | friend class DependentTemplateSpecializationType; |
1723 | |
1724 | unsigned : NumTypeBits; |
1725 | unsigned : NumTypeWithKeywordBits; |
1726 | |
1727 | /// The number of template arguments named in this class template |
1728 | /// specialization, which is expected to be able to hold at least 1024 |
1729 | /// according to [implimits]. However, as this limit is somewhat easy to |
1730 | /// hit with template metaprogramming we'd prefer to keep it as large |
1731 | /// as possible. At the moment it has been left as a non-bitfield since |
1732 | /// this type safely fits in 64 bits as an unsigned, so there is no reason |
1733 | /// to introduce the performance impact of a bitfield. |
1734 | unsigned NumArgs; |
1735 | }; |
1736 | |
1737 | class PackExpansionTypeBitfields { |
1738 | friend class PackExpansionType; |
1739 | |
1740 | unsigned : NumTypeBits; |
1741 | |
1742 | /// The number of expansions that this pack expansion will |
1743 | /// generate when substituted (+1), which is expected to be able to |
1744 | /// hold at least 1024 according to [implimits]. However, as this limit |
1745 | /// is somewhat easy to hit with template metaprogramming we'd prefer to |
1746 | /// keep it as large as possible. At the moment it has been left as a |
1747 | /// non-bitfield since this type safely fits in 64 bits as an unsigned, so |
1748 | /// there is no reason to introduce the performance impact of a bitfield. |
1749 | /// |
1750 | /// This field will only have a non-zero value when some of the parameter |
1751 | /// packs that occur within the pattern have been substituted but others |
1752 | /// have not. |
1753 | unsigned NumExpansions; |
1754 | }; |
1755 | |
1756 | union { |
1757 | TypeBitfields TypeBits; |
1758 | ArrayTypeBitfields ArrayTypeBits; |
1759 | ConstantArrayTypeBitfields ConstantArrayTypeBits; |
1760 | AttributedTypeBitfields AttributedTypeBits; |
1761 | AutoTypeBitfields AutoTypeBits; |
1762 | BuiltinTypeBitfields BuiltinTypeBits; |
1763 | FunctionTypeBitfields FunctionTypeBits; |
1764 | ObjCObjectTypeBitfields ObjCObjectTypeBits; |
1765 | ReferenceTypeBitfields ReferenceTypeBits; |
1766 | TypeWithKeywordBitfields TypeWithKeywordBits; |
1767 | ElaboratedTypeBitfields ElaboratedTypeBits; |
1768 | VectorTypeBitfields VectorTypeBits; |
1769 | SubstTemplateTypeParmPackTypeBitfields SubstTemplateTypeParmPackTypeBits; |
1770 | TemplateSpecializationTypeBitfields TemplateSpecializationTypeBits; |
1771 | DependentTemplateSpecializationTypeBitfields |
1772 | DependentTemplateSpecializationTypeBits; |
1773 | PackExpansionTypeBitfields PackExpansionTypeBits; |
1774 | |
1775 | static_assert(sizeof(TypeBitfields) <= 8, |
1776 | "TypeBitfields is larger than 8 bytes!"); |
1777 | static_assert(sizeof(ArrayTypeBitfields) <= 8, |
1778 | "ArrayTypeBitfields is larger than 8 bytes!"); |
1779 | static_assert(sizeof(AttributedTypeBitfields) <= 8, |
1780 | "AttributedTypeBitfields is larger than 8 bytes!"); |
1781 | static_assert(sizeof(AutoTypeBitfields) <= 8, |
1782 | "AutoTypeBitfields is larger than 8 bytes!"); |
1783 | static_assert(sizeof(BuiltinTypeBitfields) <= 8, |
1784 | "BuiltinTypeBitfields is larger than 8 bytes!"); |
1785 | static_assert(sizeof(FunctionTypeBitfields) <= 8, |
1786 | "FunctionTypeBitfields is larger than 8 bytes!"); |
1787 | static_assert(sizeof(ObjCObjectTypeBitfields) <= 8, |
1788 | "ObjCObjectTypeBitfields is larger than 8 bytes!"); |
1789 | static_assert(sizeof(ReferenceTypeBitfields) <= 8, |
1790 | "ReferenceTypeBitfields is larger than 8 bytes!"); |
1791 | static_assert(sizeof(TypeWithKeywordBitfields) <= 8, |
1792 | "TypeWithKeywordBitfields is larger than 8 bytes!"); |
1793 | static_assert(sizeof(ElaboratedTypeBitfields) <= 8, |
1794 | "ElaboratedTypeBitfields is larger than 8 bytes!"); |
1795 | static_assert(sizeof(VectorTypeBitfields) <= 8, |
1796 | "VectorTypeBitfields is larger than 8 bytes!"); |
1797 | static_assert(sizeof(SubstTemplateTypeParmPackTypeBitfields) <= 8, |
1798 | "SubstTemplateTypeParmPackTypeBitfields is larger" |
1799 | " than 8 bytes!"); |
1800 | static_assert(sizeof(TemplateSpecializationTypeBitfields) <= 8, |
1801 | "TemplateSpecializationTypeBitfields is larger" |
1802 | " than 8 bytes!"); |
1803 | static_assert(sizeof(DependentTemplateSpecializationTypeBitfields) <= 8, |
1804 | "DependentTemplateSpecializationTypeBitfields is larger" |
1805 | " than 8 bytes!"); |
1806 | static_assert(sizeof(PackExpansionTypeBitfields) <= 8, |
1807 | "PackExpansionTypeBitfields is larger than 8 bytes"); |
1808 | }; |
1809 | |
1810 | private: |
1811 | template <class T> friend class TypePropertyCache; |
1812 | |
1813 | /// Set whether this type comes from an AST file. |
1814 | void setFromAST(bool V = true) const { |
1815 | TypeBits.FromAST = V; |
1816 | } |
1817 | |
1818 | protected: |
1819 | friend class ASTContext; |
1820 | |
1821 | Type(TypeClass tc, QualType canon, bool Dependent, |
1822 | bool InstantiationDependent, bool VariablyModified, |
1823 | bool ContainsUnexpandedParameterPack) |
1824 | : ExtQualsTypeCommonBase(this, |
1825 | canon.isNull() ? QualType(this_(), 0) : canon) { |
1826 | TypeBits.TC = tc; |
1827 | TypeBits.Dependent = Dependent; |
1828 | TypeBits.InstantiationDependent = Dependent || InstantiationDependent; |
1829 | TypeBits.VariablyModified = VariablyModified; |
1830 | TypeBits.ContainsUnexpandedParameterPack = ContainsUnexpandedParameterPack; |
1831 | TypeBits.CacheValid = false; |
1832 | TypeBits.CachedLocalOrUnnamed = false; |
1833 | TypeBits.CachedLinkage = NoLinkage; |
1834 | TypeBits.FromAST = false; |
1835 | } |
1836 | |
1837 | // silence VC++ warning C4355: 'this' : used in base member initializer list |
1838 | Type *this_() { return this; } |
1839 | |
1840 | void setDependent(bool D = true) { |
1841 | TypeBits.Dependent = D; |
1842 | if (D) |
1843 | TypeBits.InstantiationDependent = true; |
1844 | } |
1845 | |
1846 | void setInstantiationDependent(bool D = true) { |
1847 | TypeBits.InstantiationDependent = D; } |
1848 | |
1849 | void setVariablyModified(bool VM = true) { TypeBits.VariablyModified = VM; } |
1850 | |
1851 | void setContainsUnexpandedParameterPack(bool PP = true) { |
1852 | TypeBits.ContainsUnexpandedParameterPack = PP; |
1853 | } |
1854 | |
1855 | public: |
1856 | friend class ASTReader; |
1857 | friend class ASTWriter; |
1858 | template <class T> friend class serialization::AbstractTypeReader; |
1859 | template <class T> friend class serialization::AbstractTypeWriter; |
1860 | |
1861 | Type(const Type &) = delete; |
1862 | Type(Type &&) = delete; |
1863 | Type &operator=(const Type &) = delete; |
1864 | Type &operator=(Type &&) = delete; |
1865 | |
1866 | TypeClass getTypeClass() const { return static_cast<TypeClass>(TypeBits.TC); } |
1867 | |
1868 | /// Whether this type comes from an AST file. |
1869 | bool isFromAST() const { return TypeBits.FromAST; } |
1870 | |
1871 | /// Whether this type is or contains an unexpanded parameter |
1872 | /// pack, used to support C++0x variadic templates. |
1873 | /// |
1874 | /// A type that contains a parameter pack shall be expanded by the |
1875 | /// ellipsis operator at some point. For example, the typedef in the |
1876 | /// following example contains an unexpanded parameter pack 'T': |
1877 | /// |
1878 | /// \code |
1879 | /// template<typename ...T> |
1880 | /// struct X { |
1881 | /// typedef T* pointer_types; // ill-formed; T is a parameter pack. |
1882 | /// }; |
1883 | /// \endcode |
1884 | /// |
1885 | /// Note that this routine does not specify which |
1886 | bool containsUnexpandedParameterPack() const { |
1887 | return TypeBits.ContainsUnexpandedParameterPack; |
1888 | } |
1889 | |
1890 | /// Determines if this type would be canonical if it had no further |
1891 | /// qualification. |
1892 | bool isCanonicalUnqualified() const { |
1893 | return CanonicalType == QualType(this, 0); |
1894 | } |
1895 | |
1896 | /// Pull a single level of sugar off of this locally-unqualified type. |
1897 | /// Users should generally prefer SplitQualType::getSingleStepDesugaredType() |
1898 | /// or QualType::getSingleStepDesugaredType(const ASTContext&). |
1899 | QualType getLocallyUnqualifiedSingleStepDesugaredType() const; |
1900 | |
1901 | /// Types are partitioned into 3 broad categories (C99 6.2.5p1): |
1902 | /// object types, function types, and incomplete types. |
1903 | |
1904 | /// Return true if this is an incomplete type. |
1905 | /// A type that can describe objects, but which lacks information needed to |
1906 | /// determine its size (e.g. void, or a fwd declared struct). Clients of this |
1907 | /// routine will need to determine if the size is actually required. |
1908 | /// |
1909 | /// Def If non-null, and the type refers to some kind of declaration |
1910 | /// that can be completed (such as a C struct, C++ class, or Objective-C |
1911 | /// class), will be set to the declaration. |
1912 | bool isIncompleteType(NamedDecl **Def = nullptr) const; |
1913 | |
1914 | /// Return true if this is an incomplete or object |
1915 | /// type, in other words, not a function type. |
1916 | bool isIncompleteOrObjectType() const { |
1917 | return !isFunctionType(); |
1918 | } |
1919 | |
1920 | /// Determine whether this type is an object type. |
1921 | bool isObjectType() const { |
1922 | // C++ [basic.types]p8: |
1923 | // An object type is a (possibly cv-qualified) type that is not a |
1924 | // function type, not a reference type, and not a void type. |
1925 | return !isReferenceType() && !isFunctionType() && !isVoidType(); |
1926 | } |
1927 | |
1928 | /// Return true if this is a literal type |
1929 | /// (C++11 [basic.types]p10) |
1930 | bool isLiteralType(const ASTContext &Ctx) const; |
1931 | |
1932 | /// Test if this type is a standard-layout type. |
1933 | /// (C++0x [basic.type]p9) |
1934 | bool isStandardLayoutType() const; |
1935 | |
1936 | /// Helper methods to distinguish type categories. All type predicates |
1937 | /// operate on the canonical type, ignoring typedefs and qualifiers. |
1938 | |
1939 | /// Returns true if the type is a builtin type. |
1940 | bool isBuiltinType() const; |
1941 | |
1942 | /// Test for a particular builtin type. |
1943 | bool isSpecificBuiltinType(unsigned K) const; |
1944 | |
1945 | /// Test for a type which does not represent an actual type-system type but |
1946 | /// is instead used as a placeholder for various convenient purposes within |
1947 | /// Clang. All such types are BuiltinTypes. |
1948 | bool isPlaceholderType() const; |
1949 | const BuiltinType *getAsPlaceholderType() const; |
1950 | |
1951 | /// Test for a specific placeholder type. |
1952 | bool isSpecificPlaceholderType(unsigned K) const; |
1953 | |
1954 | /// Test for a placeholder type other than Overload; see |
1955 | /// BuiltinType::isNonOverloadPlaceholderType. |
1956 | bool isNonOverloadPlaceholderType() const; |
1957 | |
1958 | /// isIntegerType() does *not* include complex integers (a GCC extension). |
1959 | /// isComplexIntegerType() can be used to test for complex integers. |
1960 | bool isIntegerType() const; // C99 6.2.5p17 (int, char, bool, enum) |
1961 | bool isEnumeralType() const; |
1962 | |
1963 | /// Determine whether this type is a scoped enumeration type. |
1964 | bool isScopedEnumeralType() const; |
1965 | bool isBooleanType() const; |
1966 | bool isCharType() const; |
1967 | bool isWideCharType() const; |
1968 | bool isChar8Type() const; |
1969 | bool isChar16Type() const; |
1970 | bool isChar32Type() const; |
1971 | bool isAnyCharacterType() const; |
1972 | bool isIntegralType(const ASTContext &Ctx) const; |
1973 | |
1974 | /// Determine whether this type is an integral or enumeration type. |
1975 | bool isIntegralOrEnumerationType() const; |
1976 | |
1977 | /// Determine whether this type is an integral or unscoped enumeration type. |
1978 | bool isIntegralOrUnscopedEnumerationType() const; |
1979 | bool isUnscopedEnumerationType() const; |
1980 | |
1981 | /// Floating point categories. |
1982 | bool isRealFloatingType() const; // C99 6.2.5p10 (float, double, long double) |
1983 | /// isComplexType() does *not* include complex integers (a GCC extension). |
1984 | /// isComplexIntegerType() can be used to test for complex integers. |
1985 | bool isComplexType() const; // C99 6.2.5p11 (complex) |
1986 | bool isAnyComplexType() const; // C99 6.2.5p11 (complex) + Complex Int. |
1987 | bool isFloatingType() const; // C99 6.2.5p11 (real floating + complex) |
1988 | bool isHalfType() const; // OpenCL 6.1.1.1, NEON (IEEE 754-2008 half) |
1989 | bool isFloat16Type() const; // C11 extension ISO/IEC TS 18661 |
1990 | bool isFloat128Type() const; |
1991 | bool isRealType() const; // C99 6.2.5p17 (real floating + integer) |
1992 | bool isArithmeticType() const; // C99 6.2.5p18 (integer + floating) |
1993 | bool isVoidType() const; // C99 6.2.5p19 |
1994 | bool isScalarType() const; // C99 6.2.5p21 (arithmetic + pointers) |
1995 | bool isAggregateType() const; |
1996 | bool isFundamentalType() const; |
1997 | bool isCompoundType() const; |
1998 | |
1999 | // Type Predicates: Check to see if this type is structurally the specified |
2000 | // type, ignoring typedefs and qualifiers. |
2001 | bool isFunctionType() const; |
2002 | bool isFunctionNoProtoType() const { return getAs<FunctionNoProtoType>(); } |
2003 | bool isFunctionProtoType() const { return getAs<FunctionProtoType>(); } |
2004 | bool isPointerType() const; |
2005 | bool isAnyPointerType() const; // Any C pointer or ObjC object pointer |
2006 | bool isBlockPointerType() const; |
2007 | bool isVoidPointerType() const; |
2008 | bool isReferenceType() const; |
2009 | bool isLValueReferenceType() const; |
2010 | bool isRValueReferenceType() const; |
2011 | bool isObjectPointerType() const; |
2012 | bool isFunctionPointerType() const; |
2013 | bool isFunctionReferenceType() const; |
2014 | bool isMemberPointerType() const; |
2015 | bool isMemberFunctionPointerType() const; |
2016 | bool isMemberDataPointerType() const; |
2017 | bool isArrayType() const; |
2018 | bool isConstantArrayType() const; |
2019 | bool isIncompleteArrayType() const; |
2020 | bool isVariableArrayType() const; |
2021 | bool isDependentSizedArrayType() const; |
2022 | bool isRecordType() const; |
2023 | bool isClassType() const; |
2024 | bool isStructureType() const; |
2025 | bool isObjCBoxableRecordType() const; |
2026 | bool isInterfaceType() const; |
2027 | bool isStructureOrClassType() const; |
2028 | bool isUnionType() const; |
2029 | bool isComplexIntegerType() const; // GCC _Complex integer type. |
2030 | bool isVectorType() const; // GCC vector type. |
2031 | bool isExtVectorType() const; // Extended vector type. |
2032 | bool isDependentAddressSpaceType() const; // value-dependent address space qualifier |
2033 | bool isObjCObjectPointerType() const; // pointer to ObjC object |
2034 | bool isObjCRetainableType() const; // ObjC object or block pointer |
2035 | bool isObjCLifetimeType() const; // (array of)* retainable type |
2036 | bool isObjCIndirectLifetimeType() const; // (pointer to)* lifetime type |
2037 | bool isObjCNSObjectType() const; // __attribute__((NSObject)) |
2038 | bool isObjCIndependentClassType() const; // __attribute__((objc_independent_class)) |
2039 | // FIXME: change this to 'raw' interface type, so we can used 'interface' type |
2040 | // for the common case. |
2041 | bool isObjCObjectType() const; // NSString or typeof(*(id)0) |
2042 | bool isObjCQualifiedInterfaceType() const; // NSString<foo> |
2043 | bool isObjCQualifiedIdType() const; // id<foo> |
2044 | bool isObjCQualifiedClassType() const; // Class<foo> |
2045 | bool isObjCObjectOrInterfaceType() const; |
2046 | bool isObjCIdType() const; // id |
2047 | bool isDecltypeType() const; |
2048 | /// Was this type written with the special inert-in-ARC __unsafe_unretained |
2049 | /// qualifier? |
2050 | /// |
2051 | /// This approximates the answer to the following question: if this |
2052 | /// translation unit were compiled in ARC, would this type be qualified |
2053 | /// with __unsafe_unretained? |
2054 | bool isObjCInertUnsafeUnretainedType() const { |
2055 | return hasAttr(attr::ObjCInertUnsafeUnretained); |
2056 | } |
2057 | |
2058 | /// Whether the type is Objective-C 'id' or a __kindof type of an |
2059 | /// object type, e.g., __kindof NSView * or __kindof id |
2060 | /// <NSCopying>. |
2061 | /// |
2062 | /// \param bound Will be set to the bound on non-id subtype types, |
2063 | /// which will be (possibly specialized) Objective-C class type, or |
2064 | /// null for 'id. |
2065 | bool isObjCIdOrObjectKindOfType(const ASTContext &ctx, |
2066 | const ObjCObjectType *&bound) const; |
2067 | |
2068 | bool isObjCClassType() const; // Class |
2069 | |
2070 | /// Whether the type is Objective-C 'Class' or a __kindof type of an |
2071 | /// Class type, e.g., __kindof Class <NSCopying>. |
2072 | /// |
2073 | /// Unlike \c isObjCIdOrObjectKindOfType, there is no relevant bound |
2074 | /// here because Objective-C's type system cannot express "a class |
2075 | /// object for a subclass of NSFoo". |
2076 | bool isObjCClassOrClassKindOfType() const; |
2077 | |
2078 | bool isBlockCompatibleObjCPointerType(ASTContext &ctx) const; |
2079 | bool isObjCSelType() const; // Class |
2080 | bool isObjCBuiltinType() const; // 'id' or 'Class' |
2081 | bool isObjCARCBridgableType() const; |
2082 | bool isCARCBridgableType() const; |
2083 | bool isTemplateTypeParmType() const; // C++ template type parameter |
2084 | bool isNullPtrType() const; // C++11 std::nullptr_t |
2085 | bool isNothrowT() const; // C++ std::nothrow_t |
2086 | bool isAlignValT() const; // C++17 std::align_val_t |
2087 | bool isStdByteType() const; // C++17 std::byte |
2088 | bool isAtomicType() const; // C11 _Atomic() |
2089 | bool isUndeducedAutoType() const; // C++11 auto or |
2090 | // C++14 decltype(auto) |
2091 | |
2092 | #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \ |
2093 | bool is##Id##Type() const; |
2094 | #include "clang/Basic/OpenCLImageTypes.def" |
2095 | |
2096 | bool isImageType() const; // Any OpenCL image type |
2097 | |
2098 | bool isSamplerT() const; // OpenCL sampler_t |
2099 | bool isEventT() const; // OpenCL event_t |
2100 | bool isClkEventT() const; // OpenCL clk_event_t |
2101 | bool isQueueT() const; // OpenCL queue_t |
2102 | bool isReserveIDT() const; // OpenCL reserve_id_t |
2103 | |
2104 | #define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \ |
2105 | bool is##Id##Type() const; |
2106 | #include "clang/Basic/OpenCLExtensionTypes.def" |
2107 | // Type defined in cl_intel_device_side_avc_motion_estimation OpenCL extension |
2108 | bool isOCLIntelSubgroupAVCType() const; |
2109 | bool isOCLExtOpaqueType() const; // Any OpenCL extension type |
2110 | |
2111 | bool isPipeType() const; // OpenCL pipe type |
2112 | bool isOpenCLSpecificType() const; // Any OpenCL specific type |
2113 | |
2114 | /// Determines if this type, which must satisfy |
2115 | /// isObjCLifetimeType(), is implicitly __unsafe_unretained rather |
2116 | /// than implicitly __strong. |
2117 | bool isObjCARCImplicitlyUnretainedType() const; |
2118 | |
2119 | /// Return the implicit lifetime for this type, which must not be dependent. |
2120 | Qualifiers::ObjCLifetime getObjCARCImplicitLifetime() const; |
2121 | |
2122 | enum ScalarTypeKind { |
2123 | STK_CPointer, |
2124 | STK_BlockPointer, |
2125 | STK_ObjCObjectPointer, |
2126 | STK_MemberPointer, |
2127 | STK_Bool, |
2128 | STK_Integral, |
2129 | STK_Floating, |
2130 | STK_IntegralComplex, |
2131 | STK_FloatingComplex, |
2132 | STK_FixedPoint |
2133 | }; |
2134 | |
2135 | /// Given that this is a scalar type, classify it. |
2136 | ScalarTypeKind getScalarTypeKind() const; |
2137 | |
2138 | /// Whether this type is a dependent type, meaning that its definition |
2139 | /// somehow depends on a template parameter (C++ [temp.dep.type]). |
2140 | bool isDependentType() const { return TypeBits.Dependent; } |
2141 | |
2142 | /// Determine whether this type is an instantiation-dependent type, |
2143 | /// meaning that the type involves a template parameter (even if the |
2144 | /// definition does not actually depend on the type substituted for that |
2145 | /// template parameter). |
2146 | bool isInstantiationDependentType() const { |
2147 | return TypeBits.InstantiationDependent; |
2148 | } |
2149 | |
2150 | /// Determine whether this type is an undeduced type, meaning that |
2151 | /// it somehow involves a C++11 'auto' type or similar which has not yet been |
2152 | /// deduced. |
2153 | bool isUndeducedType() const; |
2154 | |
2155 | /// Whether this type is a variably-modified type (C99 6.7.5). |
2156 | bool isVariablyModifiedType() const { return TypeBits.VariablyModified; } |
2157 | |
2158 | /// Whether this type involves a variable-length array type |
2159 | /// with a definite size. |
2160 | bool hasSizedVLAType() const; |
2161 | |
2162 | /// Whether this type is or contains a local or unnamed type. |
2163 | bool hasUnnamedOrLocalType() const; |
2164 | |
2165 | bool isOverloadableType() const; |
2166 | |
2167 | /// Determine wither this type is a C++ elaborated-type-specifier. |
2168 | bool isElaboratedTypeSpecifier() const; |
2169 | |
2170 | bool canDecayToPointerType() const; |
2171 | |
2172 | /// Whether this type is represented natively as a pointer. This includes |
2173 | /// pointers, references, block pointers, and Objective-C interface, |
2174 | /// qualified id, and qualified interface types, as well as nullptr_t. |
2175 | bool hasPointerRepresentation() const; |
2176 | |
2177 | /// Whether this type can represent an objective pointer type for the |
2178 | /// purpose of GC'ability |
2179 | bool hasObjCPointerRepresentation() const; |
2180 | |
2181 | /// Determine whether this type has an integer representation |
2182 | /// of some sort, e.g., it is an integer type or a vector. |
2183 | bool hasIntegerRepresentation() const; |
2184 | |
2185 | /// Determine whether this type has an signed integer representation |
2186 | /// of some sort, e.g., it is an signed integer type or a vector. |
2187 | bool hasSignedIntegerRepresentation() const; |
2188 | |
2189 | /// Determine whether this type has an unsigned integer representation |
2190 | /// of some sort, e.g., it is an unsigned integer type or a vector. |
2191 | bool hasUnsignedIntegerRepresentation() const; |
2192 | |
2193 | /// Determine whether this type has a floating-point representation |
2194 | /// of some sort, e.g., it is a floating-point type or a vector thereof. |
2195 | bool hasFloatingRepresentation() const; |
2196 | |
2197 | // Type Checking Functions: Check to see if this type is structurally the |
2198 | // specified type, ignoring typedefs and qualifiers, and return a pointer to |
2199 | // the best type we can. |
2200 | const RecordType *getAsStructureType() const; |
2201 | /// NOTE: getAs*ArrayType are methods on ASTContext. |
2202 | const RecordType *getAsUnionType() const; |
2203 | const ComplexType *getAsComplexIntegerType() const; // GCC complex int type. |
2204 | const ObjCObjectType *getAsObjCInterfaceType() const; |
2205 | |
2206 | // The following is a convenience method that returns an ObjCObjectPointerType |
2207 | // for object declared using an interface. |
2208 | const ObjCObjectPointerType *getAsObjCInterfacePointerType() const; |
2209 | const ObjCObjectPointerType *getAsObjCQualifiedIdType() const; |
2210 | const ObjCObjectPointerType *getAsObjCQualifiedClassType() const; |
2211 | const ObjCObjectType *getAsObjCQualifiedInterfaceType() const; |
2212 | |
2213 | /// Retrieves the CXXRecordDecl that this type refers to, either |
2214 | /// because the type is a RecordType or because it is the injected-class-name |
2215 | /// type of a class template or class template partial specialization. |
2216 | CXXRecordDecl *getAsCXXRecordDecl() const; |
2217 | |
2218 | /// Retrieves the RecordDecl this type refers to. |
2219 | RecordDecl *getAsRecordDecl() const; |
2220 | |
2221 | /// Retrieves the TagDecl that this type refers to, either |
2222 | /// because the type is a TagType or because it is the injected-class-name |
2223 | /// type of a class template or class template partial specialization. |
2224 | TagDecl *getAsTagDecl() const; |
2225 | |
2226 | /// If this is a pointer or reference to a RecordType, return the |
2227 | /// CXXRecordDecl that the type refers to. |
2228 | /// |
2229 | /// If this is not a pointer or reference, or the type being pointed to does |
2230 | /// not refer to a CXXRecordDecl, returns NULL. |
2231 | const CXXRecordDecl *getPointeeCXXRecordDecl() const; |
2232 | |
2233 | /// Get the DeducedType whose type will be deduced for a variable with |
2234 | /// an initializer of this type. This looks through declarators like pointer |
2235 | /// types, but not through decltype or typedefs. |
2236 | DeducedType *getContainedDeducedType() const; |
2237 | |
2238 | /// Get the AutoType whose type will be deduced for a variable with |
2239 | /// an initializer of this type. This looks through declarators like pointer |
2240 | /// types, but not through decltype or typedefs. |
2241 | AutoType *getContainedAutoType() const { |
2242 | return dyn_cast_or_null<AutoType>(getContainedDeducedType()); |
2243 | } |
2244 | |
2245 | /// Determine whether this type was written with a leading 'auto' |
2246 | /// corresponding to a trailing return type (possibly for a nested |
2247 | /// function type within a pointer to function type or similar). |
2248 | bool hasAutoForTrailingReturnType() const; |
2249 | |
2250 | /// Member-template getAs<specific type>'. Look through sugar for |
2251 | /// an instance of \<specific type>. This scheme will eventually |
2252 | /// replace the specific getAsXXXX methods above. |
2253 | /// |
2254 | /// There are some specializations of this member template listed |
2255 | /// immediately following this class. |
2256 | template <typename T> const T *getAs() const; |
2257 | |
2258 | /// Member-template getAsAdjusted<specific type>. Look through specific kinds |
2259 | /// of sugar (parens, attributes, etc) for an instance of \<specific type>. |
2260 | /// This is used when you need to walk over sugar nodes that represent some |
2261 | /// kind of type adjustment from a type that was written as a \<specific type> |
2262 | /// to another type that is still canonically a \<specific type>. |
2263 | template <typename T> const T *getAsAdjusted() const; |
2264 | |
2265 | /// A variant of getAs<> for array types which silently discards |
2266 | /// qualifiers from the outermost type. |
2267 | const ArrayType *getAsArrayTypeUnsafe() const; |
2268 | |
2269 | /// Member-template castAs<specific type>. Look through sugar for |
2270 | /// the underlying instance of \<specific type>. |
2271 | /// |
2272 | /// This method has the same relationship to getAs<T> as cast<T> has |
2273 | /// to dyn_cast<T>; which is to say, the underlying type *must* |
2274 | /// have the intended type, and this method will never return null. |
2275 | template <typename T> const T *castAs() const; |
2276 | |
2277 | /// A variant of castAs<> for array type which silently discards |
2278 | /// qualifiers from the outermost type. |
2279 | const ArrayType *castAsArrayTypeUnsafe() const; |
2280 | |
2281 | /// Determine whether this type had the specified attribute applied to it |
2282 | /// (looking through top-level type sugar). |
2283 | bool hasAttr(attr::Kind AK) const; |
2284 | |
2285 | /// Get the base element type of this type, potentially discarding type |
2286 | /// qualifiers. This should never be used when type qualifiers |
2287 | /// are meaningful. |
2288 | const Type *getBaseElementTypeUnsafe() const; |
2289 | |
2290 | /// If this is an array type, return the element type of the array, |
2291 | /// potentially with type qualifiers missing. |
2292 | /// This should never be used when type qualifiers are meaningful. |
2293 | const Type *getArrayElementTypeNoTypeQual() const; |
2294 | |
2295 | /// If this is a pointer type, return the pointee type. |
2296 | /// If this is an array type, return the array element type. |
2297 | /// This should never be used when type qualifiers are meaningful. |
2298 | const Type *getPointeeOrArrayElementType() const; |
2299 | |
2300 | /// If this is a pointer, ObjC object pointer, or block |
2301 | /// pointer, this returns the respective pointee. |
2302 | QualType getPointeeType() const; |
2303 | |
2304 | /// Return the specified type with any "sugar" removed from the type, |
2305 | /// removing any typedefs, typeofs, etc., as well as any qualifiers. |
2306 | const Type *getUnqualifiedDesugaredType() const; |
2307 | |
2308 | /// More type predicates useful for type checking/promotion |
2309 | bool isPromotableIntegerType() const; // C99 6.3.1.1p2 |
2310 | |
2311 | /// Return true if this is an integer type that is |
2312 | /// signed, according to C99 6.2.5p4 [char, signed char, short, int, long..], |
2313 | /// or an enum decl which has a signed representation. |
2314 | bool isSignedIntegerType() const; |
2315 | |
2316 | /// Return true if this is an integer type that is |
2317 | /// unsigned, according to C99 6.2.5p6 [which returns true for _Bool], |
2318 | /// or an enum decl which has an unsigned representation. |
2319 | bool isUnsignedIntegerType() const; |
2320 | |
2321 | /// Determines whether this is an integer type that is signed or an |
2322 | /// enumeration types whose underlying type is a signed integer type. |
2323 | bool isSignedIntegerOrEnumerationType() const; |
2324 | |
2325 | /// Determines whether this is an integer type that is unsigned or an |
2326 | /// enumeration types whose underlying type is a unsigned integer type. |
2327 | bool isUnsignedIntegerOrEnumerationType() const; |
2328 | |
2329 | /// Return true if this is a fixed point type according to |
2330 | /// ISO/IEC JTC1 SC22 WG14 N1169. |
2331 | bool isFixedPointType() const; |
2332 | |
2333 | /// Return true if this is a fixed point or integer type. |
2334 | bool isFixedPointOrIntegerType() const; |
2335 | |
2336 | /// Return true if this is a saturated fixed point type according to |
2337 | /// ISO/IEC JTC1 SC22 WG14 N1169. This type can be signed or unsigned. |
2338 | bool isSaturatedFixedPointType() const; |
2339 | |
2340 | /// Return true if this is a saturated fixed point type according to |
2341 | /// ISO/IEC JTC1 SC22 WG14 N1169. This type can be signed or unsigned. |
2342 | bool isUnsaturatedFixedPointType() const; |
2343 | |
2344 | /// Return true if this is a fixed point type that is signed according |
2345 | /// to ISO/IEC JTC1 SC22 WG14 N1169. This type can also be saturated. |
2346 | bool isSignedFixedPointType() const; |
2347 | |
2348 | /// Return true if this is a fixed point type that is unsigned according |
2349 | /// to ISO/IEC JTC1 SC22 WG14 N1169. This type can also be saturated. |
2350 | bool isUnsignedFixedPointType() const; |
2351 | |
2352 | /// Return true if this is not a variable sized type, |
2353 | /// according to the rules of C99 6.7.5p3. It is not legal to call this on |
2354 | /// incomplete types. |
2355 | bool isConstantSizeType() const; |
2356 | |
2357 | /// Returns true if this type can be represented by some |
2358 | /// set of type specifiers. |
2359 | bool isSpecifierType() const; |
2360 | |
2361 | /// Determine the linkage of this type. |
2362 | Linkage getLinkage() const; |
2363 | |
2364 | /// Determine the visibility of this type. |
2365 | Visibility getVisibility() const { |
2366 | return getLinkageAndVisibility().getVisibility(); |
2367 | } |
2368 | |
2369 | /// Return true if the visibility was explicitly set is the code. |
2370 | bool isVisibilityExplicit() const { |
2371 | return getLinkageAndVisibility().isVisibilityExplicit(); |
2372 | } |
2373 | |
2374 | /// Determine the linkage and visibility of this type. |
2375 | LinkageInfo getLinkageAndVisibility() const; |
2376 | |
2377 | /// True if the computed linkage is valid. Used for consistency |
2378 | /// checking. Should always return true. |
2379 | bool isLinkageValid() const; |
2380 | |
2381 | /// Determine the nullability of the given type. |
2382 | /// |
2383 | /// Note that nullability is only captured as sugar within the type |
2384 | /// system, not as part of the canonical type, so nullability will |
2385 | /// be lost by canonicalization and desugaring. |
2386 | Optional<NullabilityKind> getNullability(const ASTContext &context) const; |
2387 | |
2388 | /// Determine whether the given type can have a nullability |
2389 | /// specifier applied to it, i.e., if it is any kind of pointer type. |
2390 | /// |
2391 | /// \param ResultIfUnknown The value to return if we don't yet know whether |
2392 | /// this type can have nullability because it is dependent. |
2393 | bool canHaveNullability(bool ResultIfUnknown = true) const; |
2394 | |
2395 | /// Retrieve the set of substitutions required when accessing a member |
2396 | /// of the Objective-C receiver type that is declared in the given context. |
2397 | /// |
2398 | /// \c *this is the type of the object we're operating on, e.g., the |
2399 | /// receiver for a message send or the base of a property access, and is |
2400 | /// expected to be of some object or object pointer type. |
2401 | /// |
2402 | /// \param dc The declaration context for which we are building up a |
2403 | /// substitution mapping, which should be an Objective-C class, extension, |
2404 | /// category, or method within. |
2405 | /// |
2406 | /// \returns an array of type arguments that can be substituted for |
2407 | /// the type parameters of the given declaration context in any type described |
2408 | /// within that context, or an empty optional to indicate that no |
2409 | /// substitution is required. |
2410 | Optional<ArrayRef<QualType>> |
2411 | getObjCSubstitutions(const DeclContext *dc) const; |
2412 | |
2413 | /// Determines if this is an ObjC interface type that may accept type |
2414 | /// parameters. |
2415 | bool acceptsObjCTypeParams() const; |
2416 | |
2417 | const char *getTypeClassName() const; |
2418 | |
2419 | QualType getCanonicalTypeInternal() const { |
2420 | return CanonicalType; |
2421 | } |
2422 | |
2423 | CanQualType getCanonicalTypeUnqualified() const; // in CanonicalType.h |
2424 | void dump() const; |
2425 | void dump(llvm::raw_ostream &OS) const; |
2426 | }; |
2427 | |
2428 | /// This will check for a TypedefType by removing any existing sugar |
2429 | /// until it reaches a TypedefType or a non-sugared type. |
2430 | template <> const TypedefType *Type::getAs() const; |
2431 | |
2432 | /// This will check for a TemplateSpecializationType by removing any |
2433 | /// existing sugar until it reaches a TemplateSpecializationType or a |
2434 | /// non-sugared type. |
2435 | template <> const TemplateSpecializationType *Type::getAs() const; |
2436 | |
2437 | /// This will check for an AttributedType by removing any existing sugar |
2438 | /// until it reaches an AttributedType or a non-sugared type. |
2439 | template <> const AttributedType *Type::getAs() const; |
2440 | |
2441 | // We can do canonical leaf types faster, because we don't have to |
2442 | // worry about preserving child type decoration. |
2443 | #define TYPE(Class, Base) |
2444 | #define LEAF_TYPE(Class) \ |
2445 | template <> inline const Class##Type *Type::getAs() const { \ |
2446 | return dyn_cast<Class##Type>(CanonicalType); \ |
2447 | } \ |
2448 | template <> inline const Class##Type *Type::castAs() const { \ |
2449 | return cast<Class##Type>(CanonicalType); \ |
2450 | } |
2451 | #include "clang/AST/TypeNodes.inc" |
2452 | |
2453 | /// This class is used for builtin types like 'int'. Builtin |
2454 | /// types are always canonical and have a literal name field. |
2455 | class BuiltinType : public Type { |
2456 | public: |
2457 | enum Kind { |
2458 | // OpenCL image types |
2459 | #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) Id, |
2460 | #include "clang/Basic/OpenCLImageTypes.def" |
2461 | // OpenCL extension types |
2462 | #define EXT_OPAQUE_TYPE(ExtType, Id, Ext) Id, |
2463 | #include "clang/Basic/OpenCLExtensionTypes.def" |
2464 | // SVE Types |
2465 | #define SVE_TYPE(Name, Id, SingletonId) Id, |
2466 | #include "clang/Basic/AArch64SVEACLETypes.def" |
2467 | // All other builtin types |
2468 | #define BUILTIN_TYPE(Id, SingletonId) Id, |
2469 | #define LAST_BUILTIN_TYPE(Id) LastKind = Id |
2470 | #include "clang/AST/BuiltinTypes.def" |
2471 | }; |
2472 | |
2473 | private: |
2474 | friend class ASTContext; // ASTContext creates these. |
2475 | |
2476 | BuiltinType(Kind K) |
2477 | : Type(Builtin, QualType(), /*Dependent=*/(K == Dependent), |
2478 | /*InstantiationDependent=*/(K == Dependent), |
2479 | /*VariablyModified=*/false, |
2480 | /*Unexpanded parameter pack=*/false) { |
2481 | BuiltinTypeBits.Kind = K; |
2482 | } |
2483 | |
2484 | public: |
2485 | Kind getKind() const { return static_cast<Kind>(BuiltinTypeBits.Kind); } |
2486 | StringRef getName(const PrintingPolicy &Policy) const; |
2487 | |
2488 | const char *getNameAsCString(const PrintingPolicy &Policy) const { |
2489 | // The StringRef is null-terminated. |
2490 | StringRef str = getName(Policy); |
2491 | assert(!str.empty() && str.data()[str.size()] == '\0')((!str.empty() && str.data()[str.size()] == '\0') ? static_cast <void> (0) : __assert_fail ("!str.empty() && str.data()[str.size()] == '\\0'" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 2491, __PRETTY_FUNCTION__)); |
2492 | return str.data(); |
2493 | } |
2494 | |
2495 | bool isSugared() const { return false; } |
2496 | QualType desugar() const { return QualType(this, 0); } |
2497 | |
2498 | bool isInteger() const { |
2499 | return getKind() >= Bool && getKind() <= Int128; |
2500 | } |
2501 | |
2502 | bool isSignedInteger() const { |
2503 | return getKind() >= Char_S && getKind() <= Int128; |
2504 | } |
2505 | |
2506 | bool isUnsignedInteger() const { |
2507 | return getKind() >= Bool && getKind() <= UInt128; |
2508 | } |
2509 | |
2510 | bool isFloatingPoint() const { |
2511 | return getKind() >= Half && getKind() <= Float128; |
2512 | } |
2513 | |
2514 | /// Determines whether the given kind corresponds to a placeholder type. |
2515 | static bool isPlaceholderTypeKind(Kind K) { |
2516 | return K >= Overload; |
2517 | } |
2518 | |
2519 | /// Determines whether this type is a placeholder type, i.e. a type |
2520 | /// which cannot appear in arbitrary positions in a fully-formed |
2521 | /// expression. |
2522 | bool isPlaceholderType() const { |
2523 | return isPlaceholderTypeKind(getKind()); |
2524 | } |
2525 | |
2526 | /// Determines whether this type is a placeholder type other than |
2527 | /// Overload. Most placeholder types require only syntactic |
2528 | /// information about their context in order to be resolved (e.g. |
2529 | /// whether it is a call expression), which means they can (and |
2530 | /// should) be resolved in an earlier "phase" of analysis. |
2531 | /// Overload expressions sometimes pick up further information |
2532 | /// from their context, like whether the context expects a |
2533 | /// specific function-pointer type, and so frequently need |
2534 | /// special treatment. |
2535 | bool isNonOverloadPlaceholderType() const { |
2536 | return getKind() > Overload; |
2537 | } |
2538 | |
2539 | static bool classof(const Type *T) { return T->getTypeClass() == Builtin; } |
2540 | }; |
2541 | |
2542 | /// Complex values, per C99 6.2.5p11. This supports the C99 complex |
2543 | /// types (_Complex float etc) as well as the GCC integer complex extensions. |
2544 | class ComplexType : public Type, public llvm::FoldingSetNode { |
2545 | friend class ASTContext; // ASTContext creates these. |
2546 | |
2547 | QualType ElementType; |
2548 | |
2549 | ComplexType(QualType Element, QualType CanonicalPtr) |
2550 | : Type(Complex, CanonicalPtr, Element->isDependentType(), |
2551 | Element->isInstantiationDependentType(), |
2552 | Element->isVariablyModifiedType(), |
2553 | Element->containsUnexpandedParameterPack()), |
2554 | ElementType(Element) {} |
2555 | |
2556 | public: |
2557 | QualType getElementType() const { return ElementType; } |
2558 | |
2559 | bool isSugared() const { return false; } |
2560 | QualType desugar() const { return QualType(this, 0); } |
2561 | |
2562 | void Profile(llvm::FoldingSetNodeID &ID) { |
2563 | Profile(ID, getElementType()); |
2564 | } |
2565 | |
2566 | static void Profile(llvm::FoldingSetNodeID &ID, QualType Element) { |
2567 | ID.AddPointer(Element.getAsOpaquePtr()); |
2568 | } |
2569 | |
2570 | static bool classof(const Type *T) { return T->getTypeClass() == Complex; } |
2571 | }; |
2572 | |
2573 | /// Sugar for parentheses used when specifying types. |
2574 | class ParenType : public Type, public llvm::FoldingSetNode { |
2575 | friend class ASTContext; // ASTContext creates these. |
2576 | |
2577 | QualType Inner; |
2578 | |
2579 | ParenType(QualType InnerType, QualType CanonType) |
2580 | : Type(Paren, CanonType, InnerType->isDependentType(), |
2581 | InnerType->isInstantiationDependentType(), |
2582 | InnerType->isVariablyModifiedType(), |
2583 | InnerType->containsUnexpandedParameterPack()), |
2584 | Inner(InnerType) {} |
2585 | |
2586 | public: |
2587 | QualType getInnerType() const { return Inner; } |
2588 | |
2589 | bool isSugared() const { return true; } |
2590 | QualType desugar() const { return getInnerType(); } |
2591 | |
2592 | void Profile(llvm::FoldingSetNodeID &ID) { |
2593 | Profile(ID, getInnerType()); |
2594 | } |
2595 | |
2596 | static void Profile(llvm::FoldingSetNodeID &ID, QualType Inner) { |
2597 | Inner.Profile(ID); |
2598 | } |
2599 | |
2600 | static bool classof(const Type *T) { return T->getTypeClass() == Paren; } |
2601 | }; |
2602 | |
2603 | /// PointerType - C99 6.7.5.1 - Pointer Declarators. |
2604 | class PointerType : public Type, public llvm::FoldingSetNode { |
2605 | friend class ASTContext; // ASTContext creates these. |
2606 | |
2607 | QualType PointeeType; |
2608 | |
2609 | PointerType(QualType Pointee, QualType CanonicalPtr) |
2610 | : Type(Pointer, CanonicalPtr, Pointee->isDependentType(), |
2611 | Pointee->isInstantiationDependentType(), |
2612 | Pointee->isVariablyModifiedType(), |
2613 | Pointee->containsUnexpandedParameterPack()), |
2614 | PointeeType(Pointee) {} |
2615 | |
2616 | public: |
2617 | QualType getPointeeType() const { return PointeeType; } |
2618 | |
2619 | /// Returns true if address spaces of pointers overlap. |
2620 | /// OpenCL v2.0 defines conversion rules for pointers to different |
2621 | /// address spaces (OpenCLC v2.0 s6.5.5) and notion of overlapping |
2622 | /// address spaces. |
2623 | /// CL1.1 or CL1.2: |
2624 | /// address spaces overlap iff they are they same. |
2625 | /// CL2.0 adds: |
2626 | /// __generic overlaps with any address space except for __constant. |
2627 | bool isAddressSpaceOverlapping(const PointerType &other) const { |
2628 | Qualifiers thisQuals = PointeeType.getQualifiers(); |
2629 | Qualifiers otherQuals = other.getPointeeType().getQualifiers(); |
2630 | // Address spaces overlap if at least one of them is a superset of another |
2631 | return thisQuals.isAddressSpaceSupersetOf(otherQuals) || |
2632 | otherQuals.isAddressSpaceSupersetOf(thisQuals); |
2633 | } |
2634 | |
2635 | bool isSugared() const { return false; } |
2636 | QualType desugar() const { return QualType(this, 0); } |
2637 | |
2638 | void Profile(llvm::FoldingSetNodeID &ID) { |
2639 | Profile(ID, getPointeeType()); |
2640 | } |
2641 | |
2642 | static void Profile(llvm::FoldingSetNodeID &ID, QualType Pointee) { |
2643 | ID.AddPointer(Pointee.getAsOpaquePtr()); |
2644 | } |
2645 | |
2646 | static bool classof(const Type *T) { return T->getTypeClass() == Pointer; } |
2647 | }; |
2648 | |
2649 | /// Represents a type which was implicitly adjusted by the semantic |
2650 | /// engine for arbitrary reasons. For example, array and function types can |
2651 | /// decay, and function types can have their calling conventions adjusted. |
2652 | class AdjustedType : public Type, public llvm::FoldingSetNode { |
2653 | QualType OriginalTy; |
2654 | QualType AdjustedTy; |
2655 | |
2656 | protected: |
2657 | friend class ASTContext; // ASTContext creates these. |
2658 | |
2659 | AdjustedType(TypeClass TC, QualType OriginalTy, QualType AdjustedTy, |
2660 | QualType CanonicalPtr) |
2661 | : Type(TC, CanonicalPtr, OriginalTy->isDependentType(), |
2662 | OriginalTy->isInstantiationDependentType(), |
2663 | OriginalTy->isVariablyModifiedType(), |
2664 | OriginalTy->containsUnexpandedParameterPack()), |
2665 | OriginalTy(OriginalTy), AdjustedTy(AdjustedTy) {} |
2666 | |
2667 | public: |
2668 | QualType getOriginalType() const { return OriginalTy; } |
2669 | QualType getAdjustedType() const { return AdjustedTy; } |
2670 | |
2671 | bool isSugared() const { return true; } |
2672 | QualType desugar() const { return AdjustedTy; } |
2673 | |
2674 | void Profile(llvm::FoldingSetNodeID &ID) { |
2675 | Profile(ID, OriginalTy, AdjustedTy); |
2676 | } |
2677 | |
2678 | static void Profile(llvm::FoldingSetNodeID &ID, QualType Orig, QualType New) { |
2679 | ID.AddPointer(Orig.getAsOpaquePtr()); |
2680 | ID.AddPointer(New.getAsOpaquePtr()); |
2681 | } |
2682 | |
2683 | static bool classof(const Type *T) { |
2684 | return T->getTypeClass() == Adjusted || T->getTypeClass() == Decayed; |
2685 | } |
2686 | }; |
2687 | |
2688 | /// Represents a pointer type decayed from an array or function type. |
2689 | class DecayedType : public AdjustedType { |
2690 | friend class ASTContext; // ASTContext creates these. |
2691 | |
2692 | inline |
2693 | DecayedType(QualType OriginalType, QualType Decayed, QualType Canonical); |
2694 | |
2695 | public: |
2696 | QualType getDecayedType() const { return getAdjustedType(); } |
2697 | |
2698 | inline QualType getPointeeType() const; |
2699 | |
2700 | static bool classof(const Type *T) { return T->getTypeClass() == Decayed; } |
2701 | }; |
2702 | |
2703 | /// Pointer to a block type. |
2704 | /// This type is to represent types syntactically represented as |
2705 | /// "void (^)(int)", etc. Pointee is required to always be a function type. |
2706 | class BlockPointerType : public Type, public llvm::FoldingSetNode { |
2707 | friend class ASTContext; // ASTContext creates these. |
2708 | |
2709 | // Block is some kind of pointer type |
2710 | QualType PointeeType; |
2711 | |
2712 | BlockPointerType(QualType Pointee, QualType CanonicalCls) |
2713 | : Type(BlockPointer, CanonicalCls, Pointee->isDependentType(), |
2714 | Pointee->isInstantiationDependentType(), |
2715 | Pointee->isVariablyModifiedType(), |
2716 | Pointee->containsUnexpandedParameterPack()), |
2717 | PointeeType(Pointee) {} |
2718 | |
2719 | public: |
2720 | // Get the pointee type. Pointee is required to always be a function type. |
2721 | QualType getPointeeType() const { return PointeeType; } |
2722 | |
2723 | bool isSugared() const { return false; } |
2724 | QualType desugar() const { return QualType(this, 0); } |
2725 | |
2726 | void Profile(llvm::FoldingSetNodeID &ID) { |
2727 | Profile(ID, getPointeeType()); |
2728 | } |
2729 | |
2730 | static void Profile(llvm::FoldingSetNodeID &ID, QualType Pointee) { |
2731 | ID.AddPointer(Pointee.getAsOpaquePtr()); |
2732 | } |
2733 | |
2734 | static bool classof(const Type *T) { |
2735 | return T->getTypeClass() == BlockPointer; |
2736 | } |
2737 | }; |
2738 | |
2739 | /// Base for LValueReferenceType and RValueReferenceType |
2740 | class ReferenceType : public Type, public llvm::FoldingSetNode { |
2741 | QualType PointeeType; |
2742 | |
2743 | protected: |
2744 | ReferenceType(TypeClass tc, QualType Referencee, QualType CanonicalRef, |
2745 | bool SpelledAsLValue) |
2746 | : Type(tc, CanonicalRef, Referencee->isDependentType(), |
2747 | Referencee->isInstantiationDependentType(), |
2748 | Referencee->isVariablyModifiedType(), |
2749 | Referencee->containsUnexpandedParameterPack()), |
2750 | PointeeType(Referencee) { |
2751 | ReferenceTypeBits.SpelledAsLValue = SpelledAsLValue; |
2752 | ReferenceTypeBits.InnerRef = Referencee->isReferenceType(); |
2753 | } |
2754 | |
2755 | public: |
2756 | bool isSpelledAsLValue() const { return ReferenceTypeBits.SpelledAsLValue; } |
2757 | bool isInnerRef() const { return ReferenceTypeBits.InnerRef; } |
2758 | |
2759 | QualType getPointeeTypeAsWritten() const { return PointeeType; } |
2760 | |
2761 | QualType getPointeeType() const { |
2762 | // FIXME: this might strip inner qualifiers; okay? |
2763 | const ReferenceType *T = this; |
2764 | while (T->isInnerRef()) |
2765 | T = T->PointeeType->castAs<ReferenceType>(); |
2766 | return T->PointeeType; |
2767 | } |
2768 | |
2769 | void Profile(llvm::FoldingSetNodeID &ID) { |
2770 | Profile(ID, PointeeType, isSpelledAsLValue()); |
2771 | } |
2772 | |
2773 | static void Profile(llvm::FoldingSetNodeID &ID, |
2774 | QualType Referencee, |
2775 | bool SpelledAsLValue) { |
2776 | ID.AddPointer(Referencee.getAsOpaquePtr()); |
2777 | ID.AddBoolean(SpelledAsLValue); |
2778 | } |
2779 | |
2780 | static bool classof(const Type *T) { |
2781 | return T->getTypeClass() == LValueReference || |
2782 | T->getTypeClass() == RValueReference; |
2783 | } |
2784 | }; |
2785 | |
2786 | /// An lvalue reference type, per C++11 [dcl.ref]. |
2787 | class LValueReferenceType : public ReferenceType { |
2788 | friend class ASTContext; // ASTContext creates these |
2789 | |
2790 | LValueReferenceType(QualType Referencee, QualType CanonicalRef, |
2791 | bool SpelledAsLValue) |
2792 | : ReferenceType(LValueReference, Referencee, CanonicalRef, |
2793 | SpelledAsLValue) {} |
2794 | |
2795 | public: |
2796 | bool isSugared() const { return false; } |
2797 | QualType desugar() const { return QualType(this, 0); } |
2798 | |
2799 | static bool classof(const Type *T) { |
2800 | return T->getTypeClass() == LValueReference; |
2801 | } |
2802 | }; |
2803 | |
2804 | /// An rvalue reference type, per C++11 [dcl.ref]. |
2805 | class RValueReferenceType : public ReferenceType { |
2806 | friend class ASTContext; // ASTContext creates these |
2807 | |
2808 | RValueReferenceType(QualType Referencee, QualType CanonicalRef) |
2809 | : ReferenceType(RValueReference, Referencee, CanonicalRef, false) {} |
2810 | |
2811 | public: |
2812 | bool isSugared() const { return false; } |
2813 | QualType desugar() const { return QualType(this, 0); } |
2814 | |
2815 | static bool classof(const Type *T) { |
2816 | return T->getTypeClass() == RValueReference; |
2817 | } |
2818 | }; |
2819 | |
2820 | /// A pointer to member type per C++ 8.3.3 - Pointers to members. |
2821 | /// |
2822 | /// This includes both pointers to data members and pointer to member functions. |
2823 | class MemberPointerType : public Type, public llvm::FoldingSetNode { |
2824 | friend class ASTContext; // ASTContext creates these. |
2825 | |
2826 | QualType PointeeType; |
2827 | |
2828 | /// The class of which the pointee is a member. Must ultimately be a |
2829 | /// RecordType, but could be a typedef or a template parameter too. |
2830 | const Type *Class; |
2831 | |
2832 | MemberPointerType(QualType Pointee, const Type *Cls, QualType CanonicalPtr) |
2833 | : Type(MemberPointer, CanonicalPtr, |
2834 | Cls->isDependentType() || Pointee->isDependentType(), |
2835 | (Cls->isInstantiationDependentType() || |
2836 | Pointee->isInstantiationDependentType()), |
2837 | Pointee->isVariablyModifiedType(), |
2838 | (Cls->containsUnexpandedParameterPack() || |
2839 | Pointee->containsUnexpandedParameterPack())), |
2840 | PointeeType(Pointee), Class(Cls) {} |
2841 | |
2842 | public: |
2843 | QualType getPointeeType() const { return PointeeType; } |
2844 | |
2845 | /// Returns true if the member type (i.e. the pointee type) is a |
2846 | /// function type rather than a data-member type. |
2847 | bool isMemberFunctionPointer() const { |
2848 | return PointeeType->isFunctionProtoType(); |
2849 | } |
2850 | |
2851 | /// Returns true if the member type (i.e. the pointee type) is a |
2852 | /// data type rather than a function type. |
2853 | bool isMemberDataPointer() const { |
2854 | return !PointeeType->isFunctionProtoType(); |
2855 | } |
2856 | |
2857 | const Type *getClass() const { return Class; } |
2858 | CXXRecordDecl *getMostRecentCXXRecordDecl() const; |
2859 | |
2860 | bool isSugared() const { return false; } |
2861 | QualType desugar() const { return QualType(this, 0); } |
2862 | |
2863 | void Profile(llvm::FoldingSetNodeID &ID) { |
2864 | Profile(ID, getPointeeType(), getClass()); |
2865 | } |
2866 | |
2867 | static void Profile(llvm::FoldingSetNodeID &ID, QualType Pointee, |
2868 | const Type *Class) { |
2869 | ID.AddPointer(Pointee.getAsOpaquePtr()); |
2870 | ID.AddPointer(Class); |
2871 | } |
2872 | |
2873 | static bool classof(const Type *T) { |
2874 | return T->getTypeClass() == MemberPointer; |
2875 | } |
2876 | }; |
2877 | |
2878 | /// Represents an array type, per C99 6.7.5.2 - Array Declarators. |
2879 | class ArrayType : public Type, public llvm::FoldingSetNode { |
2880 | public: |
2881 | /// Capture whether this is a normal array (e.g. int X[4]) |
2882 | /// an array with a static size (e.g. int X[static 4]), or an array |
2883 | /// with a star size (e.g. int X[*]). |
2884 | /// 'static' is only allowed on function parameters. |
2885 | enum ArraySizeModifier { |
2886 | Normal, Static, Star |
2887 | }; |
2888 | |
2889 | private: |
2890 | /// The element type of the array. |
2891 | QualType ElementType; |
2892 | |
2893 | protected: |
2894 | friend class ASTContext; // ASTContext creates these. |
2895 | |
2896 | ArrayType(TypeClass tc, QualType et, QualType can, ArraySizeModifier sm, |
2897 | unsigned tq, const Expr *sz = nullptr); |
2898 | |
2899 | public: |
2900 | QualType getElementType() const { return ElementType; } |
2901 | |
2902 | ArraySizeModifier getSizeModifier() const { |
2903 | return ArraySizeModifier(ArrayTypeBits.SizeModifier); |
2904 | } |
2905 | |
2906 | Qualifiers getIndexTypeQualifiers() const { |
2907 | return Qualifiers::fromCVRMask(getIndexTypeCVRQualifiers()); |
2908 | } |
2909 | |
2910 | unsigned getIndexTypeCVRQualifiers() const { |
2911 | return ArrayTypeBits.IndexTypeQuals; |
2912 | } |
2913 | |
2914 | static bool classof(const Type *T) { |
2915 | return T->getTypeClass() == ConstantArray || |
2916 | T->getTypeClass() == VariableArray || |
2917 | T->getTypeClass() == IncompleteArray || |
2918 | T->getTypeClass() == DependentSizedArray; |
2919 | } |
2920 | }; |
2921 | |
2922 | /// Represents the canonical version of C arrays with a specified constant size. |
2923 | /// For example, the canonical type for 'int A[4 + 4*100]' is a |
2924 | /// ConstantArrayType where the element type is 'int' and the size is 404. |
2925 | class ConstantArrayType final |
2926 | : public ArrayType, |
2927 | private llvm::TrailingObjects<ConstantArrayType, const Expr *> { |
2928 | friend class ASTContext; // ASTContext creates these. |
2929 | friend TrailingObjects; |
2930 | |
2931 | llvm::APInt Size; // Allows us to unique the type. |
2932 | |
2933 | ConstantArrayType(QualType et, QualType can, const llvm::APInt &size, |
2934 | const Expr *sz, ArraySizeModifier sm, unsigned tq) |
2935 | : ArrayType(ConstantArray, et, can, sm, tq, sz), Size(size) { |
2936 | ConstantArrayTypeBits.HasStoredSizeExpr = sz != nullptr; |
2937 | if (ConstantArrayTypeBits.HasStoredSizeExpr) { |
2938 | assert(!can.isNull() && "canonical constant array should not have size")((!can.isNull() && "canonical constant array should not have size" ) ? static_cast<void> (0) : __assert_fail ("!can.isNull() && \"canonical constant array should not have size\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 2938, __PRETTY_FUNCTION__)); |
2939 | *getTrailingObjects<const Expr*>() = sz; |
2940 | } |
2941 | } |
2942 | |
2943 | unsigned numTrailingObjects(OverloadToken<const Expr*>) const { |
2944 | return ConstantArrayTypeBits.HasStoredSizeExpr; |
2945 | } |
2946 | |
2947 | public: |
2948 | const llvm::APInt &getSize() const { return Size; } |
2949 | const Expr *getSizeExpr() const { |
2950 | return ConstantArrayTypeBits.HasStoredSizeExpr |
2951 | ? *getTrailingObjects<const Expr *>() |
2952 | : nullptr; |
2953 | } |
2954 | bool isSugared() const { return false; } |
2955 | QualType desugar() const { return QualType(this, 0); } |
2956 | |
2957 | /// Determine the number of bits required to address a member of |
2958 | // an array with the given element type and number of elements. |
2959 | static unsigned getNumAddressingBits(const ASTContext &Context, |
2960 | QualType ElementType, |
2961 | const llvm::APInt &NumElements); |
2962 | |
2963 | /// Determine the maximum number of active bits that an array's size |
2964 | /// can require, which limits the maximum size of the array. |
2965 | static unsigned getMaxSizeBits(const ASTContext &Context); |
2966 | |
2967 | void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Ctx) { |
2968 | Profile(ID, Ctx, getElementType(), getSize(), getSizeExpr(), |
2969 | getSizeModifier(), getIndexTypeCVRQualifiers()); |
2970 | } |
2971 | |
2972 | static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Ctx, |
2973 | QualType ET, const llvm::APInt &ArraySize, |
2974 | const Expr *SizeExpr, ArraySizeModifier SizeMod, |
2975 | unsigned TypeQuals); |
2976 | |
2977 | static bool classof(const Type *T) { |
2978 | return T->getTypeClass() == ConstantArray; |
2979 | } |
2980 | }; |
2981 | |
2982 | /// Represents a C array with an unspecified size. For example 'int A[]' has |
2983 | /// an IncompleteArrayType where the element type is 'int' and the size is |
2984 | /// unspecified. |
2985 | class IncompleteArrayType : public ArrayType { |
2986 | friend class ASTContext; // ASTContext creates these. |
2987 | |
2988 | IncompleteArrayType(QualType et, QualType can, |
2989 | ArraySizeModifier sm, unsigned tq) |
2990 | : ArrayType(IncompleteArray, et, can, sm, tq) {} |
2991 | |
2992 | public: |
2993 | friend class StmtIteratorBase; |
2994 | |
2995 | bool isSugared() const { return false; } |
2996 | QualType desugar() const { return QualType(this, 0); } |
2997 | |
2998 | static bool classof(const Type *T) { |
2999 | return T->getTypeClass() == IncompleteArray; |
3000 | } |
3001 | |
3002 | void Profile(llvm::FoldingSetNodeID &ID) { |
3003 | Profile(ID, getElementType(), getSizeModifier(), |
3004 | getIndexTypeCVRQualifiers()); |
3005 | } |
3006 | |
3007 | static void Profile(llvm::FoldingSetNodeID &ID, QualType ET, |
3008 | ArraySizeModifier SizeMod, unsigned TypeQuals) { |
3009 | ID.AddPointer(ET.getAsOpaquePtr()); |
3010 | ID.AddInteger(SizeMod); |
3011 | ID.AddInteger(TypeQuals); |
3012 | } |
3013 | }; |
3014 | |
3015 | /// Represents a C array with a specified size that is not an |
3016 | /// integer-constant-expression. For example, 'int s[x+foo()]'. |
3017 | /// Since the size expression is an arbitrary expression, we store it as such. |
3018 | /// |
3019 | /// Note: VariableArrayType's aren't uniqued (since the expressions aren't) and |
3020 | /// should not be: two lexically equivalent variable array types could mean |
3021 | /// different things, for example, these variables do not have the same type |
3022 | /// dynamically: |
3023 | /// |
3024 | /// void foo(int x) { |
3025 | /// int Y[x]; |
3026 | /// ++x; |
3027 | /// int Z[x]; |
3028 | /// } |
3029 | class VariableArrayType : public ArrayType { |
3030 | friend class ASTContext; // ASTContext creates these. |
3031 | |
3032 | /// An assignment-expression. VLA's are only permitted within |
3033 | /// a function block. |
3034 | Stmt *SizeExpr; |
3035 | |
3036 | /// The range spanned by the left and right array brackets. |
3037 | SourceRange Brackets; |
3038 | |
3039 | VariableArrayType(QualType et, QualType can, Expr *e, |
3040 | ArraySizeModifier sm, unsigned tq, |
3041 | SourceRange brackets) |
3042 | : ArrayType(VariableArray, et, can, sm, tq, e), |
3043 | SizeExpr((Stmt*) e), Brackets(brackets) {} |
3044 | |
3045 | public: |
3046 | friend class StmtIteratorBase; |
3047 | |
3048 | Expr *getSizeExpr() const { |
3049 | // We use C-style casts instead of cast<> here because we do not wish |
3050 | // to have a dependency of Type.h on Stmt.h/Expr.h. |
3051 | return (Expr*) SizeExpr; |
3052 | } |
3053 | |
3054 | SourceRange getBracketsRange() const { return Brackets; } |
3055 | SourceLocation getLBracketLoc() const { return Brackets.getBegin(); } |
3056 | SourceLocation getRBracketLoc() const { return Brackets.getEnd(); } |
3057 | |
3058 | bool isSugared() const { return false; } |
3059 | QualType desugar() const { return QualType(this, 0); } |
3060 | |
3061 | static bool classof(const Type *T) { |
3062 | return T->getTypeClass() == VariableArray; |
3063 | } |
3064 | |
3065 | void Profile(llvm::FoldingSetNodeID &ID) { |
3066 | llvm_unreachable("Cannot unique VariableArrayTypes.")::llvm::llvm_unreachable_internal("Cannot unique VariableArrayTypes." , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 3066); |
3067 | } |
3068 | }; |
3069 | |
3070 | /// Represents an array type in C++ whose size is a value-dependent expression. |
3071 | /// |
3072 | /// For example: |
3073 | /// \code |
3074 | /// template<typename T, int Size> |
3075 | /// class array { |
3076 | /// T data[Size]; |
3077 | /// }; |
3078 | /// \endcode |
3079 | /// |
3080 | /// For these types, we won't actually know what the array bound is |
3081 | /// until template instantiation occurs, at which point this will |
3082 | /// become either a ConstantArrayType or a VariableArrayType. |
3083 | class DependentSizedArrayType : public ArrayType { |
3084 | friend class ASTContext; // ASTContext creates these. |
3085 | |
3086 | const ASTContext &Context; |
3087 | |
3088 | /// An assignment expression that will instantiate to the |
3089 | /// size of the array. |
3090 | /// |
3091 | /// The expression itself might be null, in which case the array |
3092 | /// type will have its size deduced from an initializer. |
3093 | Stmt *SizeExpr; |
3094 | |
3095 | /// The range spanned by the left and right array brackets. |
3096 | SourceRange Brackets; |
3097 | |
3098 | DependentSizedArrayType(const ASTContext &Context, QualType et, QualType can, |
3099 | Expr *e, ArraySizeModifier sm, unsigned tq, |
3100 | SourceRange brackets); |
3101 | |
3102 | public: |
3103 | friend class StmtIteratorBase; |
3104 | |
3105 | Expr *getSizeExpr() const { |
3106 | // We use C-style casts instead of cast<> here because we do not wish |
3107 | // to have a dependency of Type.h on Stmt.h/Expr.h. |
3108 | return (Expr*) SizeExpr; |
3109 | } |
3110 | |
3111 | SourceRange getBracketsRange() const { return Brackets; } |
3112 | SourceLocation getLBracketLoc() const { return Brackets.getBegin(); } |
3113 | SourceLocation getRBracketLoc() const { return Brackets.getEnd(); } |
3114 | |
3115 | bool isSugared() const { return false; } |
3116 | QualType desugar() const { return QualType(this, 0); } |
3117 | |
3118 | static bool classof(const Type *T) { |
3119 | return T->getTypeClass() == DependentSizedArray; |
3120 | } |
3121 | |
3122 | void Profile(llvm::FoldingSetNodeID &ID) { |
3123 | Profile(ID, Context, getElementType(), |
3124 | getSizeModifier(), getIndexTypeCVRQualifiers(), getSizeExpr()); |
3125 | } |
3126 | |
3127 | static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context, |
3128 | QualType ET, ArraySizeModifier SizeMod, |
3129 | unsigned TypeQuals, Expr *E); |
3130 | }; |
3131 | |
3132 | /// Represents an extended address space qualifier where the input address space |
3133 | /// value is dependent. Non-dependent address spaces are not represented with a |
3134 | /// special Type subclass; they are stored on an ExtQuals node as part of a QualType. |
3135 | /// |
3136 | /// For example: |
3137 | /// \code |
3138 | /// template<typename T, int AddrSpace> |
3139 | /// class AddressSpace { |
3140 | /// typedef T __attribute__((address_space(AddrSpace))) type; |
3141 | /// } |
3142 | /// \endcode |
3143 | class DependentAddressSpaceType : public Type, public llvm::FoldingSetNode { |
3144 | friend class ASTContext; |
3145 | |
3146 | const ASTContext &Context; |
3147 | Expr *AddrSpaceExpr; |
3148 | QualType PointeeType; |
3149 | SourceLocation loc; |
3150 | |
3151 | DependentAddressSpaceType(const ASTContext &Context, QualType PointeeType, |
3152 | QualType can, Expr *AddrSpaceExpr, |
3153 | SourceLocation loc); |
3154 | |
3155 | public: |
3156 | Expr *getAddrSpaceExpr() const { return AddrSpaceExpr; } |
3157 | QualType getPointeeType() const { return PointeeType; } |
3158 | SourceLocation getAttributeLoc() const { return loc; } |
3159 | |
3160 | bool isSugared() const { return false; } |
3161 | QualType desugar() const { return QualType(this, 0); } |
3162 | |
3163 | static bool classof(const Type *T) { |
3164 | return T->getTypeClass() == DependentAddressSpace; |
3165 | } |
3166 | |
3167 | void Profile(llvm::FoldingSetNodeID &ID) { |
3168 | Profile(ID, Context, getPointeeType(), getAddrSpaceExpr()); |
3169 | } |
3170 | |
3171 | static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context, |
3172 | QualType PointeeType, Expr *AddrSpaceExpr); |
3173 | }; |
3174 | |
3175 | /// Represents an extended vector type where either the type or size is |
3176 | /// dependent. |
3177 | /// |
3178 | /// For example: |
3179 | /// \code |
3180 | /// template<typename T, int Size> |
3181 | /// class vector { |
3182 | /// typedef T __attribute__((ext_vector_type(Size))) type; |
3183 | /// } |
3184 | /// \endcode |
3185 | class DependentSizedExtVectorType : public Type, public llvm::FoldingSetNode { |
3186 | friend class ASTContext; |
3187 | |
3188 | const ASTContext &Context; |
3189 | Expr *SizeExpr; |
3190 | |
3191 | /// The element type of the array. |
3192 | QualType ElementType; |
3193 | |
3194 | SourceLocation loc; |
3195 | |
3196 | DependentSizedExtVectorType(const ASTContext &Context, QualType ElementType, |
3197 | QualType can, Expr *SizeExpr, SourceLocation loc); |
3198 | |
3199 | public: |
3200 | Expr *getSizeExpr() const { return SizeExpr; } |
3201 | QualType getElementType() const { return ElementType; } |
3202 | SourceLocation getAttributeLoc() const { return loc; } |
3203 | |
3204 | bool isSugared() const { return false; } |
3205 | QualType desugar() const { return QualType(this, 0); } |
3206 | |
3207 | static bool classof(const Type *T) { |
3208 | return T->getTypeClass() == DependentSizedExtVector; |
3209 | } |
3210 | |
3211 | void Profile(llvm::FoldingSetNodeID &ID) { |
3212 | Profile(ID, Context, getElementType(), getSizeExpr()); |
3213 | } |
3214 | |
3215 | static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context, |
3216 | QualType ElementType, Expr *SizeExpr); |
3217 | }; |
3218 | |
3219 | |
3220 | /// Represents a GCC generic vector type. This type is created using |
3221 | /// __attribute__((vector_size(n)), where "n" specifies the vector size in |
3222 | /// bytes; or from an Altivec __vector or vector declaration. |
3223 | /// Since the constructor takes the number of vector elements, the |
3224 | /// client is responsible for converting the size into the number of elements. |
3225 | class VectorType : public Type, public llvm::FoldingSetNode { |
3226 | public: |
3227 | enum VectorKind { |
3228 | /// not a target-specific vector type |
3229 | GenericVector, |
3230 | |
3231 | /// is AltiVec vector |
3232 | AltiVecVector, |
3233 | |
3234 | /// is AltiVec 'vector Pixel' |
3235 | AltiVecPixel, |
3236 | |
3237 | /// is AltiVec 'vector bool ...' |
3238 | AltiVecBool, |
3239 | |
3240 | /// is ARM Neon vector |
3241 | NeonVector, |
3242 | |
3243 | /// is ARM Neon polynomial vector |
3244 | NeonPolyVector |
3245 | }; |
3246 | |
3247 | protected: |
3248 | friend class ASTContext; // ASTContext creates these. |
3249 | |
3250 | /// The element type of the vector. |
3251 | QualType ElementType; |
3252 | |
3253 | VectorType(QualType vecType, unsigned nElements, QualType canonType, |
3254 | VectorKind vecKind); |
3255 | |
3256 | VectorType(TypeClass tc, QualType vecType, unsigned nElements, |
3257 | QualType canonType, VectorKind vecKind); |
3258 | |
3259 | public: |
3260 | QualType getElementType() const { return ElementType; } |
3261 | unsigned getNumElements() const { return VectorTypeBits.NumElements; } |
3262 | |
3263 | static bool isVectorSizeTooLarge(unsigned NumElements) { |
3264 | return NumElements > VectorTypeBitfields::MaxNumElements; |
3265 | } |
3266 | |
3267 | bool isSugared() const { return false; } |
3268 | QualType desugar() const { return QualType(this, 0); } |
3269 | |
3270 | VectorKind getVectorKind() const { |
3271 | return VectorKind(VectorTypeBits.VecKind); |
3272 | } |
3273 | |
3274 | void Profile(llvm::FoldingSetNodeID &ID) { |
3275 | Profile(ID, getElementType(), getNumElements(), |
3276 | getTypeClass(), getVectorKind()); |
3277 | } |
3278 | |
3279 | static void Profile(llvm::FoldingSetNodeID &ID, QualType ElementType, |
3280 | unsigned NumElements, TypeClass TypeClass, |
3281 | VectorKind VecKind) { |
3282 | ID.AddPointer(ElementType.getAsOpaquePtr()); |
3283 | ID.AddInteger(NumElements); |
3284 | ID.AddInteger(TypeClass); |
3285 | ID.AddInteger(VecKind); |
3286 | } |
3287 | |
3288 | static bool classof(const Type *T) { |
3289 | return T->getTypeClass() == Vector || T->getTypeClass() == ExtVector; |
3290 | } |
3291 | }; |
3292 | |
3293 | /// Represents a vector type where either the type or size is dependent. |
3294 | //// |
3295 | /// For example: |
3296 | /// \code |
3297 | /// template<typename T, int Size> |
3298 | /// class vector { |
3299 | /// typedef T __attribute__((vector_size(Size))) type; |
3300 | /// } |
3301 | /// \endcode |
3302 | class DependentVectorType : public Type, public llvm::FoldingSetNode { |
3303 | friend class ASTContext; |
3304 | |
3305 | const ASTContext &Context; |
3306 | QualType ElementType; |
3307 | Expr *SizeExpr; |
3308 | SourceLocation Loc; |
3309 | |
3310 | DependentVectorType(const ASTContext &Context, QualType ElementType, |
3311 | QualType CanonType, Expr *SizeExpr, |
3312 | SourceLocation Loc, VectorType::VectorKind vecKind); |
3313 | |
3314 | public: |
3315 | Expr *getSizeExpr() const { return SizeExpr; } |
3316 | QualType getElementType() const { return ElementType; } |
3317 | SourceLocation getAttributeLoc() const { return Loc; } |
3318 | VectorType::VectorKind getVectorKind() const { |
3319 | return VectorType::VectorKind(VectorTypeBits.VecKind); |
3320 | } |
3321 | |
3322 | bool isSugared() const { return false; } |
3323 | QualType desugar() const { return QualType(this, 0); } |
3324 | |
3325 | static bool classof(const Type *T) { |
3326 | return T->getTypeClass() == DependentVector; |
3327 | } |
3328 | |
3329 | void Profile(llvm::FoldingSetNodeID &ID) { |
3330 | Profile(ID, Context, getElementType(), getSizeExpr(), getVectorKind()); |
3331 | } |
3332 | |
3333 | static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context, |
3334 | QualType ElementType, const Expr *SizeExpr, |
3335 | VectorType::VectorKind VecKind); |
3336 | }; |
3337 | |
3338 | /// ExtVectorType - Extended vector type. This type is created using |
3339 | /// __attribute__((ext_vector_type(n)), where "n" is the number of elements. |
3340 | /// Unlike vector_size, ext_vector_type is only allowed on typedef's. This |
3341 | /// class enables syntactic extensions, like Vector Components for accessing |
3342 | /// points (as .xyzw), colors (as .rgba), and textures (modeled after OpenGL |
3343 | /// Shading Language). |
3344 | class ExtVectorType : public VectorType { |
3345 | friend class ASTContext; // ASTContext creates these. |
3346 | |
3347 | ExtVectorType(QualType vecType, unsigned nElements, QualType canonType) |
3348 | : VectorType(ExtVector, vecType, nElements, canonType, GenericVector) {} |
3349 | |
3350 | public: |
3351 | static int getPointAccessorIdx(char c) { |
3352 | switch (c) { |
3353 | default: return -1; |
3354 | case 'x': case 'r': return 0; |
3355 | case 'y': case 'g': return 1; |
3356 | case 'z': case 'b': return 2; |
3357 | case 'w': case 'a': return 3; |
3358 | } |
3359 | } |
3360 | |
3361 | static int getNumericAccessorIdx(char c) { |
3362 | switch (c) { |
3363 | default: return -1; |
3364 | case '0': return 0; |
3365 | case '1': return 1; |
3366 | case '2': return 2; |
3367 | case '3': return 3; |
3368 | case '4': return 4; |
3369 | case '5': return 5; |
3370 | case '6': return 6; |
3371 | case '7': return 7; |
3372 | case '8': return 8; |
3373 | case '9': return 9; |
3374 | case 'A': |
3375 | case 'a': return 10; |
3376 | case 'B': |
3377 | case 'b': return 11; |
3378 | case 'C': |
3379 | case 'c': return 12; |
3380 | case 'D': |
3381 | case 'd': return 13; |
3382 | case 'E': |
3383 | case 'e': return 14; |
3384 | case 'F': |
3385 | case 'f': return 15; |
3386 | } |
3387 | } |
3388 | |
3389 | static int getAccessorIdx(char c, bool isNumericAccessor) { |
3390 | if (isNumericAccessor) |
3391 | return getNumericAccessorIdx(c); |
3392 | else |
3393 | return getPointAccessorIdx(c); |
3394 | } |
3395 | |
3396 | bool isAccessorWithinNumElements(char c, bool isNumericAccessor) const { |
3397 | if (int idx = getAccessorIdx(c, isNumericAccessor)+1) |
3398 | return unsigned(idx-1) < getNumElements(); |
3399 | return false; |
3400 | } |
3401 | |
3402 | bool isSugared() const { return false; } |
3403 | QualType desugar() const { return QualType(this, 0); } |
3404 | |
3405 | static bool classof(const Type *T) { |
3406 | return T->getTypeClass() == ExtVector; |
3407 | } |
3408 | }; |
3409 | |
3410 | /// FunctionType - C99 6.7.5.3 - Function Declarators. This is the common base |
3411 | /// class of FunctionNoProtoType and FunctionProtoType. |
3412 | class FunctionType : public Type { |
3413 | // The type returned by the function. |
3414 | QualType ResultType; |
3415 | |
3416 | public: |
3417 | /// Interesting information about a specific parameter that can't simply |
3418 | /// be reflected in parameter's type. This is only used by FunctionProtoType |
3419 | /// but is in FunctionType to make this class available during the |
3420 | /// specification of the bases of FunctionProtoType. |
3421 | /// |
3422 | /// It makes sense to model language features this way when there's some |
3423 | /// sort of parameter-specific override (such as an attribute) that |
3424 | /// affects how the function is called. For example, the ARC ns_consumed |
3425 | /// attribute changes whether a parameter is passed at +0 (the default) |
3426 | /// or +1 (ns_consumed). This must be reflected in the function type, |
3427 | /// but isn't really a change to the parameter type. |
3428 | /// |
3429 | /// One serious disadvantage of modelling language features this way is |
3430 | /// that they generally do not work with language features that attempt |
3431 | /// to destructure types. For example, template argument deduction will |
3432 | /// not be able to match a parameter declared as |
3433 | /// T (*)(U) |
3434 | /// against an argument of type |
3435 | /// void (*)(__attribute__((ns_consumed)) id) |
3436 | /// because the substitution of T=void, U=id into the former will |
3437 | /// not produce the latter. |
3438 | class ExtParameterInfo { |
3439 | enum { |
3440 | ABIMask = 0x0F, |
3441 | IsConsumed = 0x10, |
3442 | HasPassObjSize = 0x20, |
3443 | IsNoEscape = 0x40, |
3444 | }; |
3445 | unsigned char Data = 0; |
3446 | |
3447 | public: |
3448 | ExtParameterInfo() = default; |
3449 | |
3450 | /// Return the ABI treatment of this parameter. |
3451 | ParameterABI getABI() const { return ParameterABI(Data & ABIMask); } |
3452 | ExtParameterInfo withABI(ParameterABI kind) const { |
3453 | ExtParameterInfo copy = *this; |
3454 | copy.Data = (copy.Data & ~ABIMask) | unsigned(kind); |
3455 | return copy; |
3456 | } |
3457 | |
3458 | /// Is this parameter considered "consumed" by Objective-C ARC? |
3459 | /// Consumed parameters must have retainable object type. |
3460 | bool isConsumed() const { return (Data & IsConsumed); } |
3461 | ExtParameterInfo withIsConsumed(bool consumed) const { |
3462 | ExtParameterInfo copy = *this; |
3463 | if (consumed) |
3464 | copy.Data |= IsConsumed; |
3465 | else |
3466 | copy.Data &= ~IsConsumed; |
3467 | return copy; |
3468 | } |
3469 | |
3470 | bool hasPassObjectSize() const { return Data & HasPassObjSize; } |
3471 | ExtParameterInfo withHasPassObjectSize() const { |
3472 | ExtParameterInfo Copy = *this; |
3473 | Copy.Data |= HasPassObjSize; |
3474 | return Copy; |
3475 | } |
3476 | |
3477 | bool isNoEscape() const { return Data & IsNoEscape; } |
3478 | ExtParameterInfo withIsNoEscape(bool NoEscape) const { |
3479 | ExtParameterInfo Copy = *this; |
3480 | if (NoEscape) |
3481 | Copy.Data |= IsNoEscape; |
3482 | else |
3483 | Copy.Data &= ~IsNoEscape; |
3484 | return Copy; |
3485 | } |
3486 | |
3487 | unsigned char getOpaqueValue() const { return Data; } |
3488 | static ExtParameterInfo getFromOpaqueValue(unsigned char data) { |
3489 | ExtParameterInfo result; |
3490 | result.Data = data; |
3491 | return result; |
3492 | } |
3493 | |
3494 | friend bool operator==(ExtParameterInfo lhs, ExtParameterInfo rhs) { |
3495 | return lhs.Data == rhs.Data; |
3496 | } |
3497 | |
3498 | friend bool operator!=(ExtParameterInfo lhs, ExtParameterInfo rhs) { |
3499 | return lhs.Data != rhs.Data; |
3500 | } |
3501 | }; |
3502 | |
3503 | /// A class which abstracts out some details necessary for |
3504 | /// making a call. |
3505 | /// |
3506 | /// It is not actually used directly for storing this information in |
3507 | /// a FunctionType, although FunctionType does currently use the |
3508 | /// same bit-pattern. |
3509 | /// |
3510 | // If you add a field (say Foo), other than the obvious places (both, |
3511 | // constructors, compile failures), what you need to update is |
3512 | // * Operator== |
3513 | // * getFoo |
3514 | // * withFoo |
3515 | // * functionType. Add Foo, getFoo. |
3516 | // * ASTContext::getFooType |
3517 | // * ASTContext::mergeFunctionTypes |
3518 | // * FunctionNoProtoType::Profile |
3519 | // * FunctionProtoType::Profile |
3520 | // * TypePrinter::PrintFunctionProto |
3521 | // * AST read and write |
3522 | // * Codegen |
3523 | class ExtInfo { |
3524 | friend class FunctionType; |
3525 | |
3526 | // Feel free to rearrange or add bits, but if you go over 12, |
3527 | // you'll need to adjust both the Bits field below and |
3528 | // Type::FunctionTypeBitfields. |
3529 | |
3530 | // | CC |noreturn|produces|nocallersavedregs|regparm|nocfcheck| |
3531 | // |0 .. 4| 5 | 6 | 7 |8 .. 10| 11 | |
3532 | // |
3533 | // regparm is either 0 (no regparm attribute) or the regparm value+1. |
3534 | enum { CallConvMask = 0x1F }; |
3535 | enum { NoReturnMask = 0x20 }; |
3536 | enum { ProducesResultMask = 0x40 }; |
3537 | enum { NoCallerSavedRegsMask = 0x80 }; |
3538 | enum { NoCfCheckMask = 0x800 }; |
3539 | enum { |
3540 | RegParmMask = ~(CallConvMask | NoReturnMask | ProducesResultMask | |
3541 | NoCallerSavedRegsMask | NoCfCheckMask), |
3542 | RegParmOffset = 8 |
3543 | }; // Assumed to be the last field |
3544 | uint16_t Bits = CC_C; |
3545 | |
3546 | ExtInfo(unsigned Bits) : Bits(static_cast<uint16_t>(Bits)) {} |
3547 | |
3548 | public: |
3549 | // Constructor with no defaults. Use this when you know that you |
3550 | // have all the elements (when reading an AST file for example). |
3551 | ExtInfo(bool noReturn, bool hasRegParm, unsigned regParm, CallingConv cc, |
3552 | bool producesResult, bool noCallerSavedRegs, bool NoCfCheck) { |
3553 | assert((!hasRegParm || regParm < 7) && "Invalid regparm value")(((!hasRegParm || regParm < 7) && "Invalid regparm value" ) ? static_cast<void> (0) : __assert_fail ("(!hasRegParm || regParm < 7) && \"Invalid regparm value\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 3553, __PRETTY_FUNCTION__)); |
3554 | Bits = ((unsigned)cc) | (noReturn ? NoReturnMask : 0) | |
3555 | (producesResult ? ProducesResultMask : 0) | |
3556 | (noCallerSavedRegs ? NoCallerSavedRegsMask : 0) | |
3557 | (hasRegParm ? ((regParm + 1) << RegParmOffset) : 0) | |
3558 | (NoCfCheck ? NoCfCheckMask : 0); |
3559 | } |
3560 | |
3561 | // Constructor with all defaults. Use when for example creating a |
3562 | // function known to use defaults. |
3563 | ExtInfo() = default; |
3564 | |
3565 | // Constructor with just the calling convention, which is an important part |
3566 | // of the canonical type. |
3567 | ExtInfo(CallingConv CC) : Bits(CC) {} |
3568 | |
3569 | bool getNoReturn() const { return Bits & NoReturnMask; } |
3570 | bool getProducesResult() const { return Bits & ProducesResultMask; } |
3571 | bool getNoCallerSavedRegs() const { return Bits & NoCallerSavedRegsMask; } |
3572 | bool getNoCfCheck() const { return Bits & NoCfCheckMask; } |
3573 | bool getHasRegParm() const { return (Bits >> RegParmOffset) != 0; } |
3574 | |
3575 | unsigned getRegParm() const { |
3576 | unsigned RegParm = (Bits & RegParmMask) >> RegParmOffset; |
3577 | if (RegParm > 0) |
3578 | --RegParm; |
3579 | return RegParm; |
3580 | } |
3581 | |
3582 | CallingConv getCC() const { return CallingConv(Bits & CallConvMask); } |
3583 | |
3584 | bool operator==(ExtInfo Other) const { |
3585 | return Bits == Other.Bits; |
3586 | } |
3587 | bool operator!=(ExtInfo Other) const { |
3588 | return Bits != Other.Bits; |
3589 | } |
3590 | |
3591 | // Note that we don't have setters. That is by design, use |
3592 | // the following with methods instead of mutating these objects. |
3593 | |
3594 | ExtInfo withNoReturn(bool noReturn) const { |
3595 | if (noReturn) |
3596 | return ExtInfo(Bits | NoReturnMask); |
3597 | else |
3598 | return ExtInfo(Bits & ~NoReturnMask); |
3599 | } |
3600 | |
3601 | ExtInfo withProducesResult(bool producesResult) const { |
3602 | if (producesResult) |
3603 | return ExtInfo(Bits | ProducesResultMask); |
3604 | else |
3605 | return ExtInfo(Bits & ~ProducesResultMask); |
3606 | } |
3607 | |
3608 | ExtInfo withNoCallerSavedRegs(bool noCallerSavedRegs) const { |
3609 | if (noCallerSavedRegs) |
3610 | return ExtInfo(Bits | NoCallerSavedRegsMask); |
3611 | else |
3612 | return ExtInfo(Bits & ~NoCallerSavedRegsMask); |
3613 | } |
3614 | |
3615 | ExtInfo withNoCfCheck(bool noCfCheck) const { |
3616 | if (noCfCheck) |
3617 | return ExtInfo(Bits | NoCfCheckMask); |
3618 | else |
3619 | return ExtInfo(Bits & ~NoCfCheckMask); |
3620 | } |
3621 | |
3622 | ExtInfo withRegParm(unsigned RegParm) const { |
3623 | assert(RegParm < 7 && "Invalid regparm value")((RegParm < 7 && "Invalid regparm value") ? static_cast <void> (0) : __assert_fail ("RegParm < 7 && \"Invalid regparm value\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 3623, __PRETTY_FUNCTION__)); |
3624 | return ExtInfo((Bits & ~RegParmMask) | |
3625 | ((RegParm + 1) << RegParmOffset)); |
3626 | } |
3627 | |
3628 | ExtInfo withCallingConv(CallingConv cc) const { |
3629 | return ExtInfo((Bits & ~CallConvMask) | (unsigned) cc); |
3630 | } |
3631 | |
3632 | void Profile(llvm::FoldingSetNodeID &ID) const { |
3633 | ID.AddInteger(Bits); |
3634 | } |
3635 | }; |
3636 | |
3637 | /// A simple holder for a QualType representing a type in an |
3638 | /// exception specification. Unfortunately needed by FunctionProtoType |
3639 | /// because TrailingObjects cannot handle repeated types. |
3640 | struct ExceptionType { QualType Type; }; |
3641 | |
3642 | /// A simple holder for various uncommon bits which do not fit in |
3643 | /// FunctionTypeBitfields. Aligned to alignof(void *) to maintain the |
3644 | /// alignment of subsequent objects in TrailingObjects. You must update |
3645 | /// hasExtraBitfields in FunctionProtoType after adding extra data here. |
3646 | struct alignas(void *) FunctionTypeExtraBitfields { |
3647 | /// The number of types in the exception specification. |
3648 | /// A whole unsigned is not needed here and according to |
3649 | /// [implimits] 8 bits would be enough here. |
3650 | unsigned NumExceptionType; |
3651 | }; |
3652 | |
3653 | protected: |
3654 | FunctionType(TypeClass tc, QualType res, |
3655 | QualType Canonical, bool Dependent, |
3656 | bool InstantiationDependent, |
3657 | bool VariablyModified, bool ContainsUnexpandedParameterPack, |
3658 | ExtInfo Info) |
3659 | : Type(tc, Canonical, Dependent, InstantiationDependent, VariablyModified, |
3660 | ContainsUnexpandedParameterPack), |
3661 | ResultType(res) { |
3662 | FunctionTypeBits.ExtInfo = Info.Bits; |
3663 | } |
3664 | |
3665 | Qualifiers getFastTypeQuals() const { |
3666 | return Qualifiers::fromFastMask(FunctionTypeBits.FastTypeQuals); |
3667 | } |
3668 | |
3669 | public: |
3670 | QualType getReturnType() const { return ResultType; } |
3671 | |
3672 | bool getHasRegParm() const { return getExtInfo().getHasRegParm(); } |
3673 | unsigned getRegParmType() const { return getExtInfo().getRegParm(); } |
3674 | |
3675 | /// Determine whether this function type includes the GNU noreturn |
3676 | /// attribute. The C++11 [[noreturn]] attribute does not affect the function |
3677 | /// type. |
3678 | bool getNoReturnAttr() const { return getExtInfo().getNoReturn(); } |
3679 | |
3680 | CallingConv getCallConv() const { return getExtInfo().getCC(); } |
3681 | ExtInfo getExtInfo() const { return ExtInfo(FunctionTypeBits.ExtInfo); } |
3682 | |
3683 | static_assert((~Qualifiers::FastMask & Qualifiers::CVRMask) == 0, |
3684 | "Const, volatile and restrict are assumed to be a subset of " |
3685 | "the fast qualifiers."); |
3686 | |
3687 | bool isConst() const { return getFastTypeQuals().hasConst(); } |
3688 | bool isVolatile() const { return getFastTypeQuals().hasVolatile(); } |
3689 | bool isRestrict() const { return getFastTypeQuals().hasRestrict(); } |
3690 | |
3691 | /// Determine the type of an expression that calls a function of |
3692 | /// this type. |
3693 | QualType getCallResultType(const ASTContext &Context) const { |
3694 | return getReturnType().getNonLValueExprType(Context); |
3695 | } |
3696 | |
3697 | static StringRef getNameForCallConv(CallingConv CC); |
3698 | |
3699 | static bool classof(const Type *T) { |
3700 | return T->getTypeClass() == FunctionNoProto || |
3701 | T->getTypeClass() == FunctionProto; |
3702 | } |
3703 | }; |
3704 | |
3705 | /// Represents a K&R-style 'int foo()' function, which has |
3706 | /// no information available about its arguments. |
3707 | class FunctionNoProtoType : public FunctionType, public llvm::FoldingSetNode { |
3708 | friend class ASTContext; // ASTContext creates these. |
3709 | |
3710 | FunctionNoProtoType(QualType Result, QualType Canonical, ExtInfo Info) |
3711 | : FunctionType(FunctionNoProto, Result, Canonical, |
3712 | /*Dependent=*/false, /*InstantiationDependent=*/false, |
3713 | Result->isVariablyModifiedType(), |
3714 | /*ContainsUnexpandedParameterPack=*/false, Info) {} |
3715 | |
3716 | public: |
3717 | // No additional state past what FunctionType provides. |
3718 | |
3719 | bool isSugared() const { return false; } |
3720 | QualType desugar() const { return QualType(this, 0); } |
3721 | |
3722 | void Profile(llvm::FoldingSetNodeID &ID) { |
3723 | Profile(ID, getReturnType(), getExtInfo()); |
3724 | } |
3725 | |
3726 | static void Profile(llvm::FoldingSetNodeID &ID, QualType ResultType, |
3727 | ExtInfo Info) { |
3728 | Info.Profile(ID); |
3729 | ID.AddPointer(ResultType.getAsOpaquePtr()); |
3730 | } |
3731 | |
3732 | static bool classof(const Type *T) { |
3733 | return T->getTypeClass() == FunctionNoProto; |
3734 | } |
3735 | }; |
3736 | |
3737 | /// Represents a prototype with parameter type info, e.g. |
3738 | /// 'int foo(int)' or 'int foo(void)'. 'void' is represented as having no |
3739 | /// parameters, not as having a single void parameter. Such a type can have |
3740 | /// an exception specification, but this specification is not part of the |
3741 | /// canonical type. FunctionProtoType has several trailing objects, some of |
3742 | /// which optional. For more information about the trailing objects see |
3743 | /// the first comment inside FunctionProtoType. |
3744 | class FunctionProtoType final |
3745 | : public FunctionType, |
3746 | public llvm::FoldingSetNode, |
3747 | private llvm::TrailingObjects< |
3748 | FunctionProtoType, QualType, SourceLocation, |
3749 | FunctionType::FunctionTypeExtraBitfields, FunctionType::ExceptionType, |
3750 | Expr *, FunctionDecl *, FunctionType::ExtParameterInfo, Qualifiers> { |
3751 | friend class ASTContext; // ASTContext creates these. |
3752 | friend TrailingObjects; |
3753 | |
3754 | // FunctionProtoType is followed by several trailing objects, some of |
3755 | // which optional. They are in order: |
3756 | // |
3757 | // * An array of getNumParams() QualType holding the parameter types. |
3758 | // Always present. Note that for the vast majority of FunctionProtoType, |
3759 | // these will be the only trailing objects. |
3760 | // |
3761 | // * Optionally if the function is variadic, the SourceLocation of the |
3762 | // ellipsis. |
3763 | // |
3764 | // * Optionally if some extra data is stored in FunctionTypeExtraBitfields |
3765 | // (see FunctionTypeExtraBitfields and FunctionTypeBitfields): |
3766 | // a single FunctionTypeExtraBitfields. Present if and only if |
3767 | // hasExtraBitfields() is true. |
3768 | // |
3769 | // * Optionally exactly one of: |
3770 | // * an array of getNumExceptions() ExceptionType, |
3771 | // * a single Expr *, |
3772 | // * a pair of FunctionDecl *, |
3773 | // * a single FunctionDecl * |
3774 | // used to store information about the various types of exception |
3775 | // specification. See getExceptionSpecSize for the details. |
3776 | // |
3777 | // * Optionally an array of getNumParams() ExtParameterInfo holding |
3778 | // an ExtParameterInfo for each of the parameters. Present if and |
3779 | // only if hasExtParameterInfos() is true. |
3780 | // |
3781 | // * Optionally a Qualifiers object to represent extra qualifiers that can't |
3782 | // be represented by FunctionTypeBitfields.FastTypeQuals. Present if and only |
3783 | // if hasExtQualifiers() is true. |
3784 | // |
3785 | // The optional FunctionTypeExtraBitfields has to be before the data |
3786 | // related to the exception specification since it contains the number |
3787 | // of exception types. |
3788 | // |
3789 | // We put the ExtParameterInfos last. If all were equal, it would make |
3790 | // more sense to put these before the exception specification, because |
3791 | // it's much easier to skip past them compared to the elaborate switch |
3792 | // required to skip the exception specification. However, all is not |
3793 | // equal; ExtParameterInfos are used to model very uncommon features, |
3794 | // and it's better not to burden the more common paths. |
3795 | |
3796 | public: |
3797 | /// Holds information about the various types of exception specification. |
3798 | /// ExceptionSpecInfo is not stored as such in FunctionProtoType but is |
3799 | /// used to group together the various bits of information about the |
3800 | /// exception specification. |
3801 | struct ExceptionSpecInfo { |
3802 | /// The kind of exception specification this is. |
3803 | ExceptionSpecificationType Type = EST_None; |
3804 | |
3805 | /// Explicitly-specified list of exception types. |
3806 | ArrayRef<QualType> Exceptions; |
3807 | |
3808 | /// Noexcept expression, if this is a computed noexcept specification. |
3809 | Expr *NoexceptExpr = nullptr; |
3810 | |
3811 | /// The function whose exception specification this is, for |
3812 | /// EST_Unevaluated and EST_Uninstantiated. |
3813 | FunctionDecl *SourceDecl = nullptr; |
3814 | |
3815 | /// The function template whose exception specification this is instantiated |
3816 | /// from, for EST_Uninstantiated. |
3817 | FunctionDecl *SourceTemplate = nullptr; |
3818 | |
3819 | ExceptionSpecInfo() = default; |
3820 | |
3821 | ExceptionSpecInfo(ExceptionSpecificationType EST) : Type(EST) {} |
3822 | }; |
3823 | |
3824 | /// Extra information about a function prototype. ExtProtoInfo is not |
3825 | /// stored as such in FunctionProtoType but is used to group together |
3826 | /// the various bits of extra information about a function prototype. |
3827 | struct ExtProtoInfo { |
3828 | FunctionType::ExtInfo ExtInfo; |
3829 | bool Variadic : 1; |
3830 | bool HasTrailingReturn : 1; |
3831 | Qualifiers TypeQuals; |
3832 | RefQualifierKind RefQualifier = RQ_None; |
3833 | ExceptionSpecInfo ExceptionSpec; |
3834 | const ExtParameterInfo *ExtParameterInfos = nullptr; |
3835 | SourceLocation EllipsisLoc; |
3836 | |
3837 | ExtProtoInfo() : Variadic(false), HasTrailingReturn(false) {} |
3838 | |
3839 | ExtProtoInfo(CallingConv CC) |
3840 | : ExtInfo(CC), Variadic(false), HasTrailingReturn(false) {} |
3841 | |
3842 | ExtProtoInfo withExceptionSpec(const ExceptionSpecInfo &ESI) { |
3843 | ExtProtoInfo Result(*this); |
3844 | Result.ExceptionSpec = ESI; |
3845 | return Result; |
3846 | } |
3847 | }; |
3848 | |
3849 | private: |
3850 | unsigned numTrailingObjects(OverloadToken<QualType>) const { |
3851 | return getNumParams(); |
3852 | } |
3853 | |
3854 | unsigned numTrailingObjects(OverloadToken<SourceLocation>) const { |
3855 | return isVariadic(); |
3856 | } |
3857 | |
3858 | unsigned numTrailingObjects(OverloadToken<FunctionTypeExtraBitfields>) const { |
3859 | return hasExtraBitfields(); |
3860 | } |
3861 | |
3862 | unsigned numTrailingObjects(OverloadToken<ExceptionType>) const { |
3863 | return getExceptionSpecSize().NumExceptionType; |
3864 | } |
3865 | |
3866 | unsigned numTrailingObjects(OverloadToken<Expr *>) const { |
3867 | return getExceptionSpecSize().NumExprPtr; |
3868 | } |
3869 | |
3870 | unsigned numTrailingObjects(OverloadToken<FunctionDecl *>) const { |
3871 | return getExceptionSpecSize().NumFunctionDeclPtr; |
3872 | } |
3873 | |
3874 | unsigned numTrailingObjects(OverloadToken<ExtParameterInfo>) const { |
3875 | return hasExtParameterInfos() ? getNumParams() : 0; |
3876 | } |
3877 | |
3878 | /// Determine whether there are any argument types that |
3879 | /// contain an unexpanded parameter pack. |
3880 | static bool containsAnyUnexpandedParameterPack(const QualType *ArgArray, |
3881 | unsigned numArgs) { |
3882 | for (unsigned Idx = 0; Idx < numArgs; ++Idx) |
3883 | if (ArgArray[Idx]->containsUnexpandedParameterPack()) |
3884 | return true; |
3885 | |
3886 | return false; |
3887 | } |
3888 | |
3889 | FunctionProtoType(QualType result, ArrayRef<QualType> params, |
3890 | QualType canonical, const ExtProtoInfo &epi); |
3891 | |
3892 | /// This struct is returned by getExceptionSpecSize and is used to |
3893 | /// translate an ExceptionSpecificationType to the number and kind |
3894 | /// of trailing objects related to the exception specification. |
3895 | struct ExceptionSpecSizeHolder { |
3896 | unsigned NumExceptionType; |
3897 | unsigned NumExprPtr; |
3898 | unsigned NumFunctionDeclPtr; |
3899 | }; |
3900 | |
3901 | /// Return the number and kind of trailing objects |
3902 | /// related to the exception specification. |
3903 | static ExceptionSpecSizeHolder |
3904 | getExceptionSpecSize(ExceptionSpecificationType EST, unsigned NumExceptions) { |
3905 | switch (EST) { |
3906 | case EST_None: |
3907 | case EST_DynamicNone: |
3908 | case EST_MSAny: |
3909 | case EST_BasicNoexcept: |
3910 | case EST_Unparsed: |
3911 | case EST_NoThrow: |
3912 | return {0, 0, 0}; |
3913 | |
3914 | case EST_Dynamic: |
3915 | return {NumExceptions, 0, 0}; |
3916 | |
3917 | case EST_DependentNoexcept: |
3918 | case EST_NoexceptFalse: |
3919 | case EST_NoexceptTrue: |
3920 | return {0, 1, 0}; |
3921 | |
3922 | case EST_Uninstantiated: |
3923 | return {0, 0, 2}; |
3924 | |
3925 | case EST_Unevaluated: |
3926 | return {0, 0, 1}; |
3927 | } |
3928 | llvm_unreachable("bad exception specification kind")::llvm::llvm_unreachable_internal("bad exception specification kind" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 3928); |
3929 | } |
3930 | |
3931 | /// Return the number and kind of trailing objects |
3932 | /// related to the exception specification. |
3933 | ExceptionSpecSizeHolder getExceptionSpecSize() const { |
3934 | return getExceptionSpecSize(getExceptionSpecType(), getNumExceptions()); |
3935 | } |
3936 | |
3937 | /// Whether the trailing FunctionTypeExtraBitfields is present. |
3938 | static bool hasExtraBitfields(ExceptionSpecificationType EST) { |
3939 | // If the exception spec type is EST_Dynamic then we have > 0 exception |
3940 | // types and the exact number is stored in FunctionTypeExtraBitfields. |
3941 | return EST == EST_Dynamic; |
3942 | } |
3943 | |
3944 | /// Whether the trailing FunctionTypeExtraBitfields is present. |
3945 | bool hasExtraBitfields() const { |
3946 | return hasExtraBitfields(getExceptionSpecType()); |
3947 | } |
3948 | |
3949 | bool hasExtQualifiers() const { |
3950 | return FunctionTypeBits.HasExtQuals; |
3951 | } |
3952 | |
3953 | public: |
3954 | unsigned getNumParams() const { return FunctionTypeBits.NumParams; } |
3955 | |
3956 | QualType getParamType(unsigned i) const { |
3957 | assert(i < getNumParams() && "invalid parameter index")((i < getNumParams() && "invalid parameter index") ? static_cast<void> (0) : __assert_fail ("i < getNumParams() && \"invalid parameter index\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 3957, __PRETTY_FUNCTION__)); |
3958 | return param_type_begin()[i]; |
3959 | } |
3960 | |
3961 | ArrayRef<QualType> getParamTypes() const { |
3962 | return llvm::makeArrayRef(param_type_begin(), param_type_end()); |
3963 | } |
3964 | |
3965 | ExtProtoInfo getExtProtoInfo() const { |
3966 | ExtProtoInfo EPI; |
3967 | EPI.ExtInfo = getExtInfo(); |
3968 | EPI.Variadic = isVariadic(); |
3969 | EPI.EllipsisLoc = getEllipsisLoc(); |
3970 | EPI.HasTrailingReturn = hasTrailingReturn(); |
3971 | EPI.ExceptionSpec = getExceptionSpecInfo(); |
3972 | EPI.TypeQuals = getMethodQuals(); |
3973 | EPI.RefQualifier = getRefQualifier(); |
3974 | EPI.ExtParameterInfos = getExtParameterInfosOrNull(); |
3975 | return EPI; |
3976 | } |
3977 | |
3978 | /// Get the kind of exception specification on this function. |
3979 | ExceptionSpecificationType getExceptionSpecType() const { |
3980 | return static_cast<ExceptionSpecificationType>( |
3981 | FunctionTypeBits.ExceptionSpecType); |
3982 | } |
3983 | |
3984 | /// Return whether this function has any kind of exception spec. |
3985 | bool hasExceptionSpec() const { return getExceptionSpecType() != EST_None; } |
3986 | |
3987 | /// Return whether this function has a dynamic (throw) exception spec. |
3988 | bool hasDynamicExceptionSpec() const { |
3989 | return isDynamicExceptionSpec(getExceptionSpecType()); |
3990 | } |
3991 | |
3992 | /// Return whether this function has a noexcept exception spec. |
3993 | bool hasNoexceptExceptionSpec() const { |
3994 | return isNoexceptExceptionSpec(getExceptionSpecType()); |
3995 | } |
3996 | |
3997 | /// Return whether this function has a dependent exception spec. |
3998 | bool hasDependentExceptionSpec() const; |
3999 | |
4000 | /// Return whether this function has an instantiation-dependent exception |
4001 | /// spec. |
4002 | bool hasInstantiationDependentExceptionSpec() const; |
4003 | |
4004 | /// Return all the available information about this type's exception spec. |
4005 | ExceptionSpecInfo getExceptionSpecInfo() const { |
4006 | ExceptionSpecInfo Result; |
4007 | Result.Type = getExceptionSpecType(); |
4008 | if (Result.Type == EST_Dynamic) { |
4009 | Result.Exceptions = exceptions(); |
4010 | } else if (isComputedNoexcept(Result.Type)) { |
4011 | Result.NoexceptExpr = getNoexceptExpr(); |
4012 | } else if (Result.Type == EST_Uninstantiated) { |
4013 | Result.SourceDecl = getExceptionSpecDecl(); |
4014 | Result.SourceTemplate = getExceptionSpecTemplate(); |
4015 | } else if (Result.Type == EST_Unevaluated) { |
4016 | Result.SourceDecl = getExceptionSpecDecl(); |
4017 | } |
4018 | return Result; |
4019 | } |
4020 | |
4021 | /// Return the number of types in the exception specification. |
4022 | unsigned getNumExceptions() const { |
4023 | return getExceptionSpecType() == EST_Dynamic |
4024 | ? getTrailingObjects<FunctionTypeExtraBitfields>() |
4025 | ->NumExceptionType |
4026 | : 0; |
4027 | } |
4028 | |
4029 | /// Return the ith exception type, where 0 <= i < getNumExceptions(). |
4030 | QualType getExceptionType(unsigned i) const { |
4031 | assert(i < getNumExceptions() && "Invalid exception number!")((i < getNumExceptions() && "Invalid exception number!" ) ? static_cast<void> (0) : __assert_fail ("i < getNumExceptions() && \"Invalid exception number!\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 4031, __PRETTY_FUNCTION__)); |
4032 | return exception_begin()[i]; |
4033 | } |
4034 | |
4035 | /// Return the expression inside noexcept(expression), or a null pointer |
4036 | /// if there is none (because the exception spec is not of this form). |
4037 | Expr *getNoexceptExpr() const { |
4038 | if (!isComputedNoexcept(getExceptionSpecType())) |
4039 | return nullptr; |
4040 | return *getTrailingObjects<Expr *>(); |
4041 | } |
4042 | |
4043 | /// If this function type has an exception specification which hasn't |
4044 | /// been determined yet (either because it has not been evaluated or because |
4045 | /// it has not been instantiated), this is the function whose exception |
4046 | /// specification is represented by this type. |
4047 | FunctionDecl *getExceptionSpecDecl() const { |
4048 | if (getExceptionSpecType() != EST_Uninstantiated && |
4049 | getExceptionSpecType() != EST_Unevaluated) |
4050 | return nullptr; |
4051 | return getTrailingObjects<FunctionDecl *>()[0]; |
4052 | } |
4053 | |
4054 | /// If this function type has an uninstantiated exception |
4055 | /// specification, this is the function whose exception specification |
4056 | /// should be instantiated to find the exception specification for |
4057 | /// this type. |
4058 | FunctionDecl *getExceptionSpecTemplate() const { |
4059 | if (getExceptionSpecType() != EST_Uninstantiated) |
4060 | return nullptr; |
4061 | return getTrailingObjects<FunctionDecl *>()[1]; |
4062 | } |
4063 | |
4064 | /// Determine whether this function type has a non-throwing exception |
4065 | /// specification. |
4066 | CanThrowResult canThrow() const; |
4067 | |
4068 | /// Determine whether this function type has a non-throwing exception |
4069 | /// specification. If this depends on template arguments, returns |
4070 | /// \c ResultIfDependent. |
4071 | bool isNothrow(bool ResultIfDependent = false) const { |
4072 | return ResultIfDependent ? canThrow() != CT_Can : canThrow() == CT_Cannot; |
4073 | } |
4074 | |
4075 | /// Whether this function prototype is variadic. |
4076 | bool isVariadic() const { return FunctionTypeBits.Variadic; } |
4077 | |
4078 | SourceLocation getEllipsisLoc() const { |
4079 | return isVariadic() ? *getTrailingObjects<SourceLocation>() |
4080 | : SourceLocation(); |
4081 | } |
4082 | |
4083 | /// Determines whether this function prototype contains a |
4084 | /// parameter pack at the end. |
4085 | /// |
4086 | /// A function template whose last parameter is a parameter pack can be |
4087 | /// called with an arbitrary number of arguments, much like a variadic |
4088 | /// function. |
4089 | bool isTemplateVariadic() const; |
4090 | |
4091 | /// Whether this function prototype has a trailing return type. |
4092 | bool hasTrailingReturn() const { return FunctionTypeBits.HasTrailingReturn; } |
4093 | |
4094 | Qualifiers getMethodQuals() const { |
4095 | if (hasExtQualifiers()) |
4096 | return *getTrailingObjects<Qualifiers>(); |
4097 | else |
4098 | return getFastTypeQuals(); |
4099 | } |
4100 | |
4101 | /// Retrieve the ref-qualifier associated with this function type. |
4102 | RefQualifierKind getRefQualifier() const { |
4103 | return static_cast<RefQualifierKind>(FunctionTypeBits.RefQualifier); |
4104 | } |
4105 | |
4106 | using param_type_iterator = const QualType *; |
4107 | using param_type_range = llvm::iterator_range<param_type_iterator>; |
4108 | |
4109 | param_type_range param_types() const { |
4110 | return param_type_range(param_type_begin(), param_type_end()); |
4111 | } |
4112 | |
4113 | param_type_iterator param_type_begin() const { |
4114 | return getTrailingObjects<QualType>(); |
4115 | } |
4116 | |
4117 | param_type_iterator param_type_end() const { |
4118 | return param_type_begin() + getNumParams(); |
4119 | } |
4120 | |
4121 | using exception_iterator = const QualType *; |
4122 | |
4123 | ArrayRef<QualType> exceptions() const { |
4124 | return llvm::makeArrayRef(exception_begin(), exception_end()); |
4125 | } |
4126 | |
4127 | exception_iterator exception_begin() const { |
4128 | return reinterpret_cast<exception_iterator>( |
4129 | getTrailingObjects<ExceptionType>()); |
4130 | } |
4131 | |
4132 | exception_iterator exception_end() const { |
4133 | return exception_begin() + getNumExceptions(); |
4134 | } |
4135 | |
4136 | /// Is there any interesting extra information for any of the parameters |
4137 | /// of this function type? |
4138 | bool hasExtParameterInfos() const { |
4139 | return FunctionTypeBits.HasExtParameterInfos; |
4140 | } |
4141 | |
4142 | ArrayRef<ExtParameterInfo> getExtParameterInfos() const { |
4143 | assert(hasExtParameterInfos())((hasExtParameterInfos()) ? static_cast<void> (0) : __assert_fail ("hasExtParameterInfos()", "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 4143, __PRETTY_FUNCTION__)); |
4144 | return ArrayRef<ExtParameterInfo>(getTrailingObjects<ExtParameterInfo>(), |
4145 | getNumParams()); |
4146 | } |
4147 | |
4148 | /// Return a pointer to the beginning of the array of extra parameter |
4149 | /// information, if present, or else null if none of the parameters |
4150 | /// carry it. This is equivalent to getExtProtoInfo().ExtParameterInfos. |
4151 | const ExtParameterInfo *getExtParameterInfosOrNull() const { |
4152 | if (!hasExtParameterInfos()) |
4153 | return nullptr; |
4154 | return getTrailingObjects<ExtParameterInfo>(); |
4155 | } |
4156 | |
4157 | ExtParameterInfo getExtParameterInfo(unsigned I) const { |
4158 | assert(I < getNumParams() && "parameter index out of range")((I < getNumParams() && "parameter index out of range" ) ? static_cast<void> (0) : __assert_fail ("I < getNumParams() && \"parameter index out of range\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 4158, __PRETTY_FUNCTION__)); |
4159 | if (hasExtParameterInfos()) |
4160 | return getTrailingObjects<ExtParameterInfo>()[I]; |
4161 | return ExtParameterInfo(); |
4162 | } |
4163 | |
4164 | ParameterABI getParameterABI(unsigned I) const { |
4165 | assert(I < getNumParams() && "parameter index out of range")((I < getNumParams() && "parameter index out of range" ) ? static_cast<void> (0) : __assert_fail ("I < getNumParams() && \"parameter index out of range\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 4165, __PRETTY_FUNCTION__)); |
4166 | if (hasExtParameterInfos()) |
4167 | return getTrailingObjects<ExtParameterInfo>()[I].getABI(); |
4168 | return ParameterABI::Ordinary; |
4169 | } |
4170 | |
4171 | bool isParamConsumed(unsigned I) const { |
4172 | assert(I < getNumParams() && "parameter index out of range")((I < getNumParams() && "parameter index out of range" ) ? static_cast<void> (0) : __assert_fail ("I < getNumParams() && \"parameter index out of range\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 4172, __PRETTY_FUNCTION__)); |
4173 | if (hasExtParameterInfos()) |
4174 | return getTrailingObjects<ExtParameterInfo>()[I].isConsumed(); |
4175 | return false; |
4176 | } |
4177 | |
4178 | bool isSugared() const { return false; } |
4179 | QualType desugar() const { return QualType(this, 0); } |
4180 | |
4181 | void printExceptionSpecification(raw_ostream &OS, |
4182 | const PrintingPolicy &Policy) const; |
4183 | |
4184 | static bool classof(const Type *T) { |
4185 | return T->getTypeClass() == FunctionProto; |
4186 | } |
4187 | |
4188 | void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Ctx); |
4189 | static void Profile(llvm::FoldingSetNodeID &ID, QualType Result, |
4190 | param_type_iterator ArgTys, unsigned NumArgs, |
4191 | const ExtProtoInfo &EPI, const ASTContext &Context, |
4192 | bool Canonical); |
4193 | }; |
4194 | |
4195 | /// Represents the dependent type named by a dependently-scoped |
4196 | /// typename using declaration, e.g. |
4197 | /// using typename Base<T>::foo; |
4198 | /// |
4199 | /// Template instantiation turns these into the underlying type. |
4200 | class UnresolvedUsingType : public Type { |
4201 | friend class ASTContext; // ASTContext creates these. |
4202 | |
4203 | UnresolvedUsingTypenameDecl *Decl; |
4204 | |
4205 | UnresolvedUsingType(const UnresolvedUsingTypenameDecl *D) |
4206 | : Type(UnresolvedUsing, QualType(), true, true, false, |
4207 | /*ContainsUnexpandedParameterPack=*/false), |
4208 | Decl(const_cast<UnresolvedUsingTypenameDecl*>(D)) {} |
4209 | |
4210 | public: |
4211 | UnresolvedUsingTypenameDecl *getDecl() const { return Decl; } |
4212 | |
4213 | bool isSugared() const { return false; } |
4214 | QualType desugar() const { return QualType(this, 0); } |
4215 | |
4216 | static bool classof(const Type *T) { |
4217 | return T->getTypeClass() == UnresolvedUsing; |
4218 | } |
4219 | |
4220 | void Profile(llvm::FoldingSetNodeID &ID) { |
4221 | return Profile(ID, Decl); |
4222 | } |
4223 | |
4224 | static void Profile(llvm::FoldingSetNodeID &ID, |
4225 | UnresolvedUsingTypenameDecl *D) { |
4226 | ID.AddPointer(D); |
4227 | } |
4228 | }; |
4229 | |
4230 | class TypedefType : public Type { |
4231 | TypedefNameDecl *Decl; |
4232 | |
4233 | protected: |
4234 | friend class ASTContext; // ASTContext creates these. |
4235 | |
4236 | TypedefType(TypeClass tc, const TypedefNameDecl *D, QualType can) |
4237 | : Type(tc, can, can->isDependentType(), |
4238 | can->isInstantiationDependentType(), |
4239 | can->isVariablyModifiedType(), |
4240 | /*ContainsUnexpandedParameterPack=*/false), |
4241 | Decl(const_cast<TypedefNameDecl*>(D)) { |
4242 | assert(!isa<TypedefType>(can) && "Invalid canonical type")((!isa<TypedefType>(can) && "Invalid canonical type" ) ? static_cast<void> (0) : __assert_fail ("!isa<TypedefType>(can) && \"Invalid canonical type\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 4242, __PRETTY_FUNCTION__)); |
4243 | } |
4244 | |
4245 | public: |
4246 | TypedefNameDecl *getDecl() const { return Decl; } |
4247 | |
4248 | bool isSugared() const { return true; } |
4249 | QualType desugar() const; |
4250 | |
4251 | static bool classof(const Type *T) { return T->getTypeClass() == Typedef; } |
4252 | }; |
4253 | |
4254 | /// Sugar type that represents a type that was qualified by a qualifier written |
4255 | /// as a macro invocation. |
4256 | class MacroQualifiedType : public Type { |
4257 | friend class ASTContext; // ASTContext creates these. |
4258 | |
4259 | QualType UnderlyingTy; |
4260 | const IdentifierInfo *MacroII; |
4261 | |
4262 | MacroQualifiedType(QualType UnderlyingTy, QualType CanonTy, |
4263 | const IdentifierInfo *MacroII) |
4264 | : Type(MacroQualified, CanonTy, UnderlyingTy->isDependentType(), |
4265 | UnderlyingTy->isInstantiationDependentType(), |
4266 | UnderlyingTy->isVariablyModifiedType(), |
4267 | UnderlyingTy->containsUnexpandedParameterPack()), |
4268 | UnderlyingTy(UnderlyingTy), MacroII(MacroII) { |
4269 | assert(isa<AttributedType>(UnderlyingTy) &&((isa<AttributedType>(UnderlyingTy) && "Expected a macro qualified type to only wrap attributed types." ) ? static_cast<void> (0) : __assert_fail ("isa<AttributedType>(UnderlyingTy) && \"Expected a macro qualified type to only wrap attributed types.\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 4270, __PRETTY_FUNCTION__)) |
4270 | "Expected a macro qualified type to only wrap attributed types.")((isa<AttributedType>(UnderlyingTy) && "Expected a macro qualified type to only wrap attributed types." ) ? static_cast<void> (0) : __assert_fail ("isa<AttributedType>(UnderlyingTy) && \"Expected a macro qualified type to only wrap attributed types.\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 4270, __PRETTY_FUNCTION__)); |
4271 | } |
4272 | |
4273 | public: |
4274 | const IdentifierInfo *getMacroIdentifier() const { return MacroII; } |
4275 | QualType getUnderlyingType() const { return UnderlyingTy; } |
4276 | |
4277 | /// Return this attributed type's modified type with no qualifiers attached to |
4278 | /// it. |
4279 | QualType getModifiedType() const; |
4280 | |
4281 | bool isSugared() const { return true; } |
4282 | QualType desugar() const; |
4283 | |
4284 | static bool classof(const Type *T) { |
4285 | return T->getTypeClass() == MacroQualified; |
4286 | } |
4287 | }; |
4288 | |
4289 | /// Represents a `typeof` (or __typeof__) expression (a GCC extension). |
4290 | class TypeOfExprType : public Type { |
4291 | Expr *TOExpr; |
4292 | |
4293 | protected: |
4294 | friend class ASTContext; // ASTContext creates these. |
4295 | |
4296 | TypeOfExprType(Expr *E, QualType can = QualType()); |
4297 | |
4298 | public: |
4299 | Expr *getUnderlyingExpr() const { return TOExpr; } |
4300 | |
4301 | /// Remove a single level of sugar. |
4302 | QualType desugar() const; |
4303 | |
4304 | /// Returns whether this type directly provides sugar. |
4305 | bool isSugared() const; |
4306 | |
4307 | static bool classof(const Type *T) { return T->getTypeClass() == TypeOfExpr; } |
4308 | }; |
4309 | |
4310 | /// Internal representation of canonical, dependent |
4311 | /// `typeof(expr)` types. |
4312 | /// |
4313 | /// This class is used internally by the ASTContext to manage |
4314 | /// canonical, dependent types, only. Clients will only see instances |
4315 | /// of this class via TypeOfExprType nodes. |
4316 | class DependentTypeOfExprType |
4317 | : public TypeOfExprType, public llvm::FoldingSetNode { |
4318 | const ASTContext &Context; |
4319 | |
4320 | public: |
4321 | DependentTypeOfExprType(const ASTContext &Context, Expr *E) |
4322 | : TypeOfExprType(E), Context(Context) {} |
4323 | |
4324 | void Profile(llvm::FoldingSetNodeID &ID) { |
4325 | Profile(ID, Context, getUnderlyingExpr()); |
4326 | } |
4327 | |
4328 | static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context, |
4329 | Expr *E); |
4330 | }; |
4331 | |
4332 | /// Represents `typeof(type)`, a GCC extension. |
4333 | class TypeOfType : public Type { |
4334 | friend class ASTContext; // ASTContext creates these. |
4335 | |
4336 | QualType TOType; |
4337 | |
4338 | TypeOfType(QualType T, QualType can) |
4339 | : Type(TypeOf, can, T->isDependentType(), |
4340 | T->isInstantiationDependentType(), |
4341 | T->isVariablyModifiedType(), |
4342 | T->containsUnexpandedParameterPack()), |
4343 | TOType(T) { |
4344 | assert(!isa<TypedefType>(can) && "Invalid canonical type")((!isa<TypedefType>(can) && "Invalid canonical type" ) ? static_cast<void> (0) : __assert_fail ("!isa<TypedefType>(can) && \"Invalid canonical type\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 4344, __PRETTY_FUNCTION__)); |
4345 | } |
4346 | |
4347 | public: |
4348 | QualType getUnderlyingType() const { return TOType; } |
4349 | |
4350 | /// Remove a single level of sugar. |
4351 | QualType desugar() const { return getUnderlyingType(); } |
4352 | |
4353 | /// Returns whether this type directly provides sugar. |
4354 | bool isSugared() const { return true; } |
4355 | |
4356 | static bool classof(const Type *T) { return T->getTypeClass() == TypeOf; } |
4357 | }; |
4358 | |
4359 | /// Represents the type `decltype(expr)` (C++11). |
4360 | class DecltypeType : public Type { |
4361 | Expr *E; |
4362 | QualType UnderlyingType; |
4363 | |
4364 | protected: |
4365 | friend class ASTContext; // ASTContext creates these. |
4366 | |
4367 | DecltypeType(Expr *E, QualType underlyingType, QualType can = QualType()); |
4368 | |
4369 | public: |
4370 | Expr *getUnderlyingExpr() const { return E; } |
4371 | QualType getUnderlyingType() const { return UnderlyingType; } |
4372 | |
4373 | /// Remove a single level of sugar. |
4374 | QualType desugar() const; |
4375 | |
4376 | /// Returns whether this type directly provides sugar. |
4377 | bool isSugared() const; |
4378 | |
4379 | static bool classof(const Type *T) { return T->getTypeClass() == Decltype; } |
4380 | }; |
4381 | |
4382 | /// Internal representation of canonical, dependent |
4383 | /// decltype(expr) types. |
4384 | /// |
4385 | /// This class is used internally by the ASTContext to manage |
4386 | /// canonical, dependent types, only. Clients will only see instances |
4387 | /// of this class via DecltypeType nodes. |
4388 | class DependentDecltypeType : public DecltypeType, public llvm::FoldingSetNode { |
4389 | const ASTContext &Context; |
4390 | |
4391 | public: |
4392 | DependentDecltypeType(const ASTContext &Context, Expr *E); |
4393 | |
4394 | void Profile(llvm::FoldingSetNodeID &ID) { |
4395 | Profile(ID, Context, getUnderlyingExpr()); |
4396 | } |
4397 | |
4398 | static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context, |
4399 | Expr *E); |
4400 | }; |
4401 | |
4402 | /// A unary type transform, which is a type constructed from another. |
4403 | class UnaryTransformType : public Type { |
4404 | public: |
4405 | enum UTTKind { |
4406 | EnumUnderlyingType |
4407 | }; |
4408 | |
4409 | private: |
4410 | /// The untransformed type. |
4411 | QualType BaseType; |
4412 | |
4413 | /// The transformed type if not dependent, otherwise the same as BaseType. |
4414 | QualType UnderlyingType; |
4415 | |
4416 | UTTKind UKind; |
4417 | |
4418 | protected: |
4419 | friend class ASTContext; |
4420 | |
4421 | UnaryTransformType(QualType BaseTy, QualType UnderlyingTy, UTTKind UKind, |
4422 | QualType CanonicalTy); |
4423 | |
4424 | public: |
4425 | bool isSugared() const { return !isDependentType(); } |
4426 | QualType desugar() const { return UnderlyingType; } |
4427 | |
4428 | QualType getUnderlyingType() const { return UnderlyingType; } |
4429 | QualType getBaseType() const { return BaseType; } |
4430 | |
4431 | UTTKind getUTTKind() const { return UKind; } |
4432 | |
4433 | static bool classof(const Type *T) { |
4434 | return T->getTypeClass() == UnaryTransform; |
4435 | } |
4436 | }; |
4437 | |
4438 | /// Internal representation of canonical, dependent |
4439 | /// __underlying_type(type) types. |
4440 | /// |
4441 | /// This class is used internally by the ASTContext to manage |
4442 | /// canonical, dependent types, only. Clients will only see instances |
4443 | /// of this class via UnaryTransformType nodes. |
4444 | class DependentUnaryTransformType : public UnaryTransformType, |
4445 | public llvm::FoldingSetNode { |
4446 | public: |
4447 | DependentUnaryTransformType(const ASTContext &C, QualType BaseType, |
4448 | UTTKind UKind); |
4449 | |
4450 | void Profile(llvm::FoldingSetNodeID &ID) { |
4451 | Profile(ID, getBaseType(), getUTTKind()); |
4452 | } |
4453 | |
4454 | static void Profile(llvm::FoldingSetNodeID &ID, QualType BaseType, |
4455 | UTTKind UKind) { |
4456 | ID.AddPointer(BaseType.getAsOpaquePtr()); |
4457 | ID.AddInteger((unsigned)UKind); |
4458 | } |
4459 | }; |
4460 | |
4461 | class TagType : public Type { |
4462 | friend class ASTReader; |
4463 | template <class T> friend class serialization::AbstractTypeReader; |
4464 | |
4465 | /// Stores the TagDecl associated with this type. The decl may point to any |
4466 | /// TagDecl that declares the entity. |
4467 | TagDecl *decl; |
4468 | |
4469 | protected: |
4470 | TagType(TypeClass TC, const TagDecl *D, QualType can); |
4471 | |
4472 | public: |
4473 | TagDecl *getDecl() const; |
4474 | |
4475 | /// Determines whether this type is in the process of being defined. |
4476 | bool isBeingDefined() const; |
4477 | |
4478 | static bool classof(const Type *T) { |
4479 | return T->getTypeClass() == Enum || T->getTypeClass() == Record; |
4480 | } |
4481 | }; |
4482 | |
4483 | /// A helper class that allows the use of isa/cast/dyncast |
4484 | /// to detect TagType objects of structs/unions/classes. |
4485 | class RecordType : public TagType { |
4486 | protected: |
4487 | friend class ASTContext; // ASTContext creates these. |
4488 | |
4489 | explicit RecordType(const RecordDecl *D) |
4490 | : TagType(Record, reinterpret_cast<const TagDecl*>(D), QualType()) {} |
4491 | explicit RecordType(TypeClass TC, RecordDecl *D) |
4492 | : TagType(TC, reinterpret_cast<const TagDecl*>(D), QualType()) {} |
4493 | |
4494 | public: |
4495 | RecordDecl *getDecl() const { |
4496 | return reinterpret_cast<RecordDecl*>(TagType::getDecl()); |
4497 | } |
4498 | |
4499 | /// Recursively check all fields in the record for const-ness. If any field |
4500 | /// is declared const, return true. Otherwise, return false. |
4501 | bool hasConstFields() const; |
4502 | |
4503 | bool isSugared() const { return false; } |
4504 | QualType desugar() const { return QualType(this, 0); } |
4505 | |
4506 | static bool classof(const Type *T) { return T->getTypeClass() == Record; } |
4507 | }; |
4508 | |
4509 | /// A helper class that allows the use of isa/cast/dyncast |
4510 | /// to detect TagType objects of enums. |
4511 | class EnumType : public TagType { |
4512 | friend class ASTContext; // ASTContext creates these. |
4513 | |
4514 | explicit EnumType(const EnumDecl *D) |
4515 | : TagType(Enum, reinterpret_cast<const TagDecl*>(D), QualType()) {} |
4516 | |
4517 | public: |
4518 | EnumDecl *getDecl() const { |
4519 | return reinterpret_cast<EnumDecl*>(TagType::getDecl()); |
4520 | } |
4521 | |
4522 | bool isSugared() const { return false; } |
4523 | QualType desugar() const { return QualType(this, 0); } |
4524 | |
4525 | static bool classof(const Type *T) { return T->getTypeClass() == Enum; } |
4526 | }; |
4527 | |
4528 | /// An attributed type is a type to which a type attribute has been applied. |
4529 | /// |
4530 | /// The "modified type" is the fully-sugared type to which the attributed |
4531 | /// type was applied; generally it is not canonically equivalent to the |
4532 | /// attributed type. The "equivalent type" is the minimally-desugared type |
4533 | /// which the type is canonically equivalent to. |
4534 | /// |
4535 | /// For example, in the following attributed type: |
4536 | /// int32_t __attribute__((vector_size(16))) |
4537 | /// - the modified type is the TypedefType for int32_t |
4538 | /// - the equivalent type is VectorType(16, int32_t) |
4539 | /// - the canonical type is VectorType(16, int) |
4540 | class AttributedType : public Type, public llvm::FoldingSetNode { |
4541 | public: |
4542 | using Kind = attr::Kind; |
4543 | |
4544 | private: |
4545 | friend class ASTContext; // ASTContext creates these |
4546 | |
4547 | QualType ModifiedType; |
4548 | QualType EquivalentType; |
4549 | |
4550 | AttributedType(QualType canon, attr::Kind attrKind, QualType modified, |
4551 | QualType equivalent) |
4552 | : Type(Attributed, canon, equivalent->isDependentType(), |
4553 | equivalent->isInstantiationDependentType(), |
4554 | equivalent->isVariablyModifiedType(), |
4555 | equivalent->containsUnexpandedParameterPack()), |
4556 | ModifiedType(modified), EquivalentType(equivalent) { |
4557 | AttributedTypeBits.AttrKind = attrKind; |
4558 | } |
4559 | |
4560 | public: |
4561 | Kind getAttrKind() const { |
4562 | return static_cast<Kind>(AttributedTypeBits.AttrKind); |
4563 | } |
4564 | |
4565 | QualType getModifiedType() const { return ModifiedType; } |
4566 | QualType getEquivalentType() const { return EquivalentType; } |
4567 | |
4568 | bool isSugared() const { return true; } |
4569 | QualType desugar() const { return getEquivalentType(); } |
4570 | |
4571 | /// Does this attribute behave like a type qualifier? |
4572 | /// |
4573 | /// A type qualifier adjusts a type to provide specialized rules for |
4574 | /// a specific object, like the standard const and volatile qualifiers. |
4575 | /// This includes attributes controlling things like nullability, |
4576 | /// address spaces, and ARC ownership. The value of the object is still |
4577 | /// largely described by the modified type. |
4578 | /// |
4579 | /// In contrast, many type attributes "rewrite" their modified type to |
4580 | /// produce a fundamentally different type, not necessarily related in any |
4581 | /// formalizable way to the original type. For example, calling convention |
4582 | /// and vector attributes are not simple type qualifiers. |
4583 | /// |
4584 | /// Type qualifiers are often, but not always, reflected in the canonical |
4585 | /// type. |
4586 | bool isQualifier() const; |
4587 | |
4588 | bool isMSTypeSpec() const; |
4589 | |
4590 | bool isCallingConv() const; |
4591 | |
4592 | llvm::Optional<NullabilityKind> getImmediateNullability() const; |
4593 | |
4594 | /// Retrieve the attribute kind corresponding to the given |
4595 | /// nullability kind. |
4596 | static Kind getNullabilityAttrKind(NullabilityKind kind) { |
4597 | switch (kind) { |
4598 | case NullabilityKind::NonNull: |
4599 | return attr::TypeNonNull; |
4600 | |
4601 | case NullabilityKind::Nullable: |
4602 | return attr::TypeNullable; |
4603 | |
4604 | case NullabilityKind::Unspecified: |
4605 | return attr::TypeNullUnspecified; |
4606 | } |
4607 | llvm_unreachable("Unknown nullability kind.")::llvm::llvm_unreachable_internal("Unknown nullability kind." , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 4607); |
4608 | } |
4609 | |
4610 | /// Strip off the top-level nullability annotation on the given |
4611 | /// type, if it's there. |
4612 | /// |
4613 | /// \param T The type to strip. If the type is exactly an |
4614 | /// AttributedType specifying nullability (without looking through |
4615 | /// type sugar), the nullability is returned and this type changed |
4616 | /// to the underlying modified type. |
4617 | /// |
4618 | /// \returns the top-level nullability, if present. |
4619 | static Optional<NullabilityKind> stripOuterNullability(QualType &T); |
4620 | |
4621 | void Profile(llvm::FoldingSetNodeID &ID) { |
4622 | Profile(ID, getAttrKind(), ModifiedType, EquivalentType); |
4623 | } |
4624 | |
4625 | static void Profile(llvm::FoldingSetNodeID &ID, Kind attrKind, |
4626 | QualType modified, QualType equivalent) { |
4627 | ID.AddInteger(attrKind); |
4628 | ID.AddPointer(modified.getAsOpaquePtr()); |
4629 | ID.AddPointer(equivalent.getAsOpaquePtr()); |
4630 | } |
4631 | |
4632 | static bool classof(const Type *T) { |
4633 | return T->getTypeClass() == Attributed; |
4634 | } |
4635 | }; |
4636 | |
4637 | class TemplateTypeParmType : public Type, public llvm::FoldingSetNode { |
4638 | friend class ASTContext; // ASTContext creates these |
4639 | |
4640 | // Helper data collector for canonical types. |
4641 | struct CanonicalTTPTInfo { |
4642 | unsigned Depth : 15; |
4643 | unsigned ParameterPack : 1; |
4644 | unsigned Index : 16; |
4645 | }; |
4646 | |
4647 | union { |
4648 | // Info for the canonical type. |
4649 | CanonicalTTPTInfo CanTTPTInfo; |
4650 | |
4651 | // Info for the non-canonical type. |
4652 | TemplateTypeParmDecl *TTPDecl; |
4653 | }; |
4654 | |
4655 | /// Build a non-canonical type. |
4656 | TemplateTypeParmType(TemplateTypeParmDecl *TTPDecl, QualType Canon) |
4657 | : Type(TemplateTypeParm, Canon, /*Dependent=*/true, |
4658 | /*InstantiationDependent=*/true, |
4659 | /*VariablyModified=*/false, |
4660 | Canon->containsUnexpandedParameterPack()), |
4661 | TTPDecl(TTPDecl) {} |
4662 | |
4663 | /// Build the canonical type. |
4664 | TemplateTypeParmType(unsigned D, unsigned I, bool PP) |
4665 | : Type(TemplateTypeParm, QualType(this, 0), |
4666 | /*Dependent=*/true, |
4667 | /*InstantiationDependent=*/true, |
4668 | /*VariablyModified=*/false, PP) { |
4669 | CanTTPTInfo.Depth = D; |
4670 | CanTTPTInfo.Index = I; |
4671 | CanTTPTInfo.ParameterPack = PP; |
4672 | } |
4673 | |
4674 | const CanonicalTTPTInfo& getCanTTPTInfo() const { |
4675 | QualType Can = getCanonicalTypeInternal(); |
4676 | return Can->castAs<TemplateTypeParmType>()->CanTTPTInfo; |
4677 | } |
4678 | |
4679 | public: |
4680 | unsigned getDepth() const { return getCanTTPTInfo().Depth; } |
4681 | unsigned getIndex() const { return getCanTTPTInfo().Index; } |
4682 | bool isParameterPack() const { return getCanTTPTInfo().ParameterPack; } |
4683 | |
4684 | TemplateTypeParmDecl *getDecl() const { |
4685 | return isCanonicalUnqualified() ? nullptr : TTPDecl; |
4686 | } |
4687 | |
4688 | IdentifierInfo *getIdentifier() const; |
4689 | |
4690 | bool isSugared() const { return false; } |
4691 | QualType desugar() const { return QualType(this, 0); } |
4692 | |
4693 | void Profile(llvm::FoldingSetNodeID &ID) { |
4694 | Profile(ID, getDepth(), getIndex(), isParameterPack(), getDecl()); |
4695 | } |
4696 | |
4697 | static void Profile(llvm::FoldingSetNodeID &ID, unsigned Depth, |
4698 | unsigned Index, bool ParameterPack, |
4699 | TemplateTypeParmDecl *TTPDecl) { |
4700 | ID.AddInteger(Depth); |
4701 | ID.AddInteger(Index); |
4702 | ID.AddBoolean(ParameterPack); |
4703 | ID.AddPointer(TTPDecl); |
4704 | } |
4705 | |
4706 | static bool classof(const Type *T) { |
4707 | return T->getTypeClass() == TemplateTypeParm; |
4708 | } |
4709 | }; |
4710 | |
4711 | /// Represents the result of substituting a type for a template |
4712 | /// type parameter. |
4713 | /// |
4714 | /// Within an instantiated template, all template type parameters have |
4715 | /// been replaced with these. They are used solely to record that a |
4716 | /// type was originally written as a template type parameter; |
4717 | /// therefore they are never canonical. |
4718 | class SubstTemplateTypeParmType : public Type, public llvm::FoldingSetNode { |
4719 | friend class ASTContext; |
4720 | |
4721 | // The original type parameter. |
4722 | const TemplateTypeParmType *Replaced; |
4723 | |
4724 | SubstTemplateTypeParmType(const TemplateTypeParmType *Param, QualType Canon) |
4725 | : Type(SubstTemplateTypeParm, Canon, Canon->isDependentType(), |
4726 | Canon->isInstantiationDependentType(), |
4727 | Canon->isVariablyModifiedType(), |
4728 | Canon->containsUnexpandedParameterPack()), |
4729 | Replaced(Param) {} |
4730 | |
4731 | public: |
4732 | /// Gets the template parameter that was substituted for. |
4733 | const TemplateTypeParmType *getReplacedParameter() const { |
4734 | return Replaced; |
4735 | } |
4736 | |
4737 | /// Gets the type that was substituted for the template |
4738 | /// parameter. |
4739 | QualType getReplacementType() const { |
4740 | return getCanonicalTypeInternal(); |
4741 | } |
4742 | |
4743 | bool isSugared() const { return true; } |
4744 | QualType desugar() const { return getReplacementType(); } |
4745 | |
4746 | void Profile(llvm::FoldingSetNodeID &ID) { |
4747 | Profile(ID, getReplacedParameter(), getReplacementType()); |
4748 | } |
4749 | |
4750 | static void Profile(llvm::FoldingSetNodeID &ID, |
4751 | const TemplateTypeParmType *Replaced, |
4752 | QualType Replacement) { |
4753 | ID.AddPointer(Replaced); |
4754 | ID.AddPointer(Replacement.getAsOpaquePtr()); |
4755 | } |
4756 | |
4757 | static bool classof(const Type *T) { |
4758 | return T->getTypeClass() == SubstTemplateTypeParm; |
4759 | } |
4760 | }; |
4761 | |
4762 | /// Represents the result of substituting a set of types for a template |
4763 | /// type parameter pack. |
4764 | /// |
4765 | /// When a pack expansion in the source code contains multiple parameter packs |
4766 | /// and those parameter packs correspond to different levels of template |
4767 | /// parameter lists, this type node is used to represent a template type |
4768 | /// parameter pack from an outer level, which has already had its argument pack |
4769 | /// substituted but that still lives within a pack expansion that itself |
4770 | /// could not be instantiated. When actually performing a substitution into |
4771 | /// that pack expansion (e.g., when all template parameters have corresponding |
4772 | /// arguments), this type will be replaced with the \c SubstTemplateTypeParmType |
4773 | /// at the current pack substitution index. |
4774 | class SubstTemplateTypeParmPackType : public Type, public llvm::FoldingSetNode { |
4775 | friend class ASTContext; |
4776 | |
4777 | /// The original type parameter. |
4778 | const TemplateTypeParmType *Replaced; |
4779 | |
4780 | /// A pointer to the set of template arguments that this |
4781 | /// parameter pack is instantiated with. |
4782 | const TemplateArgument *Arguments; |
4783 | |
4784 | SubstTemplateTypeParmPackType(const TemplateTypeParmType *Param, |
4785 | QualType Canon, |
4786 | const TemplateArgument &ArgPack); |
4787 | |
4788 | public: |
4789 | IdentifierInfo *getIdentifier() const { return Replaced->getIdentifier(); } |
4790 | |
4791 | /// Gets the template parameter that was substituted for. |
4792 | const TemplateTypeParmType *getReplacedParameter() const { |
4793 | return Replaced; |
4794 | } |
4795 | |
4796 | unsigned getNumArgs() const { |
4797 | return SubstTemplateTypeParmPackTypeBits.NumArgs; |
4798 | } |
4799 | |
4800 | bool isSugared() const { return false; } |
4801 | QualType desugar() const { return QualType(this, 0); } |
4802 | |
4803 | TemplateArgument getArgumentPack() const; |
4804 | |
4805 | void Profile(llvm::FoldingSetNodeID &ID); |
4806 | static void Profile(llvm::FoldingSetNodeID &ID, |
4807 | const TemplateTypeParmType *Replaced, |
4808 | const TemplateArgument &ArgPack); |
4809 | |
4810 | static bool classof(const Type *T) { |
4811 | return T->getTypeClass() == SubstTemplateTypeParmPack; |
4812 | } |
4813 | }; |
4814 | |
4815 | /// Common base class for placeholders for types that get replaced by |
4816 | /// placeholder type deduction: C++11 auto, C++14 decltype(auto), C++17 deduced |
4817 | /// class template types, and (eventually) constrained type names from the C++ |
4818 | /// Concepts TS. |
4819 | /// |
4820 | /// These types are usually a placeholder for a deduced type. However, before |
4821 | /// the initializer is attached, or (usually) if the initializer is |
4822 | /// type-dependent, there is no deduced type and the type is canonical. In |
4823 | /// the latter case, it is also a dependent type. |
4824 | class DeducedType : public Type { |
4825 | protected: |
4826 | DeducedType(TypeClass TC, QualType DeducedAsType, bool IsDependent, |
4827 | bool IsInstantiationDependent, bool ContainsParameterPack) |
4828 | : Type(TC, |
4829 | // FIXME: Retain the sugared deduced type? |
4830 | DeducedAsType.isNull() ? QualType(this, 0) |
4831 | : DeducedAsType.getCanonicalType(), |
4832 | IsDependent, IsInstantiationDependent, |
4833 | /*VariablyModified=*/false, ContainsParameterPack) { |
4834 | if (!DeducedAsType.isNull()) { |
4835 | if (DeducedAsType->isDependentType()) |
4836 | setDependent(); |
4837 | if (DeducedAsType->isInstantiationDependentType()) |
4838 | setInstantiationDependent(); |
4839 | if (DeducedAsType->containsUnexpandedParameterPack()) |
4840 | setContainsUnexpandedParameterPack(); |
4841 | } |
4842 | } |
4843 | |
4844 | public: |
4845 | bool isSugared() const { return !isCanonicalUnqualified(); } |
4846 | QualType desugar() const { return getCanonicalTypeInternal(); } |
4847 | |
4848 | /// Get the type deduced for this placeholder type, or null if it's |
4849 | /// either not been deduced or was deduced to a dependent type. |
4850 | QualType getDeducedType() const { |
4851 | return !isCanonicalUnqualified() ? getCanonicalTypeInternal() : QualType(); |
4852 | } |
4853 | bool isDeduced() const { |
4854 | return !isCanonicalUnqualified() || isDependentType(); |
4855 | } |
4856 | |
4857 | static bool classof(const Type *T) { |
4858 | return T->getTypeClass() == Auto || |
4859 | T->getTypeClass() == DeducedTemplateSpecialization; |
4860 | } |
4861 | }; |
4862 | |
4863 | /// Represents a C++11 auto or C++14 decltype(auto) type. |
4864 | class AutoType : public DeducedType, public llvm::FoldingSetNode { |
4865 | friend class ASTContext; // ASTContext creates these |
4866 | |
4867 | AutoType(QualType DeducedAsType, AutoTypeKeyword Keyword, |
4868 | bool IsDeducedAsDependent, bool IsDeducedAsPack) |
4869 | : DeducedType(Auto, DeducedAsType, IsDeducedAsDependent, |
4870 | IsDeducedAsDependent, IsDeducedAsPack) { |
4871 | AutoTypeBits.Keyword = (unsigned)Keyword; |
4872 | } |
4873 | |
4874 | public: |
4875 | bool isDecltypeAuto() const { |
4876 | return getKeyword() == AutoTypeKeyword::DecltypeAuto; |
4877 | } |
4878 | |
4879 | AutoTypeKeyword getKeyword() const { |
4880 | return (AutoTypeKeyword)AutoTypeBits.Keyword; |
4881 | } |
4882 | |
4883 | void Profile(llvm::FoldingSetNodeID &ID) { |
4884 | Profile(ID, getDeducedType(), getKeyword(), isDependentType(), |
4885 | containsUnexpandedParameterPack()); |
4886 | } |
4887 | |
4888 | static void Profile(llvm::FoldingSetNodeID &ID, QualType Deduced, |
4889 | AutoTypeKeyword Keyword, bool IsDependent, bool IsPack) { |
4890 | ID.AddPointer(Deduced.getAsOpaquePtr()); |
4891 | ID.AddInteger((unsigned)Keyword); |
4892 | ID.AddBoolean(IsDependent); |
4893 | ID.AddBoolean(IsPack); |
4894 | } |
4895 | |
4896 | static bool classof(const Type *T) { |
4897 | return T->getTypeClass() == Auto; |
4898 | } |
4899 | }; |
4900 | |
4901 | /// Represents a C++17 deduced template specialization type. |
4902 | class DeducedTemplateSpecializationType : public DeducedType, |
4903 | public llvm::FoldingSetNode { |
4904 | friend class ASTContext; // ASTContext creates these |
4905 | |
4906 | /// The name of the template whose arguments will be deduced. |
4907 | TemplateName Template; |
4908 | |
4909 | DeducedTemplateSpecializationType(TemplateName Template, |
4910 | QualType DeducedAsType, |
4911 | bool IsDeducedAsDependent) |
4912 | : DeducedType(DeducedTemplateSpecialization, DeducedAsType, |
4913 | IsDeducedAsDependent || Template.isDependent(), |
4914 | IsDeducedAsDependent || Template.isInstantiationDependent(), |
4915 | Template.containsUnexpandedParameterPack()), |
4916 | Template(Template) {} |
4917 | |
4918 | public: |
4919 | /// Retrieve the name of the template that we are deducing. |
4920 | TemplateName getTemplateName() const { return Template;} |
4921 | |
4922 | void Profile(llvm::FoldingSetNodeID &ID) { |
4923 | Profile(ID, getTemplateName(), getDeducedType(), isDependentType()); |
4924 | } |
4925 | |
4926 | static void Profile(llvm::FoldingSetNodeID &ID, TemplateName Template, |
4927 | QualType Deduced, bool IsDependent) { |
4928 | Template.Profile(ID); |
4929 | ID.AddPointer(Deduced.getAsOpaquePtr()); |
4930 | ID.AddBoolean(IsDependent); |
4931 | } |
4932 | |
4933 | static bool classof(const Type *T) { |
4934 | return T->getTypeClass() == DeducedTemplateSpecialization; |
4935 | } |
4936 | }; |
4937 | |
4938 | /// Represents a type template specialization; the template |
4939 | /// must be a class template, a type alias template, or a template |
4940 | /// template parameter. A template which cannot be resolved to one of |
4941 | /// these, e.g. because it is written with a dependent scope |
4942 | /// specifier, is instead represented as a |
4943 | /// @c DependentTemplateSpecializationType. |
4944 | /// |
4945 | /// A non-dependent template specialization type is always "sugar", |
4946 | /// typically for a \c RecordType. For example, a class template |
4947 | /// specialization type of \c vector<int> will refer to a tag type for |
4948 | /// the instantiation \c std::vector<int, std::allocator<int>> |
4949 | /// |
4950 | /// Template specializations are dependent if either the template or |
4951 | /// any of the template arguments are dependent, in which case the |
4952 | /// type may also be canonical. |
4953 | /// |
4954 | /// Instances of this type are allocated with a trailing array of |
4955 | /// TemplateArguments, followed by a QualType representing the |
4956 | /// non-canonical aliased type when the template is a type alias |
4957 | /// template. |
4958 | class alignas(8) TemplateSpecializationType |
4959 | : public Type, |
4960 | public llvm::FoldingSetNode { |
4961 | friend class ASTContext; // ASTContext creates these |
4962 | |
4963 | /// The name of the template being specialized. This is |
4964 | /// either a TemplateName::Template (in which case it is a |
4965 | /// ClassTemplateDecl*, a TemplateTemplateParmDecl*, or a |
4966 | /// TypeAliasTemplateDecl*), a |
4967 | /// TemplateName::SubstTemplateTemplateParmPack, or a |
4968 | /// TemplateName::SubstTemplateTemplateParm (in which case the |
4969 | /// replacement must, recursively, be one of these). |
4970 | TemplateName Template; |
4971 | |
4972 | TemplateSpecializationType(TemplateName T, |
4973 | ArrayRef<TemplateArgument> Args, |
4974 | QualType Canon, |
4975 | QualType Aliased); |
4976 | |
4977 | public: |
4978 | /// Determine whether any of the given template arguments are dependent. |
4979 | static bool anyDependentTemplateArguments(ArrayRef<TemplateArgumentLoc> Args, |
4980 | bool &InstantiationDependent); |
4981 | |
4982 | static bool anyDependentTemplateArguments(const TemplateArgumentListInfo &, |
4983 | bool &InstantiationDependent); |
4984 | |
4985 | /// True if this template specialization type matches a current |
4986 | /// instantiation in the context in which it is found. |
4987 | bool isCurrentInstantiation() const { |
4988 | return isa<InjectedClassNameType>(getCanonicalTypeInternal()); |
4989 | } |
4990 | |
4991 | /// Determine if this template specialization type is for a type alias |
4992 | /// template that has been substituted. |
4993 | /// |
4994 | /// Nearly every template specialization type whose template is an alias |
4995 | /// template will be substituted. However, this is not the case when |
4996 | /// the specialization contains a pack expansion but the template alias |
4997 | /// does not have a corresponding parameter pack, e.g., |
4998 | /// |
4999 | /// \code |
5000 | /// template<typename T, typename U, typename V> struct S; |
5001 | /// template<typename T, typename U> using A = S<T, int, U>; |
5002 | /// template<typename... Ts> struct X { |
5003 | /// typedef A<Ts...> type; // not a type alias |
5004 | /// }; |
5005 | /// \endcode |
5006 | bool isTypeAlias() const { return TemplateSpecializationTypeBits.TypeAlias; } |
5007 | |
5008 | /// Get the aliased type, if this is a specialization of a type alias |
5009 | /// template. |
5010 | QualType getAliasedType() const { |
5011 | assert(isTypeAlias() && "not a type alias template specialization")((isTypeAlias() && "not a type alias template specialization" ) ? static_cast<void> (0) : __assert_fail ("isTypeAlias() && \"not a type alias template specialization\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 5011, __PRETTY_FUNCTION__)); |
5012 | return *reinterpret_cast<const QualType*>(end()); |
5013 | } |
5014 | |
5015 | using iterator = const TemplateArgument *; |
5016 | |
5017 | iterator begin() const { return getArgs(); } |
5018 | iterator end() const; // defined inline in TemplateBase.h |
5019 | |
5020 | /// Retrieve the name of the template that we are specializing. |
5021 | TemplateName getTemplateName() const { return Template; } |
5022 | |
5023 | /// Retrieve the template arguments. |
5024 | const TemplateArgument *getArgs() const { |
5025 | return reinterpret_cast<const TemplateArgument *>(this + 1); |
5026 | } |
5027 | |
5028 | /// Retrieve the number of template arguments. |
5029 | unsigned getNumArgs() const { |
5030 | return TemplateSpecializationTypeBits.NumArgs; |
5031 | } |
5032 | |
5033 | /// Retrieve a specific template argument as a type. |
5034 | /// \pre \c isArgType(Arg) |
5035 | const TemplateArgument &getArg(unsigned Idx) const; // in TemplateBase.h |
5036 | |
5037 | ArrayRef<TemplateArgument> template_arguments() const { |
5038 | return {getArgs(), getNumArgs()}; |
5039 | } |
5040 | |
5041 | bool isSugared() const { |
5042 | return !isDependentType() || isCurrentInstantiation() || isTypeAlias(); |
5043 | } |
5044 | |
5045 | QualType desugar() const { |
5046 | return isTypeAlias() ? getAliasedType() : getCanonicalTypeInternal(); |
5047 | } |
5048 | |
5049 | void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Ctx) { |
5050 | Profile(ID, Template, template_arguments(), Ctx); |
5051 | if (isTypeAlias()) |
5052 | getAliasedType().Profile(ID); |
5053 | } |
5054 | |
5055 | static void Profile(llvm::FoldingSetNodeID &ID, TemplateName T, |
5056 | ArrayRef<TemplateArgument> Args, |
5057 | const ASTContext &Context); |
5058 | |
5059 | static bool classof(const Type *T) { |
5060 | return T->getTypeClass() == TemplateSpecialization; |
5061 | } |
5062 | }; |
5063 | |
5064 | /// Print a template argument list, including the '<' and '>' |
5065 | /// enclosing the template arguments. |
5066 | void printTemplateArgumentList(raw_ostream &OS, |
5067 | ArrayRef<TemplateArgument> Args, |
5068 | const PrintingPolicy &Policy); |
5069 | |
5070 | void printTemplateArgumentList(raw_ostream &OS, |
5071 | ArrayRef<TemplateArgumentLoc> Args, |
5072 | const PrintingPolicy &Policy); |
5073 | |
5074 | void printTemplateArgumentList(raw_ostream &OS, |
5075 | const TemplateArgumentListInfo &Args, |
5076 | const PrintingPolicy &Policy); |
5077 | |
5078 | /// The injected class name of a C++ class template or class |
5079 | /// template partial specialization. Used to record that a type was |
5080 | /// spelled with a bare identifier rather than as a template-id; the |
5081 | /// equivalent for non-templated classes is just RecordType. |
5082 | /// |
5083 | /// Injected class name types are always dependent. Template |
5084 | /// instantiation turns these into RecordTypes. |
5085 | /// |
5086 | /// Injected class name types are always canonical. This works |
5087 | /// because it is impossible to compare an injected class name type |
5088 | /// with the corresponding non-injected template type, for the same |
5089 | /// reason that it is impossible to directly compare template |
5090 | /// parameters from different dependent contexts: injected class name |
5091 | /// types can only occur within the scope of a particular templated |
5092 | /// declaration, and within that scope every template specialization |
5093 | /// will canonicalize to the injected class name (when appropriate |
5094 | /// according to the rules of the language). |
5095 | class InjectedClassNameType : public Type { |
5096 | friend class ASTContext; // ASTContext creates these. |
5097 | friend class ASTNodeImporter; |
5098 | friend class ASTReader; // FIXME: ASTContext::getInjectedClassNameType is not |
5099 | // currently suitable for AST reading, too much |
5100 | // interdependencies. |
5101 | template <class T> friend class serialization::AbstractTypeReader; |
5102 | |
5103 | CXXRecordDecl *Decl; |
5104 | |
5105 | /// The template specialization which this type represents. |
5106 | /// For example, in |
5107 | /// template <class T> class A { ... }; |
5108 | /// this is A<T>, whereas in |
5109 | /// template <class X, class Y> class A<B<X,Y> > { ... }; |
5110 | /// this is A<B<X,Y> >. |
5111 | /// |
5112 | /// It is always unqualified, always a template specialization type, |
5113 | /// and always dependent. |
5114 | QualType InjectedType; |
5115 | |
5116 | InjectedClassNameType(CXXRecordDecl *D, QualType TST) |
5117 | : Type(InjectedClassName, QualType(), /*Dependent=*/true, |
5118 | /*InstantiationDependent=*/true, |
5119 | /*VariablyModified=*/false, |
5120 | /*ContainsUnexpandedParameterPack=*/false), |
5121 | Decl(D), InjectedType(TST) { |
5122 | assert(isa<TemplateSpecializationType>(TST))((isa<TemplateSpecializationType>(TST)) ? static_cast< void> (0) : __assert_fail ("isa<TemplateSpecializationType>(TST)" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 5122, __PRETTY_FUNCTION__)); |
5123 | assert(!TST.hasQualifiers())((!TST.hasQualifiers()) ? static_cast<void> (0) : __assert_fail ("!TST.hasQualifiers()", "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 5123, __PRETTY_FUNCTION__)); |
5124 | assert(TST->isDependentType())((TST->isDependentType()) ? static_cast<void> (0) : __assert_fail ("TST->isDependentType()", "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 5124, __PRETTY_FUNCTION__)); |
5125 | } |
5126 | |
5127 | public: |
5128 | QualType getInjectedSpecializationType() const { return InjectedType; } |
5129 | |
5130 | const TemplateSpecializationType *getInjectedTST() const { |
5131 | return cast<TemplateSpecializationType>(InjectedType.getTypePtr()); |
5132 | } |
5133 | |
5134 | TemplateName getTemplateName() const { |
5135 | return getInjectedTST()->getTemplateName(); |
5136 | } |
5137 | |
5138 | CXXRecordDecl *getDecl() const; |
5139 | |
5140 | bool isSugared() const { return false; } |
5141 | QualType desugar() const { return QualType(this, 0); } |
5142 | |
5143 | static bool classof(const Type *T) { |
5144 | return T->getTypeClass() == InjectedClassName; |
5145 | } |
5146 | }; |
5147 | |
5148 | /// The kind of a tag type. |
5149 | enum TagTypeKind { |
5150 | /// The "struct" keyword. |
5151 | TTK_Struct, |
5152 | |
5153 | /// The "__interface" keyword. |
5154 | TTK_Interface, |
5155 | |
5156 | /// The "union" keyword. |
5157 | TTK_Union, |
5158 | |
5159 | /// The "class" keyword. |
5160 | TTK_Class, |
5161 | |
5162 | /// The "enum" keyword. |
5163 | TTK_Enum |
5164 | }; |
5165 | |
5166 | /// The elaboration keyword that precedes a qualified type name or |
5167 | /// introduces an elaborated-type-specifier. |
5168 | enum ElaboratedTypeKeyword { |
5169 | /// The "struct" keyword introduces the elaborated-type-specifier. |
5170 | ETK_Struct, |
5171 | |
5172 | /// The "__interface" keyword introduces the elaborated-type-specifier. |
5173 | ETK_Interface, |
5174 | |
5175 | /// The "union" keyword introduces the elaborated-type-specifier. |
5176 | ETK_Union, |
5177 | |
5178 | /// The "class" keyword introduces the elaborated-type-specifier. |
5179 | ETK_Class, |
5180 | |
5181 | /// The "enum" keyword introduces the elaborated-type-specifier. |
5182 | ETK_Enum, |
5183 | |
5184 | /// The "typename" keyword precedes the qualified type name, e.g., |
5185 | /// \c typename T::type. |
5186 | ETK_Typename, |
5187 | |
5188 | /// No keyword precedes the qualified type name. |
5189 | ETK_None |
5190 | }; |
5191 | |
5192 | /// A helper class for Type nodes having an ElaboratedTypeKeyword. |
5193 | /// The keyword in stored in the free bits of the base class. |
5194 | /// Also provides a few static helpers for converting and printing |
5195 | /// elaborated type keyword and tag type kind enumerations. |
5196 | class TypeWithKeyword : public Type { |
5197 | protected: |
5198 | TypeWithKeyword(ElaboratedTypeKeyword Keyword, TypeClass tc, |
5199 | QualType Canonical, bool Dependent, |
5200 | bool InstantiationDependent, bool VariablyModified, |
5201 | bool ContainsUnexpandedParameterPack) |
5202 | : Type(tc, Canonical, Dependent, InstantiationDependent, VariablyModified, |
5203 | ContainsUnexpandedParameterPack) { |
5204 | TypeWithKeywordBits.Keyword = Keyword; |
5205 | } |
5206 | |
5207 | public: |
5208 | ElaboratedTypeKeyword getKeyword() const { |
5209 | return static_cast<ElaboratedTypeKeyword>(TypeWithKeywordBits.Keyword); |
5210 | } |
5211 | |
5212 | /// Converts a type specifier (DeclSpec::TST) into an elaborated type keyword. |
5213 | static ElaboratedTypeKeyword getKeywordForTypeSpec(unsigned TypeSpec); |
5214 | |
5215 | /// Converts a type specifier (DeclSpec::TST) into a tag type kind. |
5216 | /// It is an error to provide a type specifier which *isn't* a tag kind here. |
5217 | static TagTypeKind getTagTypeKindForTypeSpec(unsigned TypeSpec); |
5218 | |
5219 | /// Converts a TagTypeKind into an elaborated type keyword. |
5220 | static ElaboratedTypeKeyword getKeywordForTagTypeKind(TagTypeKind Tag); |
5221 | |
5222 | /// Converts an elaborated type keyword into a TagTypeKind. |
5223 | /// It is an error to provide an elaborated type keyword |
5224 | /// which *isn't* a tag kind here. |
5225 | static TagTypeKind getTagTypeKindForKeyword(ElaboratedTypeKeyword Keyword); |
5226 | |
5227 | static bool KeywordIsTagTypeKind(ElaboratedTypeKeyword Keyword); |
5228 | |
5229 | static StringRef getKeywordName(ElaboratedTypeKeyword Keyword); |
5230 | |
5231 | static StringRef getTagTypeKindName(TagTypeKind Kind) { |
5232 | return getKeywordName(getKeywordForTagTypeKind(Kind)); |
5233 | } |
5234 | |
5235 | class CannotCastToThisType {}; |
5236 | static CannotCastToThisType classof(const Type *); |
5237 | }; |
5238 | |
5239 | /// Represents a type that was referred to using an elaborated type |
5240 | /// keyword, e.g., struct S, or via a qualified name, e.g., N::M::type, |
5241 | /// or both. |
5242 | /// |
5243 | /// This type is used to keep track of a type name as written in the |
5244 | /// source code, including tag keywords and any nested-name-specifiers. |
5245 | /// The type itself is always "sugar", used to express what was written |
5246 | /// in the source code but containing no additional semantic information. |
5247 | class ElaboratedType final |
5248 | : public TypeWithKeyword, |
5249 | public llvm::FoldingSetNode, |
5250 | private llvm::TrailingObjects<ElaboratedType, TagDecl *> { |
5251 | friend class ASTContext; // ASTContext creates these |
5252 | friend TrailingObjects; |
5253 | |
5254 | /// The nested name specifier containing the qualifier. |
5255 | NestedNameSpecifier *NNS; |
5256 | |
5257 | /// The type that this qualified name refers to. |
5258 | QualType NamedType; |
5259 | |
5260 | /// The (re)declaration of this tag type owned by this occurrence is stored |
5261 | /// as a trailing object if there is one. Use getOwnedTagDecl to obtain |
5262 | /// it, or obtain a null pointer if there is none. |
5263 | |
5264 | ElaboratedType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier *NNS, |
5265 | QualType NamedType, QualType CanonType, TagDecl *OwnedTagDecl) |
5266 | : TypeWithKeyword(Keyword, Elaborated, CanonType, |
5267 | NamedType->isDependentType(), |
5268 | NamedType->isInstantiationDependentType(), |
5269 | NamedType->isVariablyModifiedType(), |
5270 | NamedType->containsUnexpandedParameterPack()), |
5271 | NNS(NNS), NamedType(NamedType) { |
5272 | ElaboratedTypeBits.HasOwnedTagDecl = false; |
5273 | if (OwnedTagDecl) { |
5274 | ElaboratedTypeBits.HasOwnedTagDecl = true; |
5275 | *getTrailingObjects<TagDecl *>() = OwnedTagDecl; |
5276 | } |
5277 | assert(!(Keyword == ETK_None && NNS == nullptr) &&((!(Keyword == ETK_None && NNS == nullptr) && "ElaboratedType cannot have elaborated type keyword " "and name qualifier both null." ) ? static_cast<void> (0) : __assert_fail ("!(Keyword == ETK_None && NNS == nullptr) && \"ElaboratedType cannot have elaborated type keyword \" \"and name qualifier both null.\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 5279, __PRETTY_FUNCTION__)) |
5278 | "ElaboratedType cannot have elaborated type keyword "((!(Keyword == ETK_None && NNS == nullptr) && "ElaboratedType cannot have elaborated type keyword " "and name qualifier both null." ) ? static_cast<void> (0) : __assert_fail ("!(Keyword == ETK_None && NNS == nullptr) && \"ElaboratedType cannot have elaborated type keyword \" \"and name qualifier both null.\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 5279, __PRETTY_FUNCTION__)) |
5279 | "and name qualifier both null.")((!(Keyword == ETK_None && NNS == nullptr) && "ElaboratedType cannot have elaborated type keyword " "and name qualifier both null." ) ? static_cast<void> (0) : __assert_fail ("!(Keyword == ETK_None && NNS == nullptr) && \"ElaboratedType cannot have elaborated type keyword \" \"and name qualifier both null.\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 5279, __PRETTY_FUNCTION__)); |
5280 | } |
5281 | |
5282 | public: |
5283 | /// Retrieve the qualification on this type. |
5284 | NestedNameSpecifier *getQualifier() const { return NNS; } |
5285 | |
5286 | /// Retrieve the type named by the qualified-id. |
5287 | QualType getNamedType() const { return NamedType; } |
5288 | |
5289 | /// Remove a single level of sugar. |
5290 | QualType desugar() const { return getNamedType(); } |
5291 | |
5292 | /// Returns whether this type directly provides sugar. |
5293 | bool isSugared() const { return true; } |
5294 | |
5295 | /// Return the (re)declaration of this type owned by this occurrence of this |
5296 | /// type, or nullptr if there is none. |
5297 | TagDecl *getOwnedTagDecl() const { |
5298 | return ElaboratedTypeBits.HasOwnedTagDecl ? *getTrailingObjects<TagDecl *>() |
5299 | : nullptr; |
5300 | } |
5301 | |
5302 | void Profile(llvm::FoldingSetNodeID &ID) { |
5303 | Profile(ID, getKeyword(), NNS, NamedType, getOwnedTagDecl()); |
5304 | } |
5305 | |
5306 | static void Profile(llvm::FoldingSetNodeID &ID, ElaboratedTypeKeyword Keyword, |
5307 | NestedNameSpecifier *NNS, QualType NamedType, |
5308 | TagDecl *OwnedTagDecl) { |
5309 | ID.AddInteger(Keyword); |
5310 | ID.AddPointer(NNS); |
5311 | NamedType.Profile(ID); |
5312 | ID.AddPointer(OwnedTagDecl); |
5313 | } |
5314 | |
5315 | static bool classof(const Type *T) { return T->getTypeClass() == Elaborated; } |
5316 | }; |
5317 | |
5318 | /// Represents a qualified type name for which the type name is |
5319 | /// dependent. |
5320 | /// |
5321 | /// DependentNameType represents a class of dependent types that involve a |
5322 | /// possibly dependent nested-name-specifier (e.g., "T::") followed by a |
5323 | /// name of a type. The DependentNameType may start with a "typename" (for a |
5324 | /// typename-specifier), "class", "struct", "union", or "enum" (for a |
5325 | /// dependent elaborated-type-specifier), or nothing (in contexts where we |
5326 | /// know that we must be referring to a type, e.g., in a base class specifier). |
5327 | /// Typically the nested-name-specifier is dependent, but in MSVC compatibility |
5328 | /// mode, this type is used with non-dependent names to delay name lookup until |
5329 | /// instantiation. |
5330 | class DependentNameType : public TypeWithKeyword, public llvm::FoldingSetNode { |
5331 | friend class ASTContext; // ASTContext creates these |
5332 | |
5333 | /// The nested name specifier containing the qualifier. |
5334 | NestedNameSpecifier *NNS; |
5335 | |
5336 | /// The type that this typename specifier refers to. |
5337 | const IdentifierInfo *Name; |
5338 | |
5339 | DependentNameType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier *NNS, |
5340 | const IdentifierInfo *Name, QualType CanonType) |
5341 | : TypeWithKeyword(Keyword, DependentName, CanonType, /*Dependent=*/true, |
5342 | /*InstantiationDependent=*/true, |
5343 | /*VariablyModified=*/false, |
5344 | NNS->containsUnexpandedParameterPack()), |
5345 | NNS(NNS), Name(Name) {} |
5346 | |
5347 | public: |
5348 | /// Retrieve the qualification on this type. |
5349 | NestedNameSpecifier *getQualifier() const { return NNS; } |
5350 | |
5351 | /// Retrieve the type named by the typename specifier as an identifier. |
5352 | /// |
5353 | /// This routine will return a non-NULL identifier pointer when the |
5354 | /// form of the original typename was terminated by an identifier, |
5355 | /// e.g., "typename T::type". |
5356 | const IdentifierInfo *getIdentifier() const { |
5357 | return Name; |
5358 | } |
5359 | |
5360 | bool isSugared() const { return false; } |
5361 | QualType desugar() const { return QualType(this, 0); } |
5362 | |
5363 | void Profile(llvm::FoldingSetNodeID &ID) { |
5364 | Profile(ID, getKeyword(), NNS, Name); |
5365 | } |
5366 | |
5367 | static void Profile(llvm::FoldingSetNodeID &ID, ElaboratedTypeKeyword Keyword, |
5368 | NestedNameSpecifier *NNS, const IdentifierInfo *Name) { |
5369 | ID.AddInteger(Keyword); |
5370 | ID.AddPointer(NNS); |
5371 | ID.AddPointer(Name); |
5372 | } |
5373 | |
5374 | static bool classof(const Type *T) { |
5375 | return T->getTypeClass() == DependentName; |
5376 | } |
5377 | }; |
5378 | |
5379 | /// Represents a template specialization type whose template cannot be |
5380 | /// resolved, e.g. |
5381 | /// A<T>::template B<T> |
5382 | class alignas(8) DependentTemplateSpecializationType |
5383 | : public TypeWithKeyword, |
5384 | public llvm::FoldingSetNode { |
5385 | friend class ASTContext; // ASTContext creates these |
5386 | |
5387 | /// The nested name specifier containing the qualifier. |
5388 | NestedNameSpecifier *NNS; |
5389 | |
5390 | /// The identifier of the template. |
5391 | const IdentifierInfo *Name; |
5392 | |
5393 | DependentTemplateSpecializationType(ElaboratedTypeKeyword Keyword, |
5394 | NestedNameSpecifier *NNS, |
5395 | const IdentifierInfo *Name, |
5396 | ArrayRef<TemplateArgument> Args, |
5397 | QualType Canon); |
5398 | |
5399 | const TemplateArgument *getArgBuffer() const { |
5400 | return reinterpret_cast<const TemplateArgument*>(this+1); |
5401 | } |
5402 | |
5403 | TemplateArgument *getArgBuffer() { |
5404 | return reinterpret_cast<TemplateArgument*>(this+1); |
5405 | } |
5406 | |
5407 | public: |
5408 | NestedNameSpecifier *getQualifier() const { return NNS; } |
5409 | const IdentifierInfo *getIdentifier() const { return Name; } |
5410 | |
5411 | /// Retrieve the template arguments. |
5412 | const TemplateArgument *getArgs() const { |
5413 | return getArgBuffer(); |
5414 | } |
5415 | |
5416 | /// Retrieve the number of template arguments. |
5417 | unsigned getNumArgs() const { |
5418 | return DependentTemplateSpecializationTypeBits.NumArgs; |
5419 | } |
5420 | |
5421 | const TemplateArgument &getArg(unsigned Idx) const; // in TemplateBase.h |
5422 | |
5423 | ArrayRef<TemplateArgument> template_arguments() const { |
5424 | return {getArgs(), getNumArgs()}; |
5425 | } |
5426 | |
5427 | using iterator = const TemplateArgument *; |
5428 | |
5429 | iterator begin() const { return getArgs(); } |
5430 | iterator end() const; // inline in TemplateBase.h |
5431 | |
5432 | bool isSugared() const { return false; } |
5433 | QualType desugar() const { return QualType(this, 0); } |
5434 | |
5435 | void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context) { |
5436 | Profile(ID, Context, getKeyword(), NNS, Name, {getArgs(), getNumArgs()}); |
5437 | } |
5438 | |
5439 | static void Profile(llvm::FoldingSetNodeID &ID, |
5440 | const ASTContext &Context, |
5441 | ElaboratedTypeKeyword Keyword, |
5442 | NestedNameSpecifier *Qualifier, |
5443 | const IdentifierInfo *Name, |
5444 | ArrayRef<TemplateArgument> Args); |
5445 | |
5446 | static bool classof(const Type *T) { |
5447 | return T->getTypeClass() == DependentTemplateSpecialization; |
5448 | } |
5449 | }; |
5450 | |
5451 | /// Represents a pack expansion of types. |
5452 | /// |
5453 | /// Pack expansions are part of C++11 variadic templates. A pack |
5454 | /// expansion contains a pattern, which itself contains one or more |
5455 | /// "unexpanded" parameter packs. When instantiated, a pack expansion |
5456 | /// produces a series of types, each instantiated from the pattern of |
5457 | /// the expansion, where the Ith instantiation of the pattern uses the |
5458 | /// Ith arguments bound to each of the unexpanded parameter packs. The |
5459 | /// pack expansion is considered to "expand" these unexpanded |
5460 | /// parameter packs. |
5461 | /// |
5462 | /// \code |
5463 | /// template<typename ...Types> struct tuple; |
5464 | /// |
5465 | /// template<typename ...Types> |
5466 | /// struct tuple_of_references { |
5467 | /// typedef tuple<Types&...> type; |
5468 | /// }; |
5469 | /// \endcode |
5470 | /// |
5471 | /// Here, the pack expansion \c Types&... is represented via a |
5472 | /// PackExpansionType whose pattern is Types&. |
5473 | class PackExpansionType : public Type, public llvm::FoldingSetNode { |
5474 | friend class ASTContext; // ASTContext creates these |
5475 | |
5476 | /// The pattern of the pack expansion. |
5477 | QualType Pattern; |
5478 | |
5479 | PackExpansionType(QualType Pattern, QualType Canon, |
5480 | Optional<unsigned> NumExpansions) |
5481 | : Type(PackExpansion, Canon, /*Dependent=*/Pattern->isDependentType(), |
5482 | /*InstantiationDependent=*/true, |
5483 | /*VariablyModified=*/Pattern->isVariablyModifiedType(), |
5484 | /*ContainsUnexpandedParameterPack=*/false), |
5485 | Pattern(Pattern) { |
5486 | PackExpansionTypeBits.NumExpansions = |
5487 | NumExpansions ? *NumExpansions + 1 : 0; |
5488 | } |
5489 | |
5490 | public: |
5491 | /// Retrieve the pattern of this pack expansion, which is the |
5492 | /// type that will be repeatedly instantiated when instantiating the |
5493 | /// pack expansion itself. |
5494 | QualType getPattern() const { return Pattern; } |
5495 | |
5496 | /// Retrieve the number of expansions that this pack expansion will |
5497 | /// generate, if known. |
5498 | Optional<unsigned> getNumExpansions() const { |
5499 | if (PackExpansionTypeBits.NumExpansions) |
5500 | return PackExpansionTypeBits.NumExpansions - 1; |
5501 | return None; |
5502 | } |
5503 | |
5504 | bool isSugared() const { return !Pattern->isDependentType(); } |
5505 | QualType desugar() const { return isSugared() ? Pattern : QualType(this, 0); } |
5506 | |
5507 | void Profile(llvm::FoldingSetNodeID &ID) { |
5508 | Profile(ID, getPattern(), getNumExpansions()); |
5509 | } |
5510 | |
5511 | static void Profile(llvm::FoldingSetNodeID &ID, QualType Pattern, |
5512 | Optional<unsigned> NumExpansions) { |
5513 | ID.AddPointer(Pattern.getAsOpaquePtr()); |
5514 | ID.AddBoolean(NumExpansions.hasValue()); |
5515 | if (NumExpansions) |
5516 | ID.AddInteger(*NumExpansions); |
5517 | } |
5518 | |
5519 | static bool classof(const Type *T) { |
5520 | return T->getTypeClass() == PackExpansion; |
5521 | } |
5522 | }; |
5523 | |
5524 | /// This class wraps the list of protocol qualifiers. For types that can |
5525 | /// take ObjC protocol qualifers, they can subclass this class. |
5526 | template <class T> |
5527 | class ObjCProtocolQualifiers { |
5528 | protected: |
5529 | ObjCProtocolQualifiers() = default; |
5530 | |
5531 | ObjCProtocolDecl * const *getProtocolStorage() const { |
5532 | return const_cast<ObjCProtocolQualifiers*>(this)->getProtocolStorage(); |
5533 | } |
5534 | |
5535 | ObjCProtocolDecl **getProtocolStorage() { |
5536 | return static_cast<T*>(this)->getProtocolStorageImpl(); |
5537 | } |
5538 | |
5539 | void setNumProtocols(unsigned N) { |
5540 | static_cast<T*>(this)->setNumProtocolsImpl(N); |
5541 | } |
5542 | |
5543 | void initialize(ArrayRef<ObjCProtocolDecl *> protocols) { |
5544 | setNumProtocols(protocols.size()); |
5545 | assert(getNumProtocols() == protocols.size() &&((getNumProtocols() == protocols.size() && "bitfield overflow in protocol count" ) ? static_cast<void> (0) : __assert_fail ("getNumProtocols() == protocols.size() && \"bitfield overflow in protocol count\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 5546, __PRETTY_FUNCTION__)) |
5546 | "bitfield overflow in protocol count")((getNumProtocols() == protocols.size() && "bitfield overflow in protocol count" ) ? static_cast<void> (0) : __assert_fail ("getNumProtocols() == protocols.size() && \"bitfield overflow in protocol count\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 5546, __PRETTY_FUNCTION__)); |
5547 | if (!protocols.empty()) |
5548 | memcpy(getProtocolStorage(), protocols.data(), |
5549 | protocols.size() * sizeof(ObjCProtocolDecl*)); |
5550 | } |
5551 | |
5552 | public: |
5553 | using qual_iterator = ObjCProtocolDecl * const *; |
5554 | using qual_range = llvm::iterator_range<qual_iterator>; |
5555 | |
5556 | qual_range quals() const { return qual_range(qual_begin(), qual_end()); } |
5557 | qual_iterator qual_begin() const { return getProtocolStorage(); } |
5558 | qual_iterator qual_end() const { return qual_begin() + getNumProtocols(); } |
5559 | |
5560 | bool qual_empty() const { return getNumProtocols() == 0; } |
5561 | |
5562 | /// Return the number of qualifying protocols in this type, or 0 if |
5563 | /// there are none. |
5564 | unsigned getNumProtocols() const { |
5565 | return static_cast<const T*>(this)->getNumProtocolsImpl(); |
5566 | } |
5567 | |
5568 | /// Fetch a protocol by index. |
5569 | ObjCProtocolDecl *getProtocol(unsigned I) const { |
5570 | assert(I < getNumProtocols() && "Out-of-range protocol access")((I < getNumProtocols() && "Out-of-range protocol access" ) ? static_cast<void> (0) : __assert_fail ("I < getNumProtocols() && \"Out-of-range protocol access\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 5570, __PRETTY_FUNCTION__)); |
5571 | return qual_begin()[I]; |
5572 | } |
5573 | |
5574 | /// Retrieve all of the protocol qualifiers. |
5575 | ArrayRef<ObjCProtocolDecl *> getProtocols() const { |
5576 | return ArrayRef<ObjCProtocolDecl *>(qual_begin(), getNumProtocols()); |
5577 | } |
5578 | }; |
5579 | |
5580 | /// Represents a type parameter type in Objective C. It can take |
5581 | /// a list of protocols. |
5582 | class ObjCTypeParamType : public Type, |
5583 | public ObjCProtocolQualifiers<ObjCTypeParamType>, |
5584 | public llvm::FoldingSetNode { |
5585 | friend class ASTContext; |
5586 | friend class ObjCProtocolQualifiers<ObjCTypeParamType>; |
5587 | |
5588 | /// The number of protocols stored on this type. |
5589 | unsigned NumProtocols : 6; |
5590 | |
5591 | ObjCTypeParamDecl *OTPDecl; |
5592 | |
5593 | /// The protocols are stored after the ObjCTypeParamType node. In the |
5594 | /// canonical type, the list of protocols are sorted alphabetically |
5595 | /// and uniqued. |
5596 | ObjCProtocolDecl **getProtocolStorageImpl(); |
5597 | |
5598 | /// Return the number of qualifying protocols in this interface type, |
5599 | /// or 0 if there are none. |
5600 | unsigned getNumProtocolsImpl() const { |
5601 | return NumProtocols; |
5602 | } |
5603 | |
5604 | void setNumProtocolsImpl(unsigned N) { |
5605 | NumProtocols = N; |
5606 | } |
5607 | |
5608 | ObjCTypeParamType(const ObjCTypeParamDecl *D, |
5609 | QualType can, |
5610 | ArrayRef<ObjCProtocolDecl *> protocols); |
5611 | |
5612 | public: |
5613 | bool isSugared() const { return true; } |
5614 | QualType desugar() const { return getCanonicalTypeInternal(); } |
5615 | |
5616 | static bool classof(const Type *T) { |
5617 | return T->getTypeClass() == ObjCTypeParam; |
5618 | } |
5619 | |
5620 | void Profile(llvm::FoldingSetNodeID &ID); |
5621 | static void Profile(llvm::FoldingSetNodeID &ID, |
5622 | const ObjCTypeParamDecl *OTPDecl, |
5623 | ArrayRef<ObjCProtocolDecl *> protocols); |
5624 | |
5625 | ObjCTypeParamDecl *getDecl() const { return OTPDecl; } |
5626 | }; |
5627 | |
5628 | /// Represents a class type in Objective C. |
5629 | /// |
5630 | /// Every Objective C type is a combination of a base type, a set of |
5631 | /// type arguments (optional, for parameterized classes) and a list of |
5632 | /// protocols. |
5633 | /// |
5634 | /// Given the following declarations: |
5635 | /// \code |
5636 | /// \@class C<T>; |
5637 | /// \@protocol P; |
5638 | /// \endcode |
5639 | /// |
5640 | /// 'C' is an ObjCInterfaceType C. It is sugar for an ObjCObjectType |
5641 | /// with base C and no protocols. |
5642 | /// |
5643 | /// 'C<P>' is an unspecialized ObjCObjectType with base C and protocol list [P]. |
5644 | /// 'C<C*>' is a specialized ObjCObjectType with type arguments 'C*' and no |
5645 | /// protocol list. |
5646 | /// 'C<C*><P>' is a specialized ObjCObjectType with base C, type arguments 'C*', |
5647 | /// and protocol list [P]. |
5648 | /// |
5649 | /// 'id' is a TypedefType which is sugar for an ObjCObjectPointerType whose |
5650 | /// pointee is an ObjCObjectType with base BuiltinType::ObjCIdType |
5651 | /// and no protocols. |
5652 | /// |
5653 | /// 'id<P>' is an ObjCObjectPointerType whose pointee is an ObjCObjectType |
5654 | /// with base BuiltinType::ObjCIdType and protocol list [P]. Eventually |
5655 | /// this should get its own sugar class to better represent the source. |
5656 | class ObjCObjectType : public Type, |
5657 | public ObjCProtocolQualifiers<ObjCObjectType> { |
5658 | friend class ObjCProtocolQualifiers<ObjCObjectType>; |
5659 | |
5660 | // ObjCObjectType.NumTypeArgs - the number of type arguments stored |
5661 | // after the ObjCObjectPointerType node. |
5662 | // ObjCObjectType.NumProtocols - the number of protocols stored |
5663 | // after the type arguments of ObjCObjectPointerType node. |
5664 | // |
5665 | // These protocols are those written directly on the type. If |
5666 | // protocol qualifiers ever become additive, the iterators will need |
5667 | // to get kindof complicated. |
5668 | // |
5669 | // In the canonical object type, these are sorted alphabetically |
5670 | // and uniqued. |
5671 | |
5672 | /// Either a BuiltinType or an InterfaceType or sugar for either. |
5673 | QualType BaseType; |
5674 | |
5675 | /// Cached superclass type. |
5676 | mutable llvm::PointerIntPair<const ObjCObjectType *, 1, bool> |
5677 | CachedSuperClassType; |
5678 | |
5679 | QualType *getTypeArgStorage(); |
5680 | const QualType *getTypeArgStorage() const { |
5681 | return const_cast<ObjCObjectType *>(this)->getTypeArgStorage(); |
5682 | } |
5683 | |
5684 | ObjCProtocolDecl **getProtocolStorageImpl(); |
5685 | /// Return the number of qualifying protocols in this interface type, |
5686 | /// or 0 if there are none. |
5687 | unsigned getNumProtocolsImpl() const { |
5688 | return ObjCObjectTypeBits.NumProtocols; |
5689 | } |
5690 | void setNumProtocolsImpl(unsigned N) { |
5691 | ObjCObjectTypeBits.NumProtocols = N; |
5692 | } |
5693 | |
5694 | protected: |
5695 | enum Nonce_ObjCInterface { Nonce_ObjCInterface }; |
5696 | |
5697 | ObjCObjectType(QualType Canonical, QualType Base, |
5698 | ArrayRef<QualType> typeArgs, |
5699 | ArrayRef<ObjCProtocolDecl *> protocols, |
5700 | bool isKindOf); |
5701 | |
5702 | ObjCObjectType(enum Nonce_ObjCInterface) |
5703 | : Type(ObjCInterface, QualType(), false, false, false, false), |
5704 | BaseType(QualType(this_(), 0)) { |
5705 | ObjCObjectTypeBits.NumProtocols = 0; |
5706 | ObjCObjectTypeBits.NumTypeArgs = 0; |
5707 | ObjCObjectTypeBits.IsKindOf = 0; |
5708 | } |
5709 | |
5710 | void computeSuperClassTypeSlow() const; |
5711 | |
5712 | public: |
5713 | /// Gets the base type of this object type. This is always (possibly |
5714 | /// sugar for) one of: |
5715 | /// - the 'id' builtin type (as opposed to the 'id' type visible to the |
5716 | /// user, which is a typedef for an ObjCObjectPointerType) |
5717 | /// - the 'Class' builtin type (same caveat) |
5718 | /// - an ObjCObjectType (currently always an ObjCInterfaceType) |
5719 | QualType getBaseType() const { return BaseType; } |
5720 | |
5721 | bool isObjCId() const { |
5722 | return getBaseType()->isSpecificBuiltinType(BuiltinType::ObjCId); |
5723 | } |
5724 | |
5725 | bool isObjCClass() const { |
5726 | return getBaseType()->isSpecificBuiltinType(BuiltinType::ObjCClass); |
5727 | } |
5728 | |
5729 | bool isObjCUnqualifiedId() const { return qual_empty() && isObjCId(); } |
5730 | bool isObjCUnqualifiedClass() const { return qual_empty() && isObjCClass(); } |
5731 | bool isObjCUnqualifiedIdOrClass() const { |
5732 | if (!qual_empty()) return false; |
5733 | if (const BuiltinType *T = getBaseType()->getAs<BuiltinType>()) |
5734 | return T->getKind() == BuiltinType::ObjCId || |
5735 | T->getKind() == BuiltinType::ObjCClass; |
5736 | return false; |
5737 | } |
5738 | bool isObjCQualifiedId() const { return !qual_empty() && isObjCId(); } |
5739 | bool isObjCQualifiedClass() const { return !qual_empty() && isObjCClass(); } |
5740 | |
5741 | /// Gets the interface declaration for this object type, if the base type |
5742 | /// really is an interface. |
5743 | ObjCInterfaceDecl *getInterface() const; |
5744 | |
5745 | /// Determine whether this object type is "specialized", meaning |
5746 | /// that it has type arguments. |
5747 | bool isSpecialized() const; |
5748 | |
5749 | /// Determine whether this object type was written with type arguments. |
5750 | bool isSpecializedAsWritten() const { |
5751 | return ObjCObjectTypeBits.NumTypeArgs > 0; |
5752 | } |
5753 | |
5754 | /// Determine whether this object type is "unspecialized", meaning |
5755 | /// that it has no type arguments. |
5756 | bool isUnspecialized() const { return !isSpecialized(); } |
5757 | |
5758 | /// Determine whether this object type is "unspecialized" as |
5759 | /// written, meaning that it has no type arguments. |
5760 | bool isUnspecializedAsWritten() const { return !isSpecializedAsWritten(); } |
5761 | |
5762 | /// Retrieve the type arguments of this object type (semantically). |
5763 | ArrayRef<QualType> getTypeArgs() const; |
5764 | |
5765 | /// Retrieve the type arguments of this object type as they were |
5766 | /// written. |
5767 | ArrayRef<QualType> getTypeArgsAsWritten() const { |
5768 | return llvm::makeArrayRef(getTypeArgStorage(), |
5769 | ObjCObjectTypeBits.NumTypeArgs); |
5770 | } |
5771 | |
5772 | /// Whether this is a "__kindof" type as written. |
5773 | bool isKindOfTypeAsWritten() const { return ObjCObjectTypeBits.IsKindOf; } |
5774 | |
5775 | /// Whether this ia a "__kindof" type (semantically). |
5776 | bool isKindOfType() const; |
5777 | |
5778 | /// Retrieve the type of the superclass of this object type. |
5779 | /// |
5780 | /// This operation substitutes any type arguments into the |
5781 | /// superclass of the current class type, potentially producing a |
5782 | /// specialization of the superclass type. Produces a null type if |
5783 | /// there is no superclass. |
5784 | QualType getSuperClassType() const { |
5785 | if (!CachedSuperClassType.getInt()) |
5786 | computeSuperClassTypeSlow(); |
5787 | |
5788 | assert(CachedSuperClassType.getInt() && "Superclass not set?")((CachedSuperClassType.getInt() && "Superclass not set?" ) ? static_cast<void> (0) : __assert_fail ("CachedSuperClassType.getInt() && \"Superclass not set?\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 5788, __PRETTY_FUNCTION__)); |
5789 | return QualType(CachedSuperClassType.getPointer(), 0); |
5790 | } |
5791 | |
5792 | /// Strip off the Objective-C "kindof" type and (with it) any |
5793 | /// protocol qualifiers. |
5794 | QualType stripObjCKindOfTypeAndQuals(const ASTContext &ctx) const; |
5795 | |
5796 | bool isSugared() const { return false; } |
5797 | QualType desugar() const { return QualType(this, 0); } |
5798 | |
5799 | static bool classof(const Type *T) { |
5800 | return T->getTypeClass() == ObjCObject || |
5801 | T->getTypeClass() == ObjCInterface; |
5802 | } |
5803 | }; |
5804 | |
5805 | /// A class providing a concrete implementation |
5806 | /// of ObjCObjectType, so as to not increase the footprint of |
5807 | /// ObjCInterfaceType. Code outside of ASTContext and the core type |
5808 | /// system should not reference this type. |
5809 | class ObjCObjectTypeImpl : public ObjCObjectType, public llvm::FoldingSetNode { |
5810 | friend class ASTContext; |
5811 | |
5812 | // If anyone adds fields here, ObjCObjectType::getProtocolStorage() |
5813 | // will need to be modified. |
5814 | |
5815 | ObjCObjectTypeImpl(QualType Canonical, QualType Base, |
5816 | ArrayRef<QualType> typeArgs, |
5817 | ArrayRef<ObjCProtocolDecl *> protocols, |
5818 | bool isKindOf) |
5819 | : ObjCObjectType(Canonical, Base, typeArgs, protocols, isKindOf) {} |
5820 | |
5821 | public: |
5822 | void Profile(llvm::FoldingSetNodeID &ID); |
5823 | static void Profile(llvm::FoldingSetNodeID &ID, |
5824 | QualType Base, |
5825 | ArrayRef<QualType> typeArgs, |
5826 | ArrayRef<ObjCProtocolDecl *> protocols, |
5827 | bool isKindOf); |
5828 | }; |
5829 | |
5830 | inline QualType *ObjCObjectType::getTypeArgStorage() { |
5831 | return reinterpret_cast<QualType *>(static_cast<ObjCObjectTypeImpl*>(this)+1); |
5832 | } |
5833 | |
5834 | inline ObjCProtocolDecl **ObjCObjectType::getProtocolStorageImpl() { |
5835 | return reinterpret_cast<ObjCProtocolDecl**>( |
5836 | getTypeArgStorage() + ObjCObjectTypeBits.NumTypeArgs); |
5837 | } |
5838 | |
5839 | inline ObjCProtocolDecl **ObjCTypeParamType::getProtocolStorageImpl() { |
5840 | return reinterpret_cast<ObjCProtocolDecl**>( |
5841 | static_cast<ObjCTypeParamType*>(this)+1); |
5842 | } |
5843 | |
5844 | /// Interfaces are the core concept in Objective-C for object oriented design. |
5845 | /// They basically correspond to C++ classes. There are two kinds of interface |
5846 | /// types: normal interfaces like `NSString`, and qualified interfaces, which |
5847 | /// are qualified with a protocol list like `NSString<NSCopyable, NSAmazing>`. |
5848 | /// |
5849 | /// ObjCInterfaceType guarantees the following properties when considered |
5850 | /// as a subtype of its superclass, ObjCObjectType: |
5851 | /// - There are no protocol qualifiers. To reinforce this, code which |
5852 | /// tries to invoke the protocol methods via an ObjCInterfaceType will |
5853 | /// fail to compile. |
5854 | /// - It is its own base type. That is, if T is an ObjCInterfaceType*, |
5855 | /// T->getBaseType() == QualType(T, 0). |
5856 | class ObjCInterfaceType : public ObjCObjectType { |
5857 | friend class ASTContext; // ASTContext creates these. |
5858 | friend class ASTReader; |
5859 | friend class ObjCInterfaceDecl; |
5860 | template <class T> friend class serialization::AbstractTypeReader; |
5861 | |
5862 | mutable ObjCInterfaceDecl *Decl; |
5863 | |
5864 | ObjCInterfaceType(const ObjCInterfaceDecl *D) |
5865 | : ObjCObjectType(Nonce_ObjCInterface), |
5866 | Decl(const_cast<ObjCInterfaceDecl*>(D)) {} |
5867 | |
5868 | public: |
5869 | /// Get the declaration of this interface. |
5870 | ObjCInterfaceDecl *getDecl() const { return Decl; } |
5871 | |
5872 | bool isSugared() const { return false; } |
5873 | QualType desugar() const { return QualType(this, 0); } |
5874 | |
5875 | static bool classof(const Type *T) { |
5876 | return T->getTypeClass() == ObjCInterface; |
5877 | } |
5878 | |
5879 | // Nonsense to "hide" certain members of ObjCObjectType within this |
5880 | // class. People asking for protocols on an ObjCInterfaceType are |
5881 | // not going to get what they want: ObjCInterfaceTypes are |
5882 | // guaranteed to have no protocols. |
5883 | enum { |
5884 | qual_iterator, |
5885 | qual_begin, |
5886 | qual_end, |
5887 | getNumProtocols, |
5888 | getProtocol |
5889 | }; |
5890 | }; |
5891 | |
5892 | inline ObjCInterfaceDecl *ObjCObjectType::getInterface() const { |
5893 | QualType baseType = getBaseType(); |
5894 | while (const auto *ObjT = baseType->getAs<ObjCObjectType>()) { |
5895 | if (const auto *T = dyn_cast<ObjCInterfaceType>(ObjT)) |
5896 | return T->getDecl(); |
5897 | |
5898 | baseType = ObjT->getBaseType(); |
5899 | } |
5900 | |
5901 | return nullptr; |
5902 | } |
5903 | |
5904 | /// Represents a pointer to an Objective C object. |
5905 | /// |
5906 | /// These are constructed from pointer declarators when the pointee type is |
5907 | /// an ObjCObjectType (or sugar for one). In addition, the 'id' and 'Class' |
5908 | /// types are typedefs for these, and the protocol-qualified types 'id<P>' |
5909 | /// and 'Class<P>' are translated into these. |
5910 | /// |
5911 | /// Pointers to pointers to Objective C objects are still PointerTypes; |
5912 | /// only the first level of pointer gets it own type implementation. |
5913 | class ObjCObjectPointerType : public Type, public llvm::FoldingSetNode { |
5914 | friend class ASTContext; // ASTContext creates these. |
5915 | |
5916 | QualType PointeeType; |
5917 | |
5918 | ObjCObjectPointerType(QualType Canonical, QualType Pointee) |
5919 | : Type(ObjCObjectPointer, Canonical, |
5920 | Pointee->isDependentType(), |
5921 | Pointee->isInstantiationDependentType(), |
5922 | Pointee->isVariablyModifiedType(), |
5923 | Pointee->containsUnexpandedParameterPack()), |
5924 | PointeeType(Pointee) {} |
5925 | |
5926 | public: |
5927 | /// Gets the type pointed to by this ObjC pointer. |
5928 | /// The result will always be an ObjCObjectType or sugar thereof. |
5929 | QualType getPointeeType() const { return PointeeType; } |
5930 | |
5931 | /// Gets the type pointed to by this ObjC pointer. Always returns non-null. |
5932 | /// |
5933 | /// This method is equivalent to getPointeeType() except that |
5934 | /// it discards any typedefs (or other sugar) between this |
5935 | /// type and the "outermost" object type. So for: |
5936 | /// \code |
5937 | /// \@class A; \@protocol P; \@protocol Q; |
5938 | /// typedef A<P> AP; |
5939 | /// typedef A A1; |
5940 | /// typedef A1<P> A1P; |
5941 | /// typedef A1P<Q> A1PQ; |
5942 | /// \endcode |
5943 | /// For 'A*', getObjectType() will return 'A'. |
5944 | /// For 'A<P>*', getObjectType() will return 'A<P>'. |
5945 | /// For 'AP*', getObjectType() will return 'A<P>'. |
5946 | /// For 'A1*', getObjectType() will return 'A'. |
5947 | /// For 'A1<P>*', getObjectType() will return 'A1<P>'. |
5948 | /// For 'A1P*', getObjectType() will return 'A1<P>'. |
5949 | /// For 'A1PQ*', getObjectType() will return 'A1<Q>', because |
5950 | /// adding protocols to a protocol-qualified base discards the |
5951 | /// old qualifiers (for now). But if it didn't, getObjectType() |
5952 | /// would return 'A1P<Q>' (and we'd have to make iterating over |
5953 | /// qualifiers more complicated). |
5954 | const ObjCObjectType *getObjectType() const { |
5955 | return PointeeType->castAs<ObjCObjectType>(); |
5956 | } |
5957 | |
5958 | /// If this pointer points to an Objective C |
5959 | /// \@interface type, gets the type for that interface. Any protocol |
5960 | /// qualifiers on the interface are ignored. |
5961 | /// |
5962 | /// \return null if the base type for this pointer is 'id' or 'Class' |
5963 | const ObjCInterfaceType *getInterfaceType() const; |
5964 | |
5965 | /// If this pointer points to an Objective \@interface |
5966 | /// type, gets the declaration for that interface. |
5967 | /// |
5968 | /// \return null if the base type for this pointer is 'id' or 'Class' |
5969 | ObjCInterfaceDecl *getInterfaceDecl() const { |
5970 | return getObjectType()->getInterface(); |
5971 | } |
5972 | |
5973 | /// True if this is equivalent to the 'id' type, i.e. if |
5974 | /// its object type is the primitive 'id' type with no protocols. |
5975 | bool isObjCIdType() const { |
5976 | return getObjectType()->isObjCUnqualifiedId(); |
5977 | } |
5978 | |
5979 | /// True if this is equivalent to the 'Class' type, |
5980 | /// i.e. if its object tive is the primitive 'Class' type with no protocols. |
5981 | bool isObjCClassType() const { |
5982 | return getObjectType()->isObjCUnqualifiedClass(); |
5983 | } |
5984 | |
5985 | /// True if this is equivalent to the 'id' or 'Class' type, |
5986 | bool isObjCIdOrClassType() const { |
5987 | return getObjectType()->isObjCUnqualifiedIdOrClass(); |
5988 | } |
5989 | |
5990 | /// True if this is equivalent to 'id<P>' for some non-empty set of |
5991 | /// protocols. |
5992 | bool isObjCQualifiedIdType() const { |
5993 | return getObjectType()->isObjCQualifiedId(); |
5994 | } |
5995 | |
5996 | /// True if this is equivalent to 'Class<P>' for some non-empty set of |
5997 | /// protocols. |
5998 | bool isObjCQualifiedClassType() const { |
5999 | return getObjectType()->isObjCQualifiedClass(); |
6000 | } |
6001 | |
6002 | /// Whether this is a "__kindof" type. |
6003 | bool isKindOfType() const { return getObjectType()->isKindOfType(); } |
6004 | |
6005 | /// Whether this type is specialized, meaning that it has type arguments. |
6006 | bool isSpecialized() const { return getObjectType()->isSpecialized(); } |
6007 | |
6008 | /// Whether this type is specialized, meaning that it has type arguments. |
6009 | bool isSpecializedAsWritten() const { |
6010 | return getObjectType()->isSpecializedAsWritten(); |
6011 | } |
6012 | |
6013 | /// Whether this type is unspecialized, meaning that is has no type arguments. |
6014 | bool isUnspecialized() const { return getObjectType()->isUnspecialized(); } |
6015 | |
6016 | /// Determine whether this object type is "unspecialized" as |
6017 | /// written, meaning that it has no type arguments. |
6018 | bool isUnspecializedAsWritten() const { return !isSpecializedAsWritten(); } |
6019 | |
6020 | /// Retrieve the type arguments for this type. |
6021 | ArrayRef<QualType> getTypeArgs() const { |
6022 | return getObjectType()->getTypeArgs(); |
6023 | } |
6024 | |
6025 | /// Retrieve the type arguments for this type. |
6026 | ArrayRef<QualType> getTypeArgsAsWritten() const { |
6027 | return getObjectType()->getTypeArgsAsWritten(); |
6028 | } |
6029 | |
6030 | /// An iterator over the qualifiers on the object type. Provided |
6031 | /// for convenience. This will always iterate over the full set of |
6032 | /// protocols on a type, not just those provided directly. |
6033 | using qual_iterator = ObjCObjectType::qual_iterator; |
6034 | using qual_range = llvm::iterator_range<qual_iterator>; |
6035 | |
6036 | qual_range quals() const { return qual_range(qual_begin(), qual_end()); } |
6037 | |
6038 | qual_iterator qual_begin() const { |
6039 | return getObjectType()->qual_begin(); |
6040 | } |
6041 | |
6042 | qual_iterator qual_end() const { |
6043 | return getObjectType()->qual_end(); |
6044 | } |
6045 | |
6046 | bool qual_empty() const { return getObjectType()->qual_empty(); } |
6047 | |
6048 | /// Return the number of qualifying protocols on the object type. |
6049 | unsigned getNumProtocols() const { |
6050 | return getObjectType()->getNumProtocols(); |
6051 | } |
6052 | |
6053 | /// Retrieve a qualifying protocol by index on the object type. |
6054 | ObjCProtocolDecl *getProtocol(unsigned I) const { |
6055 | return getObjectType()->getProtocol(I); |
6056 | } |
6057 | |
6058 | bool isSugared() const { return false; } |
6059 | QualType desugar() const { return QualType(this, 0); } |
6060 | |
6061 | /// Retrieve the type of the superclass of this object pointer type. |
6062 | /// |
6063 | /// This operation substitutes any type arguments into the |
6064 | /// superclass of the current class type, potentially producing a |
6065 | /// pointer to a specialization of the superclass type. Produces a |
6066 | /// null type if there is no superclass. |
6067 | QualType getSuperClassType() const; |
6068 | |
6069 | /// Strip off the Objective-C "kindof" type and (with it) any |
6070 | /// protocol qualifiers. |
6071 | const ObjCObjectPointerType *stripObjCKindOfTypeAndQuals( |
6072 | const ASTContext &ctx) const; |
6073 | |
6074 | void Profile(llvm::FoldingSetNodeID &ID) { |
6075 | Profile(ID, getPointeeType()); |
6076 | } |
6077 | |
6078 | static void Profile(llvm::FoldingSetNodeID &ID, QualType T) { |
6079 | ID.AddPointer(T.getAsOpaquePtr()); |
6080 | } |
6081 | |
6082 | static bool classof(const Type *T) { |
6083 | return T->getTypeClass() == ObjCObjectPointer; |
6084 | } |
6085 | }; |
6086 | |
6087 | class AtomicType : public Type, public llvm::FoldingSetNode { |
6088 | friend class ASTContext; // ASTContext creates these. |
6089 | |
6090 | QualType ValueType; |
6091 | |
6092 | AtomicType(QualType ValTy, QualType Canonical) |
6093 | : Type(Atomic, Canonical, ValTy->isDependentType(), |
6094 | ValTy->isInstantiationDependentType(), |
6095 | ValTy->isVariablyModifiedType(), |
6096 | ValTy->containsUnexpandedParameterPack()), |
6097 | ValueType(ValTy) {} |
6098 | |
6099 | public: |
6100 | /// Gets the type contained by this atomic type, i.e. |
6101 | /// the type returned by performing an atomic load of this atomic type. |
6102 | QualType getValueType() const { return ValueType; } |
6103 | |
6104 | bool isSugared() const { return false; } |
6105 | QualType desugar() const { return QualType(this, 0); } |
6106 | |
6107 | void Profile(llvm::FoldingSetNodeID &ID) { |
6108 | Profile(ID, getValueType()); |
6109 | } |
6110 | |
6111 | static void Profile(llvm::FoldingSetNodeID &ID, QualType T) { |
6112 | ID.AddPointer(T.getAsOpaquePtr()); |
6113 | } |
6114 | |
6115 | static bool classof(const Type *T) { |
6116 | return T->getTypeClass() == Atomic; |
6117 | } |
6118 | }; |
6119 | |
6120 | /// PipeType - OpenCL20. |
6121 | class PipeType : public Type, public llvm::FoldingSetNode { |
6122 | friend class ASTContext; // ASTContext creates these. |
6123 | |
6124 | QualType ElementType; |
6125 | bool isRead; |
6126 | |
6127 | PipeType(QualType elemType, QualType CanonicalPtr, bool isRead) |
6128 | : Type(Pipe, CanonicalPtr, elemType->isDependentType(), |
6129 | elemType->isInstantiationDependentType(), |
6130 | elemType->isVariablyModifiedType(), |
6131 | elemType->containsUnexpandedParameterPack()), |
6132 | ElementType(elemType), isRead(isRead) {} |
6133 | |
6134 | public: |
6135 | QualType getElementType() const { return ElementType; } |
6136 | |
6137 | bool isSugared() const { return false; } |
6138 | |
6139 | QualType desugar() const { return QualType(this, 0); } |
6140 | |
6141 | void Profile(llvm::FoldingSetNodeID &ID) { |
6142 | Profile(ID, getElementType(), isReadOnly()); |
6143 | } |
6144 | |
6145 | static void Profile(llvm::FoldingSetNodeID &ID, QualType T, bool isRead) { |
6146 | ID.AddPointer(T.getAsOpaquePtr()); |
6147 | ID.AddBoolean(isRead); |
6148 | } |
6149 | |
6150 | static bool classof(const Type *T) { |
6151 | return T->getTypeClass() == Pipe; |
6152 | } |
6153 | |
6154 | bool isReadOnly() const { return isRead; } |
6155 | }; |
6156 | |
6157 | /// A qualifier set is used to build a set of qualifiers. |
6158 | class QualifierCollector : public Qualifiers { |
6159 | public: |
6160 | QualifierCollector(Qualifiers Qs = Qualifiers()) : Qualifiers(Qs) {} |
6161 | |
6162 | /// Collect any qualifiers on the given type and return an |
6163 | /// unqualified type. The qualifiers are assumed to be consistent |
6164 | /// with those already in the type. |
6165 | const Type *strip(QualType type) { |
6166 | addFastQualifiers(type.getLocalFastQualifiers()); |
6167 | if (!type.hasLocalNonFastQualifiers()) |
6168 | return type.getTypePtrUnsafe(); |
6169 | |
6170 | const ExtQuals *extQuals = type.getExtQualsUnsafe(); |
6171 | addConsistentQualifiers(extQuals->getQualifiers()); |
6172 | return extQuals->getBaseType(); |
6173 | } |
6174 | |
6175 | /// Apply the collected qualifiers to the given type. |
6176 | QualType apply(const ASTContext &Context, QualType QT) const; |
6177 | |
6178 | /// Apply the collected qualifiers to the given type. |
6179 | QualType apply(const ASTContext &Context, const Type* T) const; |
6180 | }; |
6181 | |
6182 | /// A container of type source information. |
6183 | /// |
6184 | /// A client can read the relevant info using TypeLoc wrappers, e.g: |
6185 | /// @code |
6186 | /// TypeLoc TL = TypeSourceInfo->getTypeLoc(); |
6187 | /// TL.getBeginLoc().print(OS, SrcMgr); |
6188 | /// @endcode |
6189 | class alignas(8) TypeSourceInfo { |
6190 | // Contains a memory block after the class, used for type source information, |
6191 | // allocated by ASTContext. |
6192 | friend class ASTContext; |
6193 | |
6194 | QualType Ty; |
6195 | |
6196 | TypeSourceInfo(QualType ty) : Ty(ty) {} |
6197 | |
6198 | public: |
6199 | /// Return the type wrapped by this type source info. |
6200 | QualType getType() const { return Ty; } |
6201 | |
6202 | /// Return the TypeLoc wrapper for the type source info. |
6203 | TypeLoc getTypeLoc() const; // implemented in TypeLoc.h |
6204 | |
6205 | /// Override the type stored in this TypeSourceInfo. Use with caution! |
6206 | void overrideType(QualType T) { Ty = T; } |
6207 | }; |
6208 | |
6209 | // Inline function definitions. |
6210 | |
6211 | inline SplitQualType SplitQualType::getSingleStepDesugaredType() const { |
6212 | SplitQualType desugar = |
6213 | Ty->getLocallyUnqualifiedSingleStepDesugaredType().split(); |
6214 | desugar.Quals.addConsistentQualifiers(Quals); |
6215 | return desugar; |
6216 | } |
6217 | |
6218 | inline const Type *QualType::getTypePtr() const { |
6219 | return getCommonPtr()->BaseType; |
6220 | } |
6221 | |
6222 | inline const Type *QualType::getTypePtrOrNull() const { |
6223 | return (isNull() ? nullptr : getCommonPtr()->BaseType); |
6224 | } |
6225 | |
6226 | inline SplitQualType QualType::split() const { |
6227 | if (!hasLocalNonFastQualifiers()) |
6228 | return SplitQualType(getTypePtrUnsafe(), |
6229 | Qualifiers::fromFastMask(getLocalFastQualifiers())); |
6230 | |
6231 | const ExtQuals *eq = getExtQualsUnsafe(); |
6232 | Qualifiers qs = eq->getQualifiers(); |
6233 | qs.addFastQualifiers(getLocalFastQualifiers()); |
6234 | return SplitQualType(eq->getBaseType(), qs); |
6235 | } |
6236 | |
6237 | inline Qualifiers QualType::getLocalQualifiers() const { |
6238 | Qualifiers Quals; |
6239 | if (hasLocalNonFastQualifiers()) |
6240 | Quals = getExtQualsUnsafe()->getQualifiers(); |
6241 | Quals.addFastQualifiers(getLocalFastQualifiers()); |
6242 | return Quals; |
6243 | } |
6244 | |
6245 | inline Qualifiers QualType::getQualifiers() const { |
6246 | Qualifiers quals = getCommonPtr()->CanonicalType.getLocalQualifiers(); |
6247 | quals.addFastQualifiers(getLocalFastQualifiers()); |
6248 | return quals; |
6249 | } |
6250 | |
6251 | inline unsigned QualType::getCVRQualifiers() const { |
6252 | unsigned cvr = getCommonPtr()->CanonicalType.getLocalCVRQualifiers(); |
6253 | cvr |= getLocalCVRQualifiers(); |
6254 | return cvr; |
6255 | } |
6256 | |
6257 | inline QualType QualType::getCanonicalType() const { |
6258 | QualType canon = getCommonPtr()->CanonicalType; |
6259 | return canon.withFastQualifiers(getLocalFastQualifiers()); |
6260 | } |
6261 | |
6262 | inline bool QualType::isCanonical() const { |
6263 | return getTypePtr()->isCanonicalUnqualified(); |
6264 | } |
6265 | |
6266 | inline bool QualType::isCanonicalAsParam() const { |
6267 | if (!isCanonical()) return false; |
6268 | if (hasLocalQualifiers()) return false; |
6269 | |
6270 | const Type *T = getTypePtr(); |
6271 | if (T->isVariablyModifiedType() && T->hasSizedVLAType()) |
6272 | return false; |
6273 | |
6274 | return !isa<FunctionType>(T) && !isa<ArrayType>(T); |
6275 | } |
6276 | |
6277 | inline bool QualType::isConstQualified() const { |
6278 | return isLocalConstQualified() || |
6279 | getCommonPtr()->CanonicalType.isLocalConstQualified(); |
6280 | } |
6281 | |
6282 | inline bool QualType::isRestrictQualified() const { |
6283 | return isLocalRestrictQualified() || |
6284 | getCommonPtr()->CanonicalType.isLocalRestrictQualified(); |
6285 | } |
6286 | |
6287 | |
6288 | inline bool QualType::isVolatileQualified() const { |
6289 | return isLocalVolatileQualified() || |
6290 | getCommonPtr()->CanonicalType.isLocalVolatileQualified(); |
6291 | } |
6292 | |
6293 | inline bool QualType::hasQualifiers() const { |
6294 | return hasLocalQualifiers() || |
6295 | getCommonPtr()->CanonicalType.hasLocalQualifiers(); |
6296 | } |
6297 | |
6298 | inline QualType QualType::getUnqualifiedType() const { |
6299 | if (!getTypePtr()->getCanonicalTypeInternal().hasLocalQualifiers()) |
6300 | return QualType(getTypePtr(), 0); |
6301 | |
6302 | return QualType(getSplitUnqualifiedTypeImpl(*this).Ty, 0); |
6303 | } |
6304 | |
6305 | inline SplitQualType QualType::getSplitUnqualifiedType() const { |
6306 | if (!getTypePtr()->getCanonicalTypeInternal().hasLocalQualifiers()) |
6307 | return split(); |
6308 | |
6309 | return getSplitUnqualifiedTypeImpl(*this); |
6310 | } |
6311 | |
6312 | inline void QualType::removeLocalConst() { |
6313 | removeLocalFastQualifiers(Qualifiers::Const); |
6314 | } |
6315 | |
6316 | inline void QualType::removeLocalRestrict() { |
6317 | removeLocalFastQualifiers(Qualifiers::Restrict); |
6318 | } |
6319 | |
6320 | inline void QualType::removeLocalVolatile() { |
6321 | removeLocalFastQualifiers(Qualifiers::Volatile); |
6322 | } |
6323 | |
6324 | inline void QualType::removeLocalCVRQualifiers(unsigned Mask) { |
6325 | assert(!(Mask & ~Qualifiers::CVRMask) && "mask has non-CVR bits")((!(Mask & ~Qualifiers::CVRMask) && "mask has non-CVR bits" ) ? static_cast<void> (0) : __assert_fail ("!(Mask & ~Qualifiers::CVRMask) && \"mask has non-CVR bits\"" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 6325, __PRETTY_FUNCTION__)); |
6326 | static_assert((int)Qualifiers::CVRMask == (int)Qualifiers::FastMask, |
6327 | "Fast bits differ from CVR bits!"); |
6328 | |
6329 | // Fast path: we don't need to touch the slow qualifiers. |
6330 | removeLocalFastQualifiers(Mask); |
6331 | } |
6332 | |
6333 | /// Check if this type has any address space qualifier. |
6334 | inline bool QualType::hasAddressSpace() const { |
6335 | return getQualifiers().hasAddressSpace(); |
6336 | } |
6337 | |
6338 | /// Return the address space of this type. |
6339 | inline LangAS QualType::getAddressSpace() const { |
6340 | return getQualifiers().getAddressSpace(); |
6341 | } |
6342 | |
6343 | /// Return the gc attribute of this type. |
6344 | inline Qualifiers::GC QualType::getObjCGCAttr() const { |
6345 | return getQualifiers().getObjCGCAttr(); |
6346 | } |
6347 | |
6348 | inline bool QualType::hasNonTrivialToPrimitiveDefaultInitializeCUnion() const { |
6349 | if (auto *RD = getTypePtr()->getBaseElementTypeUnsafe()->getAsRecordDecl()) |
6350 | return hasNonTrivialToPrimitiveDefaultInitializeCUnion(RD); |
6351 | return false; |
6352 | } |
6353 | |
6354 | inline bool QualType::hasNonTrivialToPrimitiveDestructCUnion() const { |
6355 | if (auto *RD = getTypePtr()->getBaseElementTypeUnsafe()->getAsRecordDecl()) |
6356 | return hasNonTrivialToPrimitiveDestructCUnion(RD); |
6357 | return false; |
6358 | } |
6359 | |
6360 | inline bool QualType::hasNonTrivialToPrimitiveCopyCUnion() const { |
6361 | if (auto *RD = getTypePtr()->getBaseElementTypeUnsafe()->getAsRecordDecl()) |
6362 | return hasNonTrivialToPrimitiveCopyCUnion(RD); |
6363 | return false; |
6364 | } |
6365 | |
6366 | inline FunctionType::ExtInfo getFunctionExtInfo(const Type &t) { |
6367 | if (const auto *PT = t.getAs<PointerType>()) { |
6368 | if (const auto *FT = PT->getPointeeType()->getAs<FunctionType>()) |
6369 | return FT->getExtInfo(); |
6370 | } else if (const auto *FT = t.getAs<FunctionType>()) |
6371 | return FT->getExtInfo(); |
6372 | |
6373 | return FunctionType::ExtInfo(); |
6374 | } |
6375 | |
6376 | inline FunctionType::ExtInfo getFunctionExtInfo(QualType t) { |
6377 | return getFunctionExtInfo(*t); |
6378 | } |
6379 | |
6380 | /// Determine whether this type is more |
6381 | /// qualified than the Other type. For example, "const volatile int" |
6382 | /// is more qualified than "const int", "volatile int", and |
6383 | /// "int". However, it is not more qualified than "const volatile |
6384 | /// int". |
6385 | inline bool QualType::isMoreQualifiedThan(QualType other) const { |
6386 | Qualifiers MyQuals = getQualifiers(); |
6387 | Qualifiers OtherQuals = other.getQualifiers(); |
6388 | return (MyQuals != OtherQuals && MyQuals.compatiblyIncludes(OtherQuals)); |
6389 | } |
6390 | |
6391 | /// Determine whether this type is at last |
6392 | /// as qualified as the Other type. For example, "const volatile |
6393 | /// int" is at least as qualified as "const int", "volatile int", |
6394 | /// "int", and "const volatile int". |
6395 | inline bool QualType::isAtLeastAsQualifiedAs(QualType other) const { |
6396 | Qualifiers OtherQuals = other.getQualifiers(); |
6397 | |
6398 | // Ignore __unaligned qualifier if this type is a void. |
6399 | if (getUnqualifiedType()->isVoidType()) |
6400 | OtherQuals.removeUnaligned(); |
6401 | |
6402 | return getQualifiers().compatiblyIncludes(OtherQuals); |
6403 | } |
6404 | |
6405 | /// If Type is a reference type (e.g., const |
6406 | /// int&), returns the type that the reference refers to ("const |
6407 | /// int"). Otherwise, returns the type itself. This routine is used |
6408 | /// throughout Sema to implement C++ 5p6: |
6409 | /// |
6410 | /// If an expression initially has the type "reference to T" (8.3.2, |
6411 | /// 8.5.3), the type is adjusted to "T" prior to any further |
6412 | /// analysis, the expression designates the object or function |
6413 | /// denoted by the reference, and the expression is an lvalue. |
6414 | inline QualType QualType::getNonReferenceType() const { |
6415 | if (const auto *RefType = (*this)->getAs<ReferenceType>()) |
6416 | return RefType->getPointeeType(); |
6417 | else |
6418 | return *this; |
6419 | } |
6420 | |
6421 | inline bool QualType::isCForbiddenLValueType() const { |
6422 | return ((getTypePtr()->isVoidType() && !hasQualifiers()) || |
6423 | getTypePtr()->isFunctionType()); |
6424 | } |
6425 | |
6426 | /// Tests whether the type is categorized as a fundamental type. |
6427 | /// |
6428 | /// \returns True for types specified in C++0x [basic.fundamental]. |
6429 | inline bool Type::isFundamentalType() const { |
6430 | return isVoidType() || |
6431 | isNullPtrType() || |
6432 | // FIXME: It's really annoying that we don't have an |
6433 | // 'isArithmeticType()' which agrees with the standard definition. |
6434 | (isArithmeticType() && !isEnumeralType()); |
6435 | } |
6436 | |
6437 | /// Tests whether the type is categorized as a compound type. |
6438 | /// |
6439 | /// \returns True for types specified in C++0x [basic.compound]. |
6440 | inline bool Type::isCompoundType() const { |
6441 | // C++0x [basic.compound]p1: |
6442 | // Compound types can be constructed in the following ways: |
6443 | // -- arrays of objects of a given type [...]; |
6444 | return isArrayType() || |
6445 | // -- functions, which have parameters of given types [...]; |
6446 | isFunctionType() || |
6447 | // -- pointers to void or objects or functions [...]; |
6448 | isPointerType() || |
6449 | // -- references to objects or functions of a given type. [...] |
6450 | isReferenceType() || |
6451 | // -- classes containing a sequence of objects of various types, [...]; |
6452 | isRecordType() || |
6453 | // -- unions, which are classes capable of containing objects of different |
6454 | // types at different times; |
6455 | isUnionType() || |
6456 | // -- enumerations, which comprise a set of named constant values. [...]; |
6457 | isEnumeralType() || |
6458 | // -- pointers to non-static class members, [...]. |
6459 | isMemberPointerType(); |
6460 | } |
6461 | |
6462 | inline bool Type::isFunctionType() const { |
6463 | return isa<FunctionType>(CanonicalType); |
6464 | } |
6465 | |
6466 | inline bool Type::isPointerType() const { |
6467 | return isa<PointerType>(CanonicalType); |
6468 | } |
6469 | |
6470 | inline bool Type::isAnyPointerType() const { |
6471 | return isPointerType() || isObjCObjectPointerType(); |
6472 | } |
6473 | |
6474 | inline bool Type::isBlockPointerType() const { |
6475 | return isa<BlockPointerType>(CanonicalType); |
6476 | } |
6477 | |
6478 | inline bool Type::isReferenceType() const { |
6479 | return isa<ReferenceType>(CanonicalType); |
6480 | } |
6481 | |
6482 | inline bool Type::isLValueReferenceType() const { |
6483 | return isa<LValueReferenceType>(CanonicalType); |
6484 | } |
6485 | |
6486 | inline bool Type::isRValueReferenceType() const { |
6487 | return isa<RValueReferenceType>(CanonicalType); |
6488 | } |
6489 | |
6490 | inline bool Type::isObjectPointerType() const { |
6491 | // Note: an "object pointer type" is not the same thing as a pointer to an |
6492 | // object type; rather, it is a pointer to an object type or a pointer to cv |
6493 | // void. |
6494 | if (const auto *T = getAs<PointerType>()) |
6495 | return !T->getPointeeType()->isFunctionType(); |
6496 | else |
6497 | return false; |
6498 | } |
6499 | |
6500 | inline bool Type::isFunctionPointerType() const { |
6501 | if (const auto *T = getAs<PointerType>()) |
6502 | return T->getPointeeType()->isFunctionType(); |
6503 | else |
6504 | return false; |
6505 | } |
6506 | |
6507 | inline bool Type::isFunctionReferenceType() const { |
6508 | if (const auto *T = getAs<ReferenceType>()) |
6509 | return T->getPointeeType()->isFunctionType(); |
6510 | else |
6511 | return false; |
6512 | } |
6513 | |
6514 | inline bool Type::isMemberPointerType() const { |
6515 | return isa<MemberPointerType>(CanonicalType); |
6516 | } |
6517 | |
6518 | inline bool Type::isMemberFunctionPointerType() const { |
6519 | if (const auto *T = getAs<MemberPointerType>()) |
6520 | return T->isMemberFunctionPointer(); |
6521 | else |
6522 | return false; |
6523 | } |
6524 | |
6525 | inline bool Type::isMemberDataPointerType() const { |
6526 | if (const auto *T = getAs<MemberPointerType>()) |
6527 | return T->isMemberDataPointer(); |
6528 | else |
6529 | return false; |
6530 | } |
6531 | |
6532 | inline bool Type::isArrayType() const { |
6533 | return isa<ArrayType>(CanonicalType); |
6534 | } |
6535 | |
6536 | inline bool Type::isConstantArrayType() const { |
6537 | return isa<ConstantArrayType>(CanonicalType); |
6538 | } |
6539 | |
6540 | inline bool Type::isIncompleteArrayType() const { |
6541 | return isa<IncompleteArrayType>(CanonicalType); |
6542 | } |
6543 | |
6544 | inline bool Type::isVariableArrayType() const { |
6545 | return isa<VariableArrayType>(CanonicalType); |
6546 | } |
6547 | |
6548 | inline bool Type::isDependentSizedArrayType() const { |
6549 | return isa<DependentSizedArrayType>(CanonicalType); |
6550 | } |
6551 | |
6552 | inline bool Type::isBuiltinType() const { |
6553 | return isa<BuiltinType>(CanonicalType); |
6554 | } |
6555 | |
6556 | inline bool Type::isRecordType() const { |
6557 | return isa<RecordType>(CanonicalType); |
6558 | } |
6559 | |
6560 | inline bool Type::isEnumeralType() const { |
6561 | return isa<EnumType>(CanonicalType); |
6562 | } |
6563 | |
6564 | inline bool Type::isAnyComplexType() const { |
6565 | return isa<ComplexType>(CanonicalType); |
6566 | } |
6567 | |
6568 | inline bool Type::isVectorType() const { |
6569 | return isa<VectorType>(CanonicalType); |
6570 | } |
6571 | |
6572 | inline bool Type::isExtVectorType() const { |
6573 | return isa<ExtVectorType>(CanonicalType); |
6574 | } |
6575 | |
6576 | inline bool Type::isDependentAddressSpaceType() const { |
6577 | return isa<DependentAddressSpaceType>(CanonicalType); |
6578 | } |
6579 | |
6580 | inline bool Type::isObjCObjectPointerType() const { |
6581 | return isa<ObjCObjectPointerType>(CanonicalType); |
6582 | } |
6583 | |
6584 | inline bool Type::isObjCObjectType() const { |
6585 | return isa<ObjCObjectType>(CanonicalType); |
6586 | } |
6587 | |
6588 | inline bool Type::isObjCObjectOrInterfaceType() const { |
6589 | return isa<ObjCInterfaceType>(CanonicalType) || |
6590 | isa<ObjCObjectType>(CanonicalType); |
6591 | } |
6592 | |
6593 | inline bool Type::isAtomicType() const { |
6594 | return isa<AtomicType>(CanonicalType); |
6595 | } |
6596 | |
6597 | inline bool Type::isUndeducedAutoType() const { |
6598 | return isa<AutoType>(CanonicalType); |
6599 | } |
6600 | |
6601 | inline bool Type::isObjCQualifiedIdType() const { |
6602 | if (const auto *OPT = getAs<ObjCObjectPointerType>()) |
6603 | return OPT->isObjCQualifiedIdType(); |
6604 | return false; |
6605 | } |
6606 | |
6607 | inline bool Type::isObjCQualifiedClassType() const { |
6608 | if (const auto *OPT = getAs<ObjCObjectPointerType>()) |
6609 | return OPT->isObjCQualifiedClassType(); |
6610 | return false; |
6611 | } |
6612 | |
6613 | inline bool Type::isObjCIdType() const { |
6614 | if (const auto *OPT = getAs<ObjCObjectPointerType>()) |
6615 | return OPT->isObjCIdType(); |
6616 | return false; |
6617 | } |
6618 | |
6619 | inline bool Type::isObjCClassType() const { |
6620 | if (const auto *OPT = getAs<ObjCObjectPointerType>()) |
6621 | return OPT->isObjCClassType(); |
6622 | return false; |
6623 | } |
6624 | |
6625 | inline bool Type::isObjCSelType() const { |
6626 | if (const auto *OPT = getAs<PointerType>()) |
6627 | return OPT->getPointeeType()->isSpecificBuiltinType(BuiltinType::ObjCSel); |
6628 | return false; |
6629 | } |
6630 | |
6631 | inline bool Type::isObjCBuiltinType() const { |
6632 | return isObjCIdType() || isObjCClassType() || isObjCSelType(); |
6633 | } |
6634 | |
6635 | inline bool Type::isDecltypeType() const { |
6636 | return isa<DecltypeType>(this); |
6637 | } |
6638 | |
6639 | #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \ |
6640 | inline bool Type::is##Id##Type() const { \ |
6641 | return isSpecificBuiltinType(BuiltinType::Id); \ |
6642 | } |
6643 | #include "clang/Basic/OpenCLImageTypes.def" |
6644 | |
6645 | inline bool Type::isSamplerT() const { |
6646 | return isSpecificBuiltinType(BuiltinType::OCLSampler); |
6647 | } |
6648 | |
6649 | inline bool Type::isEventT() const { |
6650 | return isSpecificBuiltinType(BuiltinType::OCLEvent); |
6651 | } |
6652 | |
6653 | inline bool Type::isClkEventT() const { |
6654 | return isSpecificBuiltinType(BuiltinType::OCLClkEvent); |
6655 | } |
6656 | |
6657 | inline bool Type::isQueueT() const { |
6658 | return isSpecificBuiltinType(BuiltinType::OCLQueue); |
6659 | } |
6660 | |
6661 | inline bool Type::isReserveIDT() const { |
6662 | return isSpecificBuiltinType(BuiltinType::OCLReserveID); |
6663 | } |
6664 | |
6665 | inline bool Type::isImageType() const { |
6666 | #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) is##Id##Type() || |
6667 | return |
6668 | #include "clang/Basic/OpenCLImageTypes.def" |
6669 | false; // end boolean or operation |
6670 | } |
6671 | |
6672 | inline bool Type::isPipeType() const { |
6673 | return isa<PipeType>(CanonicalType); |
6674 | } |
6675 | |
6676 | #define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \ |
6677 | inline bool Type::is##Id##Type() const { \ |
6678 | return isSpecificBuiltinType(BuiltinType::Id); \ |
6679 | } |
6680 | #include "clang/Basic/OpenCLExtensionTypes.def" |
6681 | |
6682 | inline bool Type::isOCLIntelSubgroupAVCType() const { |
6683 | #define INTEL_SUBGROUP_AVC_TYPE(ExtType, Id) \ |
6684 | isOCLIntelSubgroupAVC##Id##Type() || |
6685 | return |
6686 | #include "clang/Basic/OpenCLExtensionTypes.def" |
6687 | false; // end of boolean or operation |
6688 | } |
6689 | |
6690 | inline bool Type::isOCLExtOpaqueType() const { |
6691 | #define EXT_OPAQUE_TYPE(ExtType, Id, Ext) is##Id##Type() || |
6692 | return |
6693 | #include "clang/Basic/OpenCLExtensionTypes.def" |
6694 | false; // end of boolean or operation |
6695 | } |
6696 | |
6697 | inline bool Type::isOpenCLSpecificType() const { |
6698 | return isSamplerT() || isEventT() || isImageType() || isClkEventT() || |
6699 | isQueueT() || isReserveIDT() || isPipeType() || isOCLExtOpaqueType(); |
6700 | } |
6701 | |
6702 | inline bool Type::isTemplateTypeParmType() const { |
6703 | return isa<TemplateTypeParmType>(CanonicalType); |
6704 | } |
6705 | |
6706 | inline bool Type::isSpecificBuiltinType(unsigned K) const { |
6707 | if (const BuiltinType *BT = getAs<BuiltinType>()) |
6708 | if (BT->getKind() == (BuiltinType::Kind) K) |
6709 | return true; |
6710 | return false; |
6711 | } |
6712 | |
6713 | inline bool Type::isPlaceholderType() const { |
6714 | if (const auto *BT = dyn_cast<BuiltinType>(this)) |
6715 | return BT->isPlaceholderType(); |
6716 | return false; |
6717 | } |
6718 | |
6719 | inline const BuiltinType *Type::getAsPlaceholderType() const { |
6720 | if (const auto *BT = dyn_cast<BuiltinType>(this)) |
6721 | if (BT->isPlaceholderType()) |
6722 | return BT; |
6723 | return nullptr; |
6724 | } |
6725 | |
6726 | inline bool Type::isSpecificPlaceholderType(unsigned K) const { |
6727 | assert(BuiltinType::isPlaceholderTypeKind((BuiltinType::Kind) K))((BuiltinType::isPlaceholderTypeKind((BuiltinType::Kind) K)) ? static_cast<void> (0) : __assert_fail ("BuiltinType::isPlaceholderTypeKind((BuiltinType::Kind) K)" , "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 6727, __PRETTY_FUNCTION__)); |
6728 | if (const auto *BT = dyn_cast<BuiltinType>(this)) |
6729 | return (BT->getKind() == (BuiltinType::Kind) K); |
6730 | return false; |
6731 | } |
6732 | |
6733 | inline bool Type::isNonOverloadPlaceholderType() const { |
6734 | if (const auto *BT = dyn_cast<BuiltinType>(this)) |
6735 | return BT->isNonOverloadPlaceholderType(); |
6736 | return false; |
6737 | } |
6738 | |
6739 | inline bool Type::isVoidType() const { |
6740 | if (const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) |
6741 | return BT->getKind() == BuiltinType::Void; |
6742 | return false; |
6743 | } |
6744 | |
6745 | inline bool Type::isHalfType() const { |
6746 | if (const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) |
6747 | return BT->getKind() == BuiltinType::Half; |
6748 | // FIXME: Should we allow complex __fp16? Probably not. |
6749 | return false; |
6750 | } |
6751 | |
6752 | inline bool Type::isFloat16Type() const { |
6753 | if (const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) |
6754 | return BT->getKind() == BuiltinType::Float16; |
6755 | return false; |
6756 | } |
6757 | |
6758 | inline bool Type::isFloat128Type() const { |
6759 | if (const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) |
6760 | return BT->getKind() == BuiltinType::Float128; |
6761 | return false; |
6762 | } |
6763 | |
6764 | inline bool Type::isNullPtrType() const { |
6765 | if (const auto *BT = getAs<BuiltinType>()) |
6766 | return BT->getKind() == BuiltinType::NullPtr; |
6767 | return false; |
6768 | } |
6769 | |
6770 | bool IsEnumDeclComplete(EnumDecl *); |
6771 | bool IsEnumDeclScoped(EnumDecl *); |
6772 | |
6773 | inline bool Type::isIntegerType() const { |
6774 | if (const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) |
6775 | return BT->getKind() >= BuiltinType::Bool && |
6776 | BT->getKind() <= BuiltinType::Int128; |
6777 | if (const EnumType *ET = dyn_cast<EnumType>(CanonicalType)) { |
6778 | // Incomplete enum types are not treated as integer types. |
6779 | // FIXME: In C++, enum types are never integer types. |
6780 | return IsEnumDeclComplete(ET->getDecl()) && |
6781 | !IsEnumDeclScoped(ET->getDecl()); |
6782 | } |
6783 | return false; |
6784 | } |
6785 | |
6786 | inline bool Type::isFixedPointType() const { |
6787 | if (const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) { |
6788 | return BT->getKind() >= BuiltinType::ShortAccum && |
6789 | BT->getKind() <= BuiltinType::SatULongFract; |
6790 | } |
6791 | return false; |
6792 | } |
6793 | |
6794 | inline bool Type::isFixedPointOrIntegerType() const { |
6795 | return isFixedPointType() || isIntegerType(); |
6796 | } |
6797 | |
6798 | inline bool Type::isSaturatedFixedPointType() const { |
6799 | if (const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) { |
6800 | return BT->getKind() >= BuiltinType::SatShortAccum && |
6801 | BT->getKind() <= BuiltinType::SatULongFract; |
6802 | } |
6803 | return false; |
6804 | } |
6805 | |
6806 | inline bool Type::isUnsaturatedFixedPointType() const { |
6807 | return isFixedPointType() && !isSaturatedFixedPointType(); |
6808 | } |
6809 | |
6810 | inline bool Type::isSignedFixedPointType() const { |
6811 | if (const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) { |
6812 | return ((BT->getKind() >= BuiltinType::ShortAccum && |
6813 | BT->getKind() <= BuiltinType::LongAccum) || |
6814 | (BT->getKind() >= BuiltinType::ShortFract && |
6815 | BT->getKind() <= BuiltinType::LongFract) || |
6816 | (BT->getKind() >= BuiltinType::SatShortAccum && |
6817 | BT->getKind() <= BuiltinType::SatLongAccum) || |
6818 | (BT->getKind() >= BuiltinType::SatShortFract && |
6819 | BT->getKind() <= BuiltinType::SatLongFract)); |
6820 | } |
6821 | return false; |
6822 | } |
6823 | |
6824 | inline bool Type::isUnsignedFixedPointType() const { |
6825 | return isFixedPointType() && !isSignedFixedPointType(); |
6826 | } |
6827 | |
6828 | inline bool Type::isScalarType() const { |
6829 | if (const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) |
6830 | return BT->getKind() > BuiltinType::Void && |
6831 | BT->getKind() <= BuiltinType::NullPtr; |
6832 | if (const EnumType *ET = dyn_cast<EnumType>(CanonicalType)) |
6833 | // Enums are scalar types, but only if they are defined. Incomplete enums |
6834 | // are not treated as scalar types. |
6835 | return IsEnumDeclComplete(ET->getDecl()); |
6836 | return isa<PointerType>(CanonicalType) || |
6837 | isa<BlockPointerType>(CanonicalType) || |
6838 | isa<MemberPointerType>(CanonicalType) || |
6839 | isa<ComplexType>(CanonicalType) || |
6840 | isa<ObjCObjectPointerType>(CanonicalType); |
6841 | } |
6842 | |
6843 | inline bool Type::isIntegralOrEnumerationType() const { |
6844 | if (const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) |
6845 | return BT->getKind() >= BuiltinType::Bool && |
6846 | BT->getKind() <= BuiltinType::Int128; |
6847 | |
6848 | // Check for a complete enum type; incomplete enum types are not properly an |
6849 | // enumeration type in the sense required here. |
6850 | if (const auto *ET = dyn_cast<EnumType>(CanonicalType)) |
6851 | return IsEnumDeclComplete(ET->getDecl()); |
6852 | |
6853 | return false; |
6854 | } |
6855 | |
6856 | inline bool Type::isBooleanType() const { |
6857 | if (const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) |
6858 | return BT->getKind() == BuiltinType::Bool; |
6859 | return false; |
6860 | } |
6861 | |
6862 | inline bool Type::isUndeducedType() const { |
6863 | auto *DT = getContainedDeducedType(); |
6864 | return DT && !DT->isDeduced(); |
6865 | } |
6866 | |
6867 | /// Determines whether this is a type for which one can define |
6868 | /// an overloaded operator. |
6869 | inline bool Type::isOverloadableType() const { |
6870 | return isDependentType() || isRecordType() || isEnumeralType(); |
6871 | } |
6872 | |
6873 | /// Determines whether this type can decay to a pointer type. |
6874 | inline bool Type::canDecayToPointerType() const { |
6875 | return isFunctionType() || isArrayType(); |
6876 | } |
6877 | |
6878 | inline bool Type::hasPointerRepresentation() const { |
6879 | return (isPointerType() || isReferenceType() || isBlockPointerType() || |
6880 | isObjCObjectPointerType() || isNullPtrType()); |
6881 | } |
6882 | |
6883 | inline bool Type::hasObjCPointerRepresentation() const { |
6884 | return isObjCObjectPointerType(); |
6885 | } |
6886 | |
6887 | inline const Type *Type::getBaseElementTypeUnsafe() const { |
6888 | const Type *type = this; |
6889 | while (const ArrayType *arrayType = type->getAsArrayTypeUnsafe()) |
6890 | type = arrayType->getElementType().getTypePtr(); |
6891 | return type; |
6892 | } |
6893 | |
6894 | inline const Type *Type::getPointeeOrArrayElementType() const { |
6895 | const Type *type = this; |
6896 | if (type->isAnyPointerType()) |
6897 | return type->getPointeeType().getTypePtr(); |
6898 | else if (type->isArrayType()) |
6899 | return type->getBaseElementTypeUnsafe(); |
6900 | return type; |
6901 | } |
6902 | /// Insertion operator for diagnostics. This allows sending address spaces into |
6903 | /// a diagnostic with <<. |
6904 | inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, |
6905 | LangAS AS) { |
6906 | DB.AddTaggedVal(static_cast<std::underlying_type_t<LangAS>>(AS), |
6907 | DiagnosticsEngine::ArgumentKind::ak_addrspace); |
6908 | return DB; |
6909 | } |
6910 | |
6911 | /// Insertion operator for partial diagnostics. This allows sending adress |
6912 | /// spaces into a diagnostic with <<. |
6913 | inline const PartialDiagnostic &operator<<(const PartialDiagnostic &PD, |
6914 | LangAS AS) { |
6915 | PD.AddTaggedVal(static_cast<std::underlying_type_t<LangAS>>(AS), |
6916 | DiagnosticsEngine::ArgumentKind::ak_addrspace); |
6917 | return PD; |
6918 | } |
6919 | |
6920 | /// Insertion operator for diagnostics. This allows sending Qualifiers into a |
6921 | /// diagnostic with <<. |
6922 | inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, |
6923 | Qualifiers Q) { |
6924 | DB.AddTaggedVal(Q.getAsOpaqueValue(), |
6925 | DiagnosticsEngine::ArgumentKind::ak_qual); |
6926 | return DB; |
6927 | } |
6928 | |
6929 | /// Insertion operator for partial diagnostics. This allows sending Qualifiers |
6930 | /// into a diagnostic with <<. |
6931 | inline const PartialDiagnostic &operator<<(const PartialDiagnostic &PD, |
6932 | Qualifiers Q) { |
6933 | PD.AddTaggedVal(Q.getAsOpaqueValue(), |
6934 | DiagnosticsEngine::ArgumentKind::ak_qual); |
6935 | return PD; |
6936 | } |
6937 | |
6938 | /// Insertion operator for diagnostics. This allows sending QualType's into a |
6939 | /// diagnostic with <<. |
6940 | inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, |
6941 | QualType T) { |
6942 | DB.AddTaggedVal(reinterpret_cast<intptr_t>(T.getAsOpaquePtr()), |
6943 | DiagnosticsEngine::ak_qualtype); |
6944 | return DB; |
6945 | } |
6946 | |
6947 | /// Insertion operator for partial diagnostics. This allows sending QualType's |
6948 | /// into a diagnostic with <<. |
6949 | inline const PartialDiagnostic &operator<<(const PartialDiagnostic &PD, |
6950 | QualType T) { |
6951 | PD.AddTaggedVal(reinterpret_cast<intptr_t>(T.getAsOpaquePtr()), |
6952 | DiagnosticsEngine::ak_qualtype); |
6953 | return PD; |
6954 | } |
6955 | |
6956 | // Helper class template that is used by Type::getAs to ensure that one does |
6957 | // not try to look through a qualified type to get to an array type. |
6958 | template <typename T> |
6959 | using TypeIsArrayType = |
6960 | std::integral_constant<bool, std::is_same<T, ArrayType>::value || |
6961 | std::is_base_of<ArrayType, T>::value>; |
6962 | |
6963 | // Member-template getAs<specific type>'. |
6964 | template <typename T> const T *Type::getAs() const { |
6965 | static_assert(!TypeIsArrayType<T>::value, |
6966 | "ArrayType cannot be used with getAs!"); |
6967 | |
6968 | // If this is directly a T type, return it. |
6969 | if (const auto *Ty = dyn_cast<T>(this)) |
6970 | return Ty; |
6971 | |
6972 | // If the canonical form of this type isn't the right kind, reject it. |
6973 | if (!isa<T>(CanonicalType)) |
6974 | return nullptr; |
6975 | |
6976 | // If this is a typedef for the type, strip the typedef off without |
6977 | // losing all typedef information. |
6978 | return cast<T>(getUnqualifiedDesugaredType()); |
6979 | } |
6980 | |
6981 | template <typename T> const T *Type::getAsAdjusted() const { |
6982 | static_assert(!TypeIsArrayType<T>::value, "ArrayType cannot be used with getAsAdjusted!"); |
6983 | |
6984 | // If this is directly a T type, return it. |
6985 | if (const auto *Ty = dyn_cast<T>(this)) |
6986 | return Ty; |
6987 | |
6988 | // If the canonical form of this type isn't the right kind, reject it. |
6989 | if (!isa<T>(CanonicalType)) |
6990 | return nullptr; |
6991 | |
6992 | // Strip off type adjustments that do not modify the underlying nature of the |
6993 | // type. |
6994 | const Type *Ty = this; |
6995 | while (Ty) { |
6996 | if (const auto *A = dyn_cast<AttributedType>(Ty)) |
6997 | Ty = A->getModifiedType().getTypePtr(); |
6998 | else if (const auto *E = dyn_cast<ElaboratedType>(Ty)) |
6999 | Ty = E->desugar().getTypePtr(); |
7000 | else if (const auto *P = dyn_cast<ParenType>(Ty)) |
7001 | Ty = P->desugar().getTypePtr(); |
7002 | else if (const auto *A = dyn_cast<AdjustedType>(Ty)) |
7003 | Ty = A->desugar().getTypePtr(); |
7004 | else if (const auto *M = dyn_cast<MacroQualifiedType>(Ty)) |
7005 | Ty = M->desugar().getTypePtr(); |
7006 | else |
7007 | break; |
7008 | } |
7009 | |
7010 | // Just because the canonical type is correct does not mean we can use cast<>, |
7011 | // since we may not have stripped off all the sugar down to the base type. |
7012 | return dyn_cast<T>(Ty); |
7013 | } |
7014 | |
7015 | inline const ArrayType *Type::getAsArrayTypeUnsafe() const { |
7016 | // If this is directly an array type, return it. |
7017 | if (const auto *arr = dyn_cast<ArrayType>(this)) |
7018 | return arr; |
7019 | |
7020 | // If the canonical form of this type isn't the right kind, reject it. |
7021 | if (!isa<ArrayType>(CanonicalType)) |
7022 | return nullptr; |
7023 | |
7024 | // If this is a typedef for the type, strip the typedef off without |
7025 | // losing all typedef information. |
7026 | return cast<ArrayType>(getUnqualifiedDesugaredType()); |
7027 | } |
7028 | |
7029 | template <typename T> const T *Type::castAs() const { |
7030 | static_assert(!TypeIsArrayType<T>::value, |
7031 | "ArrayType cannot be used with castAs!"); |
7032 | |
7033 | if (const auto *ty = dyn_cast<T>(this)) return ty; |
7034 | assert(isa<T>(CanonicalType))((isa<T>(CanonicalType)) ? static_cast<void> (0) : __assert_fail ("isa<T>(CanonicalType)", "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 7034, __PRETTY_FUNCTION__)); |
7035 | return cast<T>(getUnqualifiedDesugaredType()); |
7036 | } |
7037 | |
7038 | inline const ArrayType *Type::castAsArrayTypeUnsafe() const { |
7039 | assert(isa<ArrayType>(CanonicalType))((isa<ArrayType>(CanonicalType)) ? static_cast<void> (0) : __assert_fail ("isa<ArrayType>(CanonicalType)", "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 7039, __PRETTY_FUNCTION__)); |
7040 | if (const auto *arr = dyn_cast<ArrayType>(this)) return arr; |
7041 | return cast<ArrayType>(getUnqualifiedDesugaredType()); |
7042 | } |
7043 | |
7044 | DecayedType::DecayedType(QualType OriginalType, QualType DecayedPtr, |
7045 | QualType CanonicalPtr) |
7046 | : AdjustedType(Decayed, OriginalType, DecayedPtr, CanonicalPtr) { |
7047 | #ifndef NDEBUG |
7048 | QualType Adjusted = getAdjustedType(); |
7049 | (void)AttributedType::stripOuterNullability(Adjusted); |
7050 | assert(isa<PointerType>(Adjusted))((isa<PointerType>(Adjusted)) ? static_cast<void> (0) : __assert_fail ("isa<PointerType>(Adjusted)", "/build/llvm-toolchain-snapshot-10~++20200110111110+a1cc19b5814/clang/include/clang/AST/Type.h" , 7050, __PRETTY_FUNCTION__)); |
7051 | #endif |
7052 | } |
7053 | |
7054 | QualType DecayedType::getPointeeType() const { |
7055 | QualType Decayed = getDecayedType(); |
7056 | (void)AttributedType::stripOuterNullability(Decayed); |
7057 | return cast<PointerType>(Decayed)->getPointeeType(); |
7058 | } |
7059 | |
7060 | // Get the decimal string representation of a fixed point type, represented |
7061 | // as a scaled integer. |
7062 | // TODO: At some point, we should change the arguments to instead just accept an |
7063 | // APFixedPoint instead of APSInt and scale. |
7064 | void FixedPointValueToString(SmallVectorImpl<char> &Str, llvm::APSInt Val, |
7065 | unsigned Scale); |
7066 | |
7067 | } // namespace clang |
7068 | |
7069 | #endif // LLVM_CLANG_AST_TYPE_H |