diff options
-rw-r--r-- | clang/lib/CodeGen/CGExprScalar.cpp | 16 | ||||
-rw-r--r-- | clang/lib/CodeGen/CGStmt.cpp | 18 | ||||
-rw-r--r-- | clang/lib/CodeGen/CodeGenFunction.h | 13 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/PR20038.cpp | 15 |
4 files changed, 40 insertions, 22 deletions
diff --git a/clang/lib/CodeGen/CGExprScalar.cpp b/clang/lib/CodeGen/CGExprScalar.cpp index 1be7b4230a3..ab5aa28206a 100644 --- a/clang/lib/CodeGen/CGExprScalar.cpp +++ b/clang/lib/CodeGen/CGExprScalar.cpp @@ -358,10 +358,7 @@ public: Value *VisitExprWithCleanups(ExprWithCleanups *E) { CGF.enterFullExpression(E); CodeGenFunction::RunCleanupsScope Scope(CGF); - auto *V = Visit(E->getSubExpr()); - if (CGDebugInfo *DI = CGF.getDebugInfo()) - DI->EmitLocation(Builder, E->getLocEnd(), false); - return V; + return Visit(E->getSubExpr()); } Value *VisitCXXNewExpr(const CXXNewExpr *E) { return CGF.EmitCXXNewExpr(E); @@ -2942,12 +2939,13 @@ Value *ScalarExprEmitter::VisitBinLAnd(const BinaryOperator *E) { // Reaquire the RHS block, as there may be subblocks inserted. RHSBlock = Builder.GetInsertBlock(); - // Emit an unconditional branch from this block to ContBlock. Insert an entry - // into the phi node for the edge with the value of RHSCond. - if (CGF.getDebugInfo()) + // Emit an unconditional branch from this block to ContBlock. + { // There is no need to emit line number for unconditional branch. - Builder.SetCurrentDebugLocation(llvm::DebugLoc()); - CGF.EmitBlock(ContBlock); + SuppressDebugLocation S(Builder); + CGF.EmitBlock(ContBlock); + } + // Insert an entry into the phi node for the edge with the value of RHSCond. PN->addIncoming(RHSCond, RHSBlock); // ZExt result to int. diff --git a/clang/lib/CodeGen/CGStmt.cpp b/clang/lib/CodeGen/CGStmt.cpp index cd86eeb1216..b9d74b675a6 100644 --- a/clang/lib/CodeGen/CGStmt.cpp +++ b/clang/lib/CodeGen/CGStmt.cpp @@ -524,18 +524,20 @@ void CodeGenFunction::EmitIfStmt(const IfStmt &S) { // Emit the 'else' code if present. if (const Stmt *Else = S.getElse()) { - // There is no need to emit line number for unconditional branch. - if (getDebugInfo()) - Builder.SetCurrentDebugLocation(llvm::DebugLoc()); - EmitBlock(ElseBlock); + { + // There is no need to emit line number for unconditional branch. + SuppressDebugLocation S(Builder); + EmitBlock(ElseBlock); + } { RunCleanupsScope ElseScope(*this); EmitStmt(Else); } - // There is no need to emit line number for unconditional branch. - if (getDebugInfo()) - Builder.SetCurrentDebugLocation(llvm::DebugLoc()); - EmitBranch(ContBlock); + { + // There is no need to emit line number for unconditional branch. + SuppressDebugLocation S(Builder); + EmitBranch(ContBlock); + } } // Emit the continuation block for code after the if. diff --git a/clang/lib/CodeGen/CodeGenFunction.h b/clang/lib/CodeGen/CodeGenFunction.h index c04fc3e9e70..a2d92ff18cc 100644 --- a/clang/lib/CodeGen/CodeGenFunction.h +++ b/clang/lib/CodeGen/CodeGenFunction.h @@ -93,6 +93,19 @@ enum TypeEvaluationKind { TEK_Aggregate }; +class SuppressDebugLocation { + llvm::DebugLoc CurLoc; + llvm::IRBuilderBase &Builder; +public: + SuppressDebugLocation(llvm::IRBuilderBase &Builder) + : CurLoc(Builder.getCurrentDebugLocation()), Builder(Builder) { + Builder.SetCurrentDebugLocation(llvm::DebugLoc()); + } + ~SuppressDebugLocation() { + Builder.SetCurrentDebugLocation(CurLoc); + } +}; + /// CodeGenFunction - This class organizes the per-function state that is used /// while generating LLVM code. class CodeGenFunction : public CodeGenTypeCache { diff --git a/clang/test/CodeGenCXX/PR20038.cpp b/clang/test/CodeGenCXX/PR20038.cpp index 671b8bcd7ba..18f72c59dad 100644 --- a/clang/test/CodeGenCXX/PR20038.cpp +++ b/clang/test/CodeGenCXX/PR20038.cpp @@ -4,8 +4,13 @@ struct C { ~C(); }; extern bool b; -// CHECK: call {{.*}}, !dbg [[DTOR_CALL_LOC:![0-9]*]] -// CHECK: [[FUN4:.*]] = {{.*}}; [ DW_TAG_subprogram ] {{.*}} [def] [fun4] -// CHECK: [[DTOR_CALL_LOC]] = metadata !{i32 [[@LINE+2]], i32 0, metadata [[FUN4_BLOCK:.*]], null} -// CHECK: [[FUN4_BLOCK]] = metadata !{{{[^,]*}}, {{[^,]*}}, metadata [[FUN4]], -void fun4() { b && (C(), 1); } +// CHECK: call {{.*}}, !dbg [[DTOR_CALL1_LOC:![0-9]*]] +// CHECK: call {{.*}}, !dbg [[DTOR_CALL2_LOC:![0-9]*]] +// CHECK: [[FUN1:.*]] = {{.*}}; [ DW_TAG_subprogram ] {{.*}} [def] [fun1] +// CHECK: [[FUN2:.*]] = {{.*}}; [ DW_TAG_subprogram ] {{.*}} [def] [fun2] +// CHECK: [[DTOR_CALL1_LOC]] = metadata !{i32 [[@LINE+2]], i32 0, metadata [[FUN1_BLOCK:.*]], null} +// CHECK: [[FUN1_BLOCK]] = metadata !{{{[^,]*}}, {{[^,]*}}, metadata [[FUN1]], +void fun1() { b && (C(), 1); } +// CHECK: [[DTOR_CALL2_LOC]] = metadata !{i32 [[@LINE+2]], i32 0, metadata [[FUN2_BLOCK1:.*]], null} +// CHECK: [[FUN2_BLOCK1]] = metadata !{{{[^,]*}}, {{[^,]*}}, metadata [[FUN2]], +bool fun2() { return (C(), b) && 0; } |