blob: 05bf70e5cb22282c73de5ef0e3506c5ada4ec39e [file] [log] [blame]
Chris Lattnerbed31442007-05-28 01:07:47 +00001//===--- CodeGenFunction.cpp - Emit LLVM Code from ASTs for a Function ----===//
2//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// 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
Chris Lattnerbed31442007-05-28 01:07:47 +00006//
7//===----------------------------------------------------------------------===//
8//
9// This coordinates the per-function state used while generating code.
10//
11//===----------------------------------------------------------------------===//
12
13#include "CodeGenFunction.h"
John McCall7f416cc2015-09-08 08:05:57 +000014#include "CGBlocks.h"
Peter Collingbournefa4d6032011-10-06 18:51:56 +000015#include "CGCUDARuntime.h"
John McCall5d865c322010-08-31 07:33:07 +000016#include "CGCXXABI.h"
Reid Kleckner98031782019-12-09 16:11:56 -080017#include "CGCleanup.h"
Eli Friedman17630752008-05-22 01:40:10 +000018#include "CGDebugInfo.h"
Alexey Bataev9959db52014-05-06 10:08:46 +000019#include "CGOpenMPRuntime.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000020#include "CodeGenModule.h"
Justin Bogneref512b92014-01-06 22:27:43 +000021#include "CodeGenPGO.h"
Peter Collingbourneb453cd62013-10-20 21:29:19 +000022#include "TargetInfo.h"
Daniel Dunbarad319a72008-08-11 05:00:27 +000023#include "clang/AST/ASTContext.h"
Richard Smith376c28e2017-08-24 20:10:33 +000024#include "clang/AST/ASTLambda.h"
Reid Kleckner98031782019-12-09 16:11:56 -080025#include "clang/AST/Attr.h"
Daniel Dunbar6e8aa532008-08-11 05:35:13 +000026#include "clang/AST/Decl.h"
Anders Carlsson468fa632009-04-04 20:47:02 +000027#include "clang/AST/DeclCXX.h"
Mike Stumpbee78dd2009-12-04 23:26:17 +000028#include "clang/AST/StmtCXX.h"
Richard Smithd8e3ac32016-09-16 23:30:39 +000029#include "clang/AST/StmtObjC.h"
Sanjay Patela24296b2015-09-02 20:01:30 +000030#include "clang/Basic/Builtins.h"
Richard Trieu63688182018-12-11 03:18:39 +000031#include "clang/Basic/CodeGenOptions.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000032#include "clang/Basic/TargetInfo.h"
Mark Laceya8e7df32013-10-30 21:53:58 +000033#include "clang/CodeGen/CGFunctionInfo.h"
Richard Trieu5337c742018-12-06 06:12:20 +000034#include "clang/Frontend/FrontendDiagnostic.h"
Johannes Doerfert70cac412020-02-12 20:52:23 -060035#include "llvm/Frontend/OpenMP/OMPIRBuilder.h"
Chandler Carruthffd55512013-01-02 11:45:17 +000036#include "llvm/IR/DataLayout.h"
Gor Nishanov04491bd2017-11-11 17:00:43 +000037#include "llvm/IR/Dominators.h"
Melanie Blower7f9b5132019-12-04 12:23:46 -080038#include "llvm/IR/FPEnv.h"
39#include "llvm/IR/IntrinsicInst.h"
Chandler Carruthffd55512013-01-02 11:45:17 +000040#include "llvm/IR/Intrinsics.h"
41#include "llvm/IR/MDBuilder.h"
42#include "llvm/IR/Operator.h"
Gor Nishanov04491bd2017-11-11 17:00:43 +000043#include "llvm/Transforms/Utils/PromoteMemToReg.h"
Chris Lattnerbed31442007-05-28 01:07:47 +000044using namespace clang;
45using namespace CodeGen;
46
Vitaly Buka1c943322016-10-26 01:59:57 +000047/// shouldEmitLifetimeMarkers - Decide whether we need emit the life-time
48/// markers.
49static bool shouldEmitLifetimeMarkers(const CodeGenOptions &CGOpts,
50 const LangOptions &LangOpts) {
Mehdi Amini7f873072017-01-06 23:18:09 +000051 if (CGOpts.DisableLifetimeMarkers)
52 return false;
53
Vitaly Bukaaeca5692019-08-26 22:15:50 +000054 // Sanitizers may use markers.
55 if (CGOpts.SanitizeAddressUseAfterScope ||
Vitaly Buka669d1112019-08-26 22:16:05 +000056 LangOpts.Sanitize.has(SanitizerKind::HWAddress) ||
Vitaly Bukaaeca5692019-08-26 22:15:50 +000057 LangOpts.Sanitize.has(SanitizerKind::Memory))
Benjamin Kramer2a7d39d2017-03-31 09:19:25 +000058 return true;
59
Vitaly Buka1c943322016-10-26 01:59:57 +000060 // For now, only in optimized builds.
61 return CGOpts.OptimizationLevel != 0;
62}
63
Fariborz Jahanian63628032012-06-26 16:06:38 +000064CodeGenFunction::CodeGenFunction(CodeGenModule &cgm, bool suppressNewContext)
David Blaikie92848de2013-08-26 20:33:21 +000065 : CodeGenTypeCache(cgm), CGM(cgm), Target(cgm.getTarget()),
John McCall7f416cc2015-09-08 08:05:57 +000066 Builder(cgm, cgm.getModule().getContext(), llvm::ConstantFolder(),
David Blaikie8e90d222014-10-14 17:09:38 +000067 CGBuilderInserterTy(this)),
Erich Keanebe65e872018-07-10 21:07:50 +000068 SanOpts(CGM.getLangOpts().Sanitize), DebugInfo(CGM.getModuleDebugInfo()),
69 PGO(cgm), ShouldEmitLifetimeMarkers(shouldEmitLifetimeMarkers(
70 CGM.getCodeGenOpts(), CGM.getLangOpts())) {
Fariborz Jahanian63628032012-06-26 16:06:38 +000071 if (!suppressNewContext)
72 CGM.getCXXABI().getMangleContext().startNewFunction();
Michael Ilseman7a167ee2012-12-04 00:36:06 +000073
74 llvm::FastMathFlags FMF;
75 if (CGM.getLangOpts().FastMath)
Sanjay Patel401aaee2017-11-06 16:27:36 +000076 FMF.setFast();
Michael Ilseman7a167ee2012-12-04 00:36:06 +000077 if (CGM.getLangOpts().FiniteMathOnly) {
Benjamin Kramer7464efc2012-12-09 21:58:24 +000078 FMF.setNoNaNs();
79 FMF.setNoInfs();
Michael Ilseman7a167ee2012-12-04 00:36:06 +000080 }
Pekka Jaaskelainen37014502014-12-10 16:41:14 +000081 if (CGM.getCodeGenOpts().NoNaNsFPMath) {
82 FMF.setNoNaNs();
83 }
84 if (CGM.getCodeGenOpts().NoSignedZeros) {
85 FMF.setNoSignedZeros();
86 }
Sanjay Patel359b1052015-04-09 15:03:23 +000087 if (CGM.getCodeGenOpts().ReciprocalMath) {
88 FMF.setAllowReciprocal();
89 }
Sanjay Patelcb8c0092017-12-16 16:11:17 +000090 if (CGM.getCodeGenOpts().Reassociate) {
91 FMF.setAllowReassoc();
92 }
Sanjay Pateld61f3c72016-01-12 18:03:41 +000093 Builder.setFastMathFlags(FMF);
Melanie Blower7f9b5132019-12-04 12:23:46 -080094 SetFPModel();
Chris Lattner5696e7b2008-06-17 18:05:57 +000095}
Chris Lattnerd1af2d22007-05-29 23:17:50 +000096
John McCall08ef4662011-11-10 08:15:53 +000097CodeGenFunction::~CodeGenFunction() {
Richard Smith736a9472013-06-12 20:42:33 +000098 assert(LifetimeExtendedCleanupStack.empty() && "failed to emit a cleanup");
99
John McCall08ef4662011-11-10 08:15:53 +0000100 // If there are any unclaimed block infos, go ahead and destroy them
101 // now. This can happen if IR-gen gets clever and skips evaluating
102 // something.
103 if (FirstBlockInfo)
104 destroyBlockInfos(FirstBlockInfo);
Alexey Bataev9959db52014-05-06 10:08:46 +0000105
Alexey Bataev880d8602017-01-20 08:57:28 +0000106 if (getLangOpts().OpenMP && CurFn)
Alexey Bataev3eff5f42015-02-25 08:32:46 +0000107 CGM.getOpenMPRuntime().functionFinished(*this);
Johannes Doerfert70cac412020-02-12 20:52:23 -0600108
109 // If we have an OpenMPIRBuilder we want to finalize functions (incl.
110 // outlining etc) at some point. Doing it once the function codegen is done
111 // seems to be a reasonable spot. We do it here, as opposed to the deletion
112 // time of the CodeGenModule, because we have to ensure the IR has not yet
113 // been "emitted" to the outside, thus, modifications are still sensible.
114 if (llvm::OpenMPIRBuilder *OMPBuilder = CGM.getOpenMPIRBuilder())
115 OMPBuilder->finalize();
John McCall08ef4662011-11-10 08:15:53 +0000116}
117
Melanie Blower7f9b5132019-12-04 12:23:46 -0800118// Map the LangOption for exception behavior into
119// the corresponding enum in the IR.
120static llvm::fp::ExceptionBehavior ToConstrainedExceptMD(
121 LangOptions::FPExceptionModeKind Kind) {
122
123 switch (Kind) {
124 case LangOptions::FPE_Ignore: return llvm::fp::ebIgnore;
125 case LangOptions::FPE_MayTrap: return llvm::fp::ebMayTrap;
126 case LangOptions::FPE_Strict: return llvm::fp::ebStrict;
127 }
128 llvm_unreachable("Unsupported FP Exception Behavior");
129}
130
131void CodeGenFunction::SetFPModel() {
Serge Pavlovc7ff5b32020-03-26 14:51:09 +0700132 llvm::RoundingMode RM = getLangOpts().getFPRoundingMode();
Melanie Blower7f9b5132019-12-04 12:23:46 -0800133 auto fpExceptionBehavior = ToConstrainedExceptMD(
134 getLangOpts().getFPExceptionMode());
135
136 if (fpExceptionBehavior == llvm::fp::ebIgnore &&
Serge Pavlovc7ff5b32020-03-26 14:51:09 +0700137 RM == llvm::RoundingMode::NearestTiesToEven)
Melanie Blower7f9b5132019-12-04 12:23:46 -0800138 // Constrained intrinsics are not used.
139 ;
140 else {
141 Builder.setIsFPConstrained(true);
Serge Pavlovc7ff5b32020-03-26 14:51:09 +0700142 Builder.setDefaultConstrainedRounding(RM);
Melanie Blower7f9b5132019-12-04 12:23:46 -0800143 Builder.setDefaultConstrainedExcept(fpExceptionBehavior);
144 }
145}
146
John McCall7f416cc2015-09-08 08:05:57 +0000147CharUnits CodeGenFunction::getNaturalPointeeTypeAlignment(QualType T,
Ivan A. Kosareved141ba2017-10-17 09:12:13 +0000148 LValueBaseInfo *BaseInfo,
149 TBAAAccessInfo *TBAAInfo) {
150 return getNaturalTypeAlignment(T->getPointeeType(), BaseInfo, TBAAInfo,
Ivan A. Kosarev78f486d2017-10-13 16:58:30 +0000151 /* forPointeeType= */ true);
David Majnemer99281062014-09-18 22:05:54 +0000152}
Chris Lattnerd1af2d22007-05-29 23:17:50 +0000153
John McCall7f416cc2015-09-08 08:05:57 +0000154CharUnits CodeGenFunction::getNaturalTypeAlignment(QualType T,
Krzysztof Parzyszek8f248232017-05-18 17:07:11 +0000155 LValueBaseInfo *BaseInfo,
Ivan A. Kosarev78f486d2017-10-13 16:58:30 +0000156 TBAAAccessInfo *TBAAInfo,
John McCall7f416cc2015-09-08 08:05:57 +0000157 bool forPointeeType) {
Ivan A. Kosarev78f486d2017-10-13 16:58:30 +0000158 if (TBAAInfo)
159 *TBAAInfo = CGM.getTBAAAccessInfo(T);
160
John McCall7f416cc2015-09-08 08:05:57 +0000161 // Honor alignment typedef attributes even on incomplete types.
162 // We also honor them straight for C++ class types, even as pointees;
163 // there's an expressivity gap here.
164 if (auto TT = T->getAs<TypedefType>()) {
165 if (auto Align = TT->getDecl()->getMaxAlignment()) {
Krzysztof Parzyszek8f248232017-05-18 17:07:11 +0000166 if (BaseInfo)
Ivan A. Kosarevb9c59f32017-10-31 11:05:34 +0000167 *BaseInfo = LValueBaseInfo(AlignmentSource::AttributedType);
John McCall7f416cc2015-09-08 08:05:57 +0000168 return getContext().toCharUnitsFromBits(Align);
169 }
170 }
171
Krzysztof Parzyszek8f248232017-05-18 17:07:11 +0000172 if (BaseInfo)
Ivan A. Kosarevb9c59f32017-10-31 11:05:34 +0000173 *BaseInfo = LValueBaseInfo(AlignmentSource::Type);
John McCall7f416cc2015-09-08 08:05:57 +0000174
175 CharUnits Alignment;
David Majnemer9df56372015-09-10 21:52:00 +0000176 if (T->isIncompleteType()) {
John McCall7f416cc2015-09-08 08:05:57 +0000177 Alignment = CharUnits::One(); // Shouldn't be used, but pessimistic is best.
178 } else {
179 // For C++ class pointees, we don't know whether we're pointing at a
180 // base or a complete object, so we generally need to use the
181 // non-virtual alignment.
182 const CXXRecordDecl *RD;
183 if (forPointeeType && (RD = T->getAsCXXRecordDecl())) {
184 Alignment = CGM.getClassPointerAlignment(RD);
185 } else {
186 Alignment = getContext().getTypeAlignInChars(T);
Roger Ferrer Ibanez3fa38a12017-03-08 14:00:44 +0000187 if (T.getQualifiers().hasUnaligned())
188 Alignment = CharUnits::One();
John McCall7f416cc2015-09-08 08:05:57 +0000189 }
190
191 // Cap to the global maximum type alignment unless the alignment
192 // was somehow explicit on the type.
193 if (unsigned MaxAlign = getLangOpts().MaxTypeAlign) {
194 if (Alignment.getQuantity() > MaxAlign &&
195 !getContext().isAlignmentRequired(T))
196 Alignment = CharUnits::fromQuantity(MaxAlign);
197 }
198 }
199 return Alignment;
200}
201
202LValue CodeGenFunction::MakeNaturalAlignAddrLValue(llvm::Value *V, QualType T) {
Krzysztof Parzyszek8f248232017-05-18 17:07:11 +0000203 LValueBaseInfo BaseInfo;
Ivan A. Kosarev78f486d2017-10-13 16:58:30 +0000204 TBAAAccessInfo TBAAInfo;
205 CharUnits Alignment = getNaturalTypeAlignment(T, &BaseInfo, &TBAAInfo);
Krzysztof Parzyszek8f248232017-05-18 17:07:11 +0000206 return LValue::MakeAddr(Address(V, Alignment), T, getContext(), BaseInfo,
Ivan A. Kosarev78f486d2017-10-13 16:58:30 +0000207 TBAAInfo);
John McCall7f416cc2015-09-08 08:05:57 +0000208}
209
210/// Given a value of type T* that may not be to a complete object,
211/// construct an l-value with the natural pointee alignment of T.
212LValue
213CodeGenFunction::MakeNaturalAlignPointeeAddrLValue(llvm::Value *V, QualType T) {
Krzysztof Parzyszek8f248232017-05-18 17:07:11 +0000214 LValueBaseInfo BaseInfo;
Ivan A. Kosarev78f486d2017-10-13 16:58:30 +0000215 TBAAAccessInfo TBAAInfo;
216 CharUnits Align = getNaturalTypeAlignment(T, &BaseInfo, &TBAAInfo,
217 /* forPointeeType= */ true);
218 return MakeAddrLValue(Address(V, Align), T, BaseInfo, TBAAInfo);
John McCall7f416cc2015-09-08 08:05:57 +0000219}
220
221
Chris Lattnera5f58b02011-07-09 17:41:47 +0000222llvm::Type *CodeGenFunction::ConvertTypeForMem(QualType T) {
Daniel Dunbaree3da872009-02-03 23:03:55 +0000223 return CGM.getTypes().ConvertTypeForMem(T);
224}
225
Chris Lattnera5f58b02011-07-09 17:41:47 +0000226llvm::Type *CodeGenFunction::ConvertType(QualType T) {
Chris Lattnerf033c142007-06-22 19:05:19 +0000227 return CGM.getTypes().ConvertType(T);
Chris Lattner45bb9142007-06-09 02:28:57 +0000228}
Chris Lattnerd1af2d22007-05-29 23:17:50 +0000229
John McCall47fb9502013-03-07 21:37:08 +0000230TypeEvaluationKind CodeGenFunction::getEvaluationKind(QualType type) {
231 type = type.getCanonicalType();
232 while (true) {
233 switch (type->getTypeClass()) {
John McCall745ae282011-05-15 02:34:36 +0000234#define TYPE(name, parent)
235#define ABSTRACT_TYPE(name, parent)
236#define NON_CANONICAL_TYPE(name, parent) case Type::name:
237#define DEPENDENT_TYPE(name, parent) case Type::name:
238#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(name, parent) case Type::name:
John McCall36b12a82019-10-02 06:35:23 +0000239#include "clang/AST/TypeNodes.inc"
John McCall47fb9502013-03-07 21:37:08 +0000240 llvm_unreachable("non-canonical or dependent type in IR-generation");
John McCall745ae282011-05-15 02:34:36 +0000241
Richard Smith27d807c2013-04-30 13:56:41 +0000242 case Type::Auto:
Richard Smith600b5262017-01-26 20:40:47 +0000243 case Type::DeducedTemplateSpecialization:
244 llvm_unreachable("undeduced type in IR-generation");
Richard Smith27d807c2013-04-30 13:56:41 +0000245
John McCall47fb9502013-03-07 21:37:08 +0000246 // Various scalar types.
247 case Type::Builtin:
248 case Type::Pointer:
249 case Type::BlockPointer:
250 case Type::LValueReference:
251 case Type::RValueReference:
252 case Type::MemberPointer:
253 case Type::Vector:
254 case Type::ExtVector:
255 case Type::FunctionProto:
256 case Type::FunctionNoProto:
257 case Type::Enum:
258 case Type::ObjCObjectPointer:
Xiuli Pan9c14e282016-01-09 12:53:17 +0000259 case Type::Pipe:
John McCall47fb9502013-03-07 21:37:08 +0000260 return TEK_Scalar;
John McCall745ae282011-05-15 02:34:36 +0000261
John McCall47fb9502013-03-07 21:37:08 +0000262 // Complexes.
263 case Type::Complex:
264 return TEK_Complex;
Eli Friedman0dfb8892011-10-06 23:00:33 +0000265
John McCall47fb9502013-03-07 21:37:08 +0000266 // Arrays, records, and Objective-C objects.
267 case Type::ConstantArray:
268 case Type::IncompleteArray:
269 case Type::VariableArray:
270 case Type::Record:
271 case Type::ObjCObject:
272 case Type::ObjCInterface:
273 return TEK_Aggregate;
274
275 // We operate on atomic values according to their underlying type.
276 case Type::Atomic:
277 type = cast<AtomicType>(type)->getValueType();
278 continue;
279 }
280 llvm_unreachable("unknown type kind!");
John McCall745ae282011-05-15 02:34:36 +0000281 }
Chris Lattner54fb19e2007-06-22 22:02:34 +0000282}
283
David Blaikie66e41972015-01-14 07:38:27 +0000284llvm::DebugLoc CodeGenFunction::EmitReturnBlock() {
Daniel Dunbarfd346a32009-01-26 23:27:52 +0000285 // For cleanliness, we try to avoid emitting the return block for
286 // simple cases.
287 llvm::BasicBlock *CurBB = Builder.GetInsertBlock();
288
289 if (CurBB) {
290 assert(!CurBB->getTerminator() && "Unexpected terminated block.");
291
Daniel Dunbarea3060a2009-07-19 08:24:34 +0000292 // We have a valid insert point, reuse it if it is empty or there are no
293 // explicit jumps to the return block.
John McCallad5d61e2010-07-23 21:56:41 +0000294 if (CurBB->empty() || ReturnBlock.getBlock()->use_empty()) {
295 ReturnBlock.getBlock()->replaceAllUsesWith(CurBB);
296 delete ReturnBlock.getBlock();
John McCall8b36ac82019-04-10 17:03:09 +0000297 ReturnBlock = JumpDest();
Daniel Dunbarea3060a2009-07-19 08:24:34 +0000298 } else
John McCallad5d61e2010-07-23 21:56:41 +0000299 EmitBlock(ReturnBlock.getBlock());
David Blaikie66e41972015-01-14 07:38:27 +0000300 return llvm::DebugLoc();
Daniel Dunbarfd346a32009-01-26 23:27:52 +0000301 }
302
303 // Otherwise, if the return block is the target of a single direct
304 // branch then we can just put the code in that block instead. This
305 // cleans up functions which started with a unified return block.
John McCallad5d61e2010-07-23 21:56:41 +0000306 if (ReturnBlock.getBlock()->hasOneUse()) {
Mike Stump11289f42009-09-09 15:08:12 +0000307 llvm::BranchInst *BI =
Chandler Carruth4d01fff2014-03-09 03:16:50 +0000308 dyn_cast<llvm::BranchInst>(*ReturnBlock.getBlock()->user_begin());
John McCallbd309292010-07-06 01:34:17 +0000309 if (BI && BI->isUnconditional() &&
John McCallad5d61e2010-07-23 21:56:41 +0000310 BI->getSuccessor(0) == ReturnBlock.getBlock()) {
David Blaikie66e41972015-01-14 07:38:27 +0000311 // Record/return the DebugLoc of the simple 'return' expression to be used
312 // later by the actual 'ret' instruction.
313 llvm::DebugLoc Loc = BI->getDebugLoc();
Daniel Dunbarfd346a32009-01-26 23:27:52 +0000314 Builder.SetInsertPoint(BI->getParent());
315 BI->eraseFromParent();
John McCallad5d61e2010-07-23 21:56:41 +0000316 delete ReturnBlock.getBlock();
John McCall8b36ac82019-04-10 17:03:09 +0000317 ReturnBlock = JumpDest();
David Blaikie66e41972015-01-14 07:38:27 +0000318 return Loc;
Daniel Dunbarfd346a32009-01-26 23:27:52 +0000319 }
320 }
321
Mike Stump18bb9282009-05-16 07:57:57 +0000322 // FIXME: We are at an unreachable point, there is no reason to emit the block
323 // unless it has uses. However, we still need a place to put the debug
324 // region.end for now.
Daniel Dunbarfd346a32009-01-26 23:27:52 +0000325
John McCallad5d61e2010-07-23 21:56:41 +0000326 EmitBlock(ReturnBlock.getBlock());
David Blaikie66e41972015-01-14 07:38:27 +0000327 return llvm::DebugLoc();
John McCallbd309292010-07-06 01:34:17 +0000328}
329
330static void EmitIfUsed(CodeGenFunction &CGF, llvm::BasicBlock *BB) {
331 if (!BB) return;
332 if (!BB->use_empty())
333 return CGF.CurFn->getBasicBlockList().push_back(BB);
334 delete BB;
Daniel Dunbarfd346a32009-01-26 23:27:52 +0000335}
336
Daniel Dunbar89654ee2008-08-26 08:29:31 +0000337void CodeGenFunction::FinishFunction(SourceLocation EndLoc) {
Chris Lattnere73e4322007-07-16 21:28:45 +0000338 assert(BreakContinueStack.empty() &&
339 "mismatched push/pop in break/continue stack!");
Mike Stump11289f42009-09-09 15:08:12 +0000340
Adrian Prantl52bf3c42013-05-03 20:11:48 +0000341 bool OnlySimpleReturnStmts = NumSimpleReturnExprs > 0
Adrian Prantl524ba1f2013-07-25 00:23:42 +0000342 && NumSimpleReturnExprs == NumReturnExprs
343 && ReturnBlock.getBlock()->use_empty();
344 // Usually the return expression is evaluated before the cleanup
345 // code. If the function contains only a simple return statement,
346 // such as a constant, the location before the cleanup code becomes
347 // the last useful breakpoint in the function, because the simple
348 // return expression will be evaluated after the cleanup code. To be
349 // safe, set the debug location for cleanup code to the location of
350 // the return statement. Otherwise the cleanup code should be at the
351 // end of the function's lexical scope.
352 //
353 // If there are multiple branches to the return block, the branch
354 // instructions will get the location of the return statements and
355 // all will be fine.
Adrian Prantl3be10542013-05-02 17:30:20 +0000356 if (CGDebugInfo *DI = getDebugInfo()) {
Adrian Prantl52bf3c42013-05-03 20:11:48 +0000357 if (OnlySimpleReturnStmts)
Adrian Prantle83b1302014-01-07 22:05:52 +0000358 DI->EmitLocation(Builder, LastStopPoint);
Adrian Prantl3be10542013-05-02 17:30:20 +0000359 else
Calixte Denizetfcd661d2018-09-24 18:24:18 +0000360 DI->EmitLocation(Builder, EndLoc);
Adrian Prantl3be10542013-05-02 17:30:20 +0000361 }
David Blaikie357aafb2013-02-01 19:09:49 +0000362
John McCall31168b02011-06-15 23:02:42 +0000363 // Pop any cleanups that might have been associated with the
364 // parameters. Do this in whatever block we're currently in; it's
365 // important to do this before we enter the return block or return
366 // edges will be *really* confused.
David Majnemerdc012fa2015-04-22 21:38:15 +0000367 bool HasCleanups = EHStack.stable_begin() != PrologueCleanupDepth;
368 bool HasOnlyLifetimeMarkers =
369 HasCleanups && EHStack.containsOnlyLifetimeMarkers(PrologueCleanupDepth);
370 bool EmitRetDbgLoc = !HasCleanups || HasOnlyLifetimeMarkers;
371 if (HasCleanups) {
Adrian Prantl3be10542013-05-02 17:30:20 +0000372 // Make sure the line table doesn't jump back into the body for
373 // the ret after it's been at EndLoc.
Adrian Prantl338588d2019-12-05 13:19:37 -0800374 Optional<ApplyDebugLocation> AL;
Adrian Prantlce7d3592019-12-05 12:26:16 -0800375 if (CGDebugInfo *DI = getDebugInfo()) {
Adrian Prantl52bf3c42013-05-03 20:11:48 +0000376 if (OnlySimpleReturnStmts)
Calixte Denizetfcd661d2018-09-24 18:24:18 +0000377 DI->EmitLocation(Builder, EndLoc);
Adrian Prantlce7d3592019-12-05 12:26:16 -0800378 else
Adrian Prantl338588d2019-12-05 13:19:37 -0800379 // We may not have a valid end location. Try to apply it anyway, and
380 // fall back to an artificial location if needed.
381 AL = ApplyDebugLocation::CreateDefaultArtificial(*this, EndLoc);
Adrian Prantlce7d3592019-12-05 12:26:16 -0800382 }
David Blaikie4d524432015-02-04 19:47:54 +0000383
384 PopCleanupBlocks(PrologueCleanupDepth);
Adrian Prantl3be10542013-05-02 17:30:20 +0000385 }
386
Mike Stump11289f42009-09-09 15:08:12 +0000387 // Emit function epilog (to return).
David Blaikie66e41972015-01-14 07:38:27 +0000388 llvm::DebugLoc Loc = EmitReturnBlock();
Daniel Dunbarfab3f932008-11-11 20:59:54 +0000389
Hans Wennborg76c26c12017-11-14 21:13:27 +0000390 if (ShouldInstrumentFunction()) {
Hans Wennborg14e8a5a2017-11-21 17:30:34 +0000391 if (CGM.getCodeGenOpts().InstrumentFunctions)
392 CurFn->addFnAttr("instrument-function-exit", "__cyg_profile_func_exit");
393 if (CGM.getCodeGenOpts().InstrumentFunctionsAfterInlining)
394 CurFn->addFnAttr("instrument-function-exit-inlined",
395 "__cyg_profile_func_exit");
Hans Wennborg76c26c12017-11-14 21:13:27 +0000396 }
Chris Lattner3c77a352010-06-22 00:03:40 +0000397
Daniel Dunbarfab3f932008-11-11 20:59:54 +0000398 // Emit debug descriptor for function end.
David Blaikie66e41972015-01-14 07:38:27 +0000399 if (CGDebugInfo *DI = getDebugInfo())
Keno Fischer41d4b4e2017-06-01 21:14:03 +0000400 DI->EmitFunctionEnd(Builder, CurFn);
Daniel Dunbarfab3f932008-11-11 20:59:54 +0000401
David Blaikie66e41972015-01-14 07:38:27 +0000402 // Reset the debug location to that of the simple 'return' expression, if any
403 // rather than that of the end of the function's scope '}'.
404 ApplyDebugLocation AL(*this, Loc);
Nick Lewycky2d84e842013-10-02 02:29:49 +0000405 EmitFunctionEpilog(*CurFnInfo, EmitRetDbgLoc, EndLoc);
Mike Stump1d849212009-12-07 23:38:24 +0000406 EmitEndEHSpec(CurCodeDecl);
Daniel Dunbar54bb1932008-09-09 21:00:17 +0000407
John McCallbd309292010-07-06 01:34:17 +0000408 assert(EHStack.empty() &&
409 "did not remove all scopes from cleanup stack!");
410
Chris Lattner6c4d2552009-10-28 23:59:40 +0000411 // If someone did an indirect goto, emit the indirect goto block at the end of
412 // the function.
413 if (IndirectBranch) {
414 EmitBlock(IndirectBranch->getParent());
415 Builder.ClearInsertionPoint();
416 }
Michael Ilseman686240a2012-12-04 00:29:55 +0000417
Reid Kleckner98cb8ba2015-07-07 22:26:07 +0000418 // If some of our locals escaped, insert a call to llvm.localescape in the
Reid Kleckner31a1bb02015-04-08 22:23:48 +0000419 // entry block.
420 if (!EscapedLocals.empty()) {
421 // Invert the map from local to index into a simple vector. There should be
422 // no holes.
423 SmallVector<llvm::Value *, 4> EscapeArgs;
424 EscapeArgs.resize(EscapedLocals.size());
425 for (auto &Pair : EscapedLocals)
426 EscapeArgs[Pair.second] = Pair.first;
427 llvm::Function *FrameEscapeFn = llvm::Intrinsic::getDeclaration(
Reid Kleckner98cb8ba2015-07-07 22:26:07 +0000428 &CGM.getModule(), llvm::Intrinsic::localescape);
John McCall7f416cc2015-09-08 08:05:57 +0000429 CGBuilderTy(*this, AllocaInsertPt).CreateCall(FrameEscapeFn, EscapeArgs);
Reid Kleckner31a1bb02015-04-08 22:23:48 +0000430 }
431
Chris Lattnerc48023b2007-12-02 06:32:24 +0000432 // Remove the AllocaInsertPt instruction, which is just a convenience for us.
Chris Lattner2739d2b2009-03-31 22:17:44 +0000433 llvm::Instruction *Ptr = AllocaInsertPt;
Craig Topper8a13c412014-05-21 05:09:00 +0000434 AllocaInsertPt = nullptr;
Chris Lattner2739d2b2009-03-31 22:17:44 +0000435 Ptr->eraseFromParent();
Michael Ilseman686240a2012-12-04 00:29:55 +0000436
Chris Lattner6c4d2552009-10-28 23:59:40 +0000437 // If someone took the address of a label but never did an indirect goto, we
438 // made a zero entry PHI node, which is illegal, zap it now.
439 if (IndirectBranch) {
440 llvm::PHINode *PN = cast<llvm::PHINode>(IndirectBranch->getAddress());
441 if (PN->getNumIncomingValues() == 0) {
442 PN->replaceAllUsesWith(llvm::UndefValue::get(PN->getType()));
443 PN->eraseFromParent();
444 }
445 }
John McCallbd309292010-07-06 01:34:17 +0000446
John McCall8e4c74b2011-08-11 02:22:43 +0000447 EmitIfUsed(*this, EHResumeBlock);
John McCallbd309292010-07-06 01:34:17 +0000448 EmitIfUsed(*this, TerminateLandingPad);
449 EmitIfUsed(*this, TerminateHandler);
450 EmitIfUsed(*this, UnreachableBlock);
John McCall09ae0322010-07-06 23:57:41 +0000451
Reid Kleckner06f19a02018-01-02 21:34:16 +0000452 for (const auto &FuncletAndParent : TerminateFunclets)
453 EmitIfUsed(*this, FuncletAndParent.second);
454
John McCall09ae0322010-07-06 23:57:41 +0000455 if (CGM.getCodeGenOpts().EmitDeclMetadata)
456 EmitDeclMetadata();
Reid Kleckner314ef7b2014-02-01 00:04:45 +0000457
458 for (SmallVectorImpl<std::pair<llvm::Instruction *, llvm::Value *> >::iterator
459 I = DeferredReplacements.begin(),
460 E = DeferredReplacements.end();
461 I != E; ++I) {
462 I->first->replaceAllUsesWith(I->second);
463 I->first->eraseFromParent();
464 }
Gor Nishanov04491bd2017-11-11 17:00:43 +0000465
466 // Eliminate CleanupDestSlot alloca by replacing it with SSA values and
467 // PHIs if the current function is a coroutine. We don't do it for all
468 // functions as it may result in slight increase in numbers of instructions
469 // if compiled with no optimizations. We do it for coroutine as the lifetime
470 // of CleanupDestSlot alloca make correct coroutine frame building very
471 // difficult.
John McCall5cdf0382018-01-12 22:07:01 +0000472 if (NormalCleanupDest.isValid() && isCoroutine()) {
Gor Nishanov04491bd2017-11-11 17:00:43 +0000473 llvm::DominatorTree DT(*CurFn);
John McCall5cdf0382018-01-12 22:07:01 +0000474 llvm::PromoteMemToReg(
475 cast<llvm::AllocaInst>(NormalCleanupDest.getPointer()), DT);
476 NormalCleanupDest = Address::invalid();
Gor Nishanov04491bd2017-11-11 17:00:43 +0000477 }
Craig Topper74c10e32018-07-09 19:00:16 +0000478
Craig Topper3113ec32018-10-24 17:42:17 +0000479 // Scan function arguments for vector width.
480 for (llvm::Argument &A : CurFn->args())
481 if (auto *VT = dyn_cast<llvm::VectorType>(A.getType()))
Sander de Smalen5087ace2020-03-15 14:29:45 +0000482 LargestVectorWidth =
483 std::max((uint64_t)LargestVectorWidth,
484 VT->getPrimitiveSizeInBits().getKnownMinSize());
Craig Topper3113ec32018-10-24 17:42:17 +0000485
486 // Update vector width based on return type.
487 if (auto *VT = dyn_cast<llvm::VectorType>(CurFn->getReturnType()))
Sander de Smalen5087ace2020-03-15 14:29:45 +0000488 LargestVectorWidth =
489 std::max((uint64_t)LargestVectorWidth,
490 VT->getPrimitiveSizeInBits().getKnownMinSize());
Craig Topper3113ec32018-10-24 17:42:17 +0000491
492 // Add the required-vector-width attribute. This contains the max width from:
493 // 1. min-vector-width attribute used in the source program.
494 // 2. Any builtins used that have a vector width specified.
495 // 3. Values passed in and out of inline assembly.
496 // 4. Width of vector arguments and return types for this function.
497 // 5. Width of vector aguments and return types for functions called by this
498 // function.
Craig Topper00897e92018-10-25 05:04:35 +0000499 CurFn->addFnAttr("min-legal-vector-width", llvm::utostr(LargestVectorWidth));
John McCall8b36ac82019-04-10 17:03:09 +0000500
501 // If we generated an unreachable return block, delete it now.
502 if (ReturnBlock.isValid() && ReturnBlock.getBlock()->use_empty()) {
503 Builder.ClearInsertionPoint();
504 ReturnBlock.getBlock()->eraseFromParent();
505 }
506 if (ReturnValue.isValid()) {
507 auto *RetAlloca = dyn_cast<llvm::AllocaInst>(ReturnValue.getPointer());
508 if (RetAlloca && RetAlloca->use_empty()) {
509 RetAlloca->eraseFromParent();
510 ReturnValue = Address::invalid();
511 }
512 }
Chris Lattnerd1af2d22007-05-29 23:17:50 +0000513}
Chris Lattner308f4312007-05-29 23:50:05 +0000514
Chris Lattner3c77a352010-06-22 00:03:40 +0000515/// ShouldInstrumentFunction - Return true if the current function should be
516/// instrumented with __cyg_profile_func_* calls
517bool CodeGenFunction::ShouldInstrumentFunction() {
Hans Wennborg76c26c12017-11-14 21:13:27 +0000518 if (!CGM.getCodeGenOpts().InstrumentFunctions &&
Hans Wennborg14e8a5a2017-11-21 17:30:34 +0000519 !CGM.getCodeGenOpts().InstrumentFunctionsAfterInlining &&
520 !CGM.getCodeGenOpts().InstrumentFunctionEntryBare)
Chris Lattner3c77a352010-06-22 00:03:40 +0000521 return false;
Ted Kremenekc249c412011-05-16 23:49:20 +0000522 if (!CurFuncDecl || CurFuncDecl->hasAttr<NoInstrumentFunctionAttr>())
Chris Lattner3c77a352010-06-22 00:03:40 +0000523 return false;
524 return true;
525}
526
Aaron Ballman7d2aecb2016-07-13 22:32:15 +0000527/// ShouldXRayInstrument - Return true if the current function should be
528/// instrumented with XRay nop sleds.
529bool CodeGenFunction::ShouldXRayInstrumentFunction() const {
530 return CGM.getCodeGenOpts().XRayInstrumentFunctions;
531}
532
Dean Michael Berris1a5b10d2017-11-30 00:04:54 +0000533/// AlwaysEmitXRayCustomEvents - Return true if we should emit IR for calls to
Keith Wyssf437e352018-04-17 21:32:43 +0000534/// the __xray_customevent(...) builtin calls, when doing XRay instrumentation.
Dean Michael Berris1a5b10d2017-11-30 00:04:54 +0000535bool CodeGenFunction::AlwaysEmitXRayCustomEvents() const {
Dean Michael Berris488f7c22018-04-13 02:31:58 +0000536 return CGM.getCodeGenOpts().XRayInstrumentFunctions &&
537 (CGM.getCodeGenOpts().XRayAlwaysEmitCustomEvents ||
538 CGM.getCodeGenOpts().XRayInstrumentationBundle.Mask ==
539 XRayInstrKind::Custom);
Dean Michael Berris1a5b10d2017-11-30 00:04:54 +0000540}
541
Keith Wyssf437e352018-04-17 21:32:43 +0000542bool CodeGenFunction::AlwaysEmitXRayTypedEvents() const {
543 return CGM.getCodeGenOpts().XRayInstrumentFunctions &&
544 (CGM.getCodeGenOpts().XRayAlwaysEmitTypedEvents ||
545 CGM.getCodeGenOpts().XRayInstrumentationBundle.Mask ==
546 XRayInstrKind::Typed);
547}
548
Vedant Kumarbb5d4852017-09-13 00:04:35 +0000549llvm::Constant *
550CodeGenFunction::EncodeAddrForUseInPrologue(llvm::Function *F,
551 llvm::Constant *Addr) {
552 // Addresses stored in prologue data can't require run-time fixups and must
553 // be PC-relative. Run-time fixups are undesirable because they necessitate
554 // writable text segments, which are unsafe. And absolute addresses are
555 // undesirable because they break PIE mode.
556
557 // Add a layer of indirection through a private global. Taking its address
558 // won't result in a run-time fixup, even if Addr has linkonce_odr linkage.
559 auto *GV = new llvm::GlobalVariable(CGM.getModule(), Addr->getType(),
560 /*isConstant=*/true,
561 llvm::GlobalValue::PrivateLinkage, Addr);
562
563 // Create a PC-relative address.
564 auto *GOTAsInt = llvm::ConstantExpr::getPtrToInt(GV, IntPtrTy);
565 auto *FuncAsInt = llvm::ConstantExpr::getPtrToInt(F, IntPtrTy);
566 auto *PCRelAsInt = llvm::ConstantExpr::getSub(GOTAsInt, FuncAsInt);
567 return (IntPtrTy == Int32Ty)
568 ? PCRelAsInt
569 : llvm::ConstantExpr::getTrunc(PCRelAsInt, Int32Ty);
570}
571
572llvm::Value *
573CodeGenFunction::DecodeAddrUsedInPrologue(llvm::Value *F,
574 llvm::Value *EncodedAddr) {
575 // Reconstruct the address of the global.
576 auto *PCRelAsInt = Builder.CreateSExt(EncodedAddr, IntPtrTy);
577 auto *FuncAsInt = Builder.CreatePtrToInt(F, IntPtrTy, "func_addr.int");
578 auto *GOTAsInt = Builder.CreateAdd(PCRelAsInt, FuncAsInt, "global_addr.int");
579 auto *GOTAddr = Builder.CreateIntToPtr(GOTAsInt, Int8PtrPtrTy, "global_addr");
580
581 // Load the original pointer through the global.
582 return Builder.CreateLoad(Address(GOTAddr, getPointerAlign()),
583 "decoded_addr");
584}
585
Michael Ilseman686240a2012-12-04 00:29:55 +0000586void CodeGenFunction::EmitOpenCLKernelMetadata(const FunctionDecl *FD,
Tanya Lattnerbcffcdf2012-07-09 22:06:01 +0000587 llvm::Function *Fn)
588{
589 if (!FD->hasAttr<OpenCLKernelAttr>())
590 return;
591
592 llvm::LLVMContext &Context = getLLVMContext();
593
Anastasia Stulovae6cf6c72019-05-09 13:55:44 +0000594 CGM.GenOpenCLArgMetadata(Fn, FD, this);
Michael Ilseman686240a2012-12-04 00:29:55 +0000595
Aaron Ballmanc4327992013-12-19 03:09:10 +0000596 if (const VecTypeHintAttr *A = FD->getAttr<VecTypeHintAttr>()) {
Xiuli Panbe6da4b2017-05-04 07:31:20 +0000597 QualType HintQTy = A->getTypeHint();
598 const ExtVectorType *HintEltQTy = HintQTy->getAs<ExtVectorType>();
599 bool IsSignedInteger =
600 HintQTy->isSignedIntegerType() ||
601 (HintEltQTy && HintEltQTy->getElementType()->isSignedIntegerType());
602 llvm::Metadata *AttrMDArgs[] = {
Duncan P. N. Exon Smithfb494912014-12-09 18:39:32 +0000603 llvm::ConstantAsMetadata::get(llvm::UndefValue::get(
604 CGM.getTypes().ConvertType(A->getTypeHint()))),
605 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
606 llvm::IntegerType::get(Context, 32),
Xiuli Panbe6da4b2017-05-04 07:31:20 +0000607 llvm::APInt(32, (uint64_t)(IsSignedInteger ? 1 : 0))))};
608 Fn->setMetadata("vec_type_hint", llvm::MDNode::get(Context, AttrMDArgs));
Joey Goulyaba589c2013-03-08 09:42:32 +0000609 }
610
Aaron Ballmanc4327992013-12-19 03:09:10 +0000611 if (const WorkGroupSizeHintAttr *A = FD->getAttr<WorkGroupSizeHintAttr>()) {
Xiuli Panbe6da4b2017-05-04 07:31:20 +0000612 llvm::Metadata *AttrMDArgs[] = {
Duncan P. N. Exon Smithfb494912014-12-09 18:39:32 +0000613 llvm::ConstantAsMetadata::get(Builder.getInt32(A->getXDim())),
614 llvm::ConstantAsMetadata::get(Builder.getInt32(A->getYDim())),
615 llvm::ConstantAsMetadata::get(Builder.getInt32(A->getZDim()))};
Xiuli Panbe6da4b2017-05-04 07:31:20 +0000616 Fn->setMetadata("work_group_size_hint", llvm::MDNode::get(Context, AttrMDArgs));
Tanya Lattnerbcffcdf2012-07-09 22:06:01 +0000617 }
618
Aaron Ballmanc4327992013-12-19 03:09:10 +0000619 if (const ReqdWorkGroupSizeAttr *A = FD->getAttr<ReqdWorkGroupSizeAttr>()) {
Xiuli Panbe6da4b2017-05-04 07:31:20 +0000620 llvm::Metadata *AttrMDArgs[] = {
Duncan P. N. Exon Smithfb494912014-12-09 18:39:32 +0000621 llvm::ConstantAsMetadata::get(Builder.getInt32(A->getXDim())),
622 llvm::ConstantAsMetadata::get(Builder.getInt32(A->getYDim())),
623 llvm::ConstantAsMetadata::get(Builder.getInt32(A->getZDim()))};
Xiuli Panbe6da4b2017-05-04 07:31:20 +0000624 Fn->setMetadata("reqd_work_group_size", llvm::MDNode::get(Context, AttrMDArgs));
625 }
626
627 if (const OpenCLIntelReqdSubGroupSizeAttr *A =
628 FD->getAttr<OpenCLIntelReqdSubGroupSizeAttr>()) {
629 llvm::Metadata *AttrMDArgs[] = {
630 llvm::ConstantAsMetadata::get(Builder.getInt32(A->getSubGroupSize()))};
631 Fn->setMetadata("intel_reqd_sub_group_size",
632 llvm::MDNode::get(Context, AttrMDArgs));
Tanya Lattnerbcffcdf2012-07-09 22:06:01 +0000633 }
Tanya Lattnerbcffcdf2012-07-09 22:06:01 +0000634}
635
Adrian Prantl2cede0f2014-04-29 01:07:59 +0000636/// Determine whether the function F ends with a return stmt.
637static bool endsWithReturn(const Decl* F) {
638 const Stmt *Body = nullptr;
639 if (auto *FD = dyn_cast_or_null<FunctionDecl>(F))
640 Body = FD->getBody();
641 else if (auto *OMD = dyn_cast_or_null<ObjCMethodDecl>(F))
642 Body = OMD->getBody();
643
644 if (auto *CS = dyn_cast_or_null<CompoundStmt>(Body)) {
645 auto LastStmt = CS->body_rbegin();
646 if (LastStmt != CS->body_rend())
647 return isa<ReturnStmt>(*LastStmt);
648 }
649 return false;
650}
651
Akira Hatanaka9978da32018-08-10 15:09:24 +0000652void CodeGenFunction::markAsIgnoreThreadCheckingAtRuntime(llvm::Function *Fn) {
653 if (SanOpts.has(SanitizerKind::Thread)) {
654 Fn->addFnAttr("sanitize_thread_no_checking_at_run_time");
655 Fn->removeFnAttr(llvm::Attribute::SanitizeThread);
656 }
Anna Zakse43b4fc2017-01-13 00:50:50 +0000657}
658
Reid Kleckner98031782019-12-09 16:11:56 -0800659/// Check if the return value of this function requires sanitization.
660bool CodeGenFunction::requiresReturnValueCheck() const {
661 return requiresReturnValueNullabilityCheck() ||
662 (SanOpts.has(SanitizerKind::ReturnsNonnullAttribute) && CurCodeDecl &&
663 CurCodeDecl->getAttr<ReturnsNonNullAttr>());
664}
665
Vlad Tsyrklevich3f3aad22017-08-04 21:21:00 +0000666static bool matchesStlAllocatorFn(const Decl *D, const ASTContext &Ctx) {
667 auto *MD = dyn_cast_or_null<CXXMethodDecl>(D);
668 if (!MD || !MD->getDeclName().getAsIdentifierInfo() ||
669 !MD->getDeclName().getAsIdentifierInfo()->isStr("allocate") ||
670 (MD->getNumParams() != 1 && MD->getNumParams() != 2))
671 return false;
672
673 if (MD->parameters()[0]->getType().getCanonicalType() != Ctx.getSizeType())
674 return false;
675
676 if (MD->getNumParams() == 2) {
677 auto *PT = MD->parameters()[1]->getType()->getAs<PointerType>();
678 if (!PT || !PT->isVoidPointerType() ||
679 !PT->getPointeeType().isConstQualified())
680 return false;
681 }
682
683 return true;
684}
685
Vedant Kumaraa4ea5f2017-10-14 01:23:30 +0000686/// Return the UBSan prologue signature for \p FD if one is available.
687static llvm::Constant *getPrologueSignature(CodeGenModule &CGM,
688 const FunctionDecl *FD) {
689 if (const auto *MD = dyn_cast<CXXMethodDecl>(FD))
690 if (!MD->isStatic())
691 return nullptr;
692 return CGM.getTargetCodeGenInfo().getUBSanFunctionSignature(CGM);
693}
694
Adrian Prantl2073dd22019-11-04 14:28:14 -0800695void CodeGenFunction::StartFunction(GlobalDecl GD, QualType RetTy,
Daniel Dunbarbc915f42008-09-09 23:14:03 +0000696 llvm::Function *Fn,
John McCalla738c252011-03-09 04:27:21 +0000697 const CGFunctionInfo &FnInfo,
Daniel Dunbar354d2782008-10-18 18:22:23 +0000698 const FunctionArgList &Args,
Adrian Prantl42d71b92014-04-10 23:21:53 +0000699 SourceLocation Loc,
Tilmann Scheller99cc30c2011-03-02 21:36:49 +0000700 SourceLocation StartLoc) {
David Blaikie8e6c36e2014-10-14 16:43:46 +0000701 assert(!CurFn &&
702 "Do not use a CodeGenFunction object for more than one function");
703
Anders Carlsson73fcc952009-09-11 00:07:24 +0000704 const Decl *D = GD.getDecl();
Michael Ilseman686240a2012-12-04 00:29:55 +0000705
Anders Carlssonf4478e92009-02-09 20:20:56 +0000706 DidCallStackSave = false;
John McCalldec348f72013-05-03 07:33:41 +0000707 CurCodeDecl = D;
David Majnemer25eb1652016-03-01 19:42:53 +0000708 if (const auto *FD = dyn_cast_or_null<FunctionDecl>(D))
709 if (FD->usesSEHTry())
710 CurSEHParent = FD;
Craig Topper8a13c412014-05-21 05:09:00 +0000711 CurFuncDecl = (D ? D->getNonClosureContext() : nullptr);
Daniel Dunbarbc915f42008-09-09 23:14:03 +0000712 FnRetTy = RetTy;
Daniel Dunbar9c426522008-07-29 23:18:29 +0000713 CurFn = Fn;
John McCalla738c252011-03-09 04:27:21 +0000714 CurFnInfo = &FnInfo;
Chris Lattner5696e7b2008-06-17 18:05:57 +0000715 assert(CurFn->isDeclaration() && "Function already has body?");
716
Vlad Tsyrklevich2eccdab2017-09-25 22:11:12 +0000717 // If this function has been blacklisted for any of the enabled sanitizers,
718 // disable the sanitizer for the function.
719 do {
720#define SANITIZER(NAME, ID) \
721 if (SanOpts.empty()) \
722 break; \
723 if (SanOpts.has(SanitizerKind::ID)) \
724 if (CGM.isInSanitizerBlacklist(SanitizerKind::ID, Fn, Loc)) \
725 SanOpts.set(SanitizerKind::ID, false);
726
727#include "clang/Basic/Sanitizers.def"
728#undef SANITIZER
729 } while (0);
Will Dietzf54319c2013-01-18 11:30:38 +0000730
Peter Collingbourne915df992015-05-15 18:33:32 +0000731 if (D) {
732 // Apply the no_sanitize* attributes to SanOpts.
Vitaly Buka69a2e182018-04-09 20:10:29 +0000733 for (auto Attr : D->specific_attrs<NoSanitizeAttr>()) {
734 SanitizerMask mask = Attr->getMask();
735 SanOpts.Mask &= ~mask;
736 if (mask & SanitizerKind::Address)
737 SanOpts.set(SanitizerKind::KernelAddress, false);
738 if (mask & SanitizerKind::KernelAddress)
739 SanOpts.set(SanitizerKind::Address, false);
Andrey Konovalov1ba9d9c2018-04-13 18:05:21 +0000740 if (mask & SanitizerKind::HWAddress)
741 SanOpts.set(SanitizerKind::KernelHWAddress, false);
742 if (mask & SanitizerKind::KernelHWAddress)
743 SanOpts.set(SanitizerKind::HWAddress, false);
Vitaly Buka69a2e182018-04-09 20:10:29 +0000744 }
Peter Collingbourne915df992015-05-15 18:33:32 +0000745 }
746
747 // Apply sanitizer attributes to the function.
Alexander Potapenkob9b73ef2015-06-19 12:19:07 +0000748 if (SanOpts.hasOneOf(SanitizerKind::Address | SanitizerKind::KernelAddress))
Peter Collingbourne915df992015-05-15 18:33:32 +0000749 Fn->addFnAttr(llvm::Attribute::SanitizeAddress);
Andrey Konovalov1ba9d9c2018-04-13 18:05:21 +0000750 if (SanOpts.hasOneOf(SanitizerKind::HWAddress | SanitizerKind::KernelHWAddress))
Evgeniy Stepanov12817e52017-12-09 01:32:07 +0000751 Fn->addFnAttr(llvm::Attribute::SanitizeHWAddress);
Evgeniy Stepanovc5e7f562019-07-15 20:02:23 +0000752 if (SanOpts.has(SanitizerKind::MemTag))
753 Fn->addFnAttr(llvm::Attribute::SanitizeMemTag);
Peter Collingbourne915df992015-05-15 18:33:32 +0000754 if (SanOpts.has(SanitizerKind::Thread))
755 Fn->addFnAttr(llvm::Attribute::SanitizeThread);
Alexander Potapenkod49c32c2018-09-07 09:21:09 +0000756 if (SanOpts.hasOneOf(SanitizerKind::Memory | SanitizerKind::KernelMemory))
Peter Collingbourne915df992015-05-15 18:33:32 +0000757 Fn->addFnAttr(llvm::Attribute::SanitizeMemory);
Peter Collingbournec4122c12015-06-15 21:08:13 +0000758 if (SanOpts.has(SanitizerKind::SafeStack))
759 Fn->addFnAttr(llvm::Attribute::SafeStack);
Vlad Tsyrkleviche55aa032018-04-03 22:33:53 +0000760 if (SanOpts.has(SanitizerKind::ShadowCallStack))
761 Fn->addFnAttr(llvm::Attribute::ShadowCallStack);
Peter Collingbourne915df992015-05-15 18:33:32 +0000762
Matt Morehouse5317f2e2018-03-23 23:35:28 +0000763 // Apply fuzzing attribute to the function.
764 if (SanOpts.hasOneOf(SanitizerKind::Fuzzer | SanitizerKind::FuzzerNoLink))
765 Fn->addFnAttr(llvm::Attribute::OptForFuzzing);
766
Anna Zaksbcd35a82016-11-11 23:22:44 +0000767 // Ignore TSan memory acesses from within ObjC/ObjC++ dealloc, initialize,
Anna Zakse43b4fc2017-01-13 00:50:50 +0000768 // .cxx_destruct, __destroy_helper_block_ and all of their calees at run time.
Anna Zaksbcd35a82016-11-11 23:22:44 +0000769 if (SanOpts.has(SanitizerKind::Thread)) {
770 if (const auto *OMD = dyn_cast_or_null<ObjCMethodDecl>(D)) {
771 IdentifierInfo *II = OMD->getSelector().getIdentifierInfoForSlot(0);
772 if (OMD->getMethodFamily() == OMF_dealloc ||
773 OMD->getMethodFamily() == OMF_initialize ||
774 (OMD->getSelector().isUnarySelector() && II->isStr(".cxx_destruct"))) {
Anna Zakse43b4fc2017-01-13 00:50:50 +0000775 markAsIgnoreThreadCheckingAtRuntime(Fn);
Anna Zaksbcd35a82016-11-11 23:22:44 +0000776 }
777 }
778 }
779
Vlad Tsyrklevich3f3aad22017-08-04 21:21:00 +0000780 // Ignore unrelated casts in STL allocate() since the allocator must cast
781 // from void* to T* before object initialization completes. Don't match on the
782 // namespace because not all allocators are in std::
783 if (D && SanOpts.has(SanitizerKind::CFIUnrelatedCast)) {
784 if (matchesStlAllocatorFn(D, getContext()))
785 SanOpts.Mask &= ~SanitizerKind::CFIUnrelatedCast;
786 }
787
Brian Gesiakf8d68362019-08-13 12:02:25 +0000788 // Ignore null checks in coroutine functions since the coroutines passes
789 // are not aware of how to move the extra UBSan instructions across the split
790 // coroutine boundaries.
791 if (D && SanOpts.has(SanitizerKind::Null))
792 if (const auto *FD = dyn_cast<FunctionDecl>(D))
793 if (FD->getBody() &&
794 FD->getBody()->getStmtClass() == Stmt::CoroutineBodyStmtClass)
795 SanOpts.Mask &= ~SanitizerKind::Null;
796
Ian Levesquebb3111c2020-03-31 22:07:27 -0400797 // Apply xray attributes to the function (as a string, for now)
798 if (const auto *XRayAttr = D ? D->getAttr<XRayInstrumentAttr>() : nullptr) {
799 if (CGM.getCodeGenOpts().XRayInstrumentationBundle.has(
800 XRayInstrKind::FunctionEntry) ||
801 CGM.getCodeGenOpts().XRayInstrumentationBundle.has(
802 XRayInstrKind::FunctionExit)) {
803 if (XRayAttr->alwaysXRayInstrument() && ShouldXRayInstrumentFunction())
804 Fn->addFnAttr("function-instrument", "xray-always");
805 if (XRayAttr->neverXRayInstrument())
806 Fn->addFnAttr("function-instrument", "xray-never");
807 if (const auto *LogArgs = D->getAttr<XRayLogArgsAttr>())
808 if (ShouldXRayInstrumentFunction())
809 Fn->addFnAttr("xray-log-args",
810 llvm::utostr(LogArgs->getArgumentCount()));
Ian Levesque14f87032020-02-11 13:52:45 -0800811 }
Ian Levesquebb3111c2020-03-31 22:07:27 -0400812 } else {
813 if (ShouldXRayInstrumentFunction() && !CGM.imbueXRayAttrs(Fn, Loc))
814 Fn->addFnAttr(
815 "xray-instruction-threshold",
816 llvm::itostr(CGM.getCodeGenOpts().XRayInstructionThreshold));
817 }
Ian Levesque14f87032020-02-11 13:52:45 -0800818
Ian Levesquebb3111c2020-03-31 22:07:27 -0400819 if (ShouldXRayInstrumentFunction()) {
820 if (CGM.getCodeGenOpts().XRayIgnoreLoops)
821 Fn->addFnAttr("xray-ignore-loops");
Ian Levesque14f87032020-02-11 13:52:45 -0800822
Ian Levesquebb3111c2020-03-31 22:07:27 -0400823 if (!CGM.getCodeGenOpts().XRayInstrumentationBundle.has(
824 XRayInstrKind::FunctionExit))
825 Fn->addFnAttr("xray-skip-exit");
Ian Levesque14f87032020-02-11 13:52:45 -0800826
Ian Levesquebb3111c2020-03-31 22:07:27 -0400827 if (!CGM.getCodeGenOpts().XRayInstrumentationBundle.has(
828 XRayInstrKind::FunctionEntry))
829 Fn->addFnAttr("xray-skip-entry");
830 }
Fangrui Songa44c4342020-01-04 15:39:19 -0800831
Ian Levesquebb3111c2020-03-31 22:07:27 -0400832 unsigned Count, Offset;
833 if (const auto *Attr =
834 D ? D->getAttr<PatchableFunctionEntryAttr>() : nullptr) {
835 Count = Attr->getCount();
836 Offset = Attr->getOffset();
837 } else {
838 Count = CGM.getCodeGenOpts().PatchableFunctionEntryCount;
839 Offset = CGM.getCodeGenOpts().PatchableFunctionEntryOffset;
840 }
841 if (Count && Offset <= Count) {
842 Fn->addFnAttr("patchable-function-entry", std::to_string(Count - Offset));
843 if (Offset)
844 Fn->addFnAttr("patchable-function-prefix", std::to_string(Offset));
Aaron Ballman7d2aecb2016-07-13 22:32:15 +0000845 }
846
Nirav Daved2f44d82016-04-05 17:50:43 +0000847 // Add no-jump-tables value.
848 Fn->addFnAttr("no-jump-tables",
849 llvm::toStringRef(CGM.getCodeGenOpts().NoUseJumpTables));
850
Amy Huangab76cfd2019-10-31 09:15:53 -0700851 // Add no-inline-line-tables value.
852 if (CGM.getCodeGenOpts().NoInlineLineTables)
853 Fn->addFnAttr("no-inline-line-tables");
854
Dehao Chen5e97f232017-08-24 21:37:33 +0000855 // Add profile-sample-accurate value.
856 if (CGM.getCodeGenOpts().ProfileSampleAccurate)
857 Fn->addFnAttr("profile-sample-accurate");
858
Peter Collingbourne0e497d12019-08-09 22:31:59 +0000859 if (D && D->hasAttr<CFICanonicalJumpTableAttr>())
860 Fn->addFnAttr("cfi-canonical-jump-table");
861
Richard Smith9c6890a2012-11-01 22:30:59 +0000862 if (getLangOpts().OpenCL) {
Peter Collingbourne7ce13fc2011-02-14 01:42:53 +0000863 // Add metadata for a kernel function.
864 if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D))
Tanya Lattnerbcffcdf2012-07-09 22:06:01 +0000865 EmitOpenCLKernelMetadata(FD, Fn);
Peter Collingbourne7ce13fc2011-02-14 01:42:53 +0000866 }
867
Peter Collingbourneb453cd62013-10-20 21:29:19 +0000868 // If we are checking function types, emit a function type signature as
Peter Collingbourne1a0a9a32014-12-03 02:08:51 +0000869 // prologue data.
Alexey Samsonovedf99a92014-11-07 22:29:38 +0000870 if (getLangOpts().CPlusPlus && SanOpts.has(SanitizerKind::Function)) {
Peter Collingbourneb453cd62013-10-20 21:29:19 +0000871 if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D)) {
Vedant Kumaraa4ea5f2017-10-14 01:23:30 +0000872 if (llvm::Constant *PrologueSig = getPrologueSignature(CGM, FD)) {
Stephan Bergmann8c85bca2018-01-05 07:57:12 +0000873 // Remove any (C++17) exception specifications, to allow calling e.g. a
874 // noexcept function through a non-noexcept pointer.
875 auto ProtoTy =
876 getContext().getFunctionTypeWithExceptionSpec(FD->getType(),
877 EST_None);
Peter Collingbourneb453cd62013-10-20 21:29:19 +0000878 llvm::Constant *FTRTTIConst =
Stephan Bergmann8c85bca2018-01-05 07:57:12 +0000879 CGM.GetAddrOfRTTIDescriptor(ProtoTy, /*ForEH=*/true);
Vedant Kumarbb5d4852017-09-13 00:04:35 +0000880 llvm::Constant *FTRTTIConstEncoded =
881 EncodeAddrForUseInPrologue(Fn, FTRTTIConst);
882 llvm::Constant *PrologueStructElems[] = {PrologueSig,
883 FTRTTIConstEncoded};
Peter Collingbourne1a0a9a32014-12-03 02:08:51 +0000884 llvm::Constant *PrologueStructConst =
885 llvm::ConstantStruct::getAnon(PrologueStructElems, /*Packed=*/true);
886 Fn->setPrologueData(PrologueStructConst);
Peter Collingbourneb453cd62013-10-20 21:29:19 +0000887 }
888 }
889 }
890
Vedant Kumar42c17ec2017-03-14 01:56:34 +0000891 // If we're checking nullability, we need to know whether we can check the
892 // return value. Initialize the flag to 'true' and refine it in EmitParmDecl.
893 if (SanOpts.has(SanitizerKind::NullabilityReturn)) {
894 auto Nullability = FnRetTy->getNullability(getContext());
895 if (Nullability && *Nullability == NullabilityKind::NonNull) {
896 if (!(SanOpts.has(SanitizerKind::ReturnsNonnullAttribute) &&
897 CurCodeDecl && CurCodeDecl->getAttr<ReturnsNonNullAttr>()))
898 RetValNullabilityPrecondition =
899 llvm::ConstantInt::getTrue(getLLVMContext());
900 }
901 }
902
James Molloyc16a60b62015-11-12 15:36:04 +0000903 // If we're in C++ mode and the function name is "main", it is guaranteed
904 // to be norecurse by the standard (3.6.1.3 "The function main shall not be
905 // used within a program").
Yaxun (Sam) Liufb44b9d2020-01-29 14:11:37 -0500906 //
907 // OpenCL C 2.0 v2.2-11 s6.9.i:
908 // Recursion is not supported.
909 //
910 // SYCL v1.2.1 s3.10:
911 // kernels cannot include RTTI information, exception classes,
912 // recursive code, virtual functions or make use of C++ libraries that
913 // are not compiled for the device.
914 if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D)) {
915 if ((getLangOpts().CPlusPlus && FD->isMain()) || getLangOpts().OpenCL ||
916 getLangOpts().SYCLIsDevice ||
917 (getLangOpts().CUDA && FD->hasAttr<CUDAGlobalAttr>()))
918 Fn->addFnAttr(llvm::Attribute::NoRecurse);
919 }
Honggyu Kim2bbdeac2016-09-01 06:14:45 +0000920
Melanie Blower7f9b5132019-12-04 12:23:46 -0800921 if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D))
922 if (FD->usesFPIntrin())
923 Fn->addFnAttr(llvm::Attribute::StrictFP);
924
Martin Storsjod39d53b2018-08-21 20:41:17 +0000925 // If a custom alignment is used, force realigning to this alignment on
926 // any main function which certainly will need it.
927 if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D))
928 if ((FD->isMain() || FD->isMSVCRTEntryPoint()) &&
929 CGM.getCodeGenOpts().StackAlignment)
930 Fn->addFnAttr("stackrealign");
931
Daniel Dunbar75283ff2008-11-11 02:29:29 +0000932 llvm::BasicBlock *EntryBB = createBasicBlock("entry", CurFn);
Daniel Dunbar54bb1932008-09-09 21:00:17 +0000933
Chris Lattner5696e7b2008-06-17 18:05:57 +0000934 // Create a marker to make it easy to insert allocas into the entryblock
935 // later. Don't create this with the builder, because we don't want it
936 // folded.
Chris Lattner5e016ae2010-06-27 07:15:29 +0000937 llvm::Value *Undef = llvm::UndefValue::get(Int32Ty);
Mehdi Amini557c20a2016-03-13 21:05:23 +0000938 AllocaInsertPt = new llvm::BitCastInst(Undef, Int32Ty, "allocapt", EntryBB);
Mike Stump11289f42009-09-09 15:08:12 +0000939
John McCallbd309292010-07-06 01:34:17 +0000940 ReturnBlock = getJumpDestInCurrentScope("return");
Mike Stump11289f42009-09-09 15:08:12 +0000941
Chris Lattner5696e7b2008-06-17 18:05:57 +0000942 Builder.SetInsertPoint(EntryBB);
Mike Stump11289f42009-09-09 15:08:12 +0000943
Vedant Kumarc34d3432017-06-23 21:32:38 +0000944 // If we're checking the return value, allocate space for a pointer to a
945 // precise source location of the checked return statement.
946 if (requiresReturnValueCheck()) {
947 ReturnLocation = CreateDefaultAlignTempAlloca(Int8PtrTy, "return.sloc.ptr");
948 InitTempAlloca(ReturnLocation, llvm::ConstantPointerNull::get(Int8PtrTy));
949 }
950
Sanjiv Gupta1e8b6082008-07-04 11:04:26 +0000951 // Emit subprogram debug descriptor.
Anders Carlsson63784f42009-02-13 08:11:52 +0000952 if (CGDebugInfo *DI = getDebugInfo()) {
Reid Klecknerf00f8032016-06-08 20:41:54 +0000953 // Reconstruct the type from the argument list so that implicit parameters,
954 // such as 'this' and 'vtt', show up in the debug info. Preserve the calling
955 // convention.
956 CallingConv CC = CallingConv::CC_C;
957 if (auto *FD = dyn_cast_or_null<FunctionDecl>(D))
958 if (const auto *SrcFnTy = FD->getType()->getAs<FunctionType>())
959 CC = SrcFnTy->getCallConv();
Jordan Rose5c382722013-03-08 21:51:21 +0000960 SmallVector<QualType, 16> ArgTypes;
Reid Klecknerf00f8032016-06-08 20:41:54 +0000961 for (const VarDecl *VD : Args)
962 ArgTypes.push_back(VD->getType());
963 QualType FnType = getContext().getFunctionType(
964 RetTy, ArgTypes, FunctionProtoType::ExtProtoInfo(CC));
Brock Wyma94ece8f2018-04-16 16:53:57 +0000965 DI->EmitFunctionStart(GD, Loc, StartLoc, FnType, CurFn, CurFuncIsThunk,
966 Builder);
Sanjiv Gupta1e8b6082008-07-04 11:04:26 +0000967 }
968
Hans Wennborg76c26c12017-11-14 21:13:27 +0000969 if (ShouldInstrumentFunction()) {
Hans Wennborg14e8a5a2017-11-21 17:30:34 +0000970 if (CGM.getCodeGenOpts().InstrumentFunctions)
971 CurFn->addFnAttr("instrument-function-entry", "__cyg_profile_func_enter");
972 if (CGM.getCodeGenOpts().InstrumentFunctionsAfterInlining)
973 CurFn->addFnAttr("instrument-function-entry-inlined",
974 "__cyg_profile_func_enter");
975 if (CGM.getCodeGenOpts().InstrumentFunctionEntryBare)
976 CurFn->addFnAttr("instrument-function-entry-inlined",
977 "__cyg_profile_func_enter_bare");
Hans Wennborg76c26c12017-11-14 21:13:27 +0000978 }
Chris Lattner3c77a352010-06-22 00:03:40 +0000979
Honggyu Kim2b0e4242016-09-01 11:29:21 +0000980 // Since emitting the mcount call here impacts optimizations such as function
981 // inlining, we just add an attribute to insert a mcount call in backend.
982 // The attribute "counting-function" is set to mcount function name which is
983 // architecture dependent.
Nirav Dave0c86ccf2017-01-31 17:00:35 +0000984 if (CGM.getCodeGenOpts().InstrumentForProfiling) {
Manoj Gupta886b4502018-03-02 23:52:44 +0000985 // Calls to fentry/mcount should not be generated if function has
986 // the no_instrument_function attribute.
987 if (!CurFuncDecl || !CurFuncDecl->hasAttr<NoInstrumentFunctionAttr>()) {
988 if (CGM.getCodeGenOpts().CallFEntry)
989 Fn->addFnAttr("fentry-call", "true");
990 else {
Hans Wennborg76c26c12017-11-14 21:13:27 +0000991 Fn->addFnAttr("instrument-function-entry-inlined",
992 getTarget().getMCountName());
993 }
Jonas Paulsson93767142019-11-05 11:44:04 +0100994 if (CGM.getCodeGenOpts().MNopMCount) {
Jonas Paulsson93767142019-11-05 11:44:04 +0100995 if (!CGM.getCodeGenOpts().CallFEntry)
996 CGM.getDiags().Report(diag::err_opt_not_valid_without_opt)
997 << "-mnop-mcount" << "-mfentry";
Jonas Paulssonca520592019-12-18 10:12:41 -0800998 Fn->addFnAttr("mnop-mcount");
Jonas Paulsson93767142019-11-05 11:44:04 +0100999 }
Jonas Paulsson2520bef2019-12-17 12:00:43 -08001000
1001 if (CGM.getCodeGenOpts().RecordMCount) {
Jonas Paulsson2520bef2019-12-17 12:00:43 -08001002 if (!CGM.getCodeGenOpts().CallFEntry)
1003 CGM.getDiags().Report(diag::err_opt_not_valid_without_opt)
1004 << "-mrecord-mcount" << "-mfentry";
1005 Fn->addFnAttr("mrecord-mcount");
1006 }
Manoj Gupta162b40a2017-06-19 18:45:03 +00001007 }
Nirav Dave0c86ccf2017-01-31 17:00:35 +00001008 }
Roman Divacky178e01602011-02-10 16:52:03 +00001009
Jonas Paulsson599d1cc2019-12-12 21:40:26 +01001010 if (CGM.getCodeGenOpts().PackedStack) {
1011 if (getContext().getTargetInfo().getTriple().getArch() !=
1012 llvm::Triple::systemz)
1013 CGM.getDiags().Report(diag::err_opt_not_valid_on_target)
1014 << "-mpacked-stack";
1015 Fn->addFnAttr("packed-stack");
1016 }
1017
Eli Friedman4b1942c2009-12-04 02:43:40 +00001018 if (RetTy->isVoidType()) {
1019 // Void type; nothing to return.
John McCall7f416cc2015-09-08 08:05:57 +00001020 ReturnValue = Address::invalid();
Adrian Prantl2cede0f2014-04-29 01:07:59 +00001021
1022 // Count the implicit return.
1023 if (!endsWithReturn(D))
1024 ++NumReturnExprs;
Hans Wennborg86aba5e2018-12-07 08:17:26 +00001025 } else if (CurFnInfo->getReturnInfo().getKind() == ABIArgInfo::Indirect) {
1026 // Indirect return; emit returned value directly into sret slot.
Daniel Dunbarfd09df72010-02-16 19:45:20 +00001027 // This reduces code size, and affects correctness in C++.
Reid Kleckner37abaca2014-05-09 22:46:15 +00001028 auto AI = CurFn->arg_begin();
1029 if (CurFnInfo->getReturnInfo().isSRetAfterThis())
1030 ++AI;
Duncan P. N. Exon Smith9f5260a2015-11-06 23:00:41 +00001031 ReturnValue = Address(&*AI, CurFnInfo->getReturnInfo().getIndirectAlign());
Amy Huang7fac5c82019-06-20 17:15:21 +00001032 if (!CurFnInfo->getReturnInfo().getIndirectByVal()) {
1033 ReturnValuePointer =
1034 CreateDefaultAlignTempAlloca(Int8PtrTy, "result.ptr");
1035 Builder.CreateStore(Builder.CreatePointerBitCastOrAddrSpaceCast(
1036 ReturnValue.getPointer(), Int8PtrTy),
1037 ReturnValuePointer);
1038 }
Reid Kleckner314ef7b2014-02-01 00:04:45 +00001039 } else if (CurFnInfo->getReturnInfo().getKind() == ABIArgInfo::InAlloca &&
1040 !hasScalarEvaluationKind(CurFnInfo->getReturnType())) {
1041 // Load the sret pointer from the argument struct and return into that.
1042 unsigned Idx = CurFnInfo->getReturnInfo().getInAllocaFieldIndex();
1043 llvm::Function::arg_iterator EI = CurFn->arg_end();
1044 --EI;
Duncan P. N. Exon Smith9f5260a2015-11-06 23:00:41 +00001045 llvm::Value *Addr = Builder.CreateStructGEP(nullptr, &*EI, Idx);
Amy Huang7fac5c82019-06-20 17:15:21 +00001046 ReturnValuePointer = Address(Addr, getPointerAlign());
John McCall7f416cc2015-09-08 08:05:57 +00001047 Addr = Builder.CreateAlignedLoad(Addr, getPointerAlign(), "agg.result");
1048 ReturnValue = Address(Addr, getNaturalTypeAlignment(RetTy));
Eli Friedman4b1942c2009-12-04 02:43:40 +00001049 } else {
Daniel Dunbarfd09df72010-02-16 19:45:20 +00001050 ReturnValue = CreateIRTemp(RetTy, "retval");
John McCall31168b02011-06-15 23:02:42 +00001051
1052 // Tell the epilog emitter to autorelease the result. We do this
1053 // now so that various specialized functions can suppress it
1054 // during their IR-generation.
David Blaikiebbafb8a2012-03-11 07:00:24 +00001055 if (getLangOpts().ObjCAutoRefCount &&
John McCall31168b02011-06-15 23:02:42 +00001056 !CurFnInfo->isReturnsRetained() &&
1057 RetTy->isObjCRetainableType())
1058 AutoreleaseResult = true;
Eli Friedman4b1942c2009-12-04 02:43:40 +00001059 }
1060
Mike Stump1d849212009-12-07 23:38:24 +00001061 EmitStartEHSpec(CurCodeDecl);
John McCall31168b02011-06-15 23:02:42 +00001062
1063 PrologueCleanupDepth = EHStack.stable_begin();
Gheorghe-Teodor Bercead3dcf2f2018-03-14 14:17:45 +00001064
1065 // Emit OpenMP specific initialization of the device functions.
1066 if (getLangOpts().OpenMP && CurCodeDecl)
1067 CGM.getOpenMPRuntime().emitFunctionProlog(*this, CurCodeDecl);
1068
Daniel Dunbard931a872009-02-02 22:03:45 +00001069 EmitFunctionProlog(*CurFnInfo, CurFn, Args);
Mike Stump11289f42009-09-09 15:08:12 +00001070
Eli Friedman9fbeba02012-02-11 02:57:39 +00001071 if (D && isa<CXXMethodDecl>(D) && cast<CXXMethodDecl>(D)->isInstance()) {
John McCall5d865c322010-08-31 07:33:07 +00001072 CGM.getCXXABI().EmitInstanceFunctionProlog(*this);
Eli Friedman9fbeba02012-02-11 02:57:39 +00001073 const CXXMethodDecl *MD = cast<CXXMethodDecl>(D);
1074 if (MD->getParent()->isLambda() &&
1075 MD->getOverloadedOperator() == OO_Call) {
1076 // We're in a lambda; figure out the captures.
1077 MD->getParent()->getCaptureFields(LambdaCaptureFields,
1078 LambdaThisCaptureField);
1079 if (LambdaThisCaptureField) {
Faisal Validc6b5962016-03-21 09:25:37 +00001080 // If the lambda captures the object referred to by '*this' - either by
1081 // value or by reference, make sure CXXThisValue points to the correct
1082 // object.
1083
1084 // Get the lvalue for the field (which is a copy of the enclosing object
1085 // or contains the address of the enclosing object).
1086 LValue ThisFieldLValue = EmitLValueForLambdaField(LambdaThisCaptureField);
1087 if (!LambdaThisCaptureField->getType()->isPointerType()) {
1088 // If the enclosing object was captured by value, just use its address.
Akira Hatanakaf139ae32019-12-03 15:17:01 -08001089 CXXThisValue = ThisFieldLValue.getAddress(*this).getPointer();
Faisal Validc6b5962016-03-21 09:25:37 +00001090 } else {
1091 // Load the lvalue pointed to by the field, since '*this' was captured
1092 // by reference.
1093 CXXThisValue =
1094 EmitLoadOfLValue(ThisFieldLValue, SourceLocation()).getScalarVal();
1095 }
Eli Friedman9fbeba02012-02-11 02:57:39 +00001096 }
Alexey Bataev39c81e22014-08-28 04:28:19 +00001097 for (auto *FD : MD->getParent()->fields()) {
1098 if (FD->hasCapturedVLAType()) {
1099 auto *ExprArg = EmitLoadOfLValue(EmitLValueForLambdaField(FD),
1100 SourceLocation()).getScalarVal();
1101 auto VAT = FD->getCapturedVLAType();
1102 VLASizeMap[VAT->getSizeExpr()] = ExprArg;
1103 }
1104 }
Eli Friedman9fbeba02012-02-11 02:57:39 +00001105 } else {
1106 // Not in a lambda; just use 'this' from the method.
1107 // FIXME: Should we generate a new load for each use of 'this'? The
1108 // fast register allocator would be happier...
1109 CXXThisValue = CXXABIThisValue;
1110 }
Vedant Kumar34b1fd62017-02-17 23:22:59 +00001111
Vedant Kumarffd7c882017-04-14 22:03:34 +00001112 // Check the 'this' pointer once per function, if it's available.
Richard Smith376c28e2017-08-24 20:10:33 +00001113 if (CXXABIThisValue) {
Vedant Kumar34b1fd62017-02-17 23:22:59 +00001114 SanitizerSet SkippedChecks;
Vedant Kumar34b1fd62017-02-17 23:22:59 +00001115 SkippedChecks.set(SanitizerKind::ObjectSize, true);
Brian Gesiak5488ab42019-01-11 01:54:53 +00001116 QualType ThisTy = MD->getThisType();
Richard Smith376c28e2017-08-24 20:10:33 +00001117
1118 // If this is the call operator of a lambda with no capture-default, it
1119 // may have a static invoker function, which may call this operator with
1120 // a null 'this' pointer.
1121 if (isLambdaCallOperator(MD) &&
George Burgess IV00f70bd2018-03-01 05:43:23 +00001122 MD->getParent()->getLambdaCaptureDefault() == LCD_None)
Richard Smith376c28e2017-08-24 20:10:33 +00001123 SkippedChecks.set(SanitizerKind::Null, true);
1124
1125 EmitTypeCheck(isa<CXXConstructorDecl>(MD) ? TCK_ConstructorCall
1126 : TCK_MemberCall,
1127 Loc, CXXABIThisValue, ThisTy,
Vedant Kumarffd7c882017-04-14 22:03:34 +00001128 getContext().getTypeAlignInChars(ThisTy->getPointeeType()),
1129 SkippedChecks);
Vedant Kumar34b1fd62017-02-17 23:22:59 +00001130 }
Eli Friedman9fbeba02012-02-11 02:57:39 +00001131 }
John McCall347132b2010-02-16 22:04:33 +00001132
Anders Carlssonc20879a2008-12-20 21:28:43 +00001133 // If any of the arguments have a variably modified type, make sure to
1134 // emit the type size.
1135 for (FunctionArgList::const_iterator i = Args.begin(), e = Args.end();
1136 i != e; ++i) {
Eli Friedman1f576832012-11-14 22:09:59 +00001137 const VarDecl *VD = *i;
1138
1139 // Dig out the type as written from ParmVarDecls; it's unclear whether
1140 // the standard (C99 6.9.1p10) requires this, but we're following the
1141 // precedent set by gcc.
1142 QualType Ty;
1143 if (const ParmVarDecl *PVD = dyn_cast<ParmVarDecl>(VD))
1144 Ty = PVD->getOriginalType();
1145 else
1146 Ty = VD->getType();
Anders Carlssonc20879a2008-12-20 21:28:43 +00001147
1148 if (Ty->isVariablyModifiedType())
John McCall23c29fe2011-06-24 21:55:10 +00001149 EmitVariablyModifiedType(Ty);
Anders Carlssonc20879a2008-12-20 21:28:43 +00001150 }
Eric Christopher7cdf9482011-10-13 21:45:18 +00001151 // Emit a location at the end of the prologue.
1152 if (CGDebugInfo *DI = getDebugInfo())
Calixte Denizetfcd661d2018-09-24 18:24:18 +00001153 DI->EmitLocation(Builder, StartLoc);
Craig Topper74c10e32018-07-09 19:00:16 +00001154
1155 // TODO: Do we need to handle this in two places like we do with
1156 // target-features/target-cpu?
1157 if (CurFuncDecl)
1158 if (const auto *VecWidth = CurFuncDecl->getAttr<MinVectorWidthAttr>())
1159 LargestVectorWidth = VecWidth->getVectorWidth();
Daniel Dunbarbc915f42008-09-09 23:14:03 +00001160}
Eli Friedman3d421e12008-08-25 21:31:01 +00001161
Reid Kleckner43071082018-12-13 01:33:20 +00001162void CodeGenFunction::EmitFunctionBody(const Stmt *Body) {
Justin Bogner66242d62015-04-23 23:06:47 +00001163 incrementProfileCounter(Body);
Richard Smithb47c36f2013-11-05 09:12:18 +00001164 if (const CompoundStmt *S = dyn_cast<CompoundStmt>(Body))
David Blaikie0a21d0d2013-01-26 22:16:26 +00001165 EmitCompoundStmtWithoutScope(*S);
1166 else
Richard Smithb47c36f2013-11-05 09:12:18 +00001167 EmitStmt(Body);
John McCall89b12b32010-02-18 03:17:58 +00001168}
1169
Bob Wilsonbf854f02014-02-17 19:21:09 +00001170/// When instrumenting to collect profile data, the counts for some blocks
1171/// such as switch cases need to not include the fall-through counts, so
1172/// emit a branch around the instrumentation code. When not instrumenting,
1173/// this just calls EmitBlock().
1174void CodeGenFunction::EmitBlockWithFallThrough(llvm::BasicBlock *BB,
Justin Bogner66242d62015-04-23 23:06:47 +00001175 const Stmt *S) {
Craig Topper8a13c412014-05-21 05:09:00 +00001176 llvm::BasicBlock *SkipCountBB = nullptr;
Rong Xu9837ef52016-02-04 18:39:09 +00001177 if (HaveInsertPoint() && CGM.getCodeGenOpts().hasProfileClangInstr()) {
Bob Wilsonbf854f02014-02-17 19:21:09 +00001178 // When instrumenting for profiling, the fallthrough to certain
1179 // statements needs to skip over the instrumentation code so that we
1180 // get an accurate count.
1181 SkipCountBB = createBasicBlock("skipcount");
1182 EmitBranch(SkipCountBB);
1183 }
1184 EmitBlock(BB);
Justin Bogner66242d62015-04-23 23:06:47 +00001185 uint64_t CurrentCount = getCurrentProfileCount();
1186 incrementProfileCounter(S);
1187 setCurrentProfileCount(getCurrentProfileCount() + CurrentCount);
Bob Wilsonbf854f02014-02-17 19:21:09 +00001188 if (SkipCountBB)
1189 EmitBlock(SkipCountBB);
1190}
1191
John McCall8601a752010-08-03 22:46:07 +00001192/// Tries to mark the given function nounwind based on the
1193/// non-existence of any throwing calls within it. We believe this is
1194/// lightweight enough to do at -O0.
1195static void TryMarkNoThrow(llvm::Function *F) {
John McCall59966992010-08-11 22:38:33 +00001196 // LLVM treats 'nounwind' on a function as part of the type, so we
1197 // can't do this on functions that can be overwritten.
Sanjoy Dasf60a0d72016-04-08 01:31:02 +00001198 if (F->isInterposable()) return;
John McCall59966992010-08-11 22:38:33 +00001199
David Majnemerdbf10452015-07-31 17:58:45 +00001200 for (llvm::BasicBlock &BB : *F)
1201 for (llvm::Instruction &I : BB)
1202 if (I.mayThrow())
Bill Wendlingf0724e82011-09-19 20:31:14 +00001203 return;
David Majnemerdbf10452015-07-31 17:58:45 +00001204
Bill Wendling73e465e2012-10-10 03:13:20 +00001205 F->setDoesNotThrow();
John McCall8601a752010-08-03 22:46:07 +00001206}
1207
Richard Smith5179eb72016-06-28 19:03:57 +00001208QualType CodeGenFunction::BuildFunctionArgList(GlobalDecl GD,
1209 FunctionArgList &Args) {
Anders Carlsson73fcc952009-09-11 00:07:24 +00001210 const FunctionDecl *FD = cast<FunctionDecl>(GD.getDecl());
Alp Toker314cc812014-01-25 16:55:45 +00001211 QualType ResTy = FD->getReturnType();
Mike Stump11289f42009-09-09 15:08:12 +00001212
Reid Kleckner89077a12013-12-17 19:46:40 +00001213 const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD);
1214 if (MD && MD->isInstance()) {
Stephen Lin9dc6eef2013-06-30 20:40:16 +00001215 if (CGM.getCXXABI().HasThisReturn(GD))
Brian Gesiak5488ab42019-01-11 01:54:53 +00001216 ResTy = MD->getThisType();
David Majnemer0c0b6d92014-10-31 20:09:12 +00001217 else if (CGM.getCXXABI().hasMostDerivedReturn(GD))
1218 ResTy = CGM.getContext().VoidPtrTy;
Reid Kleckner89077a12013-12-17 19:46:40 +00001219 CGM.getCXXABI().buildThisParam(*this, Args);
Stephen Lin9dc6eef2013-06-30 20:40:16 +00001220 }
Justin Bogner66242d62015-04-23 23:06:47 +00001221
Richard Smith5179eb72016-06-28 19:03:57 +00001222 // The base version of an inheriting constructor whose constructed base is a
1223 // virtual base is not passed any arguments (because it doesn't actually call
1224 // the inherited constructor).
1225 bool PassedParams = true;
1226 if (const CXXConstructorDecl *CD = dyn_cast<CXXConstructorDecl>(FD))
1227 if (auto Inherited = CD->getInheritedConstructor())
1228 PassedParams =
1229 getTypes().inheritingCtorHasParams(Inherited, GD.getCtorType());
George Burgess IV3e3bb95b2015-12-02 21:58:08 +00001230
Richard Smith5179eb72016-06-28 19:03:57 +00001231 if (PassedParams) {
1232 for (auto *Param : FD->parameters()) {
1233 Args.push_back(Param);
1234 if (!Param->hasAttr<PassObjectSizeAttr>())
1235 continue;
1236
Richard Smith5179eb72016-06-28 19:03:57 +00001237 auto *Implicit = ImplicitParamDecl::Create(
Alexey Bataev56223232017-06-09 13:40:18 +00001238 getContext(), Param->getDeclContext(), Param->getLocation(),
1239 /*Id=*/nullptr, getContext().getSizeType(), ImplicitParamDecl::Other);
Richard Smith5179eb72016-06-28 19:03:57 +00001240 SizeArguments[Param] = Implicit;
1241 Args.push_back(Implicit);
1242 }
George Burgess IV3e3bb95b2015-12-02 21:58:08 +00001243 }
Daniel Dunbar89654ee2008-08-26 08:29:31 +00001244
Reid Kleckner89077a12013-12-17 19:46:40 +00001245 if (MD && (isa<CXXConstructorDecl>(MD) || isa<CXXDestructorDecl>(MD)))
1246 CGM.getCXXABI().addImplicitStructorParams(*this, ResTy, Args);
1247
Richard Smith5179eb72016-06-28 19:03:57 +00001248 return ResTy;
1249}
1250
Alex Lorenzc1608f72017-01-04 13:40:34 +00001251static bool
1252shouldUseUndefinedBehaviorReturnOptimization(const FunctionDecl *FD,
1253 const ASTContext &Context) {
1254 QualType T = FD->getReturnType();
1255 // Avoid the optimization for functions that return a record type with a
1256 // trivial destructor or another trivially copyable type.
1257 if (const RecordType *RT = T.getCanonicalType()->getAs<RecordType>()) {
1258 if (const auto *ClassDecl = dyn_cast<CXXRecordDecl>(RT->getDecl()))
1259 return !ClassDecl->hasTrivialDestructor();
1260 }
1261 return !T.isTriviallyCopyableType(Context);
1262}
1263
Richard Smith5179eb72016-06-28 19:03:57 +00001264void CodeGenFunction::GenerateCode(GlobalDecl GD, llvm::Function *Fn,
1265 const CGFunctionInfo &FnInfo) {
1266 const FunctionDecl *FD = cast<FunctionDecl>(GD.getDecl());
1267 CurGD = GD;
1268
1269 FunctionArgList Args;
1270 QualType ResTy = BuildFunctionArgList(GD, Args);
1271
1272 // Check if we should generate debug info for this function.
1273 if (FD->hasAttr<NoDebugAttr>())
1274 DebugInfo = nullptr; // disable debug info indefinitely for this function
1275
Reid Klecknera8589812017-02-08 16:09:32 +00001276 // The function might not have a body if we're generating thunks for a
1277 // function declaration.
John McCall89b12b32010-02-18 03:17:58 +00001278 SourceRange BodyRange;
Reid Klecknera8589812017-02-08 16:09:32 +00001279 if (Stmt *Body = FD->getBody())
1280 BodyRange = Body->getSourceRange();
1281 else
1282 BodyRange = FD->getLocation();
Adrian Prantldc237b52013-05-16 00:41:26 +00001283 CurEHLocation = BodyRange.getEnd();
Anders Carlsson438cf922009-11-06 02:55:43 +00001284
Adrian Prantl42d71b92014-04-10 23:21:53 +00001285 // Use the location of the start of the function to determine where
1286 // the function definition is located. By default use the location
1287 // of the declaration as the location for the subprogram. A function
1288 // may lack a declaration in the source code if it is created by code
1289 // gen. (examples: _GLOBAL__I_a, __cxx_global_array_dtor, thunk).
Alexey Samsonovcb1ad6f2014-07-08 20:23:18 +00001290 SourceLocation Loc = FD->getLocation();
Adrian Prantl42d71b92014-04-10 23:21:53 +00001291
Alexey Samsonovcb1ad6f2014-07-08 20:23:18 +00001292 // If this is a function specialization then use the pattern body
1293 // as the location for the function.
1294 if (const FunctionDecl *SpecDecl = FD->getTemplateInstantiationPattern())
1295 if (SpecDecl->hasBody(SpecDecl))
1296 Loc = SpecDecl->getLocation();
Adrian Prantl42d71b92014-04-10 23:21:53 +00001297
Vitaly Buka64c80b42016-10-26 05:42:30 +00001298 Stmt *Body = FD->getBody();
1299
1300 // Initialize helper which will detect jumps which can cause invalid lifetime
1301 // markers.
1302 if (Body && ShouldEmitLifetimeMarkers)
1303 Bypasses.Init(Body);
1304
John McCall89b12b32010-02-18 03:17:58 +00001305 // Emit the standard function prologue.
Adrian Prantl42d71b92014-04-10 23:21:53 +00001306 StartFunction(GD, ResTy, Fn, FnInfo, Args, Loc, BodyRange.getBegin());
Anders Carlsson438cf922009-11-06 02:55:43 +00001307
John McCall89b12b32010-02-18 03:17:58 +00001308 // Generate the body of the function.
Serge Pavlov3a561452015-12-06 14:32:39 +00001309 PGO.assignRegionCounters(GD, CurFn);
John McCallb81884d2010-02-19 09:25:03 +00001310 if (isa<CXXDestructorDecl>(FD))
1311 EmitDestructorBody(Args);
1312 else if (isa<CXXConstructorDecl>(FD))
1313 EmitConstructorBody(Args);
Richard Smith9c6890a2012-11-01 22:30:59 +00001314 else if (getLangOpts().CUDA &&
Artem Belevichf3d3db62015-03-19 18:58:18 +00001315 !getLangOpts().CUDAIsDevice &&
Peter Collingbournefa4d6032011-10-06 18:51:56 +00001316 FD->hasAttr<CUDAGlobalAttr>())
Artem Belevich52cc4872015-05-07 19:34:16 +00001317 CGM.getCUDARuntime().emitDeviceStub(*this, Args);
Reid Kleckner2d3c4212017-08-04 22:38:06 +00001318 else if (isa<CXXMethodDecl>(FD) &&
1319 cast<CXXMethodDecl>(FD)->isLambdaStaticInvoker()) {
Faisal Vali2b391ab2013-09-26 19:54:12 +00001320 // The lambda static invoker function is special, because it forwards or
Douglas Gregor355efbb2012-02-17 03:02:34 +00001321 // clones the body of the function call operator (but is actually static).
Reid Kleckner2d3c4212017-08-04 22:38:06 +00001322 EmitLambdaStaticInvokeBody(cast<CXXMethodDecl>(FD));
Lang Hamesbf122742013-02-17 07:22:09 +00001323 } else if (FD->isDefaulted() && isa<CXXMethodDecl>(FD) &&
Nick Lewyckyb39be1f2013-09-10 05:14:39 +00001324 (cast<CXXMethodDecl>(FD)->isCopyAssignmentOperator() ||
1325 cast<CXXMethodDecl>(FD)->isMoveAssignmentOperator())) {
Lang Hamesbf122742013-02-17 07:22:09 +00001326 // Implicit copy-assignment gets the same special treatment as implicit
1327 // copy-constructors.
1328 emitImplicitAssignmentOperatorBody(Args);
Vitaly Buka64c80b42016-10-26 05:42:30 +00001329 } else if (Body) {
Reid Kleckner43071082018-12-13 01:33:20 +00001330 EmitFunctionBody(Body);
Richard Smithb47c36f2013-11-05 09:12:18 +00001331 } else
1332 llvm_unreachable("no definition for emitted function");
Anders Carlssonff8cce42010-02-07 19:45:40 +00001333
Richard Smith9f9e5822012-10-04 23:52:29 +00001334 // C++11 [stmt.return]p2:
1335 // Flowing off the end of a function [...] results in undefined behavior in
1336 // a value-returning function.
1337 // C11 6.9.1p12:
1338 // If the '}' that terminates a function is reached, and the value of the
1339 // function call is used by the caller, the behavior is undefined.
Reid Kleckner9b3e3df2014-09-04 20:04:38 +00001340 if (getLangOpts().CPlusPlus && !FD->hasImplicitReturnZero() && !SawAsmBlock &&
Alp Toker314cc812014-01-25 16:55:45 +00001341 !FD->getReturnType()->isVoidType() && Builder.GetInsertBlock()) {
Alex Lorenzc1608f72017-01-04 13:40:34 +00001342 bool ShouldEmitUnreachable =
1343 CGM.getCodeGenOpts().StrictReturn ||
1344 shouldUseUndefinedBehaviorReturnOptimization(FD, getContext());
Alexey Samsonovedf99a92014-11-07 22:29:38 +00001345 if (SanOpts.has(SanitizerKind::Return)) {
Alexey Samsonov24cad992014-07-17 18:46:27 +00001346 SanitizerScope SanScope(this);
Alexey Samsonove396bfc2014-11-11 22:03:54 +00001347 llvm::Value *IsFalse = Builder.getFalse();
1348 EmitCheck(std::make_pair(IsFalse, SanitizerKind::Return),
Filipe Cabecinhas322ecd92016-12-12 16:18:40 +00001349 SanitizerHandler::MissingReturn,
1350 EmitCheckSourceLocation(FD->getLocation()), None);
Alex Lorenzc1608f72017-01-04 13:40:34 +00001351 } else if (ShouldEmitUnreachable) {
1352 if (CGM.getCodeGenOpts().OptimizationLevel == 0)
1353 EmitTrapCall(llvm::Intrinsic::trap);
Akira Hatanaka85365cd2015-07-02 22:15:41 +00001354 }
Alex Lorenzc1608f72017-01-04 13:40:34 +00001355 if (SanOpts.has(SanitizerKind::Return) || ShouldEmitUnreachable) {
1356 Builder.CreateUnreachable();
1357 Builder.ClearInsertionPoint();
1358 }
Richard Smith9f9e5822012-10-04 23:52:29 +00001359 }
1360
John McCall89b12b32010-02-18 03:17:58 +00001361 // Emit the standard function epilogue.
1362 FinishFunction(BodyRange.getEnd());
John McCall8601a752010-08-03 22:46:07 +00001363
1364 // If we haven't marked the function nothrow through other means, do
1365 // a quick pass now to see if we can.
1366 if (!CurFn->doesNotThrow())
1367 TryMarkNoThrow(CurFn);
Chris Lattner5696e7b2008-06-17 18:05:57 +00001368}
1369
Chris Lattner5b1964b2008-11-11 07:41:27 +00001370/// ContainsLabel - Return true if the statement contains a label in it. If
1371/// this statement is not executed normally, it not containing a label means
1372/// that we can just remove the code.
1373bool CodeGenFunction::ContainsLabel(const Stmt *S, bool IgnoreCaseStmts) {
1374 // Null statement, not a label!
Craig Topper8a13c412014-05-21 05:09:00 +00001375 if (!S) return false;
Mike Stump11289f42009-09-09 15:08:12 +00001376
Chris Lattner5b1964b2008-11-11 07:41:27 +00001377 // If this is a label, we have to emit the code, consider something like:
1378 // if (0) { ... foo: bar(); } goto foo;
Chris Lattner29911cc2011-02-28 00:18:40 +00001379 //
1380 // TODO: If anyone cared, we could track __label__'s, since we know that you
1381 // can't jump to one from outside their declared region.
Chris Lattner5b1964b2008-11-11 07:41:27 +00001382 if (isa<LabelStmt>(S))
1383 return true;
Michael Ilseman686240a2012-12-04 00:29:55 +00001384
Chris Lattner5b1964b2008-11-11 07:41:27 +00001385 // If this is a case/default statement, and we haven't seen a switch, we have
1386 // to emit the code.
1387 if (isa<SwitchCase>(S) && !IgnoreCaseStmts)
1388 return true;
Mike Stump11289f42009-09-09 15:08:12 +00001389
Chris Lattner5b1964b2008-11-11 07:41:27 +00001390 // If this is a switch statement, we want to ignore cases below it.
1391 if (isa<SwitchStmt>(S))
1392 IgnoreCaseStmts = true;
Mike Stump11289f42009-09-09 15:08:12 +00001393
Chris Lattner5b1964b2008-11-11 07:41:27 +00001394 // Scan subexpressions for verboten labels.
Benjamin Kramer642f1732015-07-02 21:03:14 +00001395 for (const Stmt *SubStmt : S->children())
1396 if (ContainsLabel(SubStmt, IgnoreCaseStmts))
Chris Lattner5b1964b2008-11-11 07:41:27 +00001397 return true;
Mike Stump11289f42009-09-09 15:08:12 +00001398
Chris Lattner5b1964b2008-11-11 07:41:27 +00001399 return false;
1400}
1401
Chris Lattner29911cc2011-02-28 00:18:40 +00001402/// containsBreak - Return true if the statement contains a break out of it.
1403/// If the statement (recursively) contains a switch or loop with a break
1404/// inside of it, this is fine.
1405bool CodeGenFunction::containsBreak(const Stmt *S) {
1406 // Null statement, not a label!
Craig Topper8a13c412014-05-21 05:09:00 +00001407 if (!S) return false;
Chris Lattner29911cc2011-02-28 00:18:40 +00001408
1409 // If this is a switch or loop that defines its own break scope, then we can
1410 // include it and anything inside of it.
1411 if (isa<SwitchStmt>(S) || isa<WhileStmt>(S) || isa<DoStmt>(S) ||
1412 isa<ForStmt>(S))
Chris Lattner30db8282011-02-28 00:42:31 +00001413 return false;
Michael Ilseman686240a2012-12-04 00:29:55 +00001414
Chris Lattner30db8282011-02-28 00:42:31 +00001415 if (isa<BreakStmt>(S))
Chris Lattner29911cc2011-02-28 00:18:40 +00001416 return true;
Michael Ilseman686240a2012-12-04 00:29:55 +00001417
Chris Lattner29911cc2011-02-28 00:18:40 +00001418 // Scan subexpressions for verboten breaks.
Benjamin Kramer642f1732015-07-02 21:03:14 +00001419 for (const Stmt *SubStmt : S->children())
1420 if (containsBreak(SubStmt))
Chris Lattner29911cc2011-02-28 00:18:40 +00001421 return true;
Michael Ilseman686240a2012-12-04 00:29:55 +00001422
Chris Lattner29911cc2011-02-28 00:18:40 +00001423 return false;
1424}
1425
Richard Smithd8e3ac32016-09-16 23:30:39 +00001426bool CodeGenFunction::mightAddDeclToScope(const Stmt *S) {
1427 if (!S) return false;
1428
1429 // Some statement kinds add a scope and thus never add a decl to the current
1430 // scope. Note, this list is longer than the list of statements that might
1431 // have an unscoped decl nested within them, but this way is conservatively
1432 // correct even if more statement kinds are added.
1433 if (isa<IfStmt>(S) || isa<SwitchStmt>(S) || isa<WhileStmt>(S) ||
1434 isa<DoStmt>(S) || isa<ForStmt>(S) || isa<CompoundStmt>(S) ||
1435 isa<CXXForRangeStmt>(S) || isa<CXXTryStmt>(S) ||
1436 isa<ObjCForCollectionStmt>(S) || isa<ObjCAtTryStmt>(S))
1437 return false;
1438
1439 if (isa<DeclStmt>(S))
1440 return true;
1441
1442 for (const Stmt *SubStmt : S->children())
1443 if (mightAddDeclToScope(SubStmt))
1444 return true;
1445
1446 return false;
1447}
Chris Lattnercd439292008-11-12 08:04:58 +00001448
Chris Lattner41c6ab52011-02-27 23:02:32 +00001449/// ConstantFoldsToSimpleInteger - If the specified expression does not fold
1450/// to a constant, or if it does but contains a label, return false. If it
1451/// constant folds return true and set the boolean result in Result.
1452bool CodeGenFunction::ConstantFoldsToSimpleInteger(const Expr *Cond,
Richard Smithb130fe72016-06-23 19:16:49 +00001453 bool &ResultBool,
1454 bool AllowLabels) {
Richard Trieuc320c742012-07-23 20:21:35 +00001455 llvm::APSInt ResultInt;
Richard Smithb130fe72016-06-23 19:16:49 +00001456 if (!ConstantFoldsToSimpleInteger(Cond, ResultInt, AllowLabels))
Chris Lattner29911cc2011-02-28 00:18:40 +00001457 return false;
Michael Ilseman686240a2012-12-04 00:29:55 +00001458
Chris Lattner29911cc2011-02-28 00:18:40 +00001459 ResultBool = ResultInt.getBoolValue();
1460 return true;
1461}
1462
1463/// ConstantFoldsToSimpleInteger - If the specified expression does not fold
1464/// to a constant, or if it does but contains a label, return false. If it
1465/// constant folds return true and set the folded value.
Richard Smithb130fe72016-06-23 19:16:49 +00001466bool CodeGenFunction::ConstantFoldsToSimpleInteger(const Expr *Cond,
1467 llvm::APSInt &ResultInt,
1468 bool AllowLabels) {
Daniel Dunbarf32443c2008-11-12 22:37:10 +00001469 // FIXME: Rename and handle conversion of other evaluatable things
1470 // to bool.
Fangrui Song407659a2018-11-30 23:41:18 +00001471 Expr::EvalResult Result;
1472 if (!Cond->EvaluateAsInt(Result, getContext()))
Chris Lattner41c6ab52011-02-27 23:02:32 +00001473 return false; // Not foldable, not integer or not fully evaluatable.
Richard Smith5fab0c92011-12-28 19:48:30 +00001474
Fangrui Song407659a2018-11-30 23:41:18 +00001475 llvm::APSInt Int = Result.Val.getInt();
Richard Smithb130fe72016-06-23 19:16:49 +00001476 if (!AllowLabels && CodeGenFunction::ContainsLabel(Cond))
Chris Lattner41c6ab52011-02-27 23:02:32 +00001477 return false; // Contains a label.
Richard Smith5fab0c92011-12-28 19:48:30 +00001478
1479 ResultInt = Int;
Chris Lattner41c6ab52011-02-27 23:02:32 +00001480 return true;
Chris Lattnercd439292008-11-12 08:04:58 +00001481}
1482
1483
Chris Lattner29911cc2011-02-28 00:18:40 +00001484
Chris Lattnercd439292008-11-12 08:04:58 +00001485/// EmitBranchOnBoolExpr - Emit a branch on a boolean condition (e.g. for an if
1486/// statement) to the specified blocks. Based on the condition, this might try
1487/// to simplify the codegen of the conditional based on the branch.
1488///
1489void CodeGenFunction::EmitBranchOnBoolExpr(const Expr *Cond,
1490 llvm::BasicBlock *TrueBlock,
Justin Bogneref512b92014-01-06 22:27:43 +00001491 llvm::BasicBlock *FalseBlock,
1492 uint64_t TrueCount) {
Peter Collingbourne91147592011-04-15 00:35:48 +00001493 Cond = Cond->IgnoreParens();
Mike Stump11289f42009-09-09 15:08:12 +00001494
Chris Lattnercd439292008-11-12 08:04:58 +00001495 if (const BinaryOperator *CondBOp = dyn_cast<BinaryOperator>(Cond)) {
Justin Bogneref512b92014-01-06 22:27:43 +00001496
Chris Lattnercd439292008-11-12 08:04:58 +00001497 // Handle X && Y in a condition.
John McCalle3027922010-08-25 11:45:40 +00001498 if (CondBOp->getOpcode() == BO_LAnd) {
Chris Lattnercd439292008-11-12 08:04:58 +00001499 // If we have "1 && X", simplify the code. "0 && X" would have constant
1500 // folded if the case was simple enough.
Bill Wendling6c9540e2011-03-04 21:46:03 +00001501 bool ConstantBool = false;
Chris Lattner41c6ab52011-02-27 23:02:32 +00001502 if (ConstantFoldsToSimpleInteger(CondBOp->getLHS(), ConstantBool) &&
1503 ConstantBool) {
Chris Lattnercd439292008-11-12 08:04:58 +00001504 // br(1 && X) -> br(X).
Justin Bogner66242d62015-04-23 23:06:47 +00001505 incrementProfileCounter(CondBOp);
Justin Bogneref512b92014-01-06 22:27:43 +00001506 return EmitBranchOnBoolExpr(CondBOp->getRHS(), TrueBlock, FalseBlock,
1507 TrueCount);
Chris Lattnercd439292008-11-12 08:04:58 +00001508 }
Mike Stump11289f42009-09-09 15:08:12 +00001509
Chris Lattnercd439292008-11-12 08:04:58 +00001510 // If we have "X && 1", simplify the code to use an uncond branch.
1511 // "X && 0" would have been constant folded to 0.
Chris Lattner41c6ab52011-02-27 23:02:32 +00001512 if (ConstantFoldsToSimpleInteger(CondBOp->getRHS(), ConstantBool) &&
1513 ConstantBool) {
Chris Lattnercd439292008-11-12 08:04:58 +00001514 // br(X && 1) -> br(X).
Justin Bogneref512b92014-01-06 22:27:43 +00001515 return EmitBranchOnBoolExpr(CondBOp->getLHS(), TrueBlock, FalseBlock,
1516 TrueCount);
Chris Lattnercd439292008-11-12 08:04:58 +00001517 }
Mike Stump11289f42009-09-09 15:08:12 +00001518
Chris Lattnercd439292008-11-12 08:04:58 +00001519 // Emit the LHS as a conditional. If the LHS conditional is false, we
1520 // want to jump to the FalseBlock.
Daniel Dunbara612e792008-11-13 01:38:36 +00001521 llvm::BasicBlock *LHSTrue = createBasicBlock("land.lhs.true");
Justin Bogneref512b92014-01-06 22:27:43 +00001522 // The counter tells us how often we evaluate RHS, and all of TrueCount
1523 // can be propagated to that branch.
Justin Bogner66242d62015-04-23 23:06:47 +00001524 uint64_t RHSCount = getProfileCount(CondBOp->getRHS());
John McCallce1de612011-01-26 04:00:11 +00001525
1526 ConditionalEvaluation eval(*this);
David Blaikie298720d2015-01-28 19:50:09 +00001527 {
1528 ApplyDebugLocation DL(*this, Cond);
1529 EmitBranchOnBoolExpr(CondBOp->getLHS(), LHSTrue, FalseBlock, RHSCount);
1530 EmitBlock(LHSTrue);
1531 }
Mike Stump11289f42009-09-09 15:08:12 +00001532
Justin Bogner66242d62015-04-23 23:06:47 +00001533 incrementProfileCounter(CondBOp);
1534 setCurrentProfileCount(getProfileCount(CondBOp->getRHS()));
1535
Anders Carlsson60ddba62010-01-24 00:20:05 +00001536 // Any temporaries created here are conditional.
John McCallce1de612011-01-26 04:00:11 +00001537 eval.begin(*this);
Justin Bogneref512b92014-01-06 22:27:43 +00001538 EmitBranchOnBoolExpr(CondBOp->getRHS(), TrueBlock, FalseBlock, TrueCount);
John McCallce1de612011-01-26 04:00:11 +00001539 eval.end(*this);
Anders Carlsson60ddba62010-01-24 00:20:05 +00001540
Chris Lattnercd439292008-11-12 08:04:58 +00001541 return;
Chris Lattner41c6ab52011-02-27 23:02:32 +00001542 }
Michael Ilseman686240a2012-12-04 00:29:55 +00001543
Chris Lattner41c6ab52011-02-27 23:02:32 +00001544 if (CondBOp->getOpcode() == BO_LOr) {
Chris Lattnercd439292008-11-12 08:04:58 +00001545 // If we have "0 || X", simplify the code. "1 || X" would have constant
1546 // folded if the case was simple enough.
Bill Wendling6c9540e2011-03-04 21:46:03 +00001547 bool ConstantBool = false;
Chris Lattner41c6ab52011-02-27 23:02:32 +00001548 if (ConstantFoldsToSimpleInteger(CondBOp->getLHS(), ConstantBool) &&
1549 !ConstantBool) {
Chris Lattnercd439292008-11-12 08:04:58 +00001550 // br(0 || X) -> br(X).
Justin Bogner66242d62015-04-23 23:06:47 +00001551 incrementProfileCounter(CondBOp);
Justin Bogneref512b92014-01-06 22:27:43 +00001552 return EmitBranchOnBoolExpr(CondBOp->getRHS(), TrueBlock, FalseBlock,
1553 TrueCount);
Chris Lattnercd439292008-11-12 08:04:58 +00001554 }
Mike Stump11289f42009-09-09 15:08:12 +00001555
Chris Lattnercd439292008-11-12 08:04:58 +00001556 // If we have "X || 0", simplify the code to use an uncond branch.
1557 // "X || 1" would have been constant folded to 1.
Chris Lattner41c6ab52011-02-27 23:02:32 +00001558 if (ConstantFoldsToSimpleInteger(CondBOp->getRHS(), ConstantBool) &&
1559 !ConstantBool) {
Chris Lattnercd439292008-11-12 08:04:58 +00001560 // br(X || 0) -> br(X).
Justin Bogneref512b92014-01-06 22:27:43 +00001561 return EmitBranchOnBoolExpr(CondBOp->getLHS(), TrueBlock, FalseBlock,
1562 TrueCount);
Chris Lattnercd439292008-11-12 08:04:58 +00001563 }
Mike Stump11289f42009-09-09 15:08:12 +00001564
Chris Lattnercd439292008-11-12 08:04:58 +00001565 // Emit the LHS as a conditional. If the LHS conditional is true, we
1566 // want to jump to the TrueBlock.
Daniel Dunbara612e792008-11-13 01:38:36 +00001567 llvm::BasicBlock *LHSFalse = createBasicBlock("lor.lhs.false");
Justin Bogneref512b92014-01-06 22:27:43 +00001568 // We have the count for entry to the RHS and for the whole expression
1569 // being true, so we can divy up True count between the short circuit and
1570 // the RHS.
Justin Bogner66242d62015-04-23 23:06:47 +00001571 uint64_t LHSCount =
1572 getCurrentProfileCount() - getProfileCount(CondBOp->getRHS());
Justin Bogneref512b92014-01-06 22:27:43 +00001573 uint64_t RHSCount = TrueCount - LHSCount;
John McCallce1de612011-01-26 04:00:11 +00001574
1575 ConditionalEvaluation eval(*this);
David Blaikie298720d2015-01-28 19:50:09 +00001576 {
1577 ApplyDebugLocation DL(*this, Cond);
1578 EmitBranchOnBoolExpr(CondBOp->getLHS(), TrueBlock, LHSFalse, LHSCount);
1579 EmitBlock(LHSFalse);
1580 }
Mike Stump11289f42009-09-09 15:08:12 +00001581
Justin Bogner66242d62015-04-23 23:06:47 +00001582 incrementProfileCounter(CondBOp);
1583 setCurrentProfileCount(getProfileCount(CondBOp->getRHS()));
1584
Anders Carlsson60ddba62010-01-24 00:20:05 +00001585 // Any temporaries created here are conditional.
John McCallce1de612011-01-26 04:00:11 +00001586 eval.begin(*this);
Justin Bogneref512b92014-01-06 22:27:43 +00001587 EmitBranchOnBoolExpr(CondBOp->getRHS(), TrueBlock, FalseBlock, RHSCount);
1588
John McCallce1de612011-01-26 04:00:11 +00001589 eval.end(*this);
Anders Carlsson60ddba62010-01-24 00:20:05 +00001590
Chris Lattnercd439292008-11-12 08:04:58 +00001591 return;
1592 }
Chris Lattnerd9537732008-11-12 08:13:36 +00001593 }
Mike Stump11289f42009-09-09 15:08:12 +00001594
Chris Lattnerd9537732008-11-12 08:13:36 +00001595 if (const UnaryOperator *CondUOp = dyn_cast<UnaryOperator>(Cond)) {
1596 // br(!x, t, f) -> br(x, f, t)
Justin Bogneref512b92014-01-06 22:27:43 +00001597 if (CondUOp->getOpcode() == UO_LNot) {
1598 // Negate the count.
Justin Bogner66242d62015-04-23 23:06:47 +00001599 uint64_t FalseCount = getCurrentProfileCount() - TrueCount;
Justin Bogneref512b92014-01-06 22:27:43 +00001600 // Negate the condition and swap the destination blocks.
1601 return EmitBranchOnBoolExpr(CondUOp->getSubExpr(), FalseBlock, TrueBlock,
1602 FalseCount);
1603 }
Chris Lattnercd439292008-11-12 08:04:58 +00001604 }
Mike Stump11289f42009-09-09 15:08:12 +00001605
Daniel Dunbarbf3c22e2008-11-12 10:30:32 +00001606 if (const ConditionalOperator *CondOp = dyn_cast<ConditionalOperator>(Cond)) {
Eli Friedman248f8982012-02-14 03:54:45 +00001607 // br(c ? x : y, t, f) -> br(c, br(x, t, f), br(y, t, f))
1608 llvm::BasicBlock *LHSBlock = createBasicBlock("cond.true");
1609 llvm::BasicBlock *RHSBlock = createBasicBlock("cond.false");
Daniel Dunbarbf3c22e2008-11-12 10:30:32 +00001610
Eli Friedman248f8982012-02-14 03:54:45 +00001611 ConditionalEvaluation cond(*this);
Justin Bogner66242d62015-04-23 23:06:47 +00001612 EmitBranchOnBoolExpr(CondOp->getCond(), LHSBlock, RHSBlock,
1613 getProfileCount(CondOp));
Justin Bogneref512b92014-01-06 22:27:43 +00001614
1615 // When computing PGO branch weights, we only know the overall count for
1616 // the true block. This code is essentially doing tail duplication of the
1617 // naive code-gen, introducing new edges for which counts are not
1618 // available. Divide the counts proportionally between the LHS and RHS of
1619 // the conditional operator.
1620 uint64_t LHSScaledTrueCount = 0;
1621 if (TrueCount) {
Justin Bogner66242d62015-04-23 23:06:47 +00001622 double LHSRatio =
1623 getProfileCount(CondOp) / (double)getCurrentProfileCount();
Justin Bogneref512b92014-01-06 22:27:43 +00001624 LHSScaledTrueCount = TrueCount * LHSRatio;
1625 }
John McCallce1de612011-01-26 04:00:11 +00001626
Eli Friedman248f8982012-02-14 03:54:45 +00001627 cond.begin(*this);
1628 EmitBlock(LHSBlock);
Justin Bogner66242d62015-04-23 23:06:47 +00001629 incrementProfileCounter(CondOp);
David Blaikie298720d2015-01-28 19:50:09 +00001630 {
1631 ApplyDebugLocation DL(*this, Cond);
1632 EmitBranchOnBoolExpr(CondOp->getLHS(), TrueBlock, FalseBlock,
1633 LHSScaledTrueCount);
1634 }
Eli Friedman248f8982012-02-14 03:54:45 +00001635 cond.end(*this);
John McCallce1de612011-01-26 04:00:11 +00001636
Eli Friedman248f8982012-02-14 03:54:45 +00001637 cond.begin(*this);
1638 EmitBlock(RHSBlock);
Justin Bogneref512b92014-01-06 22:27:43 +00001639 EmitBranchOnBoolExpr(CondOp->getRHS(), TrueBlock, FalseBlock,
1640 TrueCount - LHSScaledTrueCount);
Eli Friedman248f8982012-02-14 03:54:45 +00001641 cond.end(*this);
John McCallce1de612011-01-26 04:00:11 +00001642
Eli Friedman248f8982012-02-14 03:54:45 +00001643 return;
Daniel Dunbarbf3c22e2008-11-12 10:30:32 +00001644 }
1645
Richard Smithea852322013-05-07 21:53:22 +00001646 if (const CXXThrowExpr *Throw = dyn_cast<CXXThrowExpr>(Cond)) {
1647 // Conditional operator handling can give us a throw expression as a
1648 // condition for a case like:
1649 // br(c ? throw x : y, t, f) -> br(c, br(throw x, t, f), br(y, t, f)
1650 // Fold this to:
1651 // br(c, throw x, br(y, t, f))
1652 EmitCXXThrowExpr(Throw, /*KeepInsertionPoint*/false);
1653 return;
1654 }
1655
Sanjay Patela24296b2015-09-02 20:01:30 +00001656 // If the branch has a condition wrapped by __builtin_unpredictable,
1657 // create metadata that specifies that the branch is unpredictable.
1658 // Don't bother if not optimizing because that metadata would not be used.
1659 llvm::MDNode *Unpredictable = nullptr;
Erich Keane8c94f072018-12-12 20:30:53 +00001660 auto *Call = dyn_cast<CallExpr>(Cond->IgnoreImpCasts());
Sanjay Patel3fd323f2016-04-19 18:06:33 +00001661 if (Call && CGM.getCodeGenOpts().OptimizationLevel != 0) {
1662 auto *FD = dyn_cast_or_null<FunctionDecl>(Call->getCalleeDecl());
1663 if (FD && FD->getBuiltinID() == Builtin::BI__builtin_unpredictable) {
1664 llvm::MDBuilder MDHelper(getLLVMContext());
1665 Unpredictable = MDHelper.createUnpredictable();
Sanjay Patela24296b2015-09-02 20:01:30 +00001666 }
1667 }
1668
Justin Bogneref512b92014-01-06 22:27:43 +00001669 // Create branch weights based on the number of times we get here and the
1670 // number of times the condition should be true.
Justin Bogner66242d62015-04-23 23:06:47 +00001671 uint64_t CurrentCount = std::max(getCurrentProfileCount(), TrueCount);
Justin Bogner65512642015-05-02 05:00:55 +00001672 llvm::MDNode *Weights =
1673 createProfileWeights(TrueCount, CurrentCount - TrueCount);
Justin Bogneref512b92014-01-06 22:27:43 +00001674
Chris Lattnercd439292008-11-12 08:04:58 +00001675 // Emit the code with the fully general case.
David Blaikie303facb2015-01-31 01:10:11 +00001676 llvm::Value *CondV;
1677 {
1678 ApplyDebugLocation DL(*this, Cond);
1679 CondV = EvaluateExprAsBool(Cond);
1680 }
Sanjay Patela24296b2015-09-02 20:01:30 +00001681 Builder.CreateCondBr(CondV, TrueBlock, FalseBlock, Weights, Unpredictable);
Chris Lattnercd439292008-11-12 08:04:58 +00001682}
1683
Daniel Dunbara7c8cf62008-08-16 00:56:44 +00001684/// ErrorUnsupported - Print out an error that codegen doesn't support the
Chris Lattnerfc944342007-12-02 01:43:38 +00001685/// specified stmt yet.
David Blaikie4a9ec7b2013-08-19 21:02:26 +00001686void CodeGenFunction::ErrorUnsupported(const Stmt *S, const char *Type) {
1687 CGM.ErrorUnsupported(S, Type);
Chris Lattnerfc944342007-12-02 01:43:38 +00001688}
1689
John McCall2725aa12011-02-01 21:35:06 +00001690/// emitNonZeroVLAInit - Emit the "zero" initialization of a
1691/// variable-length array whose elements have a non-zero bit-pattern.
1692///
James Dennettbe302452012-06-15 22:10:14 +00001693/// \param baseType the inner-most element type of the array
John McCall2725aa12011-02-01 21:35:06 +00001694/// \param src - a char* pointing to the bit-pattern for a single
1695/// base element of the array
1696/// \param sizeInChars - the total size of the VLA, in chars
John McCall2725aa12011-02-01 21:35:06 +00001697static void emitNonZeroVLAInit(CodeGenFunction &CGF, QualType baseType,
John McCall7f416cc2015-09-08 08:05:57 +00001698 Address dest, Address src,
John McCall2725aa12011-02-01 21:35:06 +00001699 llvm::Value *sizeInChars) {
John McCall2725aa12011-02-01 21:35:06 +00001700 CGBuilderTy &Builder = CGF.Builder;
1701
John McCall7f416cc2015-09-08 08:05:57 +00001702 CharUnits baseSize = CGF.getContext().getTypeSizeInChars(baseType);
John McCall2725aa12011-02-01 21:35:06 +00001703 llvm::Value *baseSizeInChars
John McCall7f416cc2015-09-08 08:05:57 +00001704 = llvm::ConstantInt::get(CGF.IntPtrTy, baseSize.getQuantity());
John McCall2725aa12011-02-01 21:35:06 +00001705
John McCall7f416cc2015-09-08 08:05:57 +00001706 Address begin =
1707 Builder.CreateElementBitCast(dest, CGF.Int8Ty, "vla.begin");
1708 llvm::Value *end =
1709 Builder.CreateInBoundsGEP(begin.getPointer(), sizeInChars, "vla.end");
John McCall2725aa12011-02-01 21:35:06 +00001710
1711 llvm::BasicBlock *originBB = CGF.Builder.GetInsertBlock();
1712 llvm::BasicBlock *loopBB = CGF.createBasicBlock("vla-init.loop");
1713 llvm::BasicBlock *contBB = CGF.createBasicBlock("vla-init.cont");
1714
1715 // Make a loop over the VLA. C99 guarantees that the VLA element
1716 // count must be nonzero.
1717 CGF.EmitBlock(loopBB);
1718
John McCall7f416cc2015-09-08 08:05:57 +00001719 llvm::PHINode *cur = Builder.CreatePHI(begin.getType(), 2, "vla.cur");
1720 cur->addIncoming(begin.getPointer(), originBB);
1721
1722 CharUnits curAlign =
1723 dest.getAlignment().alignmentOfArrayElement(baseSize);
John McCall2725aa12011-02-01 21:35:06 +00001724
1725 // memcpy the individual element bit-pattern.
John McCall7f416cc2015-09-08 08:05:57 +00001726 Builder.CreateMemCpy(Address(cur, curAlign), src, baseSizeInChars,
John McCall2725aa12011-02-01 21:35:06 +00001727 /*volatile*/ false);
1728
1729 // Go to the next element.
John McCall7f416cc2015-09-08 08:05:57 +00001730 llvm::Value *next =
1731 Builder.CreateInBoundsGEP(CGF.Int8Ty, cur, baseSizeInChars, "vla.next");
John McCall2725aa12011-02-01 21:35:06 +00001732
1733 // Leave if that's the end of the VLA.
1734 llvm::Value *done = Builder.CreateICmpEQ(next, end, "vla-init.isdone");
1735 Builder.CreateCondBr(done, contBB, loopBB);
1736 cur->addIncoming(next, loopBB);
1737
1738 CGF.EmitBlock(contBB);
Michael Ilseman686240a2012-12-04 00:29:55 +00001739}
John McCall2725aa12011-02-01 21:35:06 +00001740
Anders Carlssonc0964b62010-05-22 17:35:42 +00001741void
John McCall7f416cc2015-09-08 08:05:57 +00001742CodeGenFunction::EmitNullInitialization(Address DestPtr, QualType Ty) {
Anders Carlsson16e94af2010-05-03 01:20:20 +00001743 // Ignore empty classes in C++.
Richard Smith9c6890a2012-11-01 22:30:59 +00001744 if (getLangOpts().CPlusPlus) {
Anders Carlsson16e94af2010-05-03 01:20:20 +00001745 if (const RecordType *RT = Ty->getAs<RecordType>()) {
1746 if (cast<CXXRecordDecl>(RT->getDecl())->isEmpty())
1747 return;
1748 }
1749 }
John McCall7cd1d972010-08-07 08:21:30 +00001750
1751 // Cast the dest ptr to the appropriate i8 pointer type.
John McCall7f416cc2015-09-08 08:05:57 +00001752 if (DestPtr.getElementType() != Int8Ty)
1753 DestPtr = Builder.CreateElementBitCast(DestPtr, Int8Ty);
Anders Carlsson2e744e82008-08-30 19:51:14 +00001754
1755 // Get size and alignment info for this aggregate.
John McCall7f416cc2015-09-08 08:05:57 +00001756 CharUnits size = getContext().getTypeSizeInChars(Ty);
Anders Carlsson2e744e82008-08-30 19:51:14 +00001757
John McCalla08ffd22011-01-14 10:37:58 +00001758 llvm::Value *SizeVal;
John McCall2725aa12011-02-01 21:35:06 +00001759 const VariableArrayType *vla;
Mike Stump11289f42009-09-09 15:08:12 +00001760
John McCalla08ffd22011-01-14 10:37:58 +00001761 // Don't bother emitting a zero-byte memset.
John McCall7f416cc2015-09-08 08:05:57 +00001762 if (size.isZero()) {
John McCalla08ffd22011-01-14 10:37:58 +00001763 // But note that getTypeInfo returns 0 for a VLA.
1764 if (const VariableArrayType *vlaType =
1765 dyn_cast_or_null<VariableArrayType>(
1766 getContext().getAsArrayType(Ty))) {
Sander de Smalen891af03a2018-02-03 13:55:59 +00001767 auto VlaSize = getVLASize(vlaType);
1768 SizeVal = VlaSize.NumElts;
1769 CharUnits eltSize = getContext().getTypeSizeInChars(VlaSize.Type);
John McCall23c29fe2011-06-24 21:55:10 +00001770 if (!eltSize.isOne())
1771 SizeVal = Builder.CreateNUWMul(SizeVal, CGM.getSize(eltSize));
John McCall2725aa12011-02-01 21:35:06 +00001772 vla = vlaType;
John McCalla08ffd22011-01-14 10:37:58 +00001773 } else {
1774 return;
1775 }
1776 } else {
John McCall7f416cc2015-09-08 08:05:57 +00001777 SizeVal = CGM.getSize(size);
Craig Topper8a13c412014-05-21 05:09:00 +00001778 vla = nullptr;
John McCalla08ffd22011-01-14 10:37:58 +00001779 }
John McCall7cd1d972010-08-07 08:21:30 +00001780
1781 // If the type contains a pointer to data member we can't memset it to zero.
1782 // Instead, create a null constant and copy it to the destination.
John McCall2725aa12011-02-01 21:35:06 +00001783 // TODO: there are other patterns besides zero that we can usefully memset,
1784 // like -1, which happens to be the pattern used by member-pointers.
John McCall614dbdc2010-08-22 21:01:12 +00001785 if (!CGM.getTypes().isZeroInitializable(Ty)) {
John McCall2725aa12011-02-01 21:35:06 +00001786 // For a VLA, emit a single element, then splat that over the VLA.
1787 if (vla) Ty = getContext().getBaseElementType(vla);
John McCalla08ffd22011-01-14 10:37:58 +00001788
John McCall7cd1d972010-08-07 08:21:30 +00001789 llvm::Constant *NullConstant = CGM.EmitNullConstant(Ty);
1790
Michael Ilseman686240a2012-12-04 00:29:55 +00001791 llvm::GlobalVariable *NullVariable =
John McCall7cd1d972010-08-07 08:21:30 +00001792 new llvm::GlobalVariable(CGM.getModule(), NullConstant->getType(),
Michael Ilseman686240a2012-12-04 00:29:55 +00001793 /*isConstant=*/true,
John McCall7cd1d972010-08-07 08:21:30 +00001794 llvm::GlobalVariable::PrivateLinkage,
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001795 NullConstant, Twine());
John McCall7f416cc2015-09-08 08:05:57 +00001796 CharUnits NullAlign = DestPtr.getAlignment();
Guillaume Chateletc79099e2019-10-03 13:00:29 +00001797 NullVariable->setAlignment(NullAlign.getAsAlign());
John McCall7f416cc2015-09-08 08:05:57 +00001798 Address SrcPtr(Builder.CreateBitCast(NullVariable, Builder.getInt8PtrTy()),
1799 NullAlign);
John McCall7cd1d972010-08-07 08:21:30 +00001800
John McCall2725aa12011-02-01 21:35:06 +00001801 if (vla) return emitNonZeroVLAInit(*this, Ty, DestPtr, SrcPtr, SizeVal);
1802
John McCall7cd1d972010-08-07 08:21:30 +00001803 // Get and call the appropriate llvm.memcpy overload.
John McCall7f416cc2015-09-08 08:05:57 +00001804 Builder.CreateMemCpy(DestPtr, SrcPtr, SizeVal, false);
John McCall7cd1d972010-08-07 08:21:30 +00001805 return;
Michael Ilseman686240a2012-12-04 00:29:55 +00001806 }
1807
John McCall7cd1d972010-08-07 08:21:30 +00001808 // Otherwise, just memset the whole thing to zero. This is legal
1809 // because in LLVM, all default initializers (other than the ones we just
1810 // handled above) are guaranteed to have a bit pattern of all zeros.
John McCall7f416cc2015-09-08 08:05:57 +00001811 Builder.CreateMemSet(DestPtr, Builder.getInt8(0), SizeVal, false);
Anders Carlsson2e744e82008-08-30 19:51:14 +00001812}
1813
Chris Lattnerc8e630e2011-02-17 07:39:24 +00001814llvm::BlockAddress *CodeGenFunction::GetAddrOfLabel(const LabelDecl *L) {
Chris Lattner6c4d2552009-10-28 23:59:40 +00001815 // Make sure that there is a block for the indirect goto.
Craig Topper8a13c412014-05-21 05:09:00 +00001816 if (!IndirectBranch)
Chris Lattner6c4d2552009-10-28 23:59:40 +00001817 GetIndirectGotoBlock();
Michael Ilseman686240a2012-12-04 00:29:55 +00001818
John McCallad5d61e2010-07-23 21:56:41 +00001819 llvm::BasicBlock *BB = getJumpDestForLabel(L).getBlock();
Michael Ilseman686240a2012-12-04 00:29:55 +00001820
Chris Lattner6c4d2552009-10-28 23:59:40 +00001821 // Make sure the indirect branch includes all of the address-taken blocks.
1822 IndirectBranch->addDestination(BB);
1823 return llvm::BlockAddress::get(CurFn, BB);
Chris Lattner2bb5cb42009-10-13 06:55:33 +00001824}
1825
1826llvm::BasicBlock *CodeGenFunction::GetIndirectGotoBlock() {
Chris Lattner6c4d2552009-10-28 23:59:40 +00001827 // If we already made the indirect branch for indirect goto, return its block.
1828 if (IndirectBranch) return IndirectBranch->getParent();
Michael Ilseman686240a2012-12-04 00:29:55 +00001829
John McCall7f416cc2015-09-08 08:05:57 +00001830 CGBuilderTy TmpBuilder(*this, createBasicBlock("indirectgoto"));
Michael Ilseman686240a2012-12-04 00:29:55 +00001831
Chris Lattner2bb5cb42009-10-13 06:55:33 +00001832 // Create the PHI node that indirect gotos will add entries to.
Jay Foad20c0f022011-03-30 11:28:58 +00001833 llvm::Value *DestVal = TmpBuilder.CreatePHI(Int8PtrTy, 0,
1834 "indirect.goto.dest");
Michael Ilseman686240a2012-12-04 00:29:55 +00001835
Chris Lattner6c4d2552009-10-28 23:59:40 +00001836 // Create the indirect branch instruction.
1837 IndirectBranch = TmpBuilder.CreateIndirectBr(DestVal);
1838 return IndirectBranch->getParent();
Daniel Dunbar88402ce2008-08-04 16:51:22 +00001839}
Anders Carlsson13abd7e2008-11-04 05:30:00 +00001840
John McCall82fe67b2011-07-09 01:37:26 +00001841/// Computes the length of an array in elements, as well as the base
1842/// element type and a properly-typed first element pointer.
1843llvm::Value *CodeGenFunction::emitArrayLength(const ArrayType *origArrayType,
1844 QualType &baseType,
John McCall7f416cc2015-09-08 08:05:57 +00001845 Address &addr) {
John McCall82fe67b2011-07-09 01:37:26 +00001846 const ArrayType *arrayType = origArrayType;
1847
1848 // If it's a VLA, we have to load the stored size. Note that
1849 // this is the size of the VLA in bytes, not its size in elements.
Craig Topper8a13c412014-05-21 05:09:00 +00001850 llvm::Value *numVLAElements = nullptr;
John McCall82fe67b2011-07-09 01:37:26 +00001851 if (isa<VariableArrayType>(arrayType)) {
Sander de Smalen891af03a2018-02-03 13:55:59 +00001852 numVLAElements = getVLASize(cast<VariableArrayType>(arrayType)).NumElts;
John McCall82fe67b2011-07-09 01:37:26 +00001853
1854 // Walk into all VLAs. This doesn't require changes to addr,
1855 // which has type T* where T is the first non-VLA element type.
1856 do {
1857 QualType elementType = arrayType->getElementType();
1858 arrayType = getContext().getAsArrayType(elementType);
1859
1860 // If we only have VLA components, 'addr' requires no adjustment.
1861 if (!arrayType) {
1862 baseType = elementType;
1863 return numVLAElements;
1864 }
1865 } while (isa<VariableArrayType>(arrayType));
1866
1867 // We get out here only if we find a constant array type
1868 // inside the VLA.
1869 }
1870
1871 // We have some number of constant-length arrays, so addr should
1872 // have LLVM type [M x [N x [...]]]*. Build a GEP that walks
1873 // down to the first element of addr.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001874 SmallVector<llvm::Value*, 8> gepIndices;
John McCall82fe67b2011-07-09 01:37:26 +00001875
1876 // GEP down to the array type.
1877 llvm::ConstantInt *zero = Builder.getInt32(0);
1878 gepIndices.push_back(zero);
1879
John McCall82fe67b2011-07-09 01:37:26 +00001880 uint64_t countFromCLAs = 1;
Richard Smithf3c37e82012-04-22 05:51:36 +00001881 QualType eltType;
John McCall82fe67b2011-07-09 01:37:26 +00001882
Chris Lattner2192fe52011-07-18 04:24:23 +00001883 llvm::ArrayType *llvmArrayType =
John McCall7f416cc2015-09-08 08:05:57 +00001884 dyn_cast<llvm::ArrayType>(addr.getElementType());
Richard Smithf3c37e82012-04-22 05:51:36 +00001885 while (llvmArrayType) {
John McCall82fe67b2011-07-09 01:37:26 +00001886 assert(isa<ConstantArrayType>(arrayType));
1887 assert(cast<ConstantArrayType>(arrayType)->getSize().getZExtValue()
1888 == llvmArrayType->getNumElements());
1889
1890 gepIndices.push_back(zero);
1891 countFromCLAs *= llvmArrayType->getNumElements();
Richard Smithf3c37e82012-04-22 05:51:36 +00001892 eltType = arrayType->getElementType();
John McCall82fe67b2011-07-09 01:37:26 +00001893
1894 llvmArrayType =
1895 dyn_cast<llvm::ArrayType>(llvmArrayType->getElementType());
John McCall82fe67b2011-07-09 01:37:26 +00001896 arrayType = getContext().getAsArrayType(arrayType->getElementType());
Richard Smithf3c37e82012-04-22 05:51:36 +00001897 assert((!llvmArrayType || arrayType) &&
1898 "LLVM and Clang types are out-of-synch");
John McCall82fe67b2011-07-09 01:37:26 +00001899 }
1900
Richard Smithf3c37e82012-04-22 05:51:36 +00001901 if (arrayType) {
1902 // From this point onwards, the Clang array type has been emitted
1903 // as some other type (probably a packed struct). Compute the array
1904 // size, and just emit the 'begin' expression as a bitcast.
1905 while (arrayType) {
1906 countFromCLAs *=
1907 cast<ConstantArrayType>(arrayType)->getSize().getZExtValue();
1908 eltType = arrayType->getElementType();
1909 arrayType = getContext().getAsArrayType(eltType);
1910 }
John McCall82fe67b2011-07-09 01:37:26 +00001911
John McCall7f416cc2015-09-08 08:05:57 +00001912 llvm::Type *baseType = ConvertType(eltType);
1913 addr = Builder.CreateElementBitCast(addr, baseType, "array.begin");
Richard Smithf3c37e82012-04-22 05:51:36 +00001914 } else {
1915 // Create the actual GEP.
John McCall7f416cc2015-09-08 08:05:57 +00001916 addr = Address(Builder.CreateInBoundsGEP(addr.getPointer(),
1917 gepIndices, "array.begin"),
1918 addr.getAlignment());
Richard Smithf3c37e82012-04-22 05:51:36 +00001919 }
1920
1921 baseType = eltType;
John McCall82fe67b2011-07-09 01:37:26 +00001922
1923 llvm::Value *numElements
1924 = llvm::ConstantInt::get(SizeTy, countFromCLAs);
1925
1926 // If we had any VLA dimensions, factor them in.
1927 if (numVLAElements)
1928 numElements = Builder.CreateNUWMul(numVLAElements, numElements);
1929
1930 return numElements;
1931}
1932
Sander de Smalen891af03a2018-02-03 13:55:59 +00001933CodeGenFunction::VlaSizePair CodeGenFunction::getVLASize(QualType type) {
John McCall23c29fe2011-06-24 21:55:10 +00001934 const VariableArrayType *vla = getContext().getAsVariableArrayType(type);
1935 assert(vla && "type was not a variable array type!");
1936 return getVLASize(vla);
Anders Carlssone388a5b2008-12-20 20:27:15 +00001937}
Anders Carlssonccbe9202008-12-12 07:19:02 +00001938
Sander de Smalen891af03a2018-02-03 13:55:59 +00001939CodeGenFunction::VlaSizePair
John McCall23c29fe2011-06-24 21:55:10 +00001940CodeGenFunction::getVLASize(const VariableArrayType *type) {
1941 // The number of elements so far; always size_t.
Craig Topper8a13c412014-05-21 05:09:00 +00001942 llvm::Value *numElements = nullptr;
John McCall23c29fe2011-06-24 21:55:10 +00001943
1944 QualType elementType;
1945 do {
1946 elementType = type->getElementType();
1947 llvm::Value *vlaSize = VLASizeMap[type->getSizeExpr()];
1948 assert(vlaSize && "no size for VLA!");
1949 assert(vlaSize->getType() == SizeTy);
1950
1951 if (!numElements) {
1952 numElements = vlaSize;
1953 } else {
1954 // It's undefined behavior if this wraps around, so mark it that way.
Alexey Samsonovcb3f8122014-03-20 10:48:29 +00001955 // FIXME: Teach -fsanitize=undefined to trap this.
John McCall23c29fe2011-06-24 21:55:10 +00001956 numElements = Builder.CreateNUWMul(numElements, vlaSize);
1957 }
1958 } while ((type = getContext().getAsVariableArrayType(elementType)));
1959
Sander de Smalen891af03a2018-02-03 13:55:59 +00001960 return { numElements, elementType };
1961}
1962
1963CodeGenFunction::VlaSizePair
1964CodeGenFunction::getVLAElements1D(QualType type) {
1965 const VariableArrayType *vla = getContext().getAsVariableArrayType(type);
1966 assert(vla && "type was not a variable array type!");
1967 return getVLAElements1D(vla);
1968}
1969
1970CodeGenFunction::VlaSizePair
1971CodeGenFunction::getVLAElements1D(const VariableArrayType *Vla) {
1972 llvm::Value *VlaSize = VLASizeMap[Vla->getSizeExpr()];
1973 assert(VlaSize && "no size for VLA!");
1974 assert(VlaSize->getType() == SizeTy);
1975 return { VlaSize, Vla->getElementType() };
John McCall23c29fe2011-06-24 21:55:10 +00001976}
1977
1978void CodeGenFunction::EmitVariablyModifiedType(QualType type) {
1979 assert(type->isVariablyModifiedType() &&
Anders Carlsson8a01b792008-12-20 20:46:34 +00001980 "Must pass variably modified type to EmitVLASizes!");
Mike Stump11289f42009-09-09 15:08:12 +00001981
Daniel Dunbarb6adc432009-07-19 06:58:07 +00001982 EnsureInsertPoint();
Mike Stump11289f42009-09-09 15:08:12 +00001983
John McCall23c29fe2011-06-24 21:55:10 +00001984 // We're going to walk down into the type and look for VLA
1985 // expressions.
John McCall23c29fe2011-06-24 21:55:10 +00001986 do {
1987 assert(type->isVariablyModifiedType());
Mike Stump11289f42009-09-09 15:08:12 +00001988
John McCall23c29fe2011-06-24 21:55:10 +00001989 const Type *ty = type.getTypePtr();
1990 switch (ty->getTypeClass()) {
Abramo Bagnara1cd83682012-01-07 10:52:36 +00001991
John McCall23c29fe2011-06-24 21:55:10 +00001992#define TYPE(Class, Base)
1993#define ABSTRACT_TYPE(Class, Base)
Abramo Bagnara1cd83682012-01-07 10:52:36 +00001994#define NON_CANONICAL_TYPE(Class, Base)
John McCall23c29fe2011-06-24 21:55:10 +00001995#define DEPENDENT_TYPE(Class, Base) case Type::Class:
Abramo Bagnara1cd83682012-01-07 10:52:36 +00001996#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base)
John McCall36b12a82019-10-02 06:35:23 +00001997#include "clang/AST/TypeNodes.inc"
Abramo Bagnara1cd83682012-01-07 10:52:36 +00001998 llvm_unreachable("unexpected dependent type!");
Mike Stump11289f42009-09-09 15:08:12 +00001999
John McCall23c29fe2011-06-24 21:55:10 +00002000 // These types are never variably-modified.
2001 case Type::Builtin:
2002 case Type::Complex:
2003 case Type::Vector:
2004 case Type::ExtVector:
2005 case Type::Record:
2006 case Type::Enum:
Abramo Bagnarafa95ed42012-01-11 08:19:46 +00002007 case Type::Elaborated:
2008 case Type::TemplateSpecialization:
Manman Rene6be26c2016-09-13 17:25:08 +00002009 case Type::ObjCTypeParam:
John McCall23c29fe2011-06-24 21:55:10 +00002010 case Type::ObjCObject:
2011 case Type::ObjCInterface:
2012 case Type::ObjCObjectPointer:
2013 llvm_unreachable("type class is never variably-modified!");
Mike Stump11289f42009-09-09 15:08:12 +00002014
Reid Kleckner0503a872013-12-05 01:23:43 +00002015 case Type::Adjusted:
2016 type = cast<AdjustedType>(ty)->getAdjustedType();
2017 break;
2018
Reid Kleckner8a365022013-06-24 17:51:48 +00002019 case Type::Decayed:
2020 type = cast<DecayedType>(ty)->getPointeeType();
2021 break;
2022
John McCall23c29fe2011-06-24 21:55:10 +00002023 case Type::Pointer:
2024 type = cast<PointerType>(ty)->getPointeeType();
2025 break;
Mike Stump11289f42009-09-09 15:08:12 +00002026
John McCall23c29fe2011-06-24 21:55:10 +00002027 case Type::BlockPointer:
2028 type = cast<BlockPointerType>(ty)->getPointeeType();
2029 break;
2030
2031 case Type::LValueReference:
2032 case Type::RValueReference:
2033 type = cast<ReferenceType>(ty)->getPointeeType();
2034 break;
2035
2036 case Type::MemberPointer:
2037 type = cast<MemberPointerType>(ty)->getPointeeType();
2038 break;
2039
2040 case Type::ConstantArray:
2041 case Type::IncompleteArray:
2042 // Losing element qualification here is fine.
2043 type = cast<ArrayType>(ty)->getElementType();
2044 break;
2045
2046 case Type::VariableArray: {
2047 // Losing element qualification here is fine.
2048 const VariableArrayType *vat = cast<VariableArrayType>(ty);
2049
2050 // Unknown size indication requires no size computation.
2051 // Otherwise, evaluate and record it.
2052 if (const Expr *size = vat->getSizeExpr()) {
2053 // It's possible that we might have emitted this already,
2054 // e.g. with a typedef and a pointer to it.
2055 llvm::Value *&entry = VLASizeMap[size];
2056 if (!entry) {
Richard Smith481652b2012-10-10 01:11:12 +00002057 llvm::Value *Size = EmitScalarExpr(size);
2058
2059 // C11 6.7.6.2p5:
2060 // If the size is an expression that is not an integer constant
2061 // expression [...] each time it is evaluated it shall have a value
2062 // greater than zero.
Alexey Samsonovedf99a92014-11-07 22:29:38 +00002063 if (SanOpts.has(SanitizerKind::VLABound) &&
Richard Smithb1b0ab42012-11-05 22:21:05 +00002064 size->getType()->isSignedIntegerType()) {
Alexey Samsonov24cad992014-07-17 18:46:27 +00002065 SanitizerScope SanScope(this);
Richard Smith481652b2012-10-10 01:11:12 +00002066 llvm::Value *Zero = llvm::Constant::getNullValue(Size->getType());
2067 llvm::Constant *StaticArgs[] = {
Stephen Kellyf2ceec42018-08-09 21:08:08 +00002068 EmitCheckSourceLocation(size->getBeginLoc()),
2069 EmitCheckTypeDescriptor(size->getType())};
Alexey Samsonove396bfc2014-11-11 22:03:54 +00002070 EmitCheck(std::make_pair(Builder.CreateICmpSGT(Size, Zero),
2071 SanitizerKind::VLABound),
Filipe Cabecinhas322ecd92016-12-12 16:18:40 +00002072 SanitizerHandler::VLABoundNotPositive, StaticArgs, Size);
Richard Smith481652b2012-10-10 01:11:12 +00002073 }
2074
John McCall23c29fe2011-06-24 21:55:10 +00002075 // Always zexting here would be wrong if it weren't
2076 // undefined behavior to have a negative bound.
Richard Smith8772bd82012-10-10 01:12:11 +00002077 entry = Builder.CreateIntCast(Size, SizeTy, /*signed*/ false);
John McCall23c29fe2011-06-24 21:55:10 +00002078 }
2079 }
2080 type = vat->getElementType();
2081 break;
Anders Carlsson8a01b792008-12-20 20:46:34 +00002082 }
Mike Stump11289f42009-09-09 15:08:12 +00002083
Abramo Bagnara1cd83682012-01-07 10:52:36 +00002084 case Type::FunctionProto:
John McCall23c29fe2011-06-24 21:55:10 +00002085 case Type::FunctionNoProto:
Alp Toker314cc812014-01-25 16:55:45 +00002086 type = cast<FunctionType>(ty)->getReturnType();
John McCall23c29fe2011-06-24 21:55:10 +00002087 break;
Eli Friedman0dfb8892011-10-06 23:00:33 +00002088
Abramo Bagnarafa95ed42012-01-11 08:19:46 +00002089 case Type::Paren:
2090 case Type::TypeOf:
2091 case Type::UnaryTransform:
2092 case Type::Attributed:
2093 case Type::SubstTemplateTypeParm:
David Blaikie66ed89d2013-07-13 21:08:08 +00002094 case Type::PackExpansion:
Leonard Chanc72aaf62019-05-07 03:20:17 +00002095 case Type::MacroQualified:
Abramo Bagnarafa95ed42012-01-11 08:19:46 +00002096 // Keep walking after single level desugaring.
2097 type = type.getSingleStepDesugaredType(getContext());
2098 break;
2099
2100 case Type::Typedef:
2101 case Type::Decltype:
2102 case Type::Auto:
Richard Smith600b5262017-01-26 20:40:47 +00002103 case Type::DeducedTemplateSpecialization:
Abramo Bagnarafa95ed42012-01-11 08:19:46 +00002104 // Stop walking: nothing to do.
2105 return;
2106
2107 case Type::TypeOfExpr:
2108 // Stop walking: emit typeof expression.
2109 EmitIgnoredExpr(cast<TypeOfExprType>(ty)->getUnderlyingExpr());
2110 return;
2111
Eli Friedman0dfb8892011-10-06 23:00:33 +00002112 case Type::Atomic:
2113 type = cast<AtomicType>(ty)->getValueType();
2114 break;
Xiuli Pan9c14e282016-01-09 12:53:17 +00002115
2116 case Type::Pipe:
2117 type = cast<PipeType>(ty)->getElementType();
2118 break;
John McCall23c29fe2011-06-24 21:55:10 +00002119 }
2120 } while (type->isVariablyModifiedType());
Anders Carlssonccbe9202008-12-12 07:19:02 +00002121}
Eli Friedmanddea0ad2009-01-20 17:46:04 +00002122
John McCall7f416cc2015-09-08 08:05:57 +00002123Address CodeGenFunction::EmitVAListRef(const Expr* E) {
Dan Gohmane9e32dc2010-10-29 22:47:07 +00002124 if (getContext().getBuiltinVaListType()->isArrayType())
John McCall7f416cc2015-09-08 08:05:57 +00002125 return EmitPointerWithAlignment(E);
Akira Hatanakaf139ae32019-12-03 15:17:01 -08002126 return EmitLValue(E).getAddress(*this);
Eli Friedmanddea0ad2009-01-20 17:46:04 +00002127}
Anders Carlsson15cb75a2009-02-07 22:53:43 +00002128
Charles Davisc7d5c942015-09-17 20:55:33 +00002129Address CodeGenFunction::EmitMSVAListRef(const Expr *E) {
Akira Hatanakaf139ae32019-12-03 15:17:01 -08002130 return EmitLValue(E).getAddress(*this);
Charles Davisc7d5c942015-09-17 20:55:33 +00002131}
2132
Yunzhong Gao0ebf1bb2013-08-30 08:53:09 +00002133void CodeGenFunction::EmitDeclRefExprDbgValue(const DeclRefExpr *E,
Peter Collingbourneeeb56ab2016-09-13 01:13:19 +00002134 const APValue &Init) {
Richard Smithe637cbe2019-05-21 23:15:18 +00002135 assert(Init.hasValue() && "Invalid DeclRefExpr initializer!");
Yunzhong Gao0ebf1bb2013-08-30 08:53:09 +00002136 if (CGDebugInfo *Dbg = getDebugInfo())
Amy Huang53539bb2020-01-13 15:54:54 -08002137 if (CGM.getCodeGenOpts().hasReducedDebugInfo())
Yunzhong Gao0ebf1bb2013-08-30 08:53:09 +00002138 Dbg->EmitGlobalVariable(E->getDecl(), Init);
Devang Patele03edfd2010-08-10 07:24:25 +00002139}
John McCallc07a0c72011-02-17 10:25:35 +00002140
2141CodeGenFunction::PeepholeProtection
2142CodeGenFunction::protectFromPeepholes(RValue rvalue) {
2143 // At the moment, the only aggressive peephole we do in IR gen
2144 // is trunc(zext) folding, but if we add more, we can easily
2145 // extend this protection.
2146
2147 if (!rvalue.isScalar()) return PeepholeProtection();
2148 llvm::Value *value = rvalue.getScalarVal();
2149 if (!isa<llvm::ZExtInst>(value)) return PeepholeProtection();
2150
2151 // Just make an extra bitcast.
2152 assert(HaveInsertPoint());
2153 llvm::Instruction *inst = new llvm::BitCastInst(value, value->getType(), "",
2154 Builder.GetInsertBlock());
2155
2156 PeepholeProtection protection;
2157 protection.Inst = inst;
2158 return protection;
2159}
2160
2161void CodeGenFunction::unprotectFromPeepholes(PeepholeProtection protection) {
2162 if (!protection.Inst) return;
2163
2164 // In theory, we could try to duplicate the peepholes now, but whatever.
2165 protection.Inst->eraseFromParent();
2166}
Julien Lerouge5a6b6982011-09-09 22:41:49 +00002167
Fangrui Song1d49eb02020-02-13 16:36:27 -08002168void CodeGenFunction::emitAlignmentAssumption(llvm::Value *PtrValue,
Roman Lebedevbd1c0872019-01-15 09:44:25 +00002169 QualType Ty, SourceLocation Loc,
2170 SourceLocation AssumptionLoc,
2171 llvm::Value *Alignment,
2172 llvm::Value *OffsetValue) {
2173 llvm::Value *TheCheck;
2174 llvm::Instruction *Assumption = Builder.CreateAlignmentAssumption(
2175 CGM.getDataLayout(), PtrValue, Alignment, OffsetValue, &TheCheck);
2176 if (SanOpts.has(SanitizerKind::Alignment)) {
Fangrui Song1d49eb02020-02-13 16:36:27 -08002177 emitAlignmentAssumptionCheck(PtrValue, Ty, Loc, AssumptionLoc, Alignment,
Roman Lebedevbd1c0872019-01-15 09:44:25 +00002178 OffsetValue, TheCheck, Assumption);
2179 }
2180}
2181
Fangrui Song1d49eb02020-02-13 16:36:27 -08002182void CodeGenFunction::emitAlignmentAssumption(llvm::Value *PtrValue,
Roman Lebedevbd1c0872019-01-15 09:44:25 +00002183 const Expr *E,
2184 SourceLocation AssumptionLoc,
Erich Keanef7593952019-10-11 14:59:44 +00002185 llvm::Value *Alignment,
Roman Lebedevbd1c0872019-01-15 09:44:25 +00002186 llvm::Value *OffsetValue) {
2187 if (auto *CE = dyn_cast<CastExpr>(E))
2188 E = CE->getSubExprAsWritten();
2189 QualType Ty = E->getType();
2190 SourceLocation Loc = E->getExprLoc();
2191
Fangrui Song1d49eb02020-02-13 16:36:27 -08002192 emitAlignmentAssumption(PtrValue, Ty, Loc, AssumptionLoc, Alignment,
Roman Lebedevbd1c0872019-01-15 09:44:25 +00002193 OffsetValue);
2194}
2195
James Y Knight8799cae2019-02-03 21:53:49 +00002196llvm::Value *CodeGenFunction::EmitAnnotationCall(llvm::Function *AnnotationFn,
Julien Lerouge5a6b6982011-09-09 22:41:49 +00002197 llvm::Value *AnnotatedVal,
Dmitri Gribenkof8579502013-01-12 19:30:44 +00002198 StringRef AnnotationStr,
Julien Lerouge5a6b6982011-09-09 22:41:49 +00002199 SourceLocation Location) {
2200 llvm::Value *Args[4] = {
2201 AnnotatedVal,
2202 Builder.CreateBitCast(CGM.EmitAnnotationString(AnnotationStr), Int8PtrTy),
2203 Builder.CreateBitCast(CGM.EmitAnnotationUnit(Location), Int8PtrTy),
2204 CGM.EmitAnnotationLineNo(Location)
2205 };
2206 return Builder.CreateCall(AnnotationFn, Args);
2207}
2208
2209void CodeGenFunction::EmitVarAnnotations(const VarDecl *D, llvm::Value *V) {
2210 assert(D->hasAttr<AnnotateAttr>() && "no annotate attribute");
2211 // FIXME We create a new bitcast for every annotation because that's what
2212 // llvm-gcc was doing.
Aaron Ballmanbe22bcb2014-03-10 17:08:28 +00002213 for (const auto *I : D->specific_attrs<AnnotateAttr>())
Julien Lerouge5a6b6982011-09-09 22:41:49 +00002214 EmitAnnotationCall(CGM.getIntrinsic(llvm::Intrinsic::var_annotation),
2215 Builder.CreateBitCast(V, CGM.Int8PtrTy, V->getName()),
Aaron Ballmanbe22bcb2014-03-10 17:08:28 +00002216 I->getAnnotation(), D->getLocation());
Julien Lerouge5a6b6982011-09-09 22:41:49 +00002217}
2218
John McCall7f416cc2015-09-08 08:05:57 +00002219Address CodeGenFunction::EmitFieldAnnotations(const FieldDecl *D,
2220 Address Addr) {
Julien Lerouge5a6b6982011-09-09 22:41:49 +00002221 assert(D->hasAttr<AnnotateAttr>() && "no annotate attribute");
John McCall7f416cc2015-09-08 08:05:57 +00002222 llvm::Value *V = Addr.getPointer();
Julien Lerouge5a6b6982011-09-09 22:41:49 +00002223 llvm::Type *VTy = V->getType();
James Y Knight8799cae2019-02-03 21:53:49 +00002224 llvm::Function *F = CGM.getIntrinsic(llvm::Intrinsic::ptr_annotation,
Julien Lerouge5a6b6982011-09-09 22:41:49 +00002225 CGM.Int8PtrTy);
2226
Aaron Ballmanbe22bcb2014-03-10 17:08:28 +00002227 for (const auto *I : D->specific_attrs<AnnotateAttr>()) {
Julien Lerouge5a6b6982011-09-09 22:41:49 +00002228 // FIXME Always emit the cast inst so we can differentiate between
2229 // annotation on the first field of a struct and annotation on the struct
2230 // itself.
2231 if (VTy != CGM.Int8PtrTy)
Erich Keane2a4eea32018-12-18 16:22:21 +00002232 V = Builder.CreateBitCast(V, CGM.Int8PtrTy);
Aaron Ballmanbe22bcb2014-03-10 17:08:28 +00002233 V = EmitAnnotationCall(F, V, I->getAnnotation(), D->getLocation());
Julien Lerouge5a6b6982011-09-09 22:41:49 +00002234 V = Builder.CreateBitCast(V, VTy);
2235 }
2236
John McCall7f416cc2015-09-08 08:05:57 +00002237 return Address(V, Addr.getAlignment());
Julien Lerouge5a6b6982011-09-09 22:41:49 +00002238}
Ben Langmuir3b4c30b2013-05-09 19:17:11 +00002239
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00002240CodeGenFunction::CGCapturedStmtInfo::~CGCapturedStmtInfo() { }
Alexander Musman515ad8c2014-05-22 08:54:05 +00002241
Alexey Samsonov24cad992014-07-17 18:46:27 +00002242CodeGenFunction::SanitizerScope::SanitizerScope(CodeGenFunction *CGF)
2243 : CGF(CGF) {
2244 assert(!CGF->IsSanitizerScope);
2245 CGF->IsSanitizerScope = true;
2246}
2247
2248CodeGenFunction::SanitizerScope::~SanitizerScope() {
2249 CGF->IsSanitizerScope = false;
2250}
2251
Alexander Musman515ad8c2014-05-22 08:54:05 +00002252void CodeGenFunction::InsertHelper(llvm::Instruction *I,
2253 const llvm::Twine &Name,
2254 llvm::BasicBlock *BB,
2255 llvm::BasicBlock::iterator InsertPt) const {
2256 LoopStack.InsertHelper(I);
Kostya Serebryany4ee69042014-08-26 02:29:59 +00002257 if (IsSanitizerScope)
2258 CGM.getSanitizerMetadata()->disableSanitizerForInstruction(I);
Alexander Musman515ad8c2014-05-22 08:54:05 +00002259}
2260
Mehdi Amini557c20a2016-03-13 21:05:23 +00002261void CGBuilderInserter::InsertHelper(
Alexander Musman515ad8c2014-05-22 08:54:05 +00002262 llvm::Instruction *I, const llvm::Twine &Name, llvm::BasicBlock *BB,
2263 llvm::BasicBlock::iterator InsertPt) const {
Mehdi Amini557c20a2016-03-13 21:05:23 +00002264 llvm::IRBuilderDefaultInserter::InsertHelper(I, Name, BB, InsertPt);
Alexander Musman515ad8c2014-05-22 08:54:05 +00002265 if (CGF)
2266 CGF->InsertHelper(I, Name, BB, InsertPt);
2267}
2268
David Blaikie5df253382015-11-12 01:09:58 +00002269static bool hasRequiredFeatures(const SmallVectorImpl<StringRef> &ReqFeatures,
Eric Christopherce836772015-11-14 02:38:37 +00002270 CodeGenModule &CGM, const FunctionDecl *FD,
2271 std::string &FirstMissing) {
David Blaikie5df253382015-11-12 01:09:58 +00002272 // If there aren't any required features listed then go ahead and return.
2273 if (ReqFeatures.empty())
2274 return false;
2275
2276 // Now build up the set of caller features and verify that all the required
2277 // features are there.
2278 llvm::StringMap<bool> CallerFeatureMap;
Craig Topperd35bcbb2019-12-23 10:38:38 -08002279 CGM.getContext().getFunctionFeatureMap(CallerFeatureMap, FD);
David Blaikie5df253382015-11-12 01:09:58 +00002280
2281 // If we have at least one of the features in the feature list return
2282 // true, otherwise return false.
2283 return std::all_of(
2284 ReqFeatures.begin(), ReqFeatures.end(), [&](StringRef Feature) {
2285 SmallVector<StringRef, 1> OrFeatures;
Craig Topper274506d2018-05-03 21:01:33 +00002286 Feature.split(OrFeatures, '|');
Fangrui Song3117b172018-10-20 17:53:42 +00002287 return llvm::any_of(OrFeatures, [&](StringRef Feature) {
2288 if (!CallerFeatureMap.lookup(Feature)) {
2289 FirstMissing = Feature.str();
2290 return false;
2291 }
2292 return true;
2293 });
David Blaikie5df253382015-11-12 01:09:58 +00002294 });
2295}
2296
Eric Christopher2b2d56f2015-11-12 00:44:12 +00002297// Emits an error if we don't have a valid set of target features for the
2298// called function.
Eric Christopherfbfd97e2015-11-12 00:44:07 +00002299void CodeGenFunction::checkTargetFeatures(const CallExpr *E,
2300 const FunctionDecl *TargetDecl) {
Erich Keane36176242019-06-21 22:29:32 +00002301 return checkTargetFeatures(E->getBeginLoc(), TargetDecl);
2302}
2303
2304// Emits an error if we don't have a valid set of target features for the
2305// called function.
2306void CodeGenFunction::checkTargetFeatures(SourceLocation Loc,
2307 const FunctionDecl *TargetDecl) {
Eric Christopherfbfd97e2015-11-12 00:44:07 +00002308 // Early exit if this is an indirect call.
2309 if (!TargetDecl)
2310 return;
2311
2312 // Get the current enclosing function if it exists. If it doesn't
2313 // we can't check the target features anyhow.
Erich Keane856f3fe2019-08-28 20:59:25 +00002314 const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(CurCodeDecl);
Eric Christopherfbfd97e2015-11-12 00:44:07 +00002315 if (!FD)
2316 return;
2317
Eric Christopher2b2d56f2015-11-12 00:44:12 +00002318 // Grab the required features for the call. For a builtin this is listed in
2319 // the td file with the default cpu, for an always_inline function this is any
2320 // listed cpu and any listed features.
Eric Christopherfbfd97e2015-11-12 00:44:07 +00002321 unsigned BuiltinID = TargetDecl->getBuiltinID();
Eric Christopherce836772015-11-14 02:38:37 +00002322 std::string MissingFeature;
Eric Christopher2b2d56f2015-11-12 00:44:12 +00002323 if (BuiltinID) {
2324 SmallVector<StringRef, 1> ReqFeatures;
2325 const char *FeatureList =
2326 CGM.getContext().BuiltinInfo.getRequiredFeatures(BuiltinID);
2327 // Return if the builtin doesn't have any required features.
2328 if (!FeatureList || StringRef(FeatureList) == "")
2329 return;
Craig Topper274506d2018-05-03 21:01:33 +00002330 StringRef(FeatureList).split(ReqFeatures, ',');
Eric Christopherce836772015-11-14 02:38:37 +00002331 if (!hasRequiredFeatures(ReqFeatures, CGM, FD, MissingFeature))
Erich Keane36176242019-06-21 22:29:32 +00002332 CGM.getDiags().Report(Loc, diag::err_builtin_needs_feature)
Eric Christopher2b2d56f2015-11-12 00:44:12 +00002333 << TargetDecl->getDeclName()
2334 << CGM.getContext().BuiltinInfo.getRequiredFeatures(BuiltinID);
2335
Erich Keane0213add2019-11-18 13:38:56 -08002336 } else if (!TargetDecl->isMultiVersion() &&
2337 TargetDecl->hasAttr<TargetAttr>()) {
Eric Christopher2b2d56f2015-11-12 00:44:12 +00002338 // Get the required features for the callee.
Gabor Buella1a83d062018-06-07 08:48:36 +00002339
2340 const TargetAttr *TD = TargetDecl->getAttr<TargetAttr>();
Craig Topperd35bcbb2019-12-23 10:38:38 -08002341 ParsedTargetAttr ParsedAttr =
2342 CGM.getContext().filterFunctionTargetAttrs(TD);
Gabor Buella1a83d062018-06-07 08:48:36 +00002343
Eric Christopher2b2d56f2015-11-12 00:44:12 +00002344 SmallVector<StringRef, 1> ReqFeatures;
2345 llvm::StringMap<bool> CalleeFeatureMap;
Erich Keane30588a72020-04-08 13:14:33 -07002346 CGM.getContext().getFunctionFeatureMap(CalleeFeatureMap, TargetDecl);
Gabor Buella1a83d062018-06-07 08:48:36 +00002347
2348 for (const auto &F : ParsedAttr.Features) {
2349 if (F[0] == '+' && CalleeFeatureMap.lookup(F.substr(1)))
2350 ReqFeatures.push_back(StringRef(F).substr(1));
2351 }
2352
Eric Christopherb7bbc532015-11-16 18:29:59 +00002353 for (const auto &F : CalleeFeatureMap) {
2354 // Only positive features are "required".
2355 if (F.getValue())
2356 ReqFeatures.push_back(F.getKey());
2357 }
Eric Christopherce836772015-11-14 02:38:37 +00002358 if (!hasRequiredFeatures(ReqFeatures, CGM, FD, MissingFeature))
Erich Keane36176242019-06-21 22:29:32 +00002359 CGM.getDiags().Report(Loc, diag::err_function_needs_feature)
Eric Christopherce836772015-11-14 02:38:37 +00002360 << FD->getDeclName() << TargetDecl->getDeclName() << MissingFeature;
Eric Christopher2b2d56f2015-11-12 00:44:12 +00002361 }
Eric Christopherfbfd97e2015-11-12 00:44:07 +00002362}
Peter Collingbournedc134532016-01-16 00:31:22 +00002363
2364void CodeGenFunction::EmitSanitizerStatReport(llvm::SanitizerStatKind SSK) {
2365 if (!CGM.getCodeGenOpts().SanitizeStats)
2366 return;
2367
2368 llvm::IRBuilder<> IRB(Builder.GetInsertBlock(), Builder.GetInsertPoint());
2369 IRB.SetCurrentDebugLocation(Builder.getCurrentDebugLocation());
2370 CGM.getSanStats().create(IRB, SSK);
2371}
Amara Emerson652795d2016-11-10 14:44:30 +00002372
Erich Keanef353ae12018-09-13 16:58:24 +00002373llvm::Value *
2374CodeGenFunction::FormResolverCondition(const MultiVersionResolverOption &RO) {
2375 llvm::Value *Condition = nullptr;
Erich Keane281d20b2018-01-08 21:34:17 +00002376
Erich Keanef353ae12018-09-13 16:58:24 +00002377 if (!RO.Conditions.Architecture.empty())
2378 Condition = EmitX86CpuIs(RO.Conditions.Architecture);
2379
2380 if (!RO.Conditions.Features.empty()) {
2381 llvm::Value *FeatureCond = EmitX86CpuSupports(RO.Conditions.Features);
2382 Condition =
2383 Condition ? Builder.CreateAnd(Condition, FeatureCond) : FeatureCond;
Erich Keane281d20b2018-01-08 21:34:17 +00002384 }
Erich Keanef353ae12018-09-13 16:58:24 +00002385 return Condition;
Erich Keane281d20b2018-01-08 21:34:17 +00002386}
2387
Erich Keane19a8adc2018-10-25 18:57:19 +00002388static void CreateMultiVersionResolverReturn(CodeGenModule &CGM,
2389 llvm::Function *Resolver,
2390 CGBuilderTy &Builder,
2391 llvm::Function *FuncToReturn,
2392 bool SupportsIFunc) {
2393 if (SupportsIFunc) {
2394 Builder.CreateRet(FuncToReturn);
2395 return;
2396 }
2397
2398 llvm::SmallVector<llvm::Value *, 10> Args;
2399 llvm::for_each(Resolver->args(),
2400 [&](llvm::Argument &Arg) { Args.push_back(&Arg); });
2401
2402 llvm::CallInst *Result = Builder.CreateCall(FuncToReturn, Args);
2403 Result->setTailCallKind(llvm::CallInst::TCK_MustTail);
2404
2405 if (Resolver->getReturnType()->isVoidTy())
2406 Builder.CreateRetVoid();
2407 else
2408 Builder.CreateRet(Result);
2409}
2410
Erich Keanef353ae12018-09-13 16:58:24 +00002411void CodeGenFunction::EmitMultiVersionResolver(
2412 llvm::Function *Resolver, ArrayRef<MultiVersionResolverOption> Options) {
Jim Linab1bcda2020-01-07 17:32:39 +08002413 assert(getContext().getTargetInfo().getTriple().isX86() &&
Erich Keane281d20b2018-01-08 21:34:17 +00002414 "Only implemented for x86 targets");
Erich Keane19a8adc2018-10-25 18:57:19 +00002415
2416 bool SupportsIFunc = getContext().getTargetInfo().supportsIFunc();
2417
Erich Keane3efe0022018-07-20 14:13:28 +00002418 // Main function's basic block.
2419 llvm::BasicBlock *CurBlock = createBasicBlock("resolver_entry", Resolver);
2420 Builder.SetInsertPoint(CurBlock);
2421 EmitX86CpuInit();
2422
Erich Keanef353ae12018-09-13 16:58:24 +00002423 for (const MultiVersionResolverOption &RO : Options) {
Erich Keane3efe0022018-07-20 14:13:28 +00002424 Builder.SetInsertPoint(CurBlock);
Erich Keanef353ae12018-09-13 16:58:24 +00002425 llvm::Value *Condition = FormResolverCondition(RO);
Erich Keane3efe0022018-07-20 14:13:28 +00002426
Erich Keanef353ae12018-09-13 16:58:24 +00002427 // The 'default' or 'generic' case.
2428 if (!Condition) {
2429 assert(&RO == Options.end() - 1 &&
2430 "Default or Generic case must be last");
Erich Keane19a8adc2018-10-25 18:57:19 +00002431 CreateMultiVersionResolverReturn(CGM, Resolver, Builder, RO.Function,
2432 SupportsIFunc);
Erich Keane3efe0022018-07-20 14:13:28 +00002433 return;
2434 }
Erich Keanef353ae12018-09-13 16:58:24 +00002435
Erich Keane3efe0022018-07-20 14:13:28 +00002436 llvm::BasicBlock *RetBlock = createBasicBlock("resolver_return", Resolver);
Erich Keane19a8adc2018-10-25 18:57:19 +00002437 CGBuilderTy RetBuilder(*this, RetBlock);
2438 CreateMultiVersionResolverReturn(CGM, Resolver, RetBuilder, RO.Function,
2439 SupportsIFunc);
Erich Keane3efe0022018-07-20 14:13:28 +00002440 CurBlock = createBasicBlock("resolver_else", Resolver);
Erich Keanef353ae12018-09-13 16:58:24 +00002441 Builder.CreateCondBr(Condition, RetBlock, CurBlock);
Erich Keane3efe0022018-07-20 14:13:28 +00002442 }
2443
Erich Keanef353ae12018-09-13 16:58:24 +00002444 // If no generic/default, emit an unreachable.
Erich Keane3efe0022018-07-20 14:13:28 +00002445 Builder.SetInsertPoint(CurBlock);
2446 llvm::CallInst *TrapCall = EmitTrapCall(llvm::Intrinsic::trap);
2447 TrapCall->setDoesNotReturn();
2448 TrapCall->setDoesNotThrow();
2449 Builder.CreateUnreachable();
2450 Builder.ClearInsertionPoint();
2451}
2452
Roman Lebedevbd1c0872019-01-15 09:44:25 +00002453// Loc - where the diagnostic will point, where in the source code this
2454// alignment has failed.
2455// SecondaryLoc - if present (will be present if sufficiently different from
2456// Loc), the diagnostic will additionally point a "Note:" to this location.
2457// It should be the location where the __attribute__((assume_aligned))
2458// was written e.g.
Fangrui Song1d49eb02020-02-13 16:36:27 -08002459void CodeGenFunction::emitAlignmentAssumptionCheck(
Roman Lebedevbd1c0872019-01-15 09:44:25 +00002460 llvm::Value *Ptr, QualType Ty, SourceLocation Loc,
2461 SourceLocation SecondaryLoc, llvm::Value *Alignment,
2462 llvm::Value *OffsetValue, llvm::Value *TheCheck,
2463 llvm::Instruction *Assumption) {
2464 assert(Assumption && isa<llvm::CallInst>(Assumption) &&
2465 cast<llvm::CallInst>(Assumption)->getCalledValue() ==
2466 llvm::Intrinsic::getDeclaration(
2467 Builder.GetInsertBlock()->getParent()->getParent(),
2468 llvm::Intrinsic::assume) &&
2469 "Assumption should be a call to llvm.assume().");
2470 assert(&(Builder.GetInsertBlock()->back()) == Assumption &&
2471 "Assumption should be the last instruction of the basic block, "
2472 "since the basic block is still being generated.");
2473
2474 if (!SanOpts.has(SanitizerKind::Alignment))
2475 return;
2476
2477 // Don't check pointers to volatile data. The behavior here is implementation-
2478 // defined.
2479 if (Ty->getPointeeType().isVolatileQualified())
2480 return;
2481
2482 // We need to temorairly remove the assumption so we can insert the
2483 // sanitizer check before it, else the check will be dropped by optimizations.
2484 Assumption->removeFromParent();
2485
2486 {
2487 SanitizerScope SanScope(this);
2488
2489 if (!OffsetValue)
2490 OffsetValue = Builder.getInt1(0); // no offset.
2491
2492 llvm::Constant *StaticData[] = {EmitCheckSourceLocation(Loc),
2493 EmitCheckSourceLocation(SecondaryLoc),
2494 EmitCheckTypeDescriptor(Ty)};
2495 llvm::Value *DynamicData[] = {EmitCheckValue(Ptr),
2496 EmitCheckValue(Alignment),
2497 EmitCheckValue(OffsetValue)};
2498 EmitCheck({std::make_pair(TheCheck, SanitizerKind::Alignment)},
2499 SanitizerHandler::AlignmentAssumption, StaticData, DynamicData);
2500 }
2501
2502 // We are now in the (new, empty) "cont" basic block.
2503 // Reintroduce the assumption.
2504 Builder.Insert(Assumption);
2505 // FIXME: Assumption still has it's original basic block as it's Parent.
2506}
2507
Amara Emerson652795d2016-11-10 14:44:30 +00002508llvm::DebugLoc CodeGenFunction::SourceLocToDebugLoc(SourceLocation Location) {
2509 if (CGDebugInfo *DI = getDebugInfo())
2510 return DI->SourceLocToDebugLoc(Location);
2511
2512 return llvm::DebugLoc();
2513}