CodeGenFunction.cpp revision 63fd408a61ae9b94e8d8a986832f526f7cdbfa84
15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===--- CodeGenFunction.cpp - Emit LLVM Code from ASTs for a Function ----===//
25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//                     The LLVM Compiler Infrastructure
45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source
60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details.
75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// This coordinates the per-function state used while generating code.
115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "CodeGenFunction.h"
15a4ae2294b6ebfb2554aacb6a6a0682fb5ed1f276Peter Collingbourne#include "CGCUDARuntime.h"
164c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall#include "CGCXXABI.h"
173f2af1002249c8acc9ce17f1fc50324864feb8e1Eli Friedman#include "CGDebugInfo.h"
1855fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "CodeGenModule.h"
19de7fb8413b13651fd85b7125d08b3c9ac2816d9dDaniel Dunbar#include "clang/AST/ASTContext.h"
20c4a1dea2dc56bd1357ec91b829a0b9e68229a13eDaniel Dunbar#include "clang/AST/Decl.h"
212b77ba8bc7a842829ad9193816dc1d7d5e9c5be6Anders Carlsson#include "clang/AST/DeclCXX.h"
226a1e0eb557d47e85185e09bdf8721f53f4bf9c9cMike Stump#include "clang/AST/StmtCXX.h"
2355fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Basic/TargetInfo.h"
247255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner#include "clang/Frontend/CodeGenOptions.h"
253b844ba7d5be205a9b4f5f0b0d1b7978977f4b8cChandler Carruth#include "llvm/IR/DataLayout.h"
263b844ba7d5be205a9b4f5f0b0d1b7978977f4b8cChandler Carruth#include "llvm/IR/Intrinsics.h"
273b844ba7d5be205a9b4f5f0b0d1b7978977f4b8cChandler Carruth#include "llvm/IR/MDBuilder.h"
283b844ba7d5be205a9b4f5f0b0d1b7978977f4b8cChandler Carruth#include "llvm/IR/Operator.h"
295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang;
305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace CodeGen;
315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
324904bf4e84cfb48080270ebaa9005327f18ab0e5Fariborz JahanianCodeGenFunction::CodeGenFunction(CodeGenModule &cgm, bool suppressNewContext)
335936e33bf74dd6bf126ceee0f6169a2593d03a69John McCall  : CodeGenTypeCache(cgm), CGM(cgm),
34cec5ebd4a6a89a7023d04cec728fd340b541ed61Eli Friedman    Target(CGM.getContext().getTargetInfo()),
35cec5ebd4a6a89a7023d04cec728fd340b541ed61Eli Friedman    Builder(cgm.getModule().getContext()),
364f45bc099f2665bc6e4bcbb169aa452390dbf3feWill Dietz    SanitizePerformTypeCheck(CGM.getSanOpts().Null |
374f45bc099f2665bc6e4bcbb169aa452390dbf3feWill Dietz                             CGM.getSanOpts().Alignment |
384f45bc099f2665bc6e4bcbb169aa452390dbf3feWill Dietz                             CGM.getSanOpts().ObjectSize |
394f45bc099f2665bc6e4bcbb169aa452390dbf3feWill Dietz                             CGM.getSanOpts().Vptr),
404f45bc099f2665bc6e4bcbb169aa452390dbf3feWill Dietz    SanOpts(&CGM.getSanOpts()),
41f85e193739c953358c865005855253af4f68a497John McCall    AutoreleaseResult(false), BlockInfo(0), BlockPointer(0),
4223f0267e2d56c0407f12e62df3561ecf75d74e6eEli Friedman    LambdaThisCaptureField(0), NormalCleanupDest(0), NextCleanupDestIndex(1),
43cec5ebd4a6a89a7023d04cec728fd340b541ed61Eli Friedman    FirstBlockInfo(0), EHResumeBlock(0), ExceptionSlot(0), EHSelectorSlot(0),
4493c332a8ba2c193c435b293966d343dab15f555bJohn McCall    DebugInfo(0), DisableDebugInfo(false), DidCallStackSave(false),
4593c332a8ba2c193c435b293966d343dab15f555bJohn McCall    IndirectBranch(0), SwitchInsn(0), CaseRangeBlock(0), UnreachableBlock(0),
4659660c21178b6af518bd4b564e032d5c9cc218cbTimur Iskhodzhanov    CXXABIThisDecl(0), CXXABIThisValue(0), CXXThisValue(0),
4759660c21178b6af518bd4b564e032d5c9cc218cbTimur Iskhodzhanov    CXXStructorImplicitParamDecl(0), CXXStructorImplicitParamValue(0),
4859660c21178b6af518bd4b564e032d5c9cc218cbTimur Iskhodzhanov    OutermostConditional(0), TerminateLandingPad(0),
49cec5ebd4a6a89a7023d04cec728fd340b541ed61Eli Friedman    TerminateHandler(0), TrapBB(0) {
504904bf4e84cfb48080270ebaa9005327f18ab0e5Fariborz Jahanian  if (!suppressNewContext)
514904bf4e84cfb48080270ebaa9005327f18ab0e5Fariborz Jahanian    CGM.getCXXABI().getMangleContext().startNewFunction();
52cdeb7d57a4867c28e3e6a8c391cba6f13c781fa6Michael Ilseman
53cdeb7d57a4867c28e3e6a8c391cba6f13c781fa6Michael Ilseman  llvm::FastMathFlags FMF;
54cdeb7d57a4867c28e3e6a8c391cba6f13c781fa6Michael Ilseman  if (CGM.getLangOpts().FastMath)
5529573b0a825b888c233d7859a257e866ffc5276eBenjamin Kramer    FMF.setUnsafeAlgebra();
56cdeb7d57a4867c28e3e6a8c391cba6f13c781fa6Michael Ilseman  if (CGM.getLangOpts().FiniteMathOnly) {
5729573b0a825b888c233d7859a257e866ffc5276eBenjamin Kramer    FMF.setNoNaNs();
5829573b0a825b888c233d7859a257e866ffc5276eBenjamin Kramer    FMF.setNoInfs();
59cdeb7d57a4867c28e3e6a8c391cba6f13c781fa6Michael Ilseman  }
60cdeb7d57a4867c28e3e6a8c391cba6f13c781fa6Michael Ilseman  Builder.SetFastMathFlags(FMF);
614111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner}
625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
631a343ebbf413e8eae6b2737b2b2d79cbf5765571John McCallCodeGenFunction::~CodeGenFunction() {
641a343ebbf413e8eae6b2737b2b2d79cbf5765571John McCall  // If there are any unclaimed block infos, go ahead and destroy them
651a343ebbf413e8eae6b2737b2b2d79cbf5765571John McCall  // now.  This can happen if IR-gen gets clever and skips evaluating
661a343ebbf413e8eae6b2737b2b2d79cbf5765571John McCall  // something.
671a343ebbf413e8eae6b2737b2b2d79cbf5765571John McCall  if (FirstBlockInfo)
681a343ebbf413e8eae6b2737b2b2d79cbf5765571John McCall    destroyBlockInfos(FirstBlockInfo);
691a343ebbf413e8eae6b2737b2b2d79cbf5765571John McCall}
701a343ebbf413e8eae6b2737b2b2d79cbf5765571John McCall
715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
729cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattnerllvm::Type *CodeGenFunction::ConvertTypeForMem(QualType T) {
738b1a343b6b360d63d5dc8a6beb841ce4414c1e00Daniel Dunbar  return CGM.getTypes().ConvertTypeForMem(T);
748b1a343b6b360d63d5dc8a6beb841ce4414c1e00Daniel Dunbar}
758b1a343b6b360d63d5dc8a6beb841ce4414c1e00Daniel Dunbar
769cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattnerllvm::Type *CodeGenFunction::ConvertType(QualType T) {
775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return CGM.getTypes().ConvertType(T);
785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
809d232c884ea9872d6555df0fd7359699819bc1f1John McCallTypeEvaluationKind CodeGenFunction::getEvaluationKind(QualType type) {
819d232c884ea9872d6555df0fd7359699819bc1f1John McCall  type = type.getCanonicalType();
829d232c884ea9872d6555df0fd7359699819bc1f1John McCall  while (true) {
839d232c884ea9872d6555df0fd7359699819bc1f1John McCall    switch (type->getTypeClass()) {
84f2aac84709c418189e476ad591848dad50291885John McCall#define TYPE(name, parent)
85f2aac84709c418189e476ad591848dad50291885John McCall#define ABSTRACT_TYPE(name, parent)
86f2aac84709c418189e476ad591848dad50291885John McCall#define NON_CANONICAL_TYPE(name, parent) case Type::name:
87f2aac84709c418189e476ad591848dad50291885John McCall#define DEPENDENT_TYPE(name, parent) case Type::name:
88f2aac84709c418189e476ad591848dad50291885John McCall#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(name, parent) case Type::name:
89f2aac84709c418189e476ad591848dad50291885John McCall#include "clang/AST/TypeNodes.def"
909d232c884ea9872d6555df0fd7359699819bc1f1John McCall      llvm_unreachable("non-canonical or dependent type in IR-generation");
919d232c884ea9872d6555df0fd7359699819bc1f1John McCall
929d232c884ea9872d6555df0fd7359699819bc1f1John McCall    // Various scalar types.
939d232c884ea9872d6555df0fd7359699819bc1f1John McCall    case Type::Builtin:
949d232c884ea9872d6555df0fd7359699819bc1f1John McCall    case Type::Pointer:
959d232c884ea9872d6555df0fd7359699819bc1f1John McCall    case Type::BlockPointer:
969d232c884ea9872d6555df0fd7359699819bc1f1John McCall    case Type::LValueReference:
979d232c884ea9872d6555df0fd7359699819bc1f1John McCall    case Type::RValueReference:
989d232c884ea9872d6555df0fd7359699819bc1f1John McCall    case Type::MemberPointer:
999d232c884ea9872d6555df0fd7359699819bc1f1John McCall    case Type::Vector:
1009d232c884ea9872d6555df0fd7359699819bc1f1John McCall    case Type::ExtVector:
1019d232c884ea9872d6555df0fd7359699819bc1f1John McCall    case Type::FunctionProto:
1029d232c884ea9872d6555df0fd7359699819bc1f1John McCall    case Type::FunctionNoProto:
1039d232c884ea9872d6555df0fd7359699819bc1f1John McCall    case Type::Enum:
1049d232c884ea9872d6555df0fd7359699819bc1f1John McCall    case Type::ObjCObjectPointer:
1059d232c884ea9872d6555df0fd7359699819bc1f1John McCall      return TEK_Scalar;
1069d232c884ea9872d6555df0fd7359699819bc1f1John McCall
1079d232c884ea9872d6555df0fd7359699819bc1f1John McCall    // Complexes.
1089d232c884ea9872d6555df0fd7359699819bc1f1John McCall    case Type::Complex:
1099d232c884ea9872d6555df0fd7359699819bc1f1John McCall      return TEK_Complex;
1109d232c884ea9872d6555df0fd7359699819bc1f1John McCall
1119d232c884ea9872d6555df0fd7359699819bc1f1John McCall    // Arrays, records, and Objective-C objects.
1129d232c884ea9872d6555df0fd7359699819bc1f1John McCall    case Type::ConstantArray:
1139d232c884ea9872d6555df0fd7359699819bc1f1John McCall    case Type::IncompleteArray:
1149d232c884ea9872d6555df0fd7359699819bc1f1John McCall    case Type::VariableArray:
1159d232c884ea9872d6555df0fd7359699819bc1f1John McCall    case Type::Record:
1169d232c884ea9872d6555df0fd7359699819bc1f1John McCall    case Type::ObjCObject:
1179d232c884ea9872d6555df0fd7359699819bc1f1John McCall    case Type::ObjCInterface:
1189d232c884ea9872d6555df0fd7359699819bc1f1John McCall      return TEK_Aggregate;
1199d232c884ea9872d6555df0fd7359699819bc1f1John McCall
1209d232c884ea9872d6555df0fd7359699819bc1f1John McCall    // We operate on atomic values according to their underlying type.
1219d232c884ea9872d6555df0fd7359699819bc1f1John McCall    case Type::Atomic:
1229d232c884ea9872d6555df0fd7359699819bc1f1John McCall      type = cast<AtomicType>(type)->getValueType();
1239d232c884ea9872d6555df0fd7359699819bc1f1John McCall      continue;
1249d232c884ea9872d6555df0fd7359699819bc1f1John McCall    }
1259d232c884ea9872d6555df0fd7359699819bc1f1John McCall    llvm_unreachable("unknown type kind!");
126f2aac84709c418189e476ad591848dad50291885John McCall  }
1274111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner}
128391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner
1290a0f93c90fd397a1aa9f97283c55f8ba0062bf55David Blaikievoid CodeGenFunction::EmitReturnBlock() {
1301c1d6074f5a0296dd273362655b1b8f9057289e3Daniel Dunbar  // For cleanliness, we try to avoid emitting the return block for
1311c1d6074f5a0296dd273362655b1b8f9057289e3Daniel Dunbar  // simple cases.
1321c1d6074f5a0296dd273362655b1b8f9057289e3Daniel Dunbar  llvm::BasicBlock *CurBB = Builder.GetInsertBlock();
1331c1d6074f5a0296dd273362655b1b8f9057289e3Daniel Dunbar
1341c1d6074f5a0296dd273362655b1b8f9057289e3Daniel Dunbar  if (CurBB) {
1351c1d6074f5a0296dd273362655b1b8f9057289e3Daniel Dunbar    assert(!CurBB->getTerminator() && "Unexpected terminated block.");
1361c1d6074f5a0296dd273362655b1b8f9057289e3Daniel Dunbar
13796e18b05ea6b55aa92a1a576f29e9cee73a7e20bDaniel Dunbar    // We have a valid insert point, reuse it if it is empty or there are no
13896e18b05ea6b55aa92a1a576f29e9cee73a7e20bDaniel Dunbar    // explicit jumps to the return block.
139ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall    if (CurBB->empty() || ReturnBlock.getBlock()->use_empty()) {
140ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall      ReturnBlock.getBlock()->replaceAllUsesWith(CurBB);
141ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall      delete ReturnBlock.getBlock();
14296e18b05ea6b55aa92a1a576f29e9cee73a7e20bDaniel Dunbar    } else
143ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall      EmitBlock(ReturnBlock.getBlock());
1440a0f93c90fd397a1aa9f97283c55f8ba0062bf55David Blaikie    return;
1451c1d6074f5a0296dd273362655b1b8f9057289e3Daniel Dunbar  }
1461c1d6074f5a0296dd273362655b1b8f9057289e3Daniel Dunbar
1471c1d6074f5a0296dd273362655b1b8f9057289e3Daniel Dunbar  // Otherwise, if the return block is the target of a single direct
1481c1d6074f5a0296dd273362655b1b8f9057289e3Daniel Dunbar  // branch then we can just put the code in that block instead. This
1491c1d6074f5a0296dd273362655b1b8f9057289e3Daniel Dunbar  // cleans up functions which started with a unified return block.
150ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall  if (ReturnBlock.getBlock()->hasOneUse()) {
1511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    llvm::BranchInst *BI =
152ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall      dyn_cast<llvm::BranchInst>(*ReturnBlock.getBlock()->use_begin());
153f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall    if (BI && BI->isUnconditional() &&
154ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall        BI->getSuccessor(0) == ReturnBlock.getBlock()) {
155c5139a9f0c9d4f835e4ab0b51e78d2f74fb488d9David Blaikie      // Reset insertion point, including debug location, and delete the
156c5139a9f0c9d4f835e4ab0b51e78d2f74fb488d9David Blaikie      // branch.  This is really subtle and only works because the next change
157c5139a9f0c9d4f835e4ab0b51e78d2f74fb488d9David Blaikie      // in location will hit the caching in CGDebugInfo::EmitLocation and not
158c5139a9f0c9d4f835e4ab0b51e78d2f74fb488d9David Blaikie      // override this.
159acae01124151392a842bd6c37bd01b1ad56d6b4dEric Christopher      Builder.SetCurrentDebugLocation(BI->getDebugLoc());
1601c1d6074f5a0296dd273362655b1b8f9057289e3Daniel Dunbar      Builder.SetInsertPoint(BI->getParent());
1611c1d6074f5a0296dd273362655b1b8f9057289e3Daniel Dunbar      BI->eraseFromParent();
162ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall      delete ReturnBlock.getBlock();
1630a0f93c90fd397a1aa9f97283c55f8ba0062bf55David Blaikie      return;
1641c1d6074f5a0296dd273362655b1b8f9057289e3Daniel Dunbar    }
1651c1d6074f5a0296dd273362655b1b8f9057289e3Daniel Dunbar  }
1661c1d6074f5a0296dd273362655b1b8f9057289e3Daniel Dunbar
167f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  // FIXME: We are at an unreachable point, there is no reason to emit the block
168f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  // unless it has uses. However, we still need a place to put the debug
169f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  // region.end for now.
1701c1d6074f5a0296dd273362655b1b8f9057289e3Daniel Dunbar
171ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall  EmitBlock(ReturnBlock.getBlock());
172f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall}
173f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall
174f1549f66a8216a78112286e3978cea2c29d6334cJohn McCallstatic void EmitIfUsed(CodeGenFunction &CGF, llvm::BasicBlock *BB) {
175f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall  if (!BB) return;
176f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall  if (!BB->use_empty())
177f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall    return CGF.CurFn->getBasicBlockList().push_back(BB);
178f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall  delete BB;
1791c1d6074f5a0296dd273362655b1b8f9057289e3Daniel Dunbar}
1801c1d6074f5a0296dd273362655b1b8f9057289e3Daniel Dunbar
181af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbarvoid CodeGenFunction::FinishFunction(SourceLocation EndLoc) {
182391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner  assert(BreakContinueStack.empty() &&
183391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner         "mismatched push/pop in break/continue stack!");
1841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1850a0f93c90fd397a1aa9f97283c55f8ba0062bf55David Blaikie  if (CGDebugInfo *DI = getDebugInfo())
1860a0f93c90fd397a1aa9f97283c55f8ba0062bf55David Blaikie    DI->EmitLocation(Builder, EndLoc);
1870a0f93c90fd397a1aa9f97283c55f8ba0062bf55David Blaikie
188f85e193739c953358c865005855253af4f68a497John McCall  // Pop any cleanups that might have been associated with the
189f85e193739c953358c865005855253af4f68a497John McCall  // parameters.  Do this in whatever block we're currently in; it's
190f85e193739c953358c865005855253af4f68a497John McCall  // important to do this before we enter the return block or return
191f85e193739c953358c865005855253af4f68a497John McCall  // edges will be *really* confused.
192f85e193739c953358c865005855253af4f68a497John McCall  if (EHStack.stable_begin() != PrologueCleanupDepth)
193f85e193739c953358c865005855253af4f68a497John McCall    PopCleanupBlocks(PrologueCleanupDepth);
194f85e193739c953358c865005855253af4f68a497John McCall
1951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // Emit function epilog (to return).
1960a0f93c90fd397a1aa9f97283c55f8ba0062bf55David Blaikie  EmitReturnBlock();
197f5bd45c8e6fa7519cdc17ec3ff4917e279c6a041Daniel Dunbar
198a18652fe1e8233fbf8b67484945c7f7b2bf272beDaniel Dunbar  if (ShouldInstrumentFunction())
199a18652fe1e8233fbf8b67484945c7f7b2bf272beDaniel Dunbar    EmitFunctionInstrumentation("__cyg_profile_func_exit");
2007255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner
201f5bd45c8e6fa7519cdc17ec3ff4917e279c6a041Daniel Dunbar  // Emit debug descriptor for function end.
202e896d98548b02223c7740d807a0aa6e20fba7079Anders Carlsson  if (CGDebugInfo *DI = getDebugInfo()) {
2035a6fbcfd8c15a2296f94a0473a68ec09d429827fDevang Patel    DI->EmitFunctionEnd(Builder);
204f5bd45c8e6fa7519cdc17ec3ff4917e279c6a041Daniel Dunbar  }
205f5bd45c8e6fa7519cdc17ec3ff4917e279c6a041Daniel Dunbar
20635b21b884e5c3447a52a74d7ffaba966b07ac81fChris Lattner  EmitFunctionEpilog(*CurFnInfo);
207cce3d4f9812182ed4e551b7cf0fc86576be8d9c5Mike Stump  EmitEndEHSpec(CurCodeDecl);
2085ca2084cf9b529563209429857f01fdae9dcdfa5Daniel Dunbar
209f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall  assert(EHStack.empty() &&
210f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall         "did not remove all scopes from cleanup stack!");
211f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall
212d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner  // If someone did an indirect goto, emit the indirect goto block at the end of
213d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner  // the function.
214d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner  if (IndirectBranch) {
215d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner    EmitBlock(IndirectBranch->getParent());
216d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner    Builder.ClearInsertionPoint();
217d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner  }
2189dce4b3d9d14ba2be2aad5bd7fd8d381a0263c36Michael Ilseman
219391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner  // Remove the AllocaInsertPt instruction, which is just a convenience for us.
220481769b5dc102b0256b35581e787909ad5edfab5Chris Lattner  llvm::Instruction *Ptr = AllocaInsertPt;
221391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner  AllocaInsertPt = 0;
222481769b5dc102b0256b35581e787909ad5edfab5Chris Lattner  Ptr->eraseFromParent();
2239dce4b3d9d14ba2be2aad5bd7fd8d381a0263c36Michael Ilseman
224d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner  // If someone took the address of a label but never did an indirect goto, we
225d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner  // made a zero entry PHI node, which is illegal, zap it now.
226d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner  if (IndirectBranch) {
227d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner    llvm::PHINode *PN = cast<llvm::PHINode>(IndirectBranch->getAddress());
228d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner    if (PN->getNumIncomingValues() == 0) {
229d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner      PN->replaceAllUsesWith(llvm::UndefValue::get(PN->getType()));
230d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner      PN->eraseFromParent();
231d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner    }
232d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner  }
233f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall
234777d6e56ad9b1fed9866daf3ee6486d85c5b7d32John McCall  EmitIfUsed(*this, EHResumeBlock);
235f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall  EmitIfUsed(*this, TerminateLandingPad);
236f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall  EmitIfUsed(*this, TerminateHandler);
237f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall  EmitIfUsed(*this, UnreachableBlock);
238744016dde06fcffd50931e94a98c850f8b12cd87John McCall
239744016dde06fcffd50931e94a98c850f8b12cd87John McCall  if (CGM.getCodeGenOpts().EmitDeclMetadata)
240744016dde06fcffd50931e94a98c850f8b12cd87John McCall    EmitDeclMetadata();
241c8aa5f1f264fb230c38182adab944232bb160c2bChris Lattner}
242c8aa5f1f264fb230c38182adab944232bb160c2bChris Lattner
2437255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner/// ShouldInstrumentFunction - Return true if the current function should be
2447255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner/// instrumented with __cyg_profile_func_* calls
2457255a2d997b15beae82e627052fdb1b2474495c2Chris Lattnerbool CodeGenFunction::ShouldInstrumentFunction() {
2467255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner  if (!CGM.getCodeGenOpts().InstrumentFunctions)
2477255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner    return false;
2487aa488a7fc5c3a8cd1a2b93476150e9737760713Ted Kremenek  if (!CurFuncDecl || CurFuncDecl->hasAttr<NoInstrumentFunctionAttr>())
2497255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner    return false;
2507255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner  return true;
2517255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner}
2527255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner
2537255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner/// EmitFunctionInstrumentation - Emit LLVM code to call the specified
2547255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner/// instrumentation function with the current function and the call site, if
2557255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner/// function instrumentation is enabled.
2567255a2d997b15beae82e627052fdb1b2474495c2Chris Lattnervoid CodeGenFunction::EmitFunctionInstrumentation(const char *Fn) {
2578dab6571b2cab96f44d0a1d6e3edbfdb68b7ed6bChris Lattner  // void __cyg_profile_func_{enter,exit} (void *this_fn, void *call_site);
2589cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner  llvm::PointerType *PointerTy = Int8PtrTy;
2599cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner  llvm::Type *ProfileFuncArgs[] = { PointerTy, PointerTy };
2602acc6e3feda5e4f7d9009bdcf8b1cd777fecfe2dChris Lattner  llvm::FunctionType *FunctionTy =
2618b418685e9e4f02f4eb2a76e1ec063e07552b68dChris Lattner    llvm::FunctionType::get(VoidTy, ProfileFuncArgs, false);
2627255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner
2637255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner  llvm::Constant *F = CGM.CreateRuntimeFunction(FunctionTy, Fn);
2647255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner  llvm::CallInst *CallSite = Builder.CreateCall(
2658dd55a3c3b28d195717c87bbc60e765951d408feBenjamin Kramer    CGM.getIntrinsic(llvm::Intrinsic::returnaddress),
26677b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner    llvm::ConstantInt::get(Int32Ty, 0),
2677255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner    "callsite");
2687255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner
269bd7370a78604e9a20d698bfe328c1e43f12a0613John McCall  llvm::Value *args[] = {
270bd7370a78604e9a20d698bfe328c1e43f12a0613John McCall    llvm::ConstantExpr::getBitCast(CurFn, PointerTy),
271bd7370a78604e9a20d698bfe328c1e43f12a0613John McCall    CallSite
272bd7370a78604e9a20d698bfe328c1e43f12a0613John McCall  };
273bd7370a78604e9a20d698bfe328c1e43f12a0613John McCall
274bd7370a78604e9a20d698bfe328c1e43f12a0613John McCall  EmitNounwindRuntimeCall(F, args);
2757255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner}
2767255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner
277be4c8705e499b55548467eb7adaa23cbc6edfef9Roman Divackyvoid CodeGenFunction::EmitMCountInstrumentation() {
2788b418685e9e4f02f4eb2a76e1ec063e07552b68dChris Lattner  llvm::FunctionType *FTy = llvm::FunctionType::get(VoidTy, false);
279be4c8705e499b55548467eb7adaa23cbc6edfef9Roman Divacky
280be4c8705e499b55548467eb7adaa23cbc6edfef9Roman Divacky  llvm::Constant *MCountFn = CGM.CreateRuntimeFunction(FTy,
281be4c8705e499b55548467eb7adaa23cbc6edfef9Roman Divacky                                                       Target.getMCountName());
282bd7370a78604e9a20d698bfe328c1e43f12a0613John McCall  EmitNounwindRuntimeCall(MCountFn);
283be4c8705e499b55548467eb7adaa23cbc6edfef9Roman Divacky}
284be4c8705e499b55548467eb7adaa23cbc6edfef9Roman Divacky
285198871cc90375246d8692680467ff6e810edac36Tanya Lattner// OpenCL v1.2 s5.6.4.6 allows the compiler to store kernel argument
286198871cc90375246d8692680467ff6e810edac36Tanya Lattner// information in the program executable. The argument information stored
287198871cc90375246d8692680467ff6e810edac36Tanya Lattner// includes the argument name, its type, the address and access qualifiers used.
288198871cc90375246d8692680467ff6e810edac36Tanya Lattner// FIXME: Add type, address, and access qualifiers.
289198871cc90375246d8692680467ff6e810edac36Tanya Lattnerstatic void GenOpenCLArgMetadata(const FunctionDecl *FD, llvm::Function *Fn,
290198871cc90375246d8692680467ff6e810edac36Tanya Lattner                                 CodeGenModule &CGM,llvm::LLVMContext &Context,
291cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko                                 SmallVector <llvm::Value*, 5> &kernelMDArgs) {
2929dce4b3d9d14ba2be2aad5bd7fd8d381a0263c36Michael Ilseman
293198871cc90375246d8692680467ff6e810edac36Tanya Lattner  // Create MDNodes that represents the kernel arg metadata.
294198871cc90375246d8692680467ff6e810edac36Tanya Lattner  // Each MDNode is a list in the form of "key", N number of values which is
295198871cc90375246d8692680467ff6e810edac36Tanya Lattner  // the same number of values as their are kernel arguments.
2969dce4b3d9d14ba2be2aad5bd7fd8d381a0263c36Michael Ilseman
297198871cc90375246d8692680467ff6e810edac36Tanya Lattner  // MDNode for the kernel argument names.
298198871cc90375246d8692680467ff6e810edac36Tanya Lattner  SmallVector<llvm::Value*, 8> argNames;
299198871cc90375246d8692680467ff6e810edac36Tanya Lattner  argNames.push_back(llvm::MDString::get(Context, "kernel_arg_name"));
3009dce4b3d9d14ba2be2aad5bd7fd8d381a0263c36Michael Ilseman
301198871cc90375246d8692680467ff6e810edac36Tanya Lattner  for (unsigned i = 0, e = FD->getNumParams(); i != e; ++i) {
302198871cc90375246d8692680467ff6e810edac36Tanya Lattner    const ParmVarDecl *parm = FD->getParamDecl(i);
3039dce4b3d9d14ba2be2aad5bd7fd8d381a0263c36Michael Ilseman
304198871cc90375246d8692680467ff6e810edac36Tanya Lattner    // Get argument name.
305198871cc90375246d8692680467ff6e810edac36Tanya Lattner    argNames.push_back(llvm::MDString::get(Context, parm->getName()));
3069dce4b3d9d14ba2be2aad5bd7fd8d381a0263c36Michael Ilseman
307198871cc90375246d8692680467ff6e810edac36Tanya Lattner  }
308198871cc90375246d8692680467ff6e810edac36Tanya Lattner  // Add MDNode to the list of all metadata.
309198871cc90375246d8692680467ff6e810edac36Tanya Lattner  kernelMDArgs.push_back(llvm::MDNode::get(Context, argNames));
310198871cc90375246d8692680467ff6e810edac36Tanya Lattner}
311198871cc90375246d8692680467ff6e810edac36Tanya Lattner
3129dce4b3d9d14ba2be2aad5bd7fd8d381a0263c36Michael Ilsemanvoid CodeGenFunction::EmitOpenCLKernelMetadata(const FunctionDecl *FD,
3130df579ec000ffe52e0cddf1e7ee5e50a55256835Tanya Lattner                                               llvm::Function *Fn)
3140df579ec000ffe52e0cddf1e7ee5e50a55256835Tanya Lattner{
3150df579ec000ffe52e0cddf1e7ee5e50a55256835Tanya Lattner  if (!FD->hasAttr<OpenCLKernelAttr>())
3160df579ec000ffe52e0cddf1e7ee5e50a55256835Tanya Lattner    return;
3170df579ec000ffe52e0cddf1e7ee5e50a55256835Tanya Lattner
3180df579ec000ffe52e0cddf1e7ee5e50a55256835Tanya Lattner  llvm::LLVMContext &Context = getLLVMContext();
3190df579ec000ffe52e0cddf1e7ee5e50a55256835Tanya Lattner
320cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko  SmallVector <llvm::Value*, 5> kernelMDArgs;
3210df579ec000ffe52e0cddf1e7ee5e50a55256835Tanya Lattner  kernelMDArgs.push_back(Fn);
3220df579ec000ffe52e0cddf1e7ee5e50a55256835Tanya Lattner
323198871cc90375246d8692680467ff6e810edac36Tanya Lattner  if (CGM.getCodeGenOpts().EmitOpenCLArgMetadata)
324198871cc90375246d8692680467ff6e810edac36Tanya Lattner    GenOpenCLArgMetadata(FD, Fn, CGM, Context, kernelMDArgs);
3259dce4b3d9d14ba2be2aad5bd7fd8d381a0263c36Michael Ilseman
32637453b9580e293eef3bd60bd36047a93ac4515b1Joey Gouly  if (FD->hasAttr<VecTypeHintAttr>()) {
32737453b9580e293eef3bd60bd36047a93ac4515b1Joey Gouly    VecTypeHintAttr *attr = FD->getAttr<VecTypeHintAttr>();
32837453b9580e293eef3bd60bd36047a93ac4515b1Joey Gouly    QualType hintQTy = attr->getTypeHint();
32937453b9580e293eef3bd60bd36047a93ac4515b1Joey Gouly    const ExtVectorType *hintEltQTy = hintQTy->getAs<ExtVectorType>();
33037453b9580e293eef3bd60bd36047a93ac4515b1Joey Gouly    bool isSignedInteger =
33137453b9580e293eef3bd60bd36047a93ac4515b1Joey Gouly        hintQTy->isSignedIntegerType() ||
33237453b9580e293eef3bd60bd36047a93ac4515b1Joey Gouly        (hintEltQTy && hintEltQTy->getElementType()->isSignedIntegerType());
33337453b9580e293eef3bd60bd36047a93ac4515b1Joey Gouly    llvm::Value *attrMDArgs[] = {
33437453b9580e293eef3bd60bd36047a93ac4515b1Joey Gouly      llvm::MDString::get(Context, "vec_type_hint"),
33537453b9580e293eef3bd60bd36047a93ac4515b1Joey Gouly      llvm::UndefValue::get(CGM.getTypes().ConvertType(attr->getTypeHint())),
33637453b9580e293eef3bd60bd36047a93ac4515b1Joey Gouly      llvm::ConstantInt::get(
33737453b9580e293eef3bd60bd36047a93ac4515b1Joey Gouly          llvm::IntegerType::get(Context, 32),
33837453b9580e293eef3bd60bd36047a93ac4515b1Joey Gouly          llvm::APInt(32, (uint64_t)(isSignedInteger ? 1 : 0)))
33937453b9580e293eef3bd60bd36047a93ac4515b1Joey Gouly    };
34037453b9580e293eef3bd60bd36047a93ac4515b1Joey Gouly    kernelMDArgs.push_back(llvm::MDNode::get(Context, attrMDArgs));
34137453b9580e293eef3bd60bd36047a93ac4515b1Joey Gouly  }
34237453b9580e293eef3bd60bd36047a93ac4515b1Joey Gouly
3430df579ec000ffe52e0cddf1e7ee5e50a55256835Tanya Lattner  if (FD->hasAttr<WorkGroupSizeHintAttr>()) {
3440df579ec000ffe52e0cddf1e7ee5e50a55256835Tanya Lattner    WorkGroupSizeHintAttr *attr = FD->getAttr<WorkGroupSizeHintAttr>();
3458fd8ee9b718a7d6ebbcc382c1de39ed1260fe2d3Benjamin Kramer    llvm::Value *attrMDArgs[] = {
3468fd8ee9b718a7d6ebbcc382c1de39ed1260fe2d3Benjamin Kramer      llvm::MDString::get(Context, "work_group_size_hint"),
3478fd8ee9b718a7d6ebbcc382c1de39ed1260fe2d3Benjamin Kramer      Builder.getInt32(attr->getXDim()),
3488fd8ee9b718a7d6ebbcc382c1de39ed1260fe2d3Benjamin Kramer      Builder.getInt32(attr->getYDim()),
3498fd8ee9b718a7d6ebbcc382c1de39ed1260fe2d3Benjamin Kramer      Builder.getInt32(attr->getZDim())
3508fd8ee9b718a7d6ebbcc382c1de39ed1260fe2d3Benjamin Kramer    };
3510df579ec000ffe52e0cddf1e7ee5e50a55256835Tanya Lattner    kernelMDArgs.push_back(llvm::MDNode::get(Context, attrMDArgs));
3520df579ec000ffe52e0cddf1e7ee5e50a55256835Tanya Lattner  }
3530df579ec000ffe52e0cddf1e7ee5e50a55256835Tanya Lattner
3540df579ec000ffe52e0cddf1e7ee5e50a55256835Tanya Lattner  if (FD->hasAttr<ReqdWorkGroupSizeAttr>()) {
3550df579ec000ffe52e0cddf1e7ee5e50a55256835Tanya Lattner    ReqdWorkGroupSizeAttr *attr = FD->getAttr<ReqdWorkGroupSizeAttr>();
3568fd8ee9b718a7d6ebbcc382c1de39ed1260fe2d3Benjamin Kramer    llvm::Value *attrMDArgs[] = {
3578fd8ee9b718a7d6ebbcc382c1de39ed1260fe2d3Benjamin Kramer      llvm::MDString::get(Context, "reqd_work_group_size"),
3588fd8ee9b718a7d6ebbcc382c1de39ed1260fe2d3Benjamin Kramer      Builder.getInt32(attr->getXDim()),
3598fd8ee9b718a7d6ebbcc382c1de39ed1260fe2d3Benjamin Kramer      Builder.getInt32(attr->getYDim()),
3608fd8ee9b718a7d6ebbcc382c1de39ed1260fe2d3Benjamin Kramer      Builder.getInt32(attr->getZDim())
3618fd8ee9b718a7d6ebbcc382c1de39ed1260fe2d3Benjamin Kramer    };
3620df579ec000ffe52e0cddf1e7ee5e50a55256835Tanya Lattner    kernelMDArgs.push_back(llvm::MDNode::get(Context, attrMDArgs));
3630df579ec000ffe52e0cddf1e7ee5e50a55256835Tanya Lattner  }
3640df579ec000ffe52e0cddf1e7ee5e50a55256835Tanya Lattner
3650df579ec000ffe52e0cddf1e7ee5e50a55256835Tanya Lattner  llvm::MDNode *kernelMDNode = llvm::MDNode::get(Context, kernelMDArgs);
3660df579ec000ffe52e0cddf1e7ee5e50a55256835Tanya Lattner  llvm::NamedMDNode *OpenCLKernelMetadata =
3670df579ec000ffe52e0cddf1e7ee5e50a55256835Tanya Lattner    CGM.getModule().getOrInsertNamedMetadata("opencl.kernels");
3680df579ec000ffe52e0cddf1e7ee5e50a55256835Tanya Lattner  OpenCLKernelMetadata->addOperand(kernelMDNode);
3690df579ec000ffe52e0cddf1e7ee5e50a55256835Tanya Lattner}
3700df579ec000ffe52e0cddf1e7ee5e50a55256835Tanya Lattner
3710ff8bafde95f6fa51ccea70738c1b99db870bddcAnders Carlssonvoid CodeGenFunction::StartFunction(GlobalDecl GD, QualType RetTy,
3727c086516f3cc9fba2733b1919973206c6ba4b171Daniel Dunbar                                    llvm::Function *Fn,
373d26bc76c98006609002d9930f8840490e88ac5b5John McCall                                    const CGFunctionInfo &FnInfo,
3742284ac9ec80299fcdefae9a2787cf85105a0f203Daniel Dunbar                                    const FunctionArgList &Args,
3759c6082fe89c61af697f017aa80937581cc2128d8Tilmann Scheller                                    SourceLocation StartLoc) {
3760ff8bafde95f6fa51ccea70738c1b99db870bddcAnders Carlsson  const Decl *D = GD.getDecl();
3779dce4b3d9d14ba2be2aad5bd7fd8d381a0263c36Michael Ilseman
3784cc1a4703363ff940b6273aeef9d96a87edeb04bAnders Carlsson  DidCallStackSave = false;
379b5437d238752dc297e42410e98d38d5250fe0463Chris Lattner  CurCodeDecl = CurFuncDecl = D;
3807c086516f3cc9fba2733b1919973206c6ba4b171Daniel Dunbar  FnRetTy = RetTy;
381bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar  CurFn = Fn;
382d26bc76c98006609002d9930f8840490e88ac5b5John McCall  CurFnInfo = &FnInfo;
3835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  assert(CurFn->isDeclaration() && "Function already has body?");
384ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
3854f45bc099f2665bc6e4bcbb169aa452390dbf3feWill Dietz  if (CGM.getSanitizerBlacklist().isIn(*Fn)) {
3864f45bc099f2665bc6e4bcbb169aa452390dbf3feWill Dietz    SanOpts = &SanitizerOptions::Disabled;
3874f45bc099f2665bc6e4bcbb169aa452390dbf3feWill Dietz    SanitizePerformTypeCheck = false;
3884f45bc099f2665bc6e4bcbb169aa452390dbf3feWill Dietz  }
3894f45bc099f2665bc6e4bcbb169aa452390dbf3feWill Dietz
390a3fe2842e0cf953241ccc05809afdf84f13798e9Jakob Stoklund Olesen  // Pass inline keyword to optimizer if it appears explicitly on any
391a3fe2842e0cf953241ccc05809afdf84f13798e9Jakob Stoklund Olesen  // declaration.
3929dce4b3d9d14ba2be2aad5bd7fd8d381a0263c36Michael Ilseman  if (!CGM.getCodeGenOpts().NoInline)
3938fbe3855db0c341964bb550e13659505efe06c43Chad Rosier    if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D))
3948fbe3855db0c341964bb550e13659505efe06c43Chad Rosier      for (FunctionDecl::redecl_iterator RI = FD->redecls_begin(),
3958fbe3855db0c341964bb550e13659505efe06c43Chad Rosier             RE = FD->redecls_end(); RI != RE; ++RI)
3968fbe3855db0c341964bb550e13659505efe06c43Chad Rosier        if (RI->isInlineSpecified()) {
39772390b39c545426023ec104afe8706395d732badBill Wendling          Fn->addFnAttr(llvm::Attribute::InlineHint);
3988fbe3855db0c341964bb550e13659505efe06c43Chad Rosier          break;
3998fbe3855db0c341964bb550e13659505efe06c43Chad Rosier        }
400a3fe2842e0cf953241ccc05809afdf84f13798e9Jakob Stoklund Olesen
4017edf9e38b91917b661277601c0e448eef0eb2b56Richard Smith  if (getLangOpts().OpenCL) {
402f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne    // Add metadata for a kernel function.
403f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne    if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D))
4040df579ec000ffe52e0cddf1e7ee5e50a55256835Tanya Lattner      EmitOpenCLKernelMetadata(FD, Fn);
405f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne  }
406f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne
40755e874299f2ad827646a4ca9ea38c402aaeb38c9Daniel Dunbar  llvm::BasicBlock *EntryBB = createBasicBlock("entry", CurFn);
4085ca2084cf9b529563209429857f01fdae9dcdfa5Daniel Dunbar
4095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Create a marker to make it easy to insert allocas into the entryblock
41055352a2d616cf9fbb621d10faf8b960b4b268bd8Chris Lattner  // later.  Don't create this with the builder, because we don't want it
41155352a2d616cf9fbb621d10faf8b960b4b268bd8Chris Lattner  // folded.
41277b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner  llvm::Value *Undef = llvm::UndefValue::get(Int32Ty);
41377b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner  AllocaInsertPt = new llvm::BitCastInst(Undef, Int32Ty, "", EntryBB);
414f1466848dce9c4c75d96a6cabdc8db560e26aac8Chris Lattner  if (Builder.isNamePreserving())
415f1466848dce9c4c75d96a6cabdc8db560e26aac8Chris Lattner    AllocaInsertPt->setName("allocapt");
4161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
417f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall  ReturnBlock = getJumpDestInCurrentScope("return");
4181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
41955352a2d616cf9fbb621d10faf8b960b4b268bd8Chris Lattner  Builder.SetInsertPoint(EntryBB);
4201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
421af99417156c652a6f04dff643925036dc3241d60Sanjiv Gupta  // Emit subprogram debug descriptor.
422e896d98548b02223c7740d807a0aa6e20fba7079Anders Carlsson  if (CGDebugInfo *DI = getDebugInfo()) {
423bea522ff43a3f11c7a2bc7949119dbb9fce19e39Jordan Rose    SmallVector<QualType, 16> ArgTypes;
42406253664315307d34ab57b892b6a0c6c5b3153bbEric Christopher    for (FunctionArgList::const_iterator i = Args.begin(), e = Args.end();
42506253664315307d34ab57b892b6a0c6c5b3153bbEric Christopher	 i != e; ++i) {
426bea522ff43a3f11c7a2bc7949119dbb9fce19e39Jordan Rose      ArgTypes.push_back((*i)->getType());
42706253664315307d34ab57b892b6a0c6c5b3153bbEric Christopher    }
42806253664315307d34ab57b892b6a0c6c5b3153bbEric Christopher
429e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall    QualType FnType =
430bea522ff43a3f11c7a2bc7949119dbb9fce19e39Jordan Rose      getContext().getFunctionType(RetTy, ArgTypes,
431e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall                                   FunctionProtoType::ExtProtoInfo());
432e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall
4332284ac9ec80299fcdefae9a2787cf85105a0f203Daniel Dunbar    DI->setLocation(StartLoc);
4349c6c3a0e3ae09626d2d4b04e4ffa42c3d7cab32bDevang Patel    DI->EmitFunctionStart(GD, FnType, CurFn, Builder);
435af99417156c652a6f04dff643925036dc3241d60Sanjiv Gupta  }
436af99417156c652a6f04dff643925036dc3241d60Sanjiv Gupta
437a18652fe1e8233fbf8b67484945c7f7b2bf272beDaniel Dunbar  if (ShouldInstrumentFunction())
438a18652fe1e8233fbf8b67484945c7f7b2bf272beDaniel Dunbar    EmitFunctionInstrumentation("__cyg_profile_func_enter");
4397255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner
440be4c8705e499b55548467eb7adaa23cbc6edfef9Roman Divacky  if (CGM.getCodeGenOpts().InstrumentForProfiling)
441be4c8705e499b55548467eb7adaa23cbc6edfef9Roman Divacky    EmitMCountInstrumentation();
442be4c8705e499b55548467eb7adaa23cbc6edfef9Roman Divacky
443b17daf9ab790ae71aacad2cc4aa11cd8d86c25d1Eli Friedman  if (RetTy->isVoidType()) {
444b17daf9ab790ae71aacad2cc4aa11cd8d86c25d1Eli Friedman    // Void type; nothing to return.
445b17daf9ab790ae71aacad2cc4aa11cd8d86c25d1Eli Friedman    ReturnValue = 0;
446b17daf9ab790ae71aacad2cc4aa11cd8d86c25d1Eli Friedman  } else if (CurFnInfo->getReturnInfo().getKind() == ABIArgInfo::Indirect &&
4479d232c884ea9872d6555df0fd7359699819bc1f1John McCall             !hasScalarEvaluationKind(CurFnInfo->getReturnType())) {
448b17daf9ab790ae71aacad2cc4aa11cd8d86c25d1Eli Friedman    // Indirect aggregate return; emit returned value directly into sret slot.
449647a1ec397fa13af176d07d9f5d071560a94c7a9Daniel Dunbar    // This reduces code size, and affects correctness in C++.
450b17daf9ab790ae71aacad2cc4aa11cd8d86c25d1Eli Friedman    ReturnValue = CurFn->arg_begin();
451b17daf9ab790ae71aacad2cc4aa11cd8d86c25d1Eli Friedman  } else {
452647a1ec397fa13af176d07d9f5d071560a94c7a9Daniel Dunbar    ReturnValue = CreateIRTemp(RetTy, "retval");
453f85e193739c953358c865005855253af4f68a497John McCall
454f85e193739c953358c865005855253af4f68a497John McCall    // Tell the epilog emitter to autorelease the result.  We do this
455f85e193739c953358c865005855253af4f68a497John McCall    // now so that various specialized functions can suppress it
456f85e193739c953358c865005855253af4f68a497John McCall    // during their IR-generation.
4574e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie    if (getLangOpts().ObjCAutoRefCount &&
458f85e193739c953358c865005855253af4f68a497John McCall        !CurFnInfo->isReturnsRetained() &&
459f85e193739c953358c865005855253af4f68a497John McCall        RetTy->isObjCRetainableType())
460f85e193739c953358c865005855253af4f68a497John McCall      AutoreleaseResult = true;
461b17daf9ab790ae71aacad2cc4aa11cd8d86c25d1Eli Friedman  }
462b17daf9ab790ae71aacad2cc4aa11cd8d86c25d1Eli Friedman
463cce3d4f9812182ed4e551b7cf0fc86576be8d9c5Mike Stump  EmitStartEHSpec(CurCodeDecl);
464f85e193739c953358c865005855253af4f68a497John McCall
465f85e193739c953358c865005855253af4f68a497John McCall  PrologueCleanupDepth = EHStack.stable_begin();
46688b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbar  EmitFunctionProlog(*CurFnInfo, CurFn, Args);
4671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
468cec5ebd4a6a89a7023d04cec728fd340b541ed61Eli Friedman  if (D && isa<CXXMethodDecl>(D) && cast<CXXMethodDecl>(D)->isInstance()) {
4694c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall    CGM.getCXXABI().EmitInstanceFunctionProlog(*this);
470cec5ebd4a6a89a7023d04cec728fd340b541ed61Eli Friedman    const CXXMethodDecl *MD = cast<CXXMethodDecl>(D);
471cec5ebd4a6a89a7023d04cec728fd340b541ed61Eli Friedman    if (MD->getParent()->isLambda() &&
472cec5ebd4a6a89a7023d04cec728fd340b541ed61Eli Friedman        MD->getOverloadedOperator() == OO_Call) {
473cec5ebd4a6a89a7023d04cec728fd340b541ed61Eli Friedman      // We're in a lambda; figure out the captures.
474cec5ebd4a6a89a7023d04cec728fd340b541ed61Eli Friedman      MD->getParent()->getCaptureFields(LambdaCaptureFields,
475cec5ebd4a6a89a7023d04cec728fd340b541ed61Eli Friedman                                        LambdaThisCaptureField);
476cec5ebd4a6a89a7023d04cec728fd340b541ed61Eli Friedman      if (LambdaThisCaptureField) {
477cec5ebd4a6a89a7023d04cec728fd340b541ed61Eli Friedman        // If this lambda captures this, load it.
478377ecc7996dce6803f7b7b6208cab5e197c9c5b8Eli Friedman        QualType LambdaTagType =
479377ecc7996dce6803f7b7b6208cab5e197c9c5b8Eli Friedman            getContext().getTagDeclType(LambdaThisCaptureField->getParent());
480377ecc7996dce6803f7b7b6208cab5e197c9c5b8Eli Friedman        LValue LambdaLV = MakeNaturalAlignAddrLValue(CXXABIThisValue,
481377ecc7996dce6803f7b7b6208cab5e197c9c5b8Eli Friedman                                                     LambdaTagType);
482377ecc7996dce6803f7b7b6208cab5e197c9c5b8Eli Friedman        LValue ThisLValue = EmitLValueForField(LambdaLV,
483377ecc7996dce6803f7b7b6208cab5e197c9c5b8Eli Friedman                                               LambdaThisCaptureField);
484cec5ebd4a6a89a7023d04cec728fd340b541ed61Eli Friedman        CXXThisValue = EmitLoadOfLValue(ThisLValue).getScalarVal();
485cec5ebd4a6a89a7023d04cec728fd340b541ed61Eli Friedman      }
486cec5ebd4a6a89a7023d04cec728fd340b541ed61Eli Friedman    } else {
487cec5ebd4a6a89a7023d04cec728fd340b541ed61Eli Friedman      // Not in a lambda; just use 'this' from the method.
488cec5ebd4a6a89a7023d04cec728fd340b541ed61Eli Friedman      // FIXME: Should we generate a new load for each use of 'this'?  The
489cec5ebd4a6a89a7023d04cec728fd340b541ed61Eli Friedman      // fast register allocator would be happier...
490cec5ebd4a6a89a7023d04cec728fd340b541ed61Eli Friedman      CXXThisValue = CXXABIThisValue;
491cec5ebd4a6a89a7023d04cec728fd340b541ed61Eli Friedman    }
492cec5ebd4a6a89a7023d04cec728fd340b541ed61Eli Friedman  }
4932504941793b549323f9d29c62507cf21d865fadeJohn McCall
494751358ff73b155f5384e151e1d18aa3f6e7b061cAnders Carlsson  // If any of the arguments have a variably modified type, make sure to
495751358ff73b155f5384e151e1d18aa3f6e7b061cAnders Carlsson  // emit the type size.
496751358ff73b155f5384e151e1d18aa3f6e7b061cAnders Carlsson  for (FunctionArgList::const_iterator i = Args.begin(), e = Args.end();
497751358ff73b155f5384e151e1d18aa3f6e7b061cAnders Carlsson       i != e; ++i) {
498f5bf912767ba19832bba7694fc679a5ec3c055ffEli Friedman    const VarDecl *VD = *i;
499f5bf912767ba19832bba7694fc679a5ec3c055ffEli Friedman
500f5bf912767ba19832bba7694fc679a5ec3c055ffEli Friedman    // Dig out the type as written from ParmVarDecls; it's unclear whether
501f5bf912767ba19832bba7694fc679a5ec3c055ffEli Friedman    // the standard (C99 6.9.1p10) requires this, but we're following the
502f5bf912767ba19832bba7694fc679a5ec3c055ffEli Friedman    // precedent set by gcc.
503f5bf912767ba19832bba7694fc679a5ec3c055ffEli Friedman    QualType Ty;
504f5bf912767ba19832bba7694fc679a5ec3c055ffEli Friedman    if (const ParmVarDecl *PVD = dyn_cast<ParmVarDecl>(VD))
505f5bf912767ba19832bba7694fc679a5ec3c055ffEli Friedman      Ty = PVD->getOriginalType();
506f5bf912767ba19832bba7694fc679a5ec3c055ffEli Friedman    else
507f5bf912767ba19832bba7694fc679a5ec3c055ffEli Friedman      Ty = VD->getType();
508751358ff73b155f5384e151e1d18aa3f6e7b061cAnders Carlsson
509751358ff73b155f5384e151e1d18aa3f6e7b061cAnders Carlsson    if (Ty->isVariablyModifiedType())
510bc8d40d85f3fa1e34569834916f18fecaa635152John McCall      EmitVariablyModifiedType(Ty);
511751358ff73b155f5384e151e1d18aa3f6e7b061cAnders Carlsson  }
51273fb35003aad027492e661a3749e921b5d1ecaf9Eric Christopher  // Emit a location at the end of the prologue.
51373fb35003aad027492e661a3749e921b5d1ecaf9Eric Christopher  if (CGDebugInfo *DI = getDebugInfo())
51473fb35003aad027492e661a3749e921b5d1ecaf9Eric Christopher    DI->EmitLocation(Builder, StartLoc);
5157c086516f3cc9fba2733b1919973206c6ba4b171Daniel Dunbar}
516eb4b7051a596560ef4a1846e3714707f44e9dc30Eli Friedman
5179fc6a7774643a810c8501dae2323e863fefb623eJohn McCallvoid CodeGenFunction::EmitFunctionBody(FunctionArgList &Args) {
5189fc6a7774643a810c8501dae2323e863fefb623eJohn McCall  const FunctionDecl *FD = cast<FunctionDecl>(CurGD.getDecl());
51906a9f3680d22529a2fcf20c52d71cf221d99d910Douglas Gregor  assert(FD->getBody());
520a6504853d297c30cfa271f4710af5a3d5db59449David Blaikie  if (const CompoundStmt *S = dyn_cast<CompoundStmt>(FD->getBody()))
521a6504853d297c30cfa271f4710af5a3d5db59449David Blaikie    EmitCompoundStmtWithoutScope(*S);
522a6504853d297c30cfa271f4710af5a3d5db59449David Blaikie  else
523a6504853d297c30cfa271f4710af5a3d5db59449David Blaikie    EmitStmt(FD->getBody());
524a355e07454463b19829ac92ffd115a097faff0e0John McCall}
525a355e07454463b19829ac92ffd115a097faff0e0John McCall
52639dad53772c42eb36ebec1c81c56ba99d038fb94John McCall/// Tries to mark the given function nounwind based on the
52739dad53772c42eb36ebec1c81c56ba99d038fb94John McCall/// non-existence of any throwing calls within it.  We believe this is
52839dad53772c42eb36ebec1c81c56ba99d038fb94John McCall/// lightweight enough to do at -O0.
52939dad53772c42eb36ebec1c81c56ba99d038fb94John McCallstatic void TryMarkNoThrow(llvm::Function *F) {
530b3a29f132794f67108bccc9c7cc3795365e8a965John McCall  // LLVM treats 'nounwind' on a function as part of the type, so we
531b3a29f132794f67108bccc9c7cc3795365e8a965John McCall  // can't do this on functions that can be overwritten.
532b3a29f132794f67108bccc9c7cc3795365e8a965John McCall  if (F->mayBeOverridden()) return;
533b3a29f132794f67108bccc9c7cc3795365e8a965John McCall
53439dad53772c42eb36ebec1c81c56ba99d038fb94John McCall  for (llvm::Function::iterator FI = F->begin(), FE = F->end(); FI != FE; ++FI)
53539dad53772c42eb36ebec1c81c56ba99d038fb94John McCall    for (llvm::BasicBlock::iterator
53639dad53772c42eb36ebec1c81c56ba99d038fb94John McCall           BI = FI->begin(), BE = FI->end(); BI != BE; ++BI)
537285cfd8953d4ca4da613a47a0d691f7234068f8cBill Wendling      if (llvm::CallInst *Call = dyn_cast<llvm::CallInst>(&*BI)) {
53839dad53772c42eb36ebec1c81c56ba99d038fb94John McCall        if (!Call->doesNotThrow())
53939dad53772c42eb36ebec1c81c56ba99d038fb94John McCall          return;
540285cfd8953d4ca4da613a47a0d691f7234068f8cBill Wendling      } else if (isa<llvm::ResumeInst>(&*BI)) {
541285cfd8953d4ca4da613a47a0d691f7234068f8cBill Wendling        return;
542285cfd8953d4ca4da613a47a0d691f7234068f8cBill Wendling      }
543fac631052809b59c1b66f687c08a743de7fb50e9Bill Wendling  F->setDoesNotThrow();
54439dad53772c42eb36ebec1c81c56ba99d038fb94John McCall}
54539dad53772c42eb36ebec1c81c56ba99d038fb94John McCall
546d26bc76c98006609002d9930f8840490e88ac5b5John McCallvoid CodeGenFunction::GenerateCode(GlobalDecl GD, llvm::Function *Fn,
547d26bc76c98006609002d9930f8840490e88ac5b5John McCall                                   const CGFunctionInfo &FnInfo) {
5480ff8bafde95f6fa51ccea70738c1b99db870bddcAnders Carlsson  const FunctionDecl *FD = cast<FunctionDecl>(GD.getDecl());
5499dce4b3d9d14ba2be2aad5bd7fd8d381a0263c36Michael Ilseman
550e896d98548b02223c7740d807a0aa6e20fba7079Anders Carlsson  // Check if we should generate debug info for this function.
551a240df2ec1b374b3e9e7f760875ffb17cd64506fAlexey Samsonov  if (!FD->hasAttr<NoDebugAttr>())
552a240df2ec1b374b3e9e7f760875ffb17cd64506fAlexey Samsonov    maybeInitializeDebugInfo();
5531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5547c086516f3cc9fba2733b1919973206c6ba4b171Daniel Dunbar  FunctionArgList Args;
5554c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall  QualType ResTy = FD->getResultType();
5561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5576a1e0eb557d47e85185e09bdf8721f53f4bf9c9cMike Stump  CurGD = GD;
5584c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall  if (isa<CXXMethodDecl>(FD) && cast<CXXMethodDecl>(FD)->isInstance())
5594c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall    CGM.getCXXABI().BuildInstanceFunctionParams(*this, ResTy, Args);
5601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5616e94f6c0f124c9a88b3dae0eea5e6b27957df183Chad Rosier  for (unsigned i = 0, e = FD->getNumParams(); i != e; ++i)
5626e94f6c0f124c9a88b3dae0eea5e6b27957df183Chad Rosier    Args.push_back(FD->getParamDecl(i));
563af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar
564a355e07454463b19829ac92ffd115a097faff0e0John McCall  SourceRange BodyRange;
565a355e07454463b19829ac92ffd115a097faff0e0John McCall  if (Stmt *Body = FD->getBody()) BodyRange = Body->getSourceRange();
5664365bba95be15342575b4f030c6583a770a5da3dAnders Carlsson
56763fd408a61ae9b94e8d8a986832f526f7cdbfa84Manman Ren  // CalleeWithThisReturn keeps track of the last callee inside this function
56863fd408a61ae9b94e8d8a986832f526f7cdbfa84Manman Ren  // that returns 'this'. Before starting the function, we set it to null.
56963fd408a61ae9b94e8d8a986832f526f7cdbfa84Manman Ren  CalleeWithThisReturn = 0;
57063fd408a61ae9b94e8d8a986832f526f7cdbfa84Manman Ren
571a355e07454463b19829ac92ffd115a097faff0e0John McCall  // Emit the standard function prologue.
572d26bc76c98006609002d9930f8840490e88ac5b5John McCall  StartFunction(GD, ResTy, Fn, FnInfo, Args, BodyRange.getBegin());
5731851a12605bc6f1ea70d11974a315340ebaab6ebAnders Carlsson
574a355e07454463b19829ac92ffd115a097faff0e0John McCall  // Generate the body of the function.
5759fc6a7774643a810c8501dae2323e863fefb623eJohn McCall  if (isa<CXXDestructorDecl>(FD))
5769fc6a7774643a810c8501dae2323e863fefb623eJohn McCall    EmitDestructorBody(Args);
5779fc6a7774643a810c8501dae2323e863fefb623eJohn McCall  else if (isa<CXXConstructorDecl>(FD))
5789fc6a7774643a810c8501dae2323e863fefb623eJohn McCall    EmitConstructorBody(Args);
5797edf9e38b91917b661277601c0e448eef0eb2b56Richard Smith  else if (getLangOpts().CUDA &&
580a4ae2294b6ebfb2554aacb6a6a0682fb5ed1f276Peter Collingbourne           !CGM.getCodeGenOpts().CUDAIsDevice &&
581a4ae2294b6ebfb2554aacb6a6a0682fb5ed1f276Peter Collingbourne           FD->hasAttr<CUDAGlobalAttr>())
582a4ae2294b6ebfb2554aacb6a6a0682fb5ed1f276Peter Collingbourne    CGM.getCUDARuntime().EmitDeviceStubBody(*this, Args);
583bd89f8c2caa9550e41daa1aa9bf30f0f1e0dfaf7Eli Friedman  else if (isa<CXXConversionDecl>(FD) &&
58427dd7d962bbf774988bc5e59d04a7743ed503514Douglas Gregor           cast<CXXConversionDecl>(FD)->isLambdaToBlockPointerConversion()) {
58527dd7d962bbf774988bc5e59d04a7743ed503514Douglas Gregor    // The lambda conversion to block pointer is special; the semantics can't be
58627dd7d962bbf774988bc5e59d04a7743ed503514Douglas Gregor    // expressed in the AST, so IRGen needs to special-case it.
58727dd7d962bbf774988bc5e59d04a7743ed503514Douglas Gregor    EmitLambdaToBlockPointerBody(Args);
58827dd7d962bbf774988bc5e59d04a7743ed503514Douglas Gregor  } else if (isa<CXXMethodDecl>(FD) &&
58927dd7d962bbf774988bc5e59d04a7743ed503514Douglas Gregor             cast<CXXMethodDecl>(FD)->isLambdaStaticInvoker()) {
59027dd7d962bbf774988bc5e59d04a7743ed503514Douglas Gregor    // The lambda "__invoke" function is special, because it forwards or
59127dd7d962bbf774988bc5e59d04a7743ed503514Douglas Gregor    // clones the body of the function call operator (but is actually static).
59227dd7d962bbf774988bc5e59d04a7743ed503514Douglas Gregor    EmitLambdaStaticInvokeFunction(cast<CXXMethodDecl>(FD));
59356c00c4868831c9a137ca7b0e16d063cf986d110Lang Hames  } else if (FD->isDefaulted() && isa<CXXMethodDecl>(FD) &&
59456c00c4868831c9a137ca7b0e16d063cf986d110Lang Hames             cast<CXXMethodDecl>(FD)->isCopyAssignmentOperator()) {
59556c00c4868831c9a137ca7b0e16d063cf986d110Lang Hames    // Implicit copy-assignment gets the same special treatment as implicit
59656c00c4868831c9a137ca7b0e16d063cf986d110Lang Hames    // copy-constructors.
59756c00c4868831c9a137ca7b0e16d063cf986d110Lang Hames    emitImplicitAssignmentOperatorBody(Args);
598bd89f8c2caa9550e41daa1aa9bf30f0f1e0dfaf7Eli Friedman  }
5999fc6a7774643a810c8501dae2323e863fefb623eJohn McCall  else
6009fc6a7774643a810c8501dae2323e863fefb623eJohn McCall    EmitFunctionBody(Args);
601c33e4ba20304e222692e77f2c6ad26a5d8d32f83Anders Carlsson
60236ef0d54cfddf31cd48816e78ab4db73b31a6c1dRichard Smith  // C++11 [stmt.return]p2:
60336ef0d54cfddf31cd48816e78ab4db73b31a6c1dRichard Smith  //   Flowing off the end of a function [...] results in undefined behavior in
60436ef0d54cfddf31cd48816e78ab4db73b31a6c1dRichard Smith  //   a value-returning function.
60536ef0d54cfddf31cd48816e78ab4db73b31a6c1dRichard Smith  // C11 6.9.1p12:
60636ef0d54cfddf31cd48816e78ab4db73b31a6c1dRichard Smith  //   If the '}' that terminates a function is reached, and the value of the
60736ef0d54cfddf31cd48816e78ab4db73b31a6c1dRichard Smith  //   function call is used by the caller, the behavior is undefined.
6087edf9e38b91917b661277601c0e448eef0eb2b56Richard Smith  if (getLangOpts().CPlusPlus && !FD->hasImplicitReturnZero() &&
60936ef0d54cfddf31cd48816e78ab4db73b31a6c1dRichard Smith      !FD->getResultType()->isVoidType() && Builder.GetInsertBlock()) {
6104f45bc099f2665bc6e4bcbb169aa452390dbf3feWill Dietz    if (SanOpts->Return)
6114def70d3040e73707c738f7c366737a986135edfRichard Smith      EmitCheck(Builder.getFalse(), "missing_return",
6124def70d3040e73707c738f7c366737a986135edfRichard Smith                EmitCheckSourceLocation(FD->getLocation()),
613cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko                ArrayRef<llvm::Value *>(), CRK_Unrecoverable);
614802cd5b1974bab2038b9d3c969d9beb0ab34f435Richard Smith    else if (CGM.getCodeGenOpts().OptimizationLevel == 0)
615802cd5b1974bab2038b9d3c969d9beb0ab34f435Richard Smith      Builder.CreateCall(CGM.getIntrinsic(llvm::Intrinsic::trap));
61636ef0d54cfddf31cd48816e78ab4db73b31a6c1dRichard Smith    Builder.CreateUnreachable();
61736ef0d54cfddf31cd48816e78ab4db73b31a6c1dRichard Smith    Builder.ClearInsertionPoint();
61836ef0d54cfddf31cd48816e78ab4db73b31a6c1dRichard Smith  }
61936ef0d54cfddf31cd48816e78ab4db73b31a6c1dRichard Smith
620a355e07454463b19829ac92ffd115a097faff0e0John McCall  // Emit the standard function epilogue.
621a355e07454463b19829ac92ffd115a097faff0e0John McCall  FinishFunction(BodyRange.getEnd());
62263fd408a61ae9b94e8d8a986832f526f7cdbfa84Manman Ren  // CalleeWithThisReturn keeps track of the last callee inside this function
62363fd408a61ae9b94e8d8a986832f526f7cdbfa84Manman Ren  // that returns 'this'. After finishing the function, we set it to null.
62463fd408a61ae9b94e8d8a986832f526f7cdbfa84Manman Ren  CalleeWithThisReturn = 0;
62539dad53772c42eb36ebec1c81c56ba99d038fb94John McCall
62639dad53772c42eb36ebec1c81c56ba99d038fb94John McCall  // If we haven't marked the function nothrow through other means, do
62739dad53772c42eb36ebec1c81c56ba99d038fb94John McCall  // a quick pass now to see if we can.
62839dad53772c42eb36ebec1c81c56ba99d038fb94John McCall  if (!CurFn->doesNotThrow())
62939dad53772c42eb36ebec1c81c56ba99d038fb94John McCall    TryMarkNoThrow(CurFn);
6305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
6315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
6320946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner/// ContainsLabel - Return true if the statement contains a label in it.  If
6330946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner/// this statement is not executed normally, it not containing a label means
6340946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner/// that we can just remove the code.
6350946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattnerbool CodeGenFunction::ContainsLabel(const Stmt *S, bool IgnoreCaseStmts) {
6360946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner  // Null statement, not a label!
6370946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner  if (S == 0) return false;
6381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6390946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner  // If this is a label, we have to emit the code, consider something like:
6400946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner  // if (0) {  ...  foo:  bar(); }  goto foo;
641ef425a69006afaa87751ee41ccf8ff405d9ede70Chris Lattner  //
642ef425a69006afaa87751ee41ccf8ff405d9ede70Chris Lattner  // TODO: If anyone cared, we could track __label__'s, since we know that you
643ef425a69006afaa87751ee41ccf8ff405d9ede70Chris Lattner  // can't jump to one from outside their declared region.
6440946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner  if (isa<LabelStmt>(S))
6450946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner    return true;
6469dce4b3d9d14ba2be2aad5bd7fd8d381a0263c36Michael Ilseman
6470946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner  // If this is a case/default statement, and we haven't seen a switch, we have
6480946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner  // to emit the code.
6490946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner  if (isa<SwitchCase>(S) && !IgnoreCaseStmts)
6500946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner    return true;
6511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6520946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner  // If this is a switch statement, we want to ignore cases below it.
6530946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner  if (isa<SwitchStmt>(S))
6540946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner    IgnoreCaseStmts = true;
6551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6560946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner  // Scan subexpressions for verboten labels.
6577502c1d3ce8bb97bcc4f7bebef507040bd93b26fJohn McCall  for (Stmt::const_child_range I = S->children(); I; ++I)
6580946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner    if (ContainsLabel(*I, IgnoreCaseStmts))
6590946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner      return true;
6601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6610946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner  return false;
6620946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner}
6630946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner
664ef425a69006afaa87751ee41ccf8ff405d9ede70Chris Lattner/// containsBreak - Return true if the statement contains a break out of it.
665ef425a69006afaa87751ee41ccf8ff405d9ede70Chris Lattner/// If the statement (recursively) contains a switch or loop with a break
666ef425a69006afaa87751ee41ccf8ff405d9ede70Chris Lattner/// inside of it, this is fine.
667ef425a69006afaa87751ee41ccf8ff405d9ede70Chris Lattnerbool CodeGenFunction::containsBreak(const Stmt *S) {
668ef425a69006afaa87751ee41ccf8ff405d9ede70Chris Lattner  // Null statement, not a label!
669ef425a69006afaa87751ee41ccf8ff405d9ede70Chris Lattner  if (S == 0) return false;
670ef425a69006afaa87751ee41ccf8ff405d9ede70Chris Lattner
671ef425a69006afaa87751ee41ccf8ff405d9ede70Chris Lattner  // If this is a switch or loop that defines its own break scope, then we can
672ef425a69006afaa87751ee41ccf8ff405d9ede70Chris Lattner  // include it and anything inside of it.
673ef425a69006afaa87751ee41ccf8ff405d9ede70Chris Lattner  if (isa<SwitchStmt>(S) || isa<WhileStmt>(S) || isa<DoStmt>(S) ||
674ef425a69006afaa87751ee41ccf8ff405d9ede70Chris Lattner      isa<ForStmt>(S))
6752bef7f5499541e3b68f114cc4d7d197e9a902fe7Chris Lattner    return false;
6769dce4b3d9d14ba2be2aad5bd7fd8d381a0263c36Michael Ilseman
6772bef7f5499541e3b68f114cc4d7d197e9a902fe7Chris Lattner  if (isa<BreakStmt>(S))
678ef425a69006afaa87751ee41ccf8ff405d9ede70Chris Lattner    return true;
6799dce4b3d9d14ba2be2aad5bd7fd8d381a0263c36Michael Ilseman
680ef425a69006afaa87751ee41ccf8ff405d9ede70Chris Lattner  // Scan subexpressions for verboten breaks.
681ef425a69006afaa87751ee41ccf8ff405d9ede70Chris Lattner  for (Stmt::const_child_range I = S->children(); I; ++I)
682ef425a69006afaa87751ee41ccf8ff405d9ede70Chris Lattner    if (containsBreak(*I))
683ef425a69006afaa87751ee41ccf8ff405d9ede70Chris Lattner      return true;
6849dce4b3d9d14ba2be2aad5bd7fd8d381a0263c36Michael Ilseman
685ef425a69006afaa87751ee41ccf8ff405d9ede70Chris Lattner  return false;
686ef425a69006afaa87751ee41ccf8ff405d9ede70Chris Lattner}
687ef425a69006afaa87751ee41ccf8ff405d9ede70Chris Lattner
68831a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner
689c2c90011a688c04a4e980282f08c267e081c4b00Chris Lattner/// ConstantFoldsToSimpleInteger - If the specified expression does not fold
690c2c90011a688c04a4e980282f08c267e081c4b00Chris Lattner/// to a constant, or if it does but contains a label, return false.  If it
691c2c90011a688c04a4e980282f08c267e081c4b00Chris Lattner/// constant folds return true and set the boolean result in Result.
692c2c90011a688c04a4e980282f08c267e081c4b00Chris Lattnerbool CodeGenFunction::ConstantFoldsToSimpleInteger(const Expr *Cond,
693c2c90011a688c04a4e980282f08c267e081c4b00Chris Lattner                                                   bool &ResultBool) {
694e1ecdc168175719d74e112bcacd4aae5e12d4631Richard Trieu  llvm::APSInt ResultInt;
695ef425a69006afaa87751ee41ccf8ff405d9ede70Chris Lattner  if (!ConstantFoldsToSimpleInteger(Cond, ResultInt))
696ef425a69006afaa87751ee41ccf8ff405d9ede70Chris Lattner    return false;
6979dce4b3d9d14ba2be2aad5bd7fd8d381a0263c36Michael Ilseman
698ef425a69006afaa87751ee41ccf8ff405d9ede70Chris Lattner  ResultBool = ResultInt.getBoolValue();
699ef425a69006afaa87751ee41ccf8ff405d9ede70Chris Lattner  return true;
700ef425a69006afaa87751ee41ccf8ff405d9ede70Chris Lattner}
701ef425a69006afaa87751ee41ccf8ff405d9ede70Chris Lattner
702ef425a69006afaa87751ee41ccf8ff405d9ede70Chris Lattner/// ConstantFoldsToSimpleInteger - If the specified expression does not fold
703ef425a69006afaa87751ee41ccf8ff405d9ede70Chris Lattner/// to a constant, or if it does but contains a label, return false.  If it
704ef425a69006afaa87751ee41ccf8ff405d9ede70Chris Lattner/// constant folds return true and set the folded value.
705ef425a69006afaa87751ee41ccf8ff405d9ede70Chris Lattnerbool CodeGenFunction::
706e1ecdc168175719d74e112bcacd4aae5e12d4631Richard TrieuConstantFoldsToSimpleInteger(const Expr *Cond, llvm::APSInt &ResultInt) {
70736bc14c3a1cf63ee306df5687ac8e85f924f8639Daniel Dunbar  // FIXME: Rename and handle conversion of other evaluatable things
70836bc14c3a1cf63ee306df5687ac8e85f924f8639Daniel Dunbar  // to bool.
70980d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith  llvm::APSInt Int;
71080d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith  if (!Cond->EvaluateAsInt(Int, getContext()))
711c2c90011a688c04a4e980282f08c267e081c4b00Chris Lattner    return false;  // Not foldable, not integer or not fully evaluatable.
71280d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith
71331a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner  if (CodeGenFunction::ContainsLabel(Cond))
714c2c90011a688c04a4e980282f08c267e081c4b00Chris Lattner    return false;  // Contains a label.
71580d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith
71680d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith  ResultInt = Int;
717c2c90011a688c04a4e980282f08c267e081c4b00Chris Lattner  return true;
71831a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner}
71931a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner
72031a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner
721ef425a69006afaa87751ee41ccf8ff405d9ede70Chris Lattner
72231a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner/// EmitBranchOnBoolExpr - Emit a branch on a boolean condition (e.g. for an if
72331a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner/// statement) to the specified blocks.  Based on the condition, this might try
72431a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner/// to simplify the codegen of the conditional based on the branch.
72531a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner///
72631a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattnervoid CodeGenFunction::EmitBranchOnBoolExpr(const Expr *Cond,
72731a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner                                           llvm::BasicBlock *TrueBlock,
72831a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner                                           llvm::BasicBlock *FalseBlock) {
729f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  Cond = Cond->IgnoreParens();
7301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
73131a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner  if (const BinaryOperator *CondBOp = dyn_cast<BinaryOperator>(Cond)) {
73231a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner    // Handle X && Y in a condition.
7332de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    if (CondBOp->getOpcode() == BO_LAnd) {
73431a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner      // If we have "1 && X", simplify the code.  "0 && X" would have constant
73531a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner      // folded if the case was simple enough.
736e3eb83b93751544a5fab19b3824f56aeac454f82Bill Wendling      bool ConstantBool = false;
737c2c90011a688c04a4e980282f08c267e081c4b00Chris Lattner      if (ConstantFoldsToSimpleInteger(CondBOp->getLHS(), ConstantBool) &&
738c2c90011a688c04a4e980282f08c267e081c4b00Chris Lattner          ConstantBool) {
73931a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner        // br(1 && X) -> br(X).
74031a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner        return EmitBranchOnBoolExpr(CondBOp->getRHS(), TrueBlock, FalseBlock);
74131a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner      }
7421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
74331a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner      // If we have "X && 1", simplify the code to use an uncond branch.
74431a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner      // "X && 0" would have been constant folded to 0.
745c2c90011a688c04a4e980282f08c267e081c4b00Chris Lattner      if (ConstantFoldsToSimpleInteger(CondBOp->getRHS(), ConstantBool) &&
746c2c90011a688c04a4e980282f08c267e081c4b00Chris Lattner          ConstantBool) {
74731a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner        // br(X && 1) -> br(X).
74831a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner        return EmitBranchOnBoolExpr(CondBOp->getLHS(), TrueBlock, FalseBlock);
74931a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner      }
7501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
75131a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner      // Emit the LHS as a conditional.  If the LHS conditional is false, we
75231a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner      // want to jump to the FalseBlock.
7539615ecb44f549ae9fa2b4db6ff46bc78befbf62cDaniel Dunbar      llvm::BasicBlock *LHSTrue = createBasicBlock("land.lhs.true");
754150b462afc7a713edd19bcbbbb22381fe060d4f5John McCall
755150b462afc7a713edd19bcbbbb22381fe060d4f5John McCall      ConditionalEvaluation eval(*this);
75631a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner      EmitBranchOnBoolExpr(CondBOp->getLHS(), LHSTrue, FalseBlock);
75731a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner      EmitBlock(LHSTrue);
7581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
75908e9e453f40aff95a59bd67db49b8f050765e1f0Anders Carlsson      // Any temporaries created here are conditional.
760150b462afc7a713edd19bcbbbb22381fe060d4f5John McCall      eval.begin(*this);
76131a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner      EmitBranchOnBoolExpr(CondBOp->getRHS(), TrueBlock, FalseBlock);
762150b462afc7a713edd19bcbbbb22381fe060d4f5John McCall      eval.end(*this);
76308e9e453f40aff95a59bd67db49b8f050765e1f0Anders Carlsson
76431a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner      return;
765c2c90011a688c04a4e980282f08c267e081c4b00Chris Lattner    }
7669dce4b3d9d14ba2be2aad5bd7fd8d381a0263c36Michael Ilseman
767c2c90011a688c04a4e980282f08c267e081c4b00Chris Lattner    if (CondBOp->getOpcode() == BO_LOr) {
76831a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner      // If we have "0 || X", simplify the code.  "1 || X" would have constant
76931a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner      // folded if the case was simple enough.
770e3eb83b93751544a5fab19b3824f56aeac454f82Bill Wendling      bool ConstantBool = false;
771c2c90011a688c04a4e980282f08c267e081c4b00Chris Lattner      if (ConstantFoldsToSimpleInteger(CondBOp->getLHS(), ConstantBool) &&
772c2c90011a688c04a4e980282f08c267e081c4b00Chris Lattner          !ConstantBool) {
77331a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner        // br(0 || X) -> br(X).
77431a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner        return EmitBranchOnBoolExpr(CondBOp->getRHS(), TrueBlock, FalseBlock);
77531a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner      }
7761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
77731a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner      // If we have "X || 0", simplify the code to use an uncond branch.
77831a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner      // "X || 1" would have been constant folded to 1.
779c2c90011a688c04a4e980282f08c267e081c4b00Chris Lattner      if (ConstantFoldsToSimpleInteger(CondBOp->getRHS(), ConstantBool) &&
780c2c90011a688c04a4e980282f08c267e081c4b00Chris Lattner          !ConstantBool) {
78131a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner        // br(X || 0) -> br(X).
78231a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner        return EmitBranchOnBoolExpr(CondBOp->getLHS(), TrueBlock, FalseBlock);
78331a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner      }
7841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
78531a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner      // Emit the LHS as a conditional.  If the LHS conditional is true, we
78631a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner      // want to jump to the TrueBlock.
7879615ecb44f549ae9fa2b4db6ff46bc78befbf62cDaniel Dunbar      llvm::BasicBlock *LHSFalse = createBasicBlock("lor.lhs.false");
788150b462afc7a713edd19bcbbbb22381fe060d4f5John McCall
789150b462afc7a713edd19bcbbbb22381fe060d4f5John McCall      ConditionalEvaluation eval(*this);
79031a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner      EmitBranchOnBoolExpr(CondBOp->getLHS(), TrueBlock, LHSFalse);
79131a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner      EmitBlock(LHSFalse);
7921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
79308e9e453f40aff95a59bd67db49b8f050765e1f0Anders Carlsson      // Any temporaries created here are conditional.
794150b462afc7a713edd19bcbbbb22381fe060d4f5John McCall      eval.begin(*this);
79531a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner      EmitBranchOnBoolExpr(CondBOp->getRHS(), TrueBlock, FalseBlock);
796150b462afc7a713edd19bcbbbb22381fe060d4f5John McCall      eval.end(*this);
79708e9e453f40aff95a59bd67db49b8f050765e1f0Anders Carlsson
79831a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner      return;
79931a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner    }
800552f4c45ba4f4a01f86d585edabd871a27829867Chris Lattner  }
8011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
802552f4c45ba4f4a01f86d585edabd871a27829867Chris Lattner  if (const UnaryOperator *CondUOp = dyn_cast<UnaryOperator>(Cond)) {
803552f4c45ba4f4a01f86d585edabd871a27829867Chris Lattner    // br(!x, t, f) -> br(x, f, t)
8042de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    if (CondUOp->getOpcode() == UO_LNot)
805552f4c45ba4f4a01f86d585edabd871a27829867Chris Lattner      return EmitBranchOnBoolExpr(CondUOp->getSubExpr(), FalseBlock, TrueBlock);
80631a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner  }
8071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
80809b14899039d828094c06ac25d60de62608e57b7Daniel Dunbar  if (const ConditionalOperator *CondOp = dyn_cast<ConditionalOperator>(Cond)) {
809df33a35f6010fea92c786c0d8f85bfd7c73ebd3eEli Friedman    // br(c ? x : y, t, f) -> br(c, br(x, t, f), br(y, t, f))
810df33a35f6010fea92c786c0d8f85bfd7c73ebd3eEli Friedman    llvm::BasicBlock *LHSBlock = createBasicBlock("cond.true");
811df33a35f6010fea92c786c0d8f85bfd7c73ebd3eEli Friedman    llvm::BasicBlock *RHSBlock = createBasicBlock("cond.false");
81209b14899039d828094c06ac25d60de62608e57b7Daniel Dunbar
813df33a35f6010fea92c786c0d8f85bfd7c73ebd3eEli Friedman    ConditionalEvaluation cond(*this);
814df33a35f6010fea92c786c0d8f85bfd7c73ebd3eEli Friedman    EmitBranchOnBoolExpr(CondOp->getCond(), LHSBlock, RHSBlock);
815150b462afc7a713edd19bcbbbb22381fe060d4f5John McCall
816df33a35f6010fea92c786c0d8f85bfd7c73ebd3eEli Friedman    cond.begin(*this);
817df33a35f6010fea92c786c0d8f85bfd7c73ebd3eEli Friedman    EmitBlock(LHSBlock);
818df33a35f6010fea92c786c0d8f85bfd7c73ebd3eEli Friedman    EmitBranchOnBoolExpr(CondOp->getLHS(), TrueBlock, FalseBlock);
819df33a35f6010fea92c786c0d8f85bfd7c73ebd3eEli Friedman    cond.end(*this);
820150b462afc7a713edd19bcbbbb22381fe060d4f5John McCall
821df33a35f6010fea92c786c0d8f85bfd7c73ebd3eEli Friedman    cond.begin(*this);
822df33a35f6010fea92c786c0d8f85bfd7c73ebd3eEli Friedman    EmitBlock(RHSBlock);
823df33a35f6010fea92c786c0d8f85bfd7c73ebd3eEli Friedman    EmitBranchOnBoolExpr(CondOp->getRHS(), TrueBlock, FalseBlock);
824df33a35f6010fea92c786c0d8f85bfd7c73ebd3eEli Friedman    cond.end(*this);
825150b462afc7a713edd19bcbbbb22381fe060d4f5John McCall
826df33a35f6010fea92c786c0d8f85bfd7c73ebd3eEli Friedman    return;
82709b14899039d828094c06ac25d60de62608e57b7Daniel Dunbar  }
82809b14899039d828094c06ac25d60de62608e57b7Daniel Dunbar
82931a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner  // Emit the code with the fully general case.
83031a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner  llvm::Value *CondV = EvaluateExprAsBool(Cond);
83131a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner  Builder.CreateCondBr(CondV, TrueBlock, FalseBlock);
83231a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner}
83331a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner
834488e993a135ce700b982bf099c3d6b856301d642Daniel Dunbar/// ErrorUnsupported - Print out an error that codegen doesn't support the
835dc5e8268292046114ffe02e48773572a91a310f1Chris Lattner/// specified stmt yet.
83690df4b6661968a84bf64baee489bb2f6d948fcc1Daniel Dunbarvoid CodeGenFunction::ErrorUnsupported(const Stmt *S, const char *Type,
83790df4b6661968a84bf64baee489bb2f6d948fcc1Daniel Dunbar                                       bool OmitOnError) {
83890df4b6661968a84bf64baee489bb2f6d948fcc1Daniel Dunbar  CGM.ErrorUnsupported(S, Type, OmitOnError);
839dc5e8268292046114ffe02e48773572a91a310f1Chris Lattner}
840dc5e8268292046114ffe02e48773572a91a310f1Chris Lattner
8417143325db76d6c3dabce82500f8cc7c93a941970John McCall/// emitNonZeroVLAInit - Emit the "zero" initialization of a
8427143325db76d6c3dabce82500f8cc7c93a941970John McCall/// variable-length array whose elements have a non-zero bit-pattern.
8437143325db76d6c3dabce82500f8cc7c93a941970John McCall///
8442ee5ba35febf830d366b65dd0dcbf8e291c41342James Dennett/// \param baseType the inner-most element type of the array
8457143325db76d6c3dabce82500f8cc7c93a941970John McCall/// \param src - a char* pointing to the bit-pattern for a single
8467143325db76d6c3dabce82500f8cc7c93a941970John McCall/// base element of the array
8477143325db76d6c3dabce82500f8cc7c93a941970John McCall/// \param sizeInChars - the total size of the VLA, in chars
8487143325db76d6c3dabce82500f8cc7c93a941970John McCallstatic void emitNonZeroVLAInit(CodeGenFunction &CGF, QualType baseType,
8499dce4b3d9d14ba2be2aad5bd7fd8d381a0263c36Michael Ilseman                               llvm::Value *dest, llvm::Value *src,
8507143325db76d6c3dabce82500f8cc7c93a941970John McCall                               llvm::Value *sizeInChars) {
8517143325db76d6c3dabce82500f8cc7c93a941970John McCall  std::pair<CharUnits,CharUnits> baseSizeAndAlign
8527143325db76d6c3dabce82500f8cc7c93a941970John McCall    = CGF.getContext().getTypeInfoInChars(baseType);
8537143325db76d6c3dabce82500f8cc7c93a941970John McCall
8547143325db76d6c3dabce82500f8cc7c93a941970John McCall  CGBuilderTy &Builder = CGF.Builder;
8557143325db76d6c3dabce82500f8cc7c93a941970John McCall
8567143325db76d6c3dabce82500f8cc7c93a941970John McCall  llvm::Value *baseSizeInChars
8577143325db76d6c3dabce82500f8cc7c93a941970John McCall    = llvm::ConstantInt::get(CGF.IntPtrTy, baseSizeAndAlign.first.getQuantity());
8587143325db76d6c3dabce82500f8cc7c93a941970John McCall
8592acc6e3feda5e4f7d9009bdcf8b1cd777fecfe2dChris Lattner  llvm::Type *i8p = Builder.getInt8PtrTy();
8607143325db76d6c3dabce82500f8cc7c93a941970John McCall
8617143325db76d6c3dabce82500f8cc7c93a941970John McCall  llvm::Value *begin = Builder.CreateBitCast(dest, i8p, "vla.begin");
8627143325db76d6c3dabce82500f8cc7c93a941970John McCall  llvm::Value *end = Builder.CreateInBoundsGEP(dest, sizeInChars, "vla.end");
8637143325db76d6c3dabce82500f8cc7c93a941970John McCall
8647143325db76d6c3dabce82500f8cc7c93a941970John McCall  llvm::BasicBlock *originBB = CGF.Builder.GetInsertBlock();
8657143325db76d6c3dabce82500f8cc7c93a941970John McCall  llvm::BasicBlock *loopBB = CGF.createBasicBlock("vla-init.loop");
8667143325db76d6c3dabce82500f8cc7c93a941970John McCall  llvm::BasicBlock *contBB = CGF.createBasicBlock("vla-init.cont");
8677143325db76d6c3dabce82500f8cc7c93a941970John McCall
8687143325db76d6c3dabce82500f8cc7c93a941970John McCall  // Make a loop over the VLA.  C99 guarantees that the VLA element
8697143325db76d6c3dabce82500f8cc7c93a941970John McCall  // count must be nonzero.
8707143325db76d6c3dabce82500f8cc7c93a941970John McCall  CGF.EmitBlock(loopBB);
8717143325db76d6c3dabce82500f8cc7c93a941970John McCall
872bbf3bacb3e0c1ebb3e8a4a8b1330404a7e379315Jay Foad  llvm::PHINode *cur = Builder.CreatePHI(i8p, 2, "vla.cur");
8737143325db76d6c3dabce82500f8cc7c93a941970John McCall  cur->addIncoming(begin, originBB);
8747143325db76d6c3dabce82500f8cc7c93a941970John McCall
8757143325db76d6c3dabce82500f8cc7c93a941970John McCall  // memcpy the individual element bit-pattern.
8767143325db76d6c3dabce82500f8cc7c93a941970John McCall  Builder.CreateMemCpy(cur, src, baseSizeInChars,
8777143325db76d6c3dabce82500f8cc7c93a941970John McCall                       baseSizeAndAlign.second.getQuantity(),
8787143325db76d6c3dabce82500f8cc7c93a941970John McCall                       /*volatile*/ false);
8797143325db76d6c3dabce82500f8cc7c93a941970John McCall
8807143325db76d6c3dabce82500f8cc7c93a941970John McCall  // Go to the next element.
8817143325db76d6c3dabce82500f8cc7c93a941970John McCall  llvm::Value *next = Builder.CreateConstInBoundsGEP1_32(cur, 1, "vla.next");
8827143325db76d6c3dabce82500f8cc7c93a941970John McCall
8837143325db76d6c3dabce82500f8cc7c93a941970John McCall  // Leave if that's the end of the VLA.
8847143325db76d6c3dabce82500f8cc7c93a941970John McCall  llvm::Value *done = Builder.CreateICmpEQ(next, end, "vla-init.isdone");
8857143325db76d6c3dabce82500f8cc7c93a941970John McCall  Builder.CreateCondBr(done, contBB, loopBB);
8867143325db76d6c3dabce82500f8cc7c93a941970John McCall  cur->addIncoming(next, loopBB);
8877143325db76d6c3dabce82500f8cc7c93a941970John McCall
8887143325db76d6c3dabce82500f8cc7c93a941970John McCall  CGF.EmitBlock(contBB);
8899dce4b3d9d14ba2be2aad5bd7fd8d381a0263c36Michael Ilseman}
8907143325db76d6c3dabce82500f8cc7c93a941970John McCall
8911884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlssonvoid
8921884eb0b5c55edda4893ddec45e7dbad79758782Anders CarlssonCodeGenFunction::EmitNullInitialization(llvm::Value *DestPtr, QualType Ty) {
8930d7c583a4b4d0f57c6b69c66fd73babec4ef3799Anders Carlsson  // Ignore empty classes in C++.
8947edf9e38b91917b661277601c0e448eef0eb2b56Richard Smith  if (getLangOpts().CPlusPlus) {
8950d7c583a4b4d0f57c6b69c66fd73babec4ef3799Anders Carlsson    if (const RecordType *RT = Ty->getAs<RecordType>()) {
8960d7c583a4b4d0f57c6b69c66fd73babec4ef3799Anders Carlsson      if (cast<CXXRecordDecl>(RT->getDecl())->isEmpty())
8970d7c583a4b4d0f57c6b69c66fd73babec4ef3799Anders Carlsson        return;
8980d7c583a4b4d0f57c6b69c66fd73babec4ef3799Anders Carlsson    }
8990d7c583a4b4d0f57c6b69c66fd73babec4ef3799Anders Carlsson  }
9009021718882441dd391a1960084580d3cd19c423aJohn McCall
9019021718882441dd391a1960084580d3cd19c423aJohn McCall  // Cast the dest ptr to the appropriate i8 pointer type.
9029021718882441dd391a1960084580d3cd19c423aJohn McCall  unsigned DestAS =
9039021718882441dd391a1960084580d3cd19c423aJohn McCall    cast<llvm::PointerType>(DestPtr->getType())->getAddressSpace();
9042acc6e3feda5e4f7d9009bdcf8b1cd777fecfe2dChris Lattner  llvm::Type *BP = Builder.getInt8PtrTy(DestAS);
9053d8400d9a61aa4b63ff35e5cede405b32a41425eAnders Carlsson  if (DestPtr->getType() != BP)
906578faa837b552403e2002b97fdfbfde14f2448e5Benjamin Kramer    DestPtr = Builder.CreateBitCast(DestPtr, BP);
9073d8400d9a61aa4b63ff35e5cede405b32a41425eAnders Carlsson
9083d8400d9a61aa4b63ff35e5cede405b32a41425eAnders Carlsson  // Get size and alignment info for this aggregate.
9099dce4b3d9d14ba2be2aad5bd7fd8d381a0263c36Michael Ilseman  std::pair<CharUnits, CharUnits> TypeInfo =
91079be76c0e360d9e9c44285c9838af02adc43e55fKen Dyck    getContext().getTypeInfoInChars(Ty);
91179be76c0e360d9e9c44285c9838af02adc43e55fKen Dyck  CharUnits Size = TypeInfo.first;
91279be76c0e360d9e9c44285c9838af02adc43e55fKen Dyck  CharUnits Align = TypeInfo.second;
9133d8400d9a61aa4b63ff35e5cede405b32a41425eAnders Carlsson
9145576d9b0a389f6f1f89bdcd37194f4e992b1fbcbJohn McCall  llvm::Value *SizeVal;
9157143325db76d6c3dabce82500f8cc7c93a941970John McCall  const VariableArrayType *vla;
9169021718882441dd391a1960084580d3cd19c423aJohn McCall
9175576d9b0a389f6f1f89bdcd37194f4e992b1fbcbJohn McCall  // Don't bother emitting a zero-byte memset.
91879be76c0e360d9e9c44285c9838af02adc43e55fKen Dyck  if (Size.isZero()) {
9195576d9b0a389f6f1f89bdcd37194f4e992b1fbcbJohn McCall    // But note that getTypeInfo returns 0 for a VLA.
9205576d9b0a389f6f1f89bdcd37194f4e992b1fbcbJohn McCall    if (const VariableArrayType *vlaType =
9215576d9b0a389f6f1f89bdcd37194f4e992b1fbcbJohn McCall          dyn_cast_or_null<VariableArrayType>(
9225576d9b0a389f6f1f89bdcd37194f4e992b1fbcbJohn McCall                                          getContext().getAsArrayType(Ty))) {
923bc8d40d85f3fa1e34569834916f18fecaa635152John McCall      QualType eltType;
924bc8d40d85f3fa1e34569834916f18fecaa635152John McCall      llvm::Value *numElts;
925bc8d40d85f3fa1e34569834916f18fecaa635152John McCall      llvm::tie(numElts, eltType) = getVLASize(vlaType);
926bc8d40d85f3fa1e34569834916f18fecaa635152John McCall
927bc8d40d85f3fa1e34569834916f18fecaa635152John McCall      SizeVal = numElts;
928bc8d40d85f3fa1e34569834916f18fecaa635152John McCall      CharUnits eltSize = getContext().getTypeSizeInChars(eltType);
929bc8d40d85f3fa1e34569834916f18fecaa635152John McCall      if (!eltSize.isOne())
930bc8d40d85f3fa1e34569834916f18fecaa635152John McCall        SizeVal = Builder.CreateNUWMul(SizeVal, CGM.getSize(eltSize));
9317143325db76d6c3dabce82500f8cc7c93a941970John McCall      vla = vlaType;
9325576d9b0a389f6f1f89bdcd37194f4e992b1fbcbJohn McCall    } else {
9335576d9b0a389f6f1f89bdcd37194f4e992b1fbcbJohn McCall      return;
9345576d9b0a389f6f1f89bdcd37194f4e992b1fbcbJohn McCall    }
9355576d9b0a389f6f1f89bdcd37194f4e992b1fbcbJohn McCall  } else {
936bc8d40d85f3fa1e34569834916f18fecaa635152John McCall    SizeVal = CGM.getSize(Size);
9377143325db76d6c3dabce82500f8cc7c93a941970John McCall    vla = 0;
9385576d9b0a389f6f1f89bdcd37194f4e992b1fbcbJohn McCall  }
9399021718882441dd391a1960084580d3cd19c423aJohn McCall
9409021718882441dd391a1960084580d3cd19c423aJohn McCall  // If the type contains a pointer to data member we can't memset it to zero.
9419021718882441dd391a1960084580d3cd19c423aJohn McCall  // Instead, create a null constant and copy it to the destination.
9427143325db76d6c3dabce82500f8cc7c93a941970John McCall  // TODO: there are other patterns besides zero that we can usefully memset,
9437143325db76d6c3dabce82500f8cc7c93a941970John McCall  // like -1, which happens to be the pattern used by member-pointers.
944f16aa103d3afd42fbca2ab346f191bf745cec092John McCall  if (!CGM.getTypes().isZeroInitializable(Ty)) {
9457143325db76d6c3dabce82500f8cc7c93a941970John McCall    // For a VLA, emit a single element, then splat that over the VLA.
9467143325db76d6c3dabce82500f8cc7c93a941970John McCall    if (vla) Ty = getContext().getBaseElementType(vla);
9475576d9b0a389f6f1f89bdcd37194f4e992b1fbcbJohn McCall
9489021718882441dd391a1960084580d3cd19c423aJohn McCall    llvm::Constant *NullConstant = CGM.EmitNullConstant(Ty);
9499021718882441dd391a1960084580d3cd19c423aJohn McCall
9509dce4b3d9d14ba2be2aad5bd7fd8d381a0263c36Michael Ilseman    llvm::GlobalVariable *NullVariable =
9519021718882441dd391a1960084580d3cd19c423aJohn McCall      new llvm::GlobalVariable(CGM.getModule(), NullConstant->getType(),
9529dce4b3d9d14ba2be2aad5bd7fd8d381a0263c36Michael Ilseman                               /*isConstant=*/true,
9539021718882441dd391a1960084580d3cd19c423aJohn McCall                               llvm::GlobalVariable::PrivateLinkage,
9545f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                               NullConstant, Twine());
9559021718882441dd391a1960084580d3cd19c423aJohn McCall    llvm::Value *SrcPtr =
9569021718882441dd391a1960084580d3cd19c423aJohn McCall      Builder.CreateBitCast(NullVariable, Builder.getInt8PtrTy());
9579021718882441dd391a1960084580d3cd19c423aJohn McCall
9587143325db76d6c3dabce82500f8cc7c93a941970John McCall    if (vla) return emitNonZeroVLAInit(*this, Ty, DestPtr, SrcPtr, SizeVal);
9597143325db76d6c3dabce82500f8cc7c93a941970John McCall
9609021718882441dd391a1960084580d3cd19c423aJohn McCall    // Get and call the appropriate llvm.memcpy overload.
96179be76c0e360d9e9c44285c9838af02adc43e55fKen Dyck    Builder.CreateMemCpy(DestPtr, SrcPtr, SizeVal, Align.getQuantity(), false);
96288207c9ca218486b93ae7df14e9764cd0c2c3383Chris Lattner    return;
9639dce4b3d9d14ba2be2aad5bd7fd8d381a0263c36Michael Ilseman  }
9649dce4b3d9d14ba2be2aad5bd7fd8d381a0263c36Michael Ilseman
9659021718882441dd391a1960084580d3cd19c423aJohn McCall  // Otherwise, just memset the whole thing to zero.  This is legal
9669021718882441dd391a1960084580d3cd19c423aJohn McCall  // because in LLVM, all default initializers (other than the ones we just
9679021718882441dd391a1960084580d3cd19c423aJohn McCall  // handled above) are guaranteed to have a bit pattern of all zeros.
9689dce4b3d9d14ba2be2aad5bd7fd8d381a0263c36Michael Ilseman  Builder.CreateMemSet(DestPtr, Builder.getInt8(0), SizeVal,
96979be76c0e360d9e9c44285c9838af02adc43e55fKen Dyck                       Align.getQuantity(), false);
9703d8400d9a61aa4b63ff35e5cede405b32a41425eAnders Carlsson}
9713d8400d9a61aa4b63ff35e5cede405b32a41425eAnders Carlsson
972ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattnerllvm::BlockAddress *CodeGenFunction::GetAddrOfLabel(const LabelDecl *L) {
973d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner  // Make sure that there is a block for the indirect goto.
974d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner  if (IndirectBranch == 0)
975d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner    GetIndirectGotoBlock();
9769dce4b3d9d14ba2be2aad5bd7fd8d381a0263c36Michael Ilseman
977ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall  llvm::BasicBlock *BB = getJumpDestForLabel(L).getBlock();
9789dce4b3d9d14ba2be2aad5bd7fd8d381a0263c36Michael Ilseman
979d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner  // Make sure the indirect branch includes all of the address-taken blocks.
980d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner  IndirectBranch->addDestination(BB);
981d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner  return llvm::BlockAddress::get(CurFn, BB);
9823d00fdc82fd550ae4bfbb2e700a1fc85bbd6d6fdChris Lattner}
9831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9843d00fdc82fd550ae4bfbb2e700a1fc85bbd6d6fdChris Lattnerllvm::BasicBlock *CodeGenFunction::GetIndirectGotoBlock() {
985d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner  // If we already made the indirect branch for indirect goto, return its block.
986d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner  if (IndirectBranch) return IndirectBranch->getParent();
9879dce4b3d9d14ba2be2aad5bd7fd8d381a0263c36Michael Ilseman
988d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner  CGBuilderTy TmpBuilder(createBasicBlock("indirectgoto"));
9899dce4b3d9d14ba2be2aad5bd7fd8d381a0263c36Michael Ilseman
9903d00fdc82fd550ae4bfbb2e700a1fc85bbd6d6fdChris Lattner  // Create the PHI node that indirect gotos will add entries to.
991bbf3bacb3e0c1ebb3e8a4a8b1330404a7e379315Jay Foad  llvm::Value *DestVal = TmpBuilder.CreatePHI(Int8PtrTy, 0,
992bbf3bacb3e0c1ebb3e8a4a8b1330404a7e379315Jay Foad                                              "indirect.goto.dest");
9939dce4b3d9d14ba2be2aad5bd7fd8d381a0263c36Michael Ilseman
994d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner  // Create the indirect branch instruction.
995d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner  IndirectBranch = TmpBuilder.CreateIndirectBr(DestVal);
996d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner  return IndirectBranch->getParent();
9970ffb125996336fc7602b162c0a9e392f1a93060fDaniel Dunbar}
998ddf7cac45d85b73127adbbd91a2b28fc7291c57eAnders Carlsson
999bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall/// Computes the length of an array in elements, as well as the base
1000bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall/// element type and a properly-typed first element pointer.
1001bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCallllvm::Value *CodeGenFunction::emitArrayLength(const ArrayType *origArrayType,
1002bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall                                              QualType &baseType,
1003bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall                                              llvm::Value *&addr) {
1004bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall  const ArrayType *arrayType = origArrayType;
1005bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall
1006bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall  // If it's a VLA, we have to load the stored size.  Note that
1007bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall  // this is the size of the VLA in bytes, not its size in elements.
1008bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall  llvm::Value *numVLAElements = 0;
1009bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall  if (isa<VariableArrayType>(arrayType)) {
1010bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall    numVLAElements = getVLASize(cast<VariableArrayType>(arrayType)).first;
1011bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall
1012bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall    // Walk into all VLAs.  This doesn't require changes to addr,
1013bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall    // which has type T* where T is the first non-VLA element type.
1014bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall    do {
1015bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall      QualType elementType = arrayType->getElementType();
1016bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall      arrayType = getContext().getAsArrayType(elementType);
1017bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall
1018bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall      // If we only have VLA components, 'addr' requires no adjustment.
1019bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall      if (!arrayType) {
1020bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall        baseType = elementType;
1021bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall        return numVLAElements;
1022bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall      }
1023bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall    } while (isa<VariableArrayType>(arrayType));
1024bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall
1025bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall    // We get out here only if we find a constant array type
1026bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall    // inside the VLA.
1027bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall  }
1028bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall
1029bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall  // We have some number of constant-length arrays, so addr should
1030bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall  // have LLVM type [M x [N x [...]]]*.  Build a GEP that walks
1031bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall  // down to the first element of addr.
10325f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<llvm::Value*, 8> gepIndices;
1033bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall
1034bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall  // GEP down to the array type.
1035bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall  llvm::ConstantInt *zero = Builder.getInt32(0);
1036bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall  gepIndices.push_back(zero);
1037bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall
1038bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall  uint64_t countFromCLAs = 1;
10391664d540d1524f0faffd2f839fccb56178975c60Richard Smith  QualType eltType;
1040bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall
10412acc6e3feda5e4f7d9009bdcf8b1cd777fecfe2dChris Lattner  llvm::ArrayType *llvmArrayType =
10421664d540d1524f0faffd2f839fccb56178975c60Richard Smith    dyn_cast<llvm::ArrayType>(
1043bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall      cast<llvm::PointerType>(addr->getType())->getElementType());
10441664d540d1524f0faffd2f839fccb56178975c60Richard Smith  while (llvmArrayType) {
1045bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall    assert(isa<ConstantArrayType>(arrayType));
1046bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall    assert(cast<ConstantArrayType>(arrayType)->getSize().getZExtValue()
1047bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall             == llvmArrayType->getNumElements());
1048bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall
1049bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall    gepIndices.push_back(zero);
1050bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall    countFromCLAs *= llvmArrayType->getNumElements();
10511664d540d1524f0faffd2f839fccb56178975c60Richard Smith    eltType = arrayType->getElementType();
1052bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall
1053bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall    llvmArrayType =
1054bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall      dyn_cast<llvm::ArrayType>(llvmArrayType->getElementType());
1055bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall    arrayType = getContext().getAsArrayType(arrayType->getElementType());
10561664d540d1524f0faffd2f839fccb56178975c60Richard Smith    assert((!llvmArrayType || arrayType) &&
10571664d540d1524f0faffd2f839fccb56178975c60Richard Smith           "LLVM and Clang types are out-of-synch");
1058bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall  }
1059bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall
10601664d540d1524f0faffd2f839fccb56178975c60Richard Smith  if (arrayType) {
10611664d540d1524f0faffd2f839fccb56178975c60Richard Smith    // From this point onwards, the Clang array type has been emitted
10621664d540d1524f0faffd2f839fccb56178975c60Richard Smith    // as some other type (probably a packed struct). Compute the array
10631664d540d1524f0faffd2f839fccb56178975c60Richard Smith    // size, and just emit the 'begin' expression as a bitcast.
10641664d540d1524f0faffd2f839fccb56178975c60Richard Smith    while (arrayType) {
10651664d540d1524f0faffd2f839fccb56178975c60Richard Smith      countFromCLAs *=
10661664d540d1524f0faffd2f839fccb56178975c60Richard Smith          cast<ConstantArrayType>(arrayType)->getSize().getZExtValue();
10671664d540d1524f0faffd2f839fccb56178975c60Richard Smith      eltType = arrayType->getElementType();
10681664d540d1524f0faffd2f839fccb56178975c60Richard Smith      arrayType = getContext().getAsArrayType(eltType);
10691664d540d1524f0faffd2f839fccb56178975c60Richard Smith    }
10701664d540d1524f0faffd2f839fccb56178975c60Richard Smith
1071956a5a17713deb1b5b27893303c4f308a1bd2a62Micah Villmow    unsigned AddressSpace = addr->getType()->getPointerAddressSpace();
10721664d540d1524f0faffd2f839fccb56178975c60Richard Smith    llvm::Type *BaseType = ConvertType(eltType)->getPointerTo(AddressSpace);
10731664d540d1524f0faffd2f839fccb56178975c60Richard Smith    addr = Builder.CreateBitCast(addr, BaseType, "array.begin");
10741664d540d1524f0faffd2f839fccb56178975c60Richard Smith  } else {
10751664d540d1524f0faffd2f839fccb56178975c60Richard Smith    // Create the actual GEP.
10761664d540d1524f0faffd2f839fccb56178975c60Richard Smith    addr = Builder.CreateInBoundsGEP(addr, gepIndices, "array.begin");
10771664d540d1524f0faffd2f839fccb56178975c60Richard Smith  }
1078bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall
10791664d540d1524f0faffd2f839fccb56178975c60Richard Smith  baseType = eltType;
1080bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall
1081bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall  llvm::Value *numElements
1082bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall    = llvm::ConstantInt::get(SizeTy, countFromCLAs);
1083bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall
1084bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall  // If we had any VLA dimensions, factor them in.
1085bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall  if (numVLAElements)
1086bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall    numElements = Builder.CreateNUWMul(numVLAElements, numElements);
1087bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall
1088bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall  return numElements;
1089bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall}
1090bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall
1091bc8d40d85f3fa1e34569834916f18fecaa635152John McCallstd::pair<llvm::Value*, QualType>
1092bc8d40d85f3fa1e34569834916f18fecaa635152John McCallCodeGenFunction::getVLASize(QualType type) {
1093bc8d40d85f3fa1e34569834916f18fecaa635152John McCall  const VariableArrayType *vla = getContext().getAsVariableArrayType(type);
1094bc8d40d85f3fa1e34569834916f18fecaa635152John McCall  assert(vla && "type was not a variable array type!");
1095bc8d40d85f3fa1e34569834916f18fecaa635152John McCall  return getVLASize(vla);
1096f666b7780d04186521adcaedb0e15dfa4d5e6933Anders Carlsson}
1097dcc90d87e6430c643b4311ae5b0089535bca41f7Anders Carlsson
1098bc8d40d85f3fa1e34569834916f18fecaa635152John McCallstd::pair<llvm::Value*, QualType>
1099bc8d40d85f3fa1e34569834916f18fecaa635152John McCallCodeGenFunction::getVLASize(const VariableArrayType *type) {
1100bc8d40d85f3fa1e34569834916f18fecaa635152John McCall  // The number of elements so far; always size_t.
1101bc8d40d85f3fa1e34569834916f18fecaa635152John McCall  llvm::Value *numElements = 0;
11021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1103bc8d40d85f3fa1e34569834916f18fecaa635152John McCall  QualType elementType;
1104bc8d40d85f3fa1e34569834916f18fecaa635152John McCall  do {
1105bc8d40d85f3fa1e34569834916f18fecaa635152John McCall    elementType = type->getElementType();
1106bc8d40d85f3fa1e34569834916f18fecaa635152John McCall    llvm::Value *vlaSize = VLASizeMap[type->getSizeExpr()];
1107bc8d40d85f3fa1e34569834916f18fecaa635152John McCall    assert(vlaSize && "no size for VLA!");
1108bc8d40d85f3fa1e34569834916f18fecaa635152John McCall    assert(vlaSize->getType() == SizeTy);
11091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1110bc8d40d85f3fa1e34569834916f18fecaa635152John McCall    if (!numElements) {
1111bc8d40d85f3fa1e34569834916f18fecaa635152John McCall      numElements = vlaSize;
1112bc8d40d85f3fa1e34569834916f18fecaa635152John McCall    } else {
1113bc8d40d85f3fa1e34569834916f18fecaa635152John McCall      // It's undefined behavior if this wraps around, so mark it that way.
1114930c05c32eac171ef1a94fabf80aecb4e6e2c840Richard Smith      // FIXME: Teach -fcatch-undefined-behavior to trap this.
1115bc8d40d85f3fa1e34569834916f18fecaa635152John McCall      numElements = Builder.CreateNUWMul(numElements, vlaSize);
1116bc8d40d85f3fa1e34569834916f18fecaa635152John McCall    }
1117bc8d40d85f3fa1e34569834916f18fecaa635152John McCall  } while ((type = getContext().getAsVariableArrayType(elementType)));
11181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1119bc8d40d85f3fa1e34569834916f18fecaa635152John McCall  return std::pair<llvm::Value*,QualType>(numElements, elementType);
1120bc8d40d85f3fa1e34569834916f18fecaa635152John McCall}
11211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1122bc8d40d85f3fa1e34569834916f18fecaa635152John McCallvoid CodeGenFunction::EmitVariablyModifiedType(QualType type) {
1123bc8d40d85f3fa1e34569834916f18fecaa635152John McCall  assert(type->isVariablyModifiedType() &&
1124bc8d40d85f3fa1e34569834916f18fecaa635152John McCall         "Must pass variably modified type to EmitVLASizes!");
11251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1126bc8d40d85f3fa1e34569834916f18fecaa635152John McCall  EnsureInsertPoint();
11271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1128bc8d40d85f3fa1e34569834916f18fecaa635152John McCall  // We're going to walk down into the type and look for VLA
1129bc8d40d85f3fa1e34569834916f18fecaa635152John McCall  // expressions.
1130bc8d40d85f3fa1e34569834916f18fecaa635152John McCall  do {
1131bc8d40d85f3fa1e34569834916f18fecaa635152John McCall    assert(type->isVariablyModifiedType());
1132bc8d40d85f3fa1e34569834916f18fecaa635152John McCall
1133bc8d40d85f3fa1e34569834916f18fecaa635152John McCall    const Type *ty = type.getTypePtr();
1134bc8d40d85f3fa1e34569834916f18fecaa635152John McCall    switch (ty->getTypeClass()) {
113506284c1dc56caed19850bc3766c89f51763724c3Abramo Bagnara
1136bc8d40d85f3fa1e34569834916f18fecaa635152John McCall#define TYPE(Class, Base)
1137bc8d40d85f3fa1e34569834916f18fecaa635152John McCall#define ABSTRACT_TYPE(Class, Base)
113806284c1dc56caed19850bc3766c89f51763724c3Abramo Bagnara#define NON_CANONICAL_TYPE(Class, Base)
1139bc8d40d85f3fa1e34569834916f18fecaa635152John McCall#define DEPENDENT_TYPE(Class, Base) case Type::Class:
114006284c1dc56caed19850bc3766c89f51763724c3Abramo Bagnara#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base)
1141bc8d40d85f3fa1e34569834916f18fecaa635152John McCall#include "clang/AST/TypeNodes.def"
114206284c1dc56caed19850bc3766c89f51763724c3Abramo Bagnara      llvm_unreachable("unexpected dependent type!");
1143bc8d40d85f3fa1e34569834916f18fecaa635152John McCall
1144bc8d40d85f3fa1e34569834916f18fecaa635152John McCall    // These types are never variably-modified.
1145bc8d40d85f3fa1e34569834916f18fecaa635152John McCall    case Type::Builtin:
1146bc8d40d85f3fa1e34569834916f18fecaa635152John McCall    case Type::Complex:
1147bc8d40d85f3fa1e34569834916f18fecaa635152John McCall    case Type::Vector:
1148bc8d40d85f3fa1e34569834916f18fecaa635152John McCall    case Type::ExtVector:
1149bc8d40d85f3fa1e34569834916f18fecaa635152John McCall    case Type::Record:
1150bc8d40d85f3fa1e34569834916f18fecaa635152John McCall    case Type::Enum:
11515ff53b27dfd918a5d9943cd008de51edc8cbec2cAbramo Bagnara    case Type::Elaborated:
11525ff53b27dfd918a5d9943cd008de51edc8cbec2cAbramo Bagnara    case Type::TemplateSpecialization:
1153bc8d40d85f3fa1e34569834916f18fecaa635152John McCall    case Type::ObjCObject:
1154bc8d40d85f3fa1e34569834916f18fecaa635152John McCall    case Type::ObjCInterface:
1155bc8d40d85f3fa1e34569834916f18fecaa635152John McCall    case Type::ObjCObjectPointer:
1156bc8d40d85f3fa1e34569834916f18fecaa635152John McCall      llvm_unreachable("type class is never variably-modified!");
1157bc8d40d85f3fa1e34569834916f18fecaa635152John McCall
1158bc8d40d85f3fa1e34569834916f18fecaa635152John McCall    case Type::Pointer:
1159bc8d40d85f3fa1e34569834916f18fecaa635152John McCall      type = cast<PointerType>(ty)->getPointeeType();
1160bc8d40d85f3fa1e34569834916f18fecaa635152John McCall      break;
1161bc8d40d85f3fa1e34569834916f18fecaa635152John McCall
1162bc8d40d85f3fa1e34569834916f18fecaa635152John McCall    case Type::BlockPointer:
1163bc8d40d85f3fa1e34569834916f18fecaa635152John McCall      type = cast<BlockPointerType>(ty)->getPointeeType();
1164bc8d40d85f3fa1e34569834916f18fecaa635152John McCall      break;
1165bc8d40d85f3fa1e34569834916f18fecaa635152John McCall
1166bc8d40d85f3fa1e34569834916f18fecaa635152John McCall    case Type::LValueReference:
1167bc8d40d85f3fa1e34569834916f18fecaa635152John McCall    case Type::RValueReference:
1168bc8d40d85f3fa1e34569834916f18fecaa635152John McCall      type = cast<ReferenceType>(ty)->getPointeeType();
1169bc8d40d85f3fa1e34569834916f18fecaa635152John McCall      break;
1170bc8d40d85f3fa1e34569834916f18fecaa635152John McCall
1171bc8d40d85f3fa1e34569834916f18fecaa635152John McCall    case Type::MemberPointer:
1172bc8d40d85f3fa1e34569834916f18fecaa635152John McCall      type = cast<MemberPointerType>(ty)->getPointeeType();
1173bc8d40d85f3fa1e34569834916f18fecaa635152John McCall      break;
1174bc8d40d85f3fa1e34569834916f18fecaa635152John McCall
1175bc8d40d85f3fa1e34569834916f18fecaa635152John McCall    case Type::ConstantArray:
1176bc8d40d85f3fa1e34569834916f18fecaa635152John McCall    case Type::IncompleteArray:
1177bc8d40d85f3fa1e34569834916f18fecaa635152John McCall      // Losing element qualification here is fine.
1178bc8d40d85f3fa1e34569834916f18fecaa635152John McCall      type = cast<ArrayType>(ty)->getElementType();
1179bc8d40d85f3fa1e34569834916f18fecaa635152John McCall      break;
1180bc8d40d85f3fa1e34569834916f18fecaa635152John McCall
1181bc8d40d85f3fa1e34569834916f18fecaa635152John McCall    case Type::VariableArray: {
1182bc8d40d85f3fa1e34569834916f18fecaa635152John McCall      // Losing element qualification here is fine.
1183bc8d40d85f3fa1e34569834916f18fecaa635152John McCall      const VariableArrayType *vat = cast<VariableArrayType>(ty);
1184bc8d40d85f3fa1e34569834916f18fecaa635152John McCall
1185bc8d40d85f3fa1e34569834916f18fecaa635152John McCall      // Unknown size indication requires no size computation.
1186bc8d40d85f3fa1e34569834916f18fecaa635152John McCall      // Otherwise, evaluate and record it.
1187bc8d40d85f3fa1e34569834916f18fecaa635152John McCall      if (const Expr *size = vat->getSizeExpr()) {
1188bc8d40d85f3fa1e34569834916f18fecaa635152John McCall        // It's possible that we might have emitted this already,
1189bc8d40d85f3fa1e34569834916f18fecaa635152John McCall        // e.g. with a typedef and a pointer to it.
1190bc8d40d85f3fa1e34569834916f18fecaa635152John McCall        llvm::Value *&entry = VLASizeMap[size];
1191bc8d40d85f3fa1e34569834916f18fecaa635152John McCall        if (!entry) {
1192930c05c32eac171ef1a94fabf80aecb4e6e2c840Richard Smith          llvm::Value *Size = EmitScalarExpr(size);
1193930c05c32eac171ef1a94fabf80aecb4e6e2c840Richard Smith
1194930c05c32eac171ef1a94fabf80aecb4e6e2c840Richard Smith          // C11 6.7.6.2p5:
1195930c05c32eac171ef1a94fabf80aecb4e6e2c840Richard Smith          //   If the size is an expression that is not an integer constant
1196930c05c32eac171ef1a94fabf80aecb4e6e2c840Richard Smith          //   expression [...] each time it is evaluated it shall have a value
1197930c05c32eac171ef1a94fabf80aecb4e6e2c840Richard Smith          //   greater than zero.
11984f45bc099f2665bc6e4bcbb169aa452390dbf3feWill Dietz          if (SanOpts->VLABound &&
1199d6396a681c9acbe56bc41bbc2bed2db45755bcd7Richard Smith              size->getType()->isSignedIntegerType()) {
1200930c05c32eac171ef1a94fabf80aecb4e6e2c840Richard Smith            llvm::Value *Zero = llvm::Constant::getNullValue(Size->getType());
1201930c05c32eac171ef1a94fabf80aecb4e6e2c840Richard Smith            llvm::Constant *StaticArgs[] = {
1202930c05c32eac171ef1a94fabf80aecb4e6e2c840Richard Smith              EmitCheckSourceLocation(size->getLocStart()),
1203930c05c32eac171ef1a94fabf80aecb4e6e2c840Richard Smith              EmitCheckTypeDescriptor(size->getType())
1204930c05c32eac171ef1a94fabf80aecb4e6e2c840Richard Smith            };
1205930c05c32eac171ef1a94fabf80aecb4e6e2c840Richard Smith            EmitCheck(Builder.CreateICmpSGT(Size, Zero),
1206ad95481b2769ad61f23afc5e2c31f11c66090657Will Dietz                      "vla_bound_not_positive", StaticArgs, Size,
1207ad95481b2769ad61f23afc5e2c31f11c66090657Will Dietz                      CRK_Recoverable);
1208930c05c32eac171ef1a94fabf80aecb4e6e2c840Richard Smith          }
1209930c05c32eac171ef1a94fabf80aecb4e6e2c840Richard Smith
1210bc8d40d85f3fa1e34569834916f18fecaa635152John McCall          // Always zexting here would be wrong if it weren't
1211bc8d40d85f3fa1e34569834916f18fecaa635152John McCall          // undefined behavior to have a negative bound.
1212bf43f2fdfbd7c4f8cd1f1403765eca9e5dc6c8aeRichard Smith          entry = Builder.CreateIntCast(Size, SizeTy, /*signed*/ false);
1213bc8d40d85f3fa1e34569834916f18fecaa635152John McCall        }
1214bc8d40d85f3fa1e34569834916f18fecaa635152John McCall      }
1215bc8d40d85f3fa1e34569834916f18fecaa635152John McCall      type = vat->getElementType();
1216bc8d40d85f3fa1e34569834916f18fecaa635152John McCall      break;
1217fcdbb93749ed69aa9022437052c390522355ec3dAnders Carlsson    }
12181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
121906284c1dc56caed19850bc3766c89f51763724c3Abramo Bagnara    case Type::FunctionProto:
1220bc8d40d85f3fa1e34569834916f18fecaa635152John McCall    case Type::FunctionNoProto:
1221bc8d40d85f3fa1e34569834916f18fecaa635152John McCall      type = cast<FunctionType>(ty)->getResultType();
1222bc8d40d85f3fa1e34569834916f18fecaa635152John McCall      break;
1223b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman
12245ff53b27dfd918a5d9943cd008de51edc8cbec2cAbramo Bagnara    case Type::Paren:
12255ff53b27dfd918a5d9943cd008de51edc8cbec2cAbramo Bagnara    case Type::TypeOf:
12265ff53b27dfd918a5d9943cd008de51edc8cbec2cAbramo Bagnara    case Type::UnaryTransform:
12275ff53b27dfd918a5d9943cd008de51edc8cbec2cAbramo Bagnara    case Type::Attributed:
12285ff53b27dfd918a5d9943cd008de51edc8cbec2cAbramo Bagnara    case Type::SubstTemplateTypeParm:
12295ff53b27dfd918a5d9943cd008de51edc8cbec2cAbramo Bagnara      // Keep walking after single level desugaring.
12305ff53b27dfd918a5d9943cd008de51edc8cbec2cAbramo Bagnara      type = type.getSingleStepDesugaredType(getContext());
12315ff53b27dfd918a5d9943cd008de51edc8cbec2cAbramo Bagnara      break;
12325ff53b27dfd918a5d9943cd008de51edc8cbec2cAbramo Bagnara
12335ff53b27dfd918a5d9943cd008de51edc8cbec2cAbramo Bagnara    case Type::Typedef:
12345ff53b27dfd918a5d9943cd008de51edc8cbec2cAbramo Bagnara    case Type::Decltype:
12355ff53b27dfd918a5d9943cd008de51edc8cbec2cAbramo Bagnara    case Type::Auto:
12365ff53b27dfd918a5d9943cd008de51edc8cbec2cAbramo Bagnara      // Stop walking: nothing to do.
12375ff53b27dfd918a5d9943cd008de51edc8cbec2cAbramo Bagnara      return;
12385ff53b27dfd918a5d9943cd008de51edc8cbec2cAbramo Bagnara
12395ff53b27dfd918a5d9943cd008de51edc8cbec2cAbramo Bagnara    case Type::TypeOfExpr:
12405ff53b27dfd918a5d9943cd008de51edc8cbec2cAbramo Bagnara      // Stop walking: emit typeof expression.
12415ff53b27dfd918a5d9943cd008de51edc8cbec2cAbramo Bagnara      EmitIgnoredExpr(cast<TypeOfExprType>(ty)->getUnderlyingExpr());
12425ff53b27dfd918a5d9943cd008de51edc8cbec2cAbramo Bagnara      return;
12435ff53b27dfd918a5d9943cd008de51edc8cbec2cAbramo Bagnara
1244b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    case Type::Atomic:
1245b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman      type = cast<AtomicType>(ty)->getValueType();
1246b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman      break;
1247bc8d40d85f3fa1e34569834916f18fecaa635152John McCall    }
1248bc8d40d85f3fa1e34569834916f18fecaa635152John McCall  } while (type->isVariablyModifiedType());
1249dcc90d87e6430c643b4311ae5b0089535bca41f7Anders Carlsson}
12504fd0aa5803357d8c72eeac2cae15e12649ea08feEli Friedman
12514fd0aa5803357d8c72eeac2cae15e12649ea08feEli Friedmanllvm::Value* CodeGenFunction::EmitVAListRef(const Expr* E) {
1252bc07a55b68342a230aafd8875cc7a26450dd3f64Dan Gohman  if (getContext().getBuiltinVaListType()->isArrayType())
12534fd0aa5803357d8c72eeac2cae15e12649ea08feEli Friedman    return EmitScalarExpr(E);
12544fd0aa5803357d8c72eeac2cae15e12649ea08feEli Friedman  return EmitLValue(E).getAddress();
12554fd0aa5803357d8c72eeac2cae15e12649ea08feEli Friedman}
12566ccc47698d0311ddabf32fa0f6db8e4f09ac96f8Anders Carlsson
12579dce4b3d9d14ba2be2aad5bd7fd8d381a0263c36Michael Ilsemanvoid CodeGenFunction::EmitDeclRefExprDbgValue(const DeclRefExpr *E,
1258189d6ef40eff11b83b2cda941d5ed89a5cef09b2John McCall                                              llvm::Constant *Init) {
125925c2c8fb9309050612009a6571e2660e75531348Devang Patel  assert (Init && "Invalid DeclRefExpr initializer!");
126025c2c8fb9309050612009a6571e2660e75531348Devang Patel  if (CGDebugInfo *Dbg = getDebugInfo())
12614cdad3151bfb2075c6bdbfe89fbb08f31a90a45bDouglas Gregor    if (CGM.getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo)
1262fd00eecad6fa5400cf37269d84361a0551d0e6d3Alexey Samsonov      Dbg->EmitGlobalVariable(E->getDecl(), Init);
12638d308384a220c7dc81755c47cdcbdd87dac25d5bDevang Patel}
126456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
126556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallCodeGenFunction::PeepholeProtection
126656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallCodeGenFunction::protectFromPeepholes(RValue rvalue) {
126756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  // At the moment, the only aggressive peephole we do in IR gen
126856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  // is trunc(zext) folding, but if we add more, we can easily
126956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  // extend this protection.
127056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
127156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  if (!rvalue.isScalar()) return PeepholeProtection();
127256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  llvm::Value *value = rvalue.getScalarVal();
127356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  if (!isa<llvm::ZExtInst>(value)) return PeepholeProtection();
127456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
127556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  // Just make an extra bitcast.
127656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  assert(HaveInsertPoint());
127756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  llvm::Instruction *inst = new llvm::BitCastInst(value, value->getType(), "",
127856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall                                                  Builder.GetInsertBlock());
127956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
128056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  PeepholeProtection protection;
128156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  protection.Inst = inst;
128256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  return protection;
128356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall}
128456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
128556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallvoid CodeGenFunction::unprotectFromPeepholes(PeepholeProtection protection) {
128656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  if (!protection.Inst) return;
128756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
128856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  // In theory, we could try to duplicate the peepholes now, but whatever.
128956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  protection.Inst->eraseFromParent();
129056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall}
129177f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge
129277f68bb90af93b95045fb994e7cd68137adcc132Julien Lerougellvm::Value *CodeGenFunction::EmitAnnotationCall(llvm::Value *AnnotationFn,
129377f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge                                                 llvm::Value *AnnotatedVal,
1294cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko                                                 StringRef AnnotationStr,
129577f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge                                                 SourceLocation Location) {
129677f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge  llvm::Value *Args[4] = {
129777f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge    AnnotatedVal,
129877f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge    Builder.CreateBitCast(CGM.EmitAnnotationString(AnnotationStr), Int8PtrTy),
129977f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge    Builder.CreateBitCast(CGM.EmitAnnotationUnit(Location), Int8PtrTy),
130077f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge    CGM.EmitAnnotationLineNo(Location)
130177f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge  };
130277f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge  return Builder.CreateCall(AnnotationFn, Args);
130377f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge}
130477f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge
130577f68bb90af93b95045fb994e7cd68137adcc132Julien Lerougevoid CodeGenFunction::EmitVarAnnotations(const VarDecl *D, llvm::Value *V) {
130677f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge  assert(D->hasAttr<AnnotateAttr>() && "no annotate attribute");
130777f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge  // FIXME We create a new bitcast for every annotation because that's what
130877f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge  // llvm-gcc was doing.
130977f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge  for (specific_attr_iterator<AnnotateAttr>
131077f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge       ai = D->specific_attr_begin<AnnotateAttr>(),
131177f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge       ae = D->specific_attr_end<AnnotateAttr>(); ai != ae; ++ai)
131277f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge    EmitAnnotationCall(CGM.getIntrinsic(llvm::Intrinsic::var_annotation),
131377f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge                       Builder.CreateBitCast(V, CGM.Int8PtrTy, V->getName()),
131477f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge                       (*ai)->getAnnotation(), D->getLocation());
131577f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge}
131677f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge
131777f68bb90af93b95045fb994e7cd68137adcc132Julien Lerougellvm::Value *CodeGenFunction::EmitFieldAnnotations(const FieldDecl *D,
131877f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge                                                   llvm::Value *V) {
131977f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge  assert(D->hasAttr<AnnotateAttr>() && "no annotate attribute");
132077f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge  llvm::Type *VTy = V->getType();
132177f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge  llvm::Value *F = CGM.getIntrinsic(llvm::Intrinsic::ptr_annotation,
132277f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge                                    CGM.Int8PtrTy);
132377f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge
132477f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge  for (specific_attr_iterator<AnnotateAttr>
132577f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge       ai = D->specific_attr_begin<AnnotateAttr>(),
132677f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge       ae = D->specific_attr_end<AnnotateAttr>(); ai != ae; ++ai) {
132777f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge    // FIXME Always emit the cast inst so we can differentiate between
132877f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge    // annotation on the first field of a struct and annotation on the struct
132977f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge    // itself.
133077f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge    if (VTy != CGM.Int8PtrTy)
133177f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge      V = Builder.Insert(new llvm::BitCastInst(V, CGM.Int8PtrTy));
133277f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge    V = EmitAnnotationCall(F, V, (*ai)->getAnnotation(), D->getLocation());
133377f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge    V = Builder.CreateBitCast(V, VTy);
133477f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge  }
133577f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge
133677f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge  return V;
133777f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge}
1338