diff options
Diffstat (limited to 'contrib/llvm/tools/clang/lib/CodeGen/CGStmt.cpp')
| -rw-r--r-- | contrib/llvm/tools/clang/lib/CodeGen/CGStmt.cpp | 42 | 
1 files changed, 23 insertions, 19 deletions
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CGStmt.cpp b/contrib/llvm/tools/clang/lib/CodeGen/CGStmt.cpp index 97e35e2b6e8d..79662ec0099f 100644 --- a/contrib/llvm/tools/clang/lib/CodeGen/CGStmt.cpp +++ b/contrib/llvm/tools/clang/lib/CodeGen/CGStmt.cpp @@ -608,7 +608,7 @@ void CodeGenFunction::EmitIfStmt(const IfStmt &S) {      EmitStmt(S.getInit());    if (S.getConditionVariable()) -    EmitAutoVarDecl(*S.getConditionVariable()); +    EmitDecl(*S.getConditionVariable());    // If the condition constant folds and can be elided, try to avoid emitting    // the condition and the dead arm of the if/else. @@ -705,7 +705,7 @@ void CodeGenFunction::EmitWhileStmt(const WhileStmt &S,    RunCleanupsScope ConditionScope(*this);    if (S.getConditionVariable()) -    EmitAutoVarDecl(*S.getConditionVariable()); +    EmitDecl(*S.getConditionVariable());    // Evaluate the conditional in the while header.  C99 6.8.5.1: The    // evaluation of the controlling expression takes place before each @@ -777,11 +777,6 @@ void CodeGenFunction::EmitDoStmt(const DoStmt &S,    // Emit the body of the loop.    llvm::BasicBlock *LoopBody = createBasicBlock("do.body"); -  const SourceRange &R = S.getSourceRange(); -  LoopStack.push(LoopBody, CGM.getContext(), DoAttrs, -                 SourceLocToDebugLoc(R.getBegin()), -                 SourceLocToDebugLoc(R.getEnd())); -    EmitBlockWithFallThrough(LoopBody, &S);    {      RunCleanupsScope BodyScope(*this); @@ -790,6 +785,11 @@ void CodeGenFunction::EmitDoStmt(const DoStmt &S,    EmitBlock(LoopCond.getBlock()); +  const SourceRange &R = S.getSourceRange(); +  LoopStack.push(LoopBody, CGM.getContext(), DoAttrs, +                 SourceLocToDebugLoc(R.getBegin()), +                 SourceLocToDebugLoc(R.getEnd())); +    // C99 6.8.5.2: "The evaluation of the controlling expression takes place    // after each execution of the loop body." @@ -865,7 +865,7 @@ void CodeGenFunction::EmitForStmt(const ForStmt &S,      // If the for statement has a condition scope, emit the local variable      // declaration.      if (S.getConditionVariable()) { -      EmitAutoVarDecl(*S.getConditionVariable()); +      EmitDecl(*S.getConditionVariable());      }      llvm::BasicBlock *ExitBlock = LoopExit.getBlock(); @@ -1005,7 +1005,9 @@ void CodeGenFunction::EmitReturnOfRValue(RValue RV, QualType Ty) {    if (RV.isScalar()) {      Builder.CreateStore(RV.getScalarVal(), ReturnValue);    } else if (RV.isAggregate()) { -    EmitAggregateCopy(ReturnValue, RV.getAggregateAddress(), Ty); +    LValue Dest = MakeAddrLValue(ReturnValue, Ty); +    LValue Src = MakeAddrLValue(RV.getAggregateAddress(), Ty); +    EmitAggregateCopy(Dest, Src, Ty, overlapForReturnValue());    } else {      EmitStoreOfComplex(RV.getComplexVal(), MakeAddrLValue(ReturnValue, Ty),                         /*init*/ true); @@ -1035,7 +1037,7 @@ void CodeGenFunction::EmitReturnStmt(const ReturnStmt &S) {      Builder.ClearInsertionPoint();    } -  // Emit the result value, even if unused, to evalute the side effects. +  // Emit the result value, even if unused, to evaluate the side effects.    const Expr *RV = S.getRetValue();    // Treat block literals in a return expression as if they appeared @@ -1083,11 +1085,12 @@ void CodeGenFunction::EmitReturnStmt(const ReturnStmt &S) {                                  /*isInit*/ true);        break;      case TEK_Aggregate: -      EmitAggExpr(RV, AggValueSlot::forAddr(ReturnValue, -                                            Qualifiers(), -                                            AggValueSlot::IsDestructed, -                                            AggValueSlot::DoesNotNeedGCBarriers, -                                            AggValueSlot::IsNotAliased)); +      EmitAggExpr(RV, AggValueSlot::forAddr( +                          ReturnValue, Qualifiers(), +                          AggValueSlot::IsDestructed, +                          AggValueSlot::DoesNotNeedGCBarriers, +                          AggValueSlot::IsNotAliased, +                          overlapForReturnValue()));        break;      }    } @@ -1572,7 +1575,7 @@ void CodeGenFunction::EmitSwitchStmt(const SwitchStmt &S) {        // Emit the condition variable if needed inside the entire cleanup scope        // used by this special case for constant folded switches.        if (S.getConditionVariable()) -        EmitAutoVarDecl(*S.getConditionVariable()); +        EmitDecl(*S.getConditionVariable());        // At this point, we are no longer "within" a switch instance, so        // we can temporarily enforce this to ensure that any embedded case @@ -1601,7 +1604,7 @@ void CodeGenFunction::EmitSwitchStmt(const SwitchStmt &S) {      EmitStmt(S.getInit());    if (S.getConditionVariable()) -    EmitAutoVarDecl(*S.getConditionVariable()); +    EmitDecl(*S.getConditionVariable());    llvm::Value *CondV = EmitScalarExpr(S.getCond());    // Create basic block to hold stuff that comes after switch @@ -1924,7 +1927,7 @@ void CodeGenFunction::EmitAsmStmt(const AsmStmt &S) {      // Simplify the output constraint.      std::string OutputConstraint(S.getOutputConstraint(i));      OutputConstraint = SimplifyConstraint(OutputConstraint.c_str() + 1, -                                          getTarget()); +                                          getTarget(), &OutputConstraintInfos);      const Expr *OutExpr = S.getOutputExpr(i);      OutExpr = OutExpr->IgnoreParenNoopCasts(getContext()); @@ -2131,7 +2134,8 @@ void CodeGenFunction::EmitAsmStmt(const AsmStmt &S) {    llvm::InlineAsm *IA =      llvm::InlineAsm::get(FTy, AsmString, Constraints, HasSideEffect,                           /* IsAlignStack */ false, AsmDialect); -  llvm::CallInst *Result = Builder.CreateCall(IA, Args); +  llvm::CallInst *Result = +      Builder.CreateCall(IA, Args, getBundlesForFunclet(IA));    Result->addAttribute(llvm::AttributeList::FunctionIndex,                         llvm::Attribute::NoUnwind);  | 
