diff options
Diffstat (limited to 'lib/CodeGen/CGCall.cpp')
| -rw-r--r-- | lib/CodeGen/CGCall.cpp | 193 | 
1 files changed, 139 insertions, 54 deletions
| diff --git a/lib/CodeGen/CGCall.cpp b/lib/CodeGen/CGCall.cpp index 6403fa99aa7b..f2340530d66d 100644 --- a/lib/CodeGen/CGCall.cpp +++ b/lib/CodeGen/CGCall.cpp @@ -30,7 +30,9 @@  #include "llvm/IR/DataLayout.h"  #include "llvm/IR/InlineAsm.h"  #include "llvm/IR/Intrinsics.h" +#include "llvm/IR/IntrinsicInst.h"  #include "llvm/Transforms/Utils/Local.h" +#include <sstream>  using namespace clang;  using namespace CodeGen; @@ -51,6 +53,8 @@ static unsigned ClangCallConvToLLVMCallConv(CallingConv CC) {    case CC_X86Pascal: return llvm::CallingConv::C;    // TODO: Add support for __vectorcall to LLVM.    case CC_X86VectorCall: return llvm::CallingConv::X86_VectorCall; +  case CC_SpirFunction: return llvm::CallingConv::SPIR_FUNC; +  case CC_SpirKernel: return llvm::CallingConv::SPIR_KERNEL;    }  } @@ -96,8 +100,7 @@ arrangeLLVMFunctionInfo(CodeGenTypes &CGT, bool instanceMethod,                          CanQual<FunctionProtoType> FTP) {    RequiredArgs required = RequiredArgs::forPrototypePlus(FTP, prefix.size());    // FIXME: Kill copy. -  for (unsigned i = 0, e = FTP->getNumParams(); i != e; ++i) -    prefix.push_back(FTP->getParamType(i)); +  prefix.append(FTP->param_type_begin(), FTP->param_type_end());    CanQualType resultType = FTP->getReturnType().getUnqualifiedType();    return CGT.arrangeLLVMFunctionInfo(resultType, instanceMethod,                                       /*chainCall=*/false, prefix, @@ -133,9 +136,6 @@ static CallingConv getCallingConventionForDecl(const Decl *D, bool IsWindows) {    if (PcsAttr *PCS = D->getAttr<PcsAttr>())      return (PCS->getPCS() == PcsAttr::AAPCS ? CC_AAPCS : CC_AAPCS_VFP); -  if (D->hasAttr<PnaclCallAttr>()) -    return CC_PnaclCall; -    if (D->hasAttr<IntelOclBiccAttr>())      return CC_IntelOclBicc; @@ -208,8 +208,7 @@ CodeGenTypes::arrangeCXXStructorDeclaration(const CXXMethodDecl *MD,    CanQual<FunctionProtoType> FTP = GetFormalType(MD);    // Add the formal parameters. -  for (unsigned i = 0, e = FTP->getNumParams(); i != e; ++i) -    argTypes.push_back(FTP->getParamType(i)); +  argTypes.append(FTP->param_type_begin(), FTP->param_type_end());    TheCXXABI.buildStructorSignature(MD, Type, argTypes); @@ -349,6 +348,26 @@ CodeGenTypes::arrangeMSMemberPointerThunk(const CXXMethodDecl *MD) {                                   FTP->getExtInfo(), RequiredArgs(1));  } +const CGFunctionInfo & +CodeGenTypes::arrangeMSCtorClosure(const CXXConstructorDecl *CD, +                                   CXXCtorType CT) { +  assert(CT == Ctor_CopyingClosure || CT == Ctor_DefaultClosure); + +  CanQual<FunctionProtoType> FTP = GetFormalType(CD); +  SmallVector<CanQualType, 2> ArgTys; +  const CXXRecordDecl *RD = CD->getParent(); +  ArgTys.push_back(GetThisType(Context, RD)); +  if (CT == Ctor_CopyingClosure) +    ArgTys.push_back(*FTP->param_type_begin()); +  if (RD->getNumVBases() > 0) +    ArgTys.push_back(Context.IntTy); +  CallingConv CC = Context.getDefaultCallingConvention( +      /*IsVariadic=*/false, /*IsCXXMethod=*/true); +  return arrangeLLVMFunctionInfo(Context.VoidTy, /*instanceMethod=*/true, +                                 /*chainCall=*/false, ArgTys, +                                 FunctionType::ExtInfo(CC), RequiredArgs::All); +} +  /// Arrange a call as unto a free function, except possibly with an  /// additional number of formal parameters considered required.  static const CGFunctionInfo & @@ -716,7 +735,8 @@ void CodeGenFunction::ExpandTypeFromArgs(    auto Exp = getTypeExpansion(Ty, getContext());    if (auto CAExp = dyn_cast<ConstantArrayExpansion>(Exp.get())) {      for (int i = 0, n = CAExp->NumElts; i < n; i++) { -      llvm::Value *EltAddr = Builder.CreateConstGEP2_32(LV.getAddress(), 0, i); +      llvm::Value *EltAddr = +          Builder.CreateConstGEP2_32(nullptr, LV.getAddress(), 0, i);        LValue LV = MakeAddrLValue(EltAddr, CAExp->EltTy);        ExpandTypeFromArgs(CAExp->EltTy, LV, AI);      } @@ -738,10 +758,12 @@ void CodeGenFunction::ExpandTypeFromArgs(        ExpandTypeFromArgs(FD->getType(), SubLV, AI);      }    } else if (auto CExp = dyn_cast<ComplexExpansion>(Exp.get())) { -    llvm::Value *RealAddr = Builder.CreateStructGEP(LV.getAddress(), 0, "real"); +    llvm::Value *RealAddr = +        Builder.CreateStructGEP(nullptr, LV.getAddress(), 0, "real");      EmitStoreThroughLValue(RValue::get(*AI++),                             MakeAddrLValue(RealAddr, CExp->EltTy)); -    llvm::Value *ImagAddr = Builder.CreateStructGEP(LV.getAddress(), 1, "imag"); +    llvm::Value *ImagAddr = +        Builder.CreateStructGEP(nullptr, LV.getAddress(), 1, "imag");      EmitStoreThroughLValue(RValue::get(*AI++),                             MakeAddrLValue(ImagAddr, CExp->EltTy));    } else { @@ -757,7 +779,7 @@ void CodeGenFunction::ExpandTypeToArgs(    if (auto CAExp = dyn_cast<ConstantArrayExpansion>(Exp.get())) {      llvm::Value *Addr = RV.getAggregateAddr();      for (int i = 0, n = CAExp->NumElts; i < n; i++) { -      llvm::Value *EltAddr = Builder.CreateConstGEP2_32(Addr, 0, i); +      llvm::Value *EltAddr = Builder.CreateConstGEP2_32(nullptr, Addr, 0, i);        RValue EltRV =            convertTempToRValue(EltAddr, CAExp->EltTy, SourceLocation());        ExpandTypeToArgs(CAExp->EltTy, EltRV, IRFuncTy, IRCallArgs, IRCallArgPos); @@ -825,7 +847,7 @@ EnterStructPointerForCoercedAccess(llvm::Value *SrcPtr,      return SrcPtr;    // GEP into the first element. -  SrcPtr = CGF.Builder.CreateConstGEP2_32(SrcPtr, 0, 0, "coerce.dive"); +  SrcPtr = CGF.Builder.CreateConstGEP2_32(SrcSTy, SrcPtr, 0, 0, "coerce.dive");    // If the first element is a struct, recurse.    llvm::Type *SrcTy = @@ -963,7 +985,7 @@ static void BuildAggStore(CodeGenFunction &CGF, llvm::Value *Val,    if (llvm::StructType *STy =          dyn_cast<llvm::StructType>(Val->getType())) {      for (unsigned i = 0, e = STy->getNumElements(); i != e; ++i) { -      llvm::Value *EltPtr = CGF.Builder.CreateConstGEP2_32(DestPtr, 0, i); +      llvm::Value *EltPtr = CGF.Builder.CreateConstGEP2_32(STy, DestPtr, 0, i);        llvm::Value *Elt = CGF.Builder.CreateExtractValue(Val, i);        llvm::StoreInst *SI = CGF.Builder.CreateStore(Elt, EltPtr,                                                      DestIsVolatile); @@ -1403,7 +1425,7 @@ void CodeGenModule::ConstructAttributeList(const CGFunctionInfo &FI,        FuncAttrs.addAttribute(llvm::Attribute::ReadOnly);        FuncAttrs.addAttribute(llvm::Attribute::NoUnwind);      } -    if (TargetDecl->hasAttr<MallocAttr>()) +    if (TargetDecl->hasAttr<RestrictAttr>())        RetAttrs.addAttribute(llvm::Attribute::NoAlias);      if (TargetDecl->hasAttr<ReturnsNonNullAttr>())        RetAttrs.addAttribute(llvm::Attribute::NonNull); @@ -1458,6 +1480,26 @@ void CodeGenModule::ConstructAttributeList(const CGFunctionInfo &FI,      if (!CodeGenOpts.StackRealignment)        FuncAttrs.addAttribute("no-realign-stack"); + +    // Add target-cpu and target-features work if they differ from the defaults. +    std::string &CPU = getTarget().getTargetOpts().CPU; +    if (CPU != "") +      FuncAttrs.addAttribute("target-cpu", CPU); + +    // TODO: Features gets us the features on the command line including +    // feature dependencies. For canonicalization purposes we might want to +    // avoid putting features in the target-features set if we know it'll be one +    // of the default features in the backend, e.g. corei7-avx and +avx or figure +    // out non-explicit dependencies. +    std::vector<std::string> &Features = getTarget().getTargetOpts().Features; +    if (!Features.empty()) { +      std::stringstream S; +      std::copy(Features.begin(), Features.end(), +                std::ostream_iterator<std::string>(S, ",")); +      // The drop_back gets rid of the trailing space. +      FuncAttrs.addAttribute("target-features", +                             StringRef(S.str()).drop_back(1)); +    }    }    ClangToLLVMArgMapping IRFunctionArgs(getContext(), FI); @@ -1546,8 +1588,12 @@ void CodeGenModule::ConstructAttributeList(const CGFunctionInfo &FI,      case ABIArgInfo::Extend:        if (ParamType->isSignedIntegerOrEnumerationType())          Attrs.addAttribute(llvm::Attribute::SExt); -      else if (ParamType->isUnsignedIntegerOrEnumerationType()) -        Attrs.addAttribute(llvm::Attribute::ZExt); +      else if (ParamType->isUnsignedIntegerOrEnumerationType()) { +        if (getTypes().getABIInfo().shouldSignExtUnsignedType(ParamType)) +          Attrs.addAttribute(llvm::Attribute::SExt); +        else +          Attrs.addAttribute(llvm::Attribute::ZExt); +      }        // FALL THROUGH      case ABIArgInfo::Direct:        if (ArgNo == 0 && FI.isChainCall()) @@ -1734,8 +1780,9 @@ void CodeGenFunction::EmitFunctionProlog(const CGFunctionInfo &FI,      switch (ArgI.getKind()) {      case ABIArgInfo::InAlloca: {        assert(NumIRArgs == 0); -      llvm::Value *V = Builder.CreateStructGEP( -          ArgStruct, ArgI.getInAllocaFieldIndex(), Arg->getName()); +      llvm::Value *V = +          Builder.CreateStructGEP(FI.getArgStruct(), ArgStruct, +                                  ArgI.getInAllocaFieldIndex(), Arg->getName());        ArgVals.push_back(ValueAndIsPtr(V, HavePointer));        break;      } @@ -1770,8 +1817,7 @@ void CodeGenFunction::EmitFunctionProlog(const CGFunctionInfo &FI,          ArgVals.push_back(ValueAndIsPtr(V, HavePointer));        } else {          // Load scalar value from indirect argument. -        CharUnits Alignment = getContext().getTypeAlignInChars(Ty); -        V = EmitLoadOfScalar(V, false, Alignment.getQuantity(), Ty, +        V = EmitLoadOfScalar(V, false, ArgI.getIndirectAlign(), Ty,                               Arg->getLocStart());          if (isPromoted) @@ -1901,7 +1947,7 @@ void CodeGenFunction::EmitFunctionProlog(const CGFunctionInfo &FI,        // If the value is offset in memory, apply the offset now.        if (unsigned Offs = ArgI.getDirectOffset()) {          Ptr = Builder.CreateBitCast(Ptr, Builder.getInt8PtrTy()); -        Ptr = Builder.CreateConstGEP1_32(Ptr, Offs); +        Ptr = Builder.CreateConstGEP1_32(Builder.getInt8Ty(), Ptr, Offs);          Ptr = Builder.CreateBitCast(Ptr,                            llvm::PointerType::getUnqual(ArgI.getCoerceToType()));        } @@ -1923,7 +1969,7 @@ void CodeGenFunction::EmitFunctionProlog(const CGFunctionInfo &FI,            for (unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {              auto AI = FnArgs[FirstIRArg + i];              AI->setName(Arg->getName() + ".coerce" + Twine(i)); -            llvm::Value *EltPtr = Builder.CreateConstGEP2_32(Ptr, 0, i); +            llvm::Value *EltPtr = Builder.CreateConstGEP2_32(STy, Ptr, 0, i);              Builder.CreateStore(AI, EltPtr);            }          } else { @@ -1936,7 +1982,8 @@ void CodeGenFunction::EmitFunctionProlog(const CGFunctionInfo &FI,            for (unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {              auto AI = FnArgs[FirstIRArg + i];              AI->setName(Arg->getName() + ".coerce" + Twine(i)); -            llvm::Value *EltPtr = Builder.CreateConstGEP2_32(TempV, 0, i); +            llvm::Value *EltPtr = +                Builder.CreateConstGEP2_32(ArgI.getCoerceToType(), TempV, 0, i);              Builder.CreateStore(AI, EltPtr);            } @@ -2173,7 +2220,29 @@ static llvm::StoreInst *findDominatingStoreToReturnValue(CodeGenFunction &CGF) {    if (!CGF.ReturnValue->hasOneUse()) {      llvm::BasicBlock *IP = CGF.Builder.GetInsertBlock();      if (IP->empty()) return nullptr; -    llvm::StoreInst *store = dyn_cast<llvm::StoreInst>(&IP->back()); +    llvm::Instruction *I = &IP->back(); + +    // Skip lifetime markers +    for (llvm::BasicBlock::reverse_iterator II = IP->rbegin(), +                                            IE = IP->rend(); +         II != IE; ++II) { +      if (llvm::IntrinsicInst *Intrinsic = +              dyn_cast<llvm::IntrinsicInst>(&*II)) { +        if (Intrinsic->getIntrinsicID() == llvm::Intrinsic::lifetime_end) { +          const llvm::Value *CastAddr = Intrinsic->getArgOperand(1); +          ++II; +          if (isa<llvm::BitCastInst>(&*II)) { +            if (CastAddr == &*II) { +              continue; +            } +          } +        } +      } +      I = &*II; +      break; +    } + +    llvm::StoreInst *store = dyn_cast<llvm::StoreInst>(I);      if (!store) return nullptr;      if (store->getPointerOperand() != CGF.ReturnValue) return nullptr;      assert(!store->isAtomic() && !store->isVolatile()); // see below @@ -2231,8 +2300,8 @@ void CodeGenFunction::EmitFunctionEpilog(const CGFunctionInfo &FI,        llvm::Function::arg_iterator EI = CurFn->arg_end();        --EI;        llvm::Value *ArgStruct = EI; -      llvm::Value *SRet = -          Builder.CreateStructGEP(ArgStruct, RetAI.getInAllocaFieldIndex()); +      llvm::Value *SRet = Builder.CreateStructGEP( +          nullptr, ArgStruct, RetAI.getInAllocaFieldIndex());        RV = Builder.CreateLoad(SRet, "sret");      }      break; @@ -2271,7 +2340,8 @@ void CodeGenFunction::EmitFunctionEpilog(const CGFunctionInfo &FI,        // If there is a dominating store to ReturnValue, we can elide        // the load, zap the store, and usually zap the alloca. -      if (llvm::StoreInst *SI = findDominatingStoreToReturnValue(*this)) { +      if (llvm::StoreInst *SI = +              findDominatingStoreToReturnValue(*this)) {          // Reuse the debug location from the store unless there is          // cleanup code to be emitted between the store and return          // instruction. @@ -2296,7 +2366,7 @@ void CodeGenFunction::EmitFunctionEpilog(const CGFunctionInfo &FI,        // If the value is offset in memory, apply the offset now.        if (unsigned Offs = RetAI.getDirectOffset()) {          V = Builder.CreateBitCast(V, Builder.getInt8PtrTy()); -        V = Builder.CreateConstGEP1_32(V, Offs); +        V = Builder.CreateConstGEP1_32(Builder.getInt8Ty(), V, Offs);          V = Builder.CreateBitCast(V,                           llvm::PointerType::getUnqual(RetAI.getCoerceToType()));        } @@ -2342,8 +2412,8 @@ void CodeGenFunction::EmitFunctionEpilog(const CGFunctionInfo &FI,      Ret = Builder.CreateRetVoid();    } -  if (!RetDbgLoc.isUnknown()) -    Ret->setDebugLoc(RetDbgLoc); +  if (RetDbgLoc) +    Ret->setDebugLoc(std::move(RetDbgLoc));  }  static bool isInAllocaArgument(CGCXXABI &ABI, QualType type) { @@ -2626,7 +2696,7 @@ void CallArgList::allocateArgumentMemory(CodeGenFunction &CGF) {    // Save the stack.    llvm::Function *F = CGF.CGM.getIntrinsic(llvm::Intrinsic::stacksave); -  StackBase = CGF.Builder.CreateCall(F, "inalloca.save"); +  StackBase = CGF.Builder.CreateCall(F, {}, "inalloca.save");    // Control gets really tied up in landing pads, so we have to spill the    // stacksave to an alloca to avoid violating SSA form. @@ -2678,12 +2748,7 @@ void CodeGenFunction::EmitCallArgs(CallArgList &Args,                                     CallExpr::const_arg_iterator ArgBeg,                                     CallExpr::const_arg_iterator ArgEnd,                                     const FunctionDecl *CalleeDecl, -                                   unsigned ParamsToSkip, -                                   bool ForceColumnInfo) { -  CGDebugInfo *DI = getDebugInfo(); -  SourceLocation CallLoc; -  if (DI) CallLoc = DI->getLocation(); - +                                   unsigned ParamsToSkip) {    // We *have* to evaluate arguments from right to left in the MS C++ ABI,    // because arguments are destroyed left to right in the callee.    if (CGM.getTarget().getCXXABI().areArgsDestroyedLeftToRightInCallee()) { @@ -2704,8 +2769,6 @@ void CodeGenFunction::EmitCallArgs(CallArgList &Args,        EmitCallArg(Args, *Arg, ArgTypes[I]);        emitNonNullArgCheck(*this, Args.back().RV, ArgTypes[I], Arg->getExprLoc(),                            CalleeDecl, ParamsToSkip + I); -      // Restore the debug location. -      if (DI) DI->EmitLocation(Builder, CallLoc, ForceColumnInfo);      }      // Un-reverse the arguments we just evaluated so they match up with the LLVM @@ -2720,8 +2783,6 @@ void CodeGenFunction::EmitCallArgs(CallArgList &Args,      EmitCallArg(Args, *Arg, ArgTypes[I]);      emitNonNullArgCheck(*this, Args.back().RV, ArgTypes[I], Arg->getExprLoc(),                          CalleeDecl, ParamsToSkip + I); -    // Restore the debug location. -    if (DI) DI->EmitLocation(Builder, CallLoc, ForceColumnInfo);    }  } @@ -2744,8 +2805,22 @@ struct DestroyUnpassedArg : EHScopeStack::Cleanup {  } +struct DisableDebugLocationUpdates { +  CodeGenFunction &CGF; +  bool disabledDebugInfo; +  DisableDebugLocationUpdates(CodeGenFunction &CGF, const Expr *E) : CGF(CGF) { +    if ((disabledDebugInfo = isa<CXXDefaultArgExpr>(E) && CGF.getDebugInfo())) +      CGF.disableDebugInfo(); +  } +  ~DisableDebugLocationUpdates() { +    if (disabledDebugInfo) +      CGF.enableDebugInfo(); +  } +}; +  void CodeGenFunction::EmitCallArg(CallArgList &args, const Expr *E,                                    QualType type) { +  DisableDebugLocationUpdates Dis(*this, E);    if (const ObjCIndirectCopyRestoreExpr *CRE          = dyn_cast<ObjCIndirectCopyRestoreExpr>(E)) {      assert(getLangOpts().ObjCAutoRefCount); @@ -2900,7 +2975,6 @@ void CodeGenFunction::EmitNoreturnRuntimeCallOrInvoke(llvm::Value *callee,      call->setCallingConv(getRuntimeCC());      Builder.CreateUnreachable();    } -  PGO.setCurrentRegionUnreachable();  }  /// Emits a call or invoke instruction to the given nullary runtime @@ -2949,7 +3023,7 @@ CodeGenFunction::EmitCallOrInvoke(llvm::Value *Callee,    if (CGM.getLangOpts().ObjCAutoRefCount)      AddObjCARCExceptionMetadata(Inst); -  return Inst; +  return llvm::CallSite(Inst);  }  /// \brief Store a non-aggregate value to an address to initialize it.  For @@ -2986,7 +3060,7 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,    // If we're using inalloca, insert the allocation after the stack save.    // FIXME: Do this earlier rather than hacking it in here! -  llvm::Value *ArgMemory = nullptr; +  llvm::AllocaInst *ArgMemory = nullptr;    if (llvm::StructType *ArgStruct = CallInfo.getArgStruct()) {      llvm::Instruction *IP = CallArgs.getStackBase();      llvm::AllocaInst *AI; @@ -3015,7 +3089,8 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,        IRCallArgs[IRFunctionArgs.getSRetArgNo()] = SRetPtr;      } else {        llvm::Value *Addr = -          Builder.CreateStructGEP(ArgMemory, RetAI.getInAllocaFieldIndex()); +          Builder.CreateStructGEP(ArgMemory->getAllocatedType(), ArgMemory, +                                  RetAI.getInAllocaFieldIndex());        Builder.CreateStore(SRetPtr, Addr);      }    } @@ -3049,14 +3124,16 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,              cast<llvm::Instruction>(RV.getAggregateAddr());          CGBuilderTy::InsertPoint IP = Builder.saveIP();          Builder.SetInsertPoint(Placeholder); -        llvm::Value *Addr = Builder.CreateStructGEP( -            ArgMemory, ArgInfo.getInAllocaFieldIndex()); +        llvm::Value *Addr = +            Builder.CreateStructGEP(ArgMemory->getAllocatedType(), ArgMemory, +                                    ArgInfo.getInAllocaFieldIndex());          Builder.restoreIP(IP);          deferPlaceholderReplacement(Placeholder, Addr);        } else {          // Store the RValue into the argument struct.          llvm::Value *Addr = -            Builder.CreateStructGEP(ArgMemory, ArgInfo.getInAllocaFieldIndex()); +            Builder.CreateStructGEP(ArgMemory->getAllocatedType(), ArgMemory, +                                    ArgInfo.getInAllocaFieldIndex());          unsigned AS = Addr->getType()->getPointerAddressSpace();          llvm::Type *MemType = ConvertTypeForMem(I->Ty)->getPointerTo(AS);          // There are some cases where a trivial bitcast is not avoidable.  The @@ -3100,8 +3177,8 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,                   : 0);          if ((!ArgInfo.getIndirectByVal() && I->NeedsCopy) ||              (ArgInfo.getIndirectByVal() && TypeAlign.getQuantity() < Align && -             llvm::getOrEnforceKnownAlignment(Addr, Align, TD) < Align) || -             (ArgInfo.getIndirectByVal() && (RVAddrSpace != ArgAddrSpace))) { +             llvm::getOrEnforceKnownAlignment(Addr, Align, *TD) < Align) || +            (ArgInfo.getIndirectByVal() && (RVAddrSpace != ArgAddrSpace))) {            // Create an aligned temporary, and copy to it.            llvm::AllocaInst *AI = CreateMemTemp(I->Ty);            if (Align > AI->getAlignment()) @@ -3158,7 +3235,7 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,        // If the value is offset in memory, apply the offset now.        if (unsigned Offs = ArgInfo.getDirectOffset()) {          SrcPtr = Builder.CreateBitCast(SrcPtr, Builder.getInt8PtrTy()); -        SrcPtr = Builder.CreateConstGEP1_32(SrcPtr, Offs); +        SrcPtr = Builder.CreateConstGEP1_32(Builder.getInt8Ty(), SrcPtr, Offs);          SrcPtr = Builder.CreateBitCast(SrcPtr,                         llvm::PointerType::getUnqual(ArgInfo.getCoerceToType())); @@ -3190,7 +3267,7 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,          assert(NumIRArgs == STy->getNumElements());          for (unsigned i = 0, e = STy->getNumElements(); i != e; ++i) { -          llvm::Value *EltPtr = Builder.CreateConstGEP2_32(SrcPtr, 0, i); +          llvm::Value *EltPtr = Builder.CreateConstGEP2_32(STy, SrcPtr, 0, i);            llvm::LoadInst *LI = Builder.CreateLoad(EltPtr);            // We don't know what we're loading from.            LI->setAlignment(1); @@ -3300,7 +3377,8 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,    llvm::BasicBlock *InvokeDest = nullptr;    if (!Attrs.hasAttribute(llvm::AttributeSet::FunctionIndex, -                          llvm::Attribute::NoUnwind)) +                          llvm::Attribute::NoUnwind) || +      currentFunctionUsesSEHTry())      InvokeDest = getInvokeDest();    llvm::CallSite CS; @@ -3320,6 +3398,12 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,          Attrs.addAttribute(getLLVMContext(), llvm::AttributeSet::FunctionIndex,                             llvm::Attribute::AlwaysInline); +  // Disable inlining inside SEH __try blocks. +  if (isSEHTryScope()) +    Attrs = +        Attrs.addAttribute(getLLVMContext(), llvm::AttributeSet::FunctionIndex, +                           llvm::Attribute::NoInline); +    CS.setAttributes(Attrs);    CS.setCallingConv(static_cast<llvm::CallingConv::ID>(CallingConv)); @@ -3413,7 +3497,8 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,        llvm::Value *StorePtr = DestPtr;        if (unsigned Offs = RetAI.getDirectOffset()) {          StorePtr = Builder.CreateBitCast(StorePtr, Builder.getInt8PtrTy()); -        StorePtr = Builder.CreateConstGEP1_32(StorePtr, Offs); +        StorePtr = +            Builder.CreateConstGEP1_32(Builder.getInt8Ty(), StorePtr, Offs);          StorePtr = Builder.CreateBitCast(StorePtr,                             llvm::PointerType::getUnqual(RetAI.getCoerceToType()));        } | 
