r225000 - Reapply "DebugInfo: Generalize debug info location handling"

David Blaikie dblaikie at gmail.com
Tue Dec 30 16:07:22 PST 2014


On Tue, Dec 30, 2014 at 4:01 PM, Jay Foad <jay.foad at gmail.com> wrote:

> Hi David,
>
> This commit seems to have introduced one regression in "ninja
> check-clang" on PowerPC64 Linux, using GCC 4.8.3 as host compiler:
>

Hopefully r225021 will address that. Let me know if it doesn't.


>
> FAIL: Clang :: CodeGenCXX/debug-info-line.cpp (2158 of 7931)
> ******************** TEST 'Clang :: CodeGenCXX/debug-info-line.cpp'
> FAILED ********************
> Script:
> --
> /home/foad/llvm-project/build/./bin/clang -cc1 -internal-isystem
> /home/foad/llvm-project/build/bin/../lib/clang/3.6.0/include
> -nostdsysteminc -g -std=c++11 -S -emit-llvm
>
> /home/foad/llvm-project/llvm/tools/clang/test/CodeGenCXX/debug-info-line.cpp
> -o - | /home/foad/llvm-project/build/./bin/FileCheck
>
> /home/foad/llvm-project/llvm/tools/clang/test/CodeGenCXX/debug-info-line.cpp
> /home/foad/llvm-project/build/./bin/clang -cc1 -internal-isystem
> /home/foad/llvm-project/build/bin/../lib/clang/3.6.0/include
> -nostdsysteminc -triple i686-linux-gnu -g -std=c++11 -S -emit-llvm
>
> /home/foad/llvm-project/llvm/tools/clang/test/CodeGenCXX/debug-info-line.cpp
> -o - | /home/foad/llvm-project/build/./bin/FileCheck
>
> /home/foad/llvm-project/llvm/tools/clang/test/CodeGenCXX/debug-info-line.cpp
> --
> Exit Code: 1
>
> Command Output (stderr):
> --
>
> /home/foad/llvm-project/llvm/tools/clang/test/CodeGenCXX/debug-info-line.cpp:706:12:
> warning: empty parentheses interpreted as a function declaration
>   int *src1();
>            ^~
>
> /home/foad/llvm-project/llvm/tools/clang/test/CodeGenCXX/debug-info-line.cpp:706:12:
> note: replace parentheses with an initializer to declare a variable
>   int *src1();
>            ^~
>             = nullptr
>
> /home/foad/llvm-project/llvm/tools/clang/test/CodeGenCXX/debug-info-line.cpp:707:11:
> warning: empty parentheses interpreted as a function declaration
>   int src2();
>           ^~
>
> /home/foad/llvm-project/llvm/tools/clang/test/CodeGenCXX/debug-info-line.cpp:707:11:
> note: replace parentheses with an initializer to declare a variable
>   int src2();
>           ^~
>            = 0
>
> /home/foad/llvm-project/llvm/tools/clang/test/CodeGenCXX/debug-info-line.cpp:807:11:
> warning: empty parentheses interpreted as a function declaration
>   int src2();
>           ^~
>
> /home/foad/llvm-project/llvm/tools/clang/test/CodeGenCXX/debug-info-line.cpp:807:11:
> note: replace parentheses with an initializer to declare a variable
>   int src2();
>           ^~
>            = 0
>
> /home/foad/llvm-project/llvm/tools/clang/test/CodeGenCXX/debug-info-line.cpp:907:11:
> warning: empty parentheses interpreted as a function declaration
>   int src2();
>           ^~
>
> /home/foad/llvm-project/llvm/tools/clang/test/CodeGenCXX/debug-info-line.cpp:907:11:
> note: replace parentheses with an initializer to declare a variable
>   int src2();
>           ^~
>            = 0
>
> /home/foad/llvm-project/llvm/tools/clang/test/CodeGenCXX/debug-info-line.cpp:1008:17:
> warning: empty parentheses interpreted as a function declaration
>   void *void_src();
>                 ^~
>
> /home/foad/llvm-project/llvm/tools/clang/test/CodeGenCXX/debug-info-line.cpp:1008:17:
> note: replace parentheses with an initializer to declare a variable
>   void *void_src();
>                 ^~
>                  = nullptr
>
> /home/foad/llvm-project/llvm/tools/clang/test/CodeGenCXX/debug-info-line.cpp:1205:12:
> warning: empty parentheses interpreted as a function declaration
>   int f12_1();
>            ^~
>
> /home/foad/llvm-project/llvm/tools/clang/test/CodeGenCXX/debug-info-line.cpp:1205:12:
> note: replace parentheses with an initializer to declare a variable
>   int f12_1();
>            ^~
>             = 0
> 6 warnings generated.
>
> /home/foad/llvm-project/llvm/tools/clang/test/CodeGenCXX/debug-info-line.cpp:126:11:
> error: expected string not found in input
> // CHECK: call i32 {{.*}} !dbg [[DBG_F12:!.*]]
>           ^
> <stdin>:235:8: note: scanning from here
> define void @_Z3f12v() #0 {
>        ^
> <stdin>:236:24: note: possible intended match here
>  %1 = call signext i32 @_Z5f12_1v(), !dbg !115
>                        ^
>
> --
>
> Thanks,
> Jay.
>
> On 30 December 2014 at 19:39, David Blaikie <dblaikie at gmail.com> wrote:
> > Author: dblaikie
> > Date: Tue Dec 30 13:39:33 2014
> > New Revision: 225000
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=225000&view=rev
> > Log:
> > Reapply "DebugInfo: Generalize debug info location handling"
> >
> > Originally committed in r224385 and reverted in r224441 due to concerns
> > this change might've introduced a crash. Turns out this change fixes the
> > crash introduced by one of my earlier more specific location handling
> > changes (those specific fixes are reverted by this patch, in favor of
> > the more general solution).
> >
> > Recommitted in r224941 and reverted in r224970 after it caused a crash
> > when building compiler-rt. Looks to be due to this change zeroing out
> > the debug location when emitting default arguments (which were meant to
> > inherit their outer expression's location) thus creating call
> > instructions without locations - these create problems for inlining and
> > must not be created. That is fixed and tested in this version of the
> > change.
> >
> > Original commit message:
> >
> > This is a more scalable (fixed in mostly one place, rather than many
> > places that will need constant improvement/maintenance) solution to
> > several commits I've made recently to increase source fidelity for
> > subexpressions.
> >
> > This resetting had to be done at the DebugLoc level (not the
> > SourceLocation level) to preserve scoping information (if the resetting
> > was done with CGDebugInfo::EmitLocation, it would've caused the tail end
> > of an expression's codegen to end up in a potentially different scope
> > than the start, even though it was at the same source location). The
> > drawback to this is that it might leave CGDebugInfo out of sync. Ideally
> > CGDebugInfo shouldn't have a duplicate sense of the current
> > SourceLocation, but for now it seems it does... - I don't think I'm
> > going to tackle removing that just now.
> >
> > I expect this'll probably cause some more buildbot fallout & I'll
> > investigate that as it comes up.
> >
> > Also these sort of improvements might be starting to show a weakness/bug
> > in LLVM's line table handling: we don't correctly emit is_stmt for
> > statements, we just put it on every line table entry. This means one
> > statement split over multiple lines appears as multiple 'statements' and
> > two statements on one line (without column info) are treated as one
> > statement.
> >
> > I don't think we have any IR representation of statements that would
> > help us distinguish these cases and identify the beginning of each
> > statement - so that might be something we need to add (possibly to the
> > lexical scope chain - a scope for each statement). This does cause some
> > problems for GDB and possibly other DWARF consumers.
> >
> > Modified:
> >     cfe/trunk/lib/CodeGen/CGBlocks.cpp
> >     cfe/trunk/lib/CodeGen/CGClass.cpp
> >     cfe/trunk/lib/CodeGen/CGCleanup.cpp
> >     cfe/trunk/lib/CodeGen/CGDebugInfo.cpp
> >     cfe/trunk/lib/CodeGen/CGDebugInfo.h
> >     cfe/trunk/lib/CodeGen/CGDecl.cpp
> >     cfe/trunk/lib/CodeGen/CGDeclCXX.cpp
> >     cfe/trunk/lib/CodeGen/CGException.cpp
> >     cfe/trunk/lib/CodeGen/CGExpr.cpp
> >     cfe/trunk/lib/CodeGen/CGExprCXX.cpp
> >     cfe/trunk/lib/CodeGen/CGExprComplex.cpp
> >     cfe/trunk/lib/CodeGen/CGExprScalar.cpp
> >     cfe/trunk/lib/CodeGen/CGStmt.cpp
> >     cfe/trunk/lib/CodeGen/CGStmtOpenMP.cpp
> >     cfe/trunk/lib/CodeGen/CodeGenFunction.h
> >     cfe/trunk/test/CodeGenCXX/PR20038.cpp
> >     cfe/trunk/test/CodeGenCXX/debug-info-line.cpp
> >     cfe/trunk/test/CodeGenCXX/debug-info-scope.cpp
> >
> > Modified: cfe/trunk/lib/CodeGen/CGBlocks.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGBlocks.cpp?rev=225000&r1=224999&r2=225000&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/lib/CodeGen/CGBlocks.cpp (original)
> > +++ cfe/trunk/lib/CodeGen/CGBlocks.cpp Tue Dec 30 13:39:33 2014
> > @@ -874,7 +874,7 @@ llvm::Value *CodeGenFunction::EmitBlockL
> >        // locations of subexpressions in the initialization.
> >        EmitExprAsInit(&l2r, &blockFieldPseudoVar,
> >                       MakeAddrLValue(blockField, type, align),
> > -                     /*captured by init*/ false, SourceLocation());
> > +                     /*captured by init*/ false);
> >      }
> >
> >      // Activate the cleanup if layout pushed one.
> > @@ -1175,7 +1175,7 @@ CodeGenFunction::GenerateBlockFunction(G
> >      Alloca->setAlignment(Align);
> >      // Set the DebugLocation to empty, so the store is recognized as a
> >      // frame setup instruction by llvm::DwarfDebug::beginFunction().
> > -    NoLocation NL(*this, Builder);
> > +    ApplyDebugLocation NL(*this);
> >      Builder.CreateAlignedStore(BlockPointer, Alloca, Align);
> >      BlockPointerDbgLoc = Alloca;
> >    }
> > @@ -1326,9 +1326,9 @@ CodeGenFunction::GenerateCopyHelperFunct
> >                                            false,
> >                                            false);
> >    // Create a scope with an artificial location for the body of this
> function.
> > -  ArtificialLocation AL(*this, Builder);
> > +  ApplyDebugLocation NL(*this);
> >    StartFunction(FD, C.VoidTy, Fn, FI, args);
> > -  AL.Emit();
> > +  ArtificialLocation AL(*this);
> >
> >    llvm::Type *structPtrTy = blockInfo.StructureType->getPointerTo();
> >
> > @@ -1497,9 +1497,9 @@ CodeGenFunction::GenerateDestroyHelperFu
> >                                            nullptr, SC_Static,
> >                                            false, false);
> >    // Create a scope with an artificial location for the body of this
> function.
> > -  ArtificialLocation AL(*this, Builder);
> > +  ApplyDebugLocation NL(*this);
> >    StartFunction(FD, C.VoidTy, Fn, FI, args);
> > -  AL.Emit();
> > +  ArtificialLocation AL(*this);
> >
> >    llvm::Type *structPtrTy = blockInfo.StructureType->getPointerTo();
> >
> >
> > Modified: cfe/trunk/lib/CodeGen/CGClass.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGClass.cpp?rev=225000&r1=224999&r2=225000&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/lib/CodeGen/CGClass.cpp (original)
> > +++ cfe/trunk/lib/CodeGen/CGClass.cpp Tue Dec 30 13:39:33 2014
> > @@ -544,6 +544,7 @@ static void EmitMemberInitializer(CodeGe
> >                                    CXXCtorInitializer *MemberInit,
> >                                    const CXXConstructorDecl *Constructor,
> >                                    FunctionArgList &Args) {
> > +  ApplyDebugLocation Loc(CGF, MemberInit->getMemberLocation());
> >    assert(MemberInit->isAnyMemberInitializer() &&
> >           "Must have member initializer!");
> >    assert(MemberInit->getInit() && "Must have initializer!");
> > @@ -597,26 +598,25 @@ static void EmitMemberInitializer(CodeGe
> >    ArrayRef<VarDecl *> ArrayIndexes;
> >    if (MemberInit->getNumArrayIndices())
> >      ArrayIndexes = MemberInit->getArrayIndexes();
> > -  CGF.EmitInitializerForField(Field, LHS, MemberInit->getInit(),
> ArrayIndexes,
> > -                              MemberInit->getMemberLocation());
> > +  ApplyDebugLocation DL(CGF, MemberInit->getMemberLocation());
> > +  CGF.EmitInitializerForField(Field, LHS, MemberInit->getInit(),
> ArrayIndexes);
> >  }
> >
> > -void CodeGenFunction::EmitInitializerForField(FieldDecl *Field, LValue
> LHS,
> > -                                              Expr *Init,
> > -                                              ArrayRef<VarDecl *>
> ArrayIndexes,
> > -                                              SourceLocation DbgLoc) {
> > +void CodeGenFunction::EmitInitializerForField(
> > +    FieldDecl *Field, LValue LHS, Expr *Init,
> > +    ArrayRef<VarDecl *> ArrayIndexes) {
> >    QualType FieldType = Field->getType();
> >    switch (getEvaluationKind(FieldType)) {
> >    case TEK_Scalar:
> >      if (LHS.isSimple()) {
> > -      EmitExprAsInit(Init, Field, LHS, false, DbgLoc);
> > +      EmitExprAsInit(Init, Field, LHS, false);
> >      } else {
> >        RValue RHS = RValue::get(EmitScalarExpr(Init));
> >        EmitStoreThroughLValue(RHS, LHS);
> >      }
> >      break;
> >    case TEK_Complex:
> > -    EmitComplexExprIntoLValue(Init, LHS, /*isInit*/ true, DbgLoc);
> > +    EmitComplexExprIntoLValue(Init, LHS, /*isInit*/ true);
> >      break;
> >    case TEK_Aggregate: {
> >      llvm::Value *ArrayIndexVar = nullptr;
> > @@ -783,8 +783,6 @@ void CodeGenFunction::EmitConstructorBod
> >    // delegation optimization.
> >    if (CtorType == Ctor_Complete && IsConstructorDelegationValid(Ctor) &&
> >        CGM.getTarget().getCXXABI().hasConstructorVariants()) {
> > -    if (CGDebugInfo *DI = getDebugInfo())
> > -      DI->EmitLocation(Builder, Ctor->getLocEnd());
> >      EmitDelegateCXXConstructorCall(Ctor, Ctor_Base, Args,
> Ctor->getLocEnd());
> >      return;
> >    }
> >
> > Modified: cfe/trunk/lib/CodeGen/CGCleanup.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCleanup.cpp?rev=225000&r1=224999&r2=225000&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/lib/CodeGen/CGCleanup.cpp (original)
> > +++ cfe/trunk/lib/CodeGen/CGCleanup.cpp Tue Dec 30 13:39:33 2014
> > @@ -861,10 +861,7 @@ void CodeGenFunction::PopCleanupBlock(bo
> >
> >    // Emit the EH cleanup if required.
> >    if (RequiresEHCleanup) {
> > -    CGDebugInfo *DI = getDebugInfo();
> > -    SaveAndRestoreLocation AutoRestoreLocation(*this, Builder);
> > -    if (DI)
> > -      DI->EmitLocation(Builder, CurEHLocation);
> > +    ApplyDebugLocation AutoRestoreLocation(*this, CurEHLocation);
> >
> >      CGBuilderTy::InsertPoint SavedIP = Builder.saveAndClearIP();
> >
> >
> > Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=225000&r1=224999&r2=225000&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original)
> > +++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Tue Dec 30 13:39:33 2014
> > @@ -52,54 +52,38 @@ CGDebugInfo::~CGDebugInfo() {
> >           "Region stack mismatch, stack not empty!");
> >  }
> >
> > -SaveAndRestoreLocation::SaveAndRestoreLocation(CodeGenFunction &CGF,
> > -                                               CGBuilderTy &B)
> > -    : DI(CGF.getDebugInfo()), Builder(B) {
> > -  if (DI) {
> > -    SavedLoc = DI->getLocation();
> > -    DI->CurLoc = SourceLocation();
> > -  }
> > -}
> > -
> > -SaveAndRestoreLocation::~SaveAndRestoreLocation() {
> > -  if (DI)
> > -    DI->EmitLocation(Builder, SavedLoc);
> > -}
> > -
> > -NoLocation::NoLocation(CodeGenFunction &CGF, CGBuilderTy &B)
> > -    : SaveAndRestoreLocation(CGF, B) {
> > -  if (DI)
> > -    Builder.SetCurrentDebugLocation(llvm::DebugLoc());
> > -}
> > -
> > -NoLocation::~NoLocation() {
> > -  if (DI)
> > -    assert(Builder.getCurrentDebugLocation().isUnknown());
> > -}
> > -
> > -ArtificialLocation::ArtificialLocation(CodeGenFunction &CGF,
> CGBuilderTy &B)
> > -    : SaveAndRestoreLocation(CGF, B) {
> > -  if (DI)
> > -    Builder.SetCurrentDebugLocation(llvm::DebugLoc());
> > -}
> > -
> > -void ArtificialLocation::Emit() {
> > -  if (DI) {
> > -    // Sync the Builder.
> > -    DI->EmitLocation(Builder, SavedLoc);
> > -    DI->CurLoc = SourceLocation();
> > +ArtificialLocation::ArtificialLocation(CodeGenFunction &CGF)
> > +    : ApplyDebugLocation(CGF) {
> > +  if (auto *DI = CGF.getDebugInfo()) {
> >      // Construct a location that has a valid scope, but no line info.
> >      assert(!DI->LexicalBlockStack.empty());
> >      llvm::DIDescriptor Scope(DI->LexicalBlockStack.back());
> > -    Builder.SetCurrentDebugLocation(llvm::DebugLoc::get(0, 0, Scope));
> > +    CGF.Builder.SetCurrentDebugLocation(llvm::DebugLoc::get(0, 0,
> Scope));
> > +  }
> > +}
> > +
> > +ApplyDebugLocation::ApplyDebugLocation(CodeGenFunction &CGF,
> > +                                       SourceLocation TemporaryLocation,
> > +                                       bool ForceColumnInfo)
> > +    : CGF(CGF) {
> > +  if (auto *DI = CGF.getDebugInfo()) {
> > +    OriginalLocation = CGF.Builder.getCurrentDebugLocation();
> > +    if (TemporaryLocation.isInvalid())
> > +      CGF.Builder.SetCurrentDebugLocation(llvm::DebugLoc());
> > +    else
> > +      DI->EmitLocation(CGF.Builder, TemporaryLocation, ForceColumnInfo);
> >    }
> >  }
> >
> > -ArtificialLocation::~ArtificialLocation() {
> > -  if (DI)
> > -    assert(Builder.getCurrentDebugLocation().getLine() == 0);
> > +ApplyDebugLocation::~ApplyDebugLocation() {
> > +  // Query CGF so the location isn't overwritten when location updates
> are
> > +  // temporarily disabled (for C++ default function arguments)
> > +  if (CGF.getDebugInfo())
> > +    CGF.Builder.SetCurrentDebugLocation(OriginalLocation);
> >  }
> >
> > +/// ArtificialLocation - An RAII object that temporarily switches to
> > +/// an artificial debug location that has a valid scope, but no line
> >  void CGDebugInfo::setLocation(SourceLocation Loc) {
> >    // If the new location isn't valid return.
> >    if (Loc.isInvalid())
> >
> > Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.h
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.h?rev=225000&r1=224999&r2=225000&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/lib/CodeGen/CGDebugInfo.h (original)
> > +++ cfe/trunk/lib/CodeGen/CGDebugInfo.h Tue Dec 30 13:39:33 2014
> > @@ -448,27 +448,16 @@ private:
> >    }
> >  };
> >
> > -/// SaveAndRestoreLocation - An RAII object saves the current location
> > -/// and automatically restores it to the original value.
> > -class SaveAndRestoreLocation {
> > +class ApplyDebugLocation {
> >  protected:
> > -  SourceLocation SavedLoc;
> > -  CGDebugInfo *DI;
> > -  CGBuilderTy &Builder;
> > -public:
> > -  SaveAndRestoreLocation(CodeGenFunction &CGF, CGBuilderTy &B);
> > -  /// Autorestore everything back to normal.
> > -  ~SaveAndRestoreLocation();
> > -};
> > +  llvm::DebugLoc OriginalLocation;
> > +  CodeGenFunction &CGF;
> >
> > -/// NoLocation - An RAII object that temporarily disables debug
> > -/// locations. This is useful for emitting instructions that should be
> > -/// counted towards the function prologue.
> > -class NoLocation : public SaveAndRestoreLocation {
> >  public:
> > -  NoLocation(CodeGenFunction &CGF, CGBuilderTy &B);
> > -  /// Autorestore everything back to normal.
> > -  ~NoLocation();
> > +  ApplyDebugLocation(CodeGenFunction &CGF,
> > +                     SourceLocation TemporaryLocation =
> SourceLocation(),
> > +                     bool ForceColumnInfo = false);
> > +  ~ApplyDebugLocation();
> >  };
> >
> >  /// ArtificialLocation - An RAII object that temporarily switches to
> > @@ -482,16 +471,9 @@ public:
> >  /// This is necessary because passing an empty SourceLocation to
> >  /// CGDebugInfo::setLocation() will result in the last valid location
> >  /// being reused.
> > -class ArtificialLocation : public SaveAndRestoreLocation {
> > +class ArtificialLocation : public ApplyDebugLocation {
> >  public:
> > -  ArtificialLocation(CodeGenFunction &CGF, CGBuilderTy &B);
> > -
> > -  /// Set the current location to line 0, but within the current scope
> > -  /// (= the top of the LexicalBlockStack).
> > -  void Emit();
> > -
> > -  /// Autorestore everything back to normal.
> > -  ~ArtificialLocation();
> > +  ArtificialLocation(CodeGenFunction &CGF);
> >  };
> >
> >
> >
> > Modified: cfe/trunk/lib/CodeGen/CGDecl.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDecl.cpp?rev=225000&r1=224999&r2=225000&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/lib/CodeGen/CGDecl.cpp (original)
> > +++ cfe/trunk/lib/CodeGen/CGDecl.cpp Tue Dec 30 13:39:33 2014
> > @@ -597,14 +597,13 @@ static void drillIntoBlockVariable(CodeG
> >  }
> >
> >  void CodeGenFunction::EmitScalarInit(const Expr *init, const ValueDecl
> *D,
> > -                                     LValue lvalue, bool capturedByInit,
> > -                                     SourceLocation DbgLoc) {
> > +                                     LValue lvalue, bool
> capturedByInit) {
> >    Qualifiers::ObjCLifetime lifetime = lvalue.getObjCLifetime();
> >    if (!lifetime) {
> >      llvm::Value *value = EmitScalarExpr(init);
> >      if (capturedByInit)
> >        drillIntoBlockVariable(*this, lvalue, cast<VarDecl>(D));
> > -    EmitStoreThroughLValue(RValue::get(value), lvalue, true, DbgLoc);
> > +    EmitStoreThroughLValue(RValue::get(value), lvalue, true);
> >      return;
> >    }
> >
> > @@ -1088,6 +1087,7 @@ void CodeGenFunction::EmitAutoVarInit(co
> >    if (emission.wasEmittedAsGlobal()) return;
> >
> >    const VarDecl &D = *emission.Variable;
> > +  ApplyDebugLocation DL(*this, D.getLocation());
> >    QualType type = D.getType();
> >
> >    // If this local has an initializer, emit it now.
> > @@ -1126,7 +1126,7 @@ void CodeGenFunction::EmitAutoVarInit(co
> >    if (!constant) {
> >      LValue lv = MakeAddrLValue(Loc, type, alignment);
> >      lv.setNonGC(true);
> > -    return EmitExprAsInit(Init, &D, lv, capturedByInit,
> D.getLocation());
> > +    return EmitExprAsInit(Init, &D, lv, capturedByInit);
> >    }
> >
> >    if (!emission.IsConstantAggregate) {
> > @@ -1192,26 +1192,25 @@ void CodeGenFunction::EmitAutoVarInit(co
> >  /// \param capturedByInit true if the variable is a __block variable
> >  ///   whose address is potentially changed by the initializer
> >  void CodeGenFunction::EmitExprAsInit(const Expr *init, const ValueDecl
> *D,
> > -                                     LValue lvalue, bool capturedByInit,
> > -                                     SourceLocation DbgLoc) {
> > +                                     LValue lvalue, bool
> capturedByInit) {
> >    QualType type = D->getType();
> >
> >    if (type->isReferenceType()) {
> >      RValue rvalue = EmitReferenceBindingToExpr(init);
> >      if (capturedByInit)
> >        drillIntoBlockVariable(*this, lvalue, cast<VarDecl>(D));
> > -    EmitStoreThroughLValue(rvalue, lvalue, true, DbgLoc);
> > +    EmitStoreThroughLValue(rvalue, lvalue, true);
> >      return;
> >    }
> >    switch (getEvaluationKind(type)) {
> >    case TEK_Scalar:
> > -    EmitScalarInit(init, D, lvalue, capturedByInit, DbgLoc);
> > +    EmitScalarInit(init, D, lvalue, capturedByInit);
> >      return;
> >    case TEK_Complex: {
> >      ComplexPairTy complex = EmitComplexExpr(init);
> >      if (capturedByInit)
> >        drillIntoBlockVariable(*this, lvalue, cast<VarDecl>(D));
> > -    EmitStoreOfComplex(complex, lvalue, /*init*/ true, DbgLoc);
> > +    EmitStoreOfComplex(complex, lvalue, /*init*/ true);
> >      return;
> >    }
> >    case TEK_Aggregate:
> >
> > Modified: cfe/trunk/lib/CodeGen/CGDeclCXX.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDeclCXX.cpp?rev=225000&r1=224999&r2=225000&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/lib/CodeGen/CGDeclCXX.cpp (original)
> > +++ cfe/trunk/lib/CodeGen/CGDeclCXX.cpp Tue Dec 30 13:39:33 2014
> > @@ -474,11 +474,11 @@ CodeGenFunction::GenerateCXXGlobalInitFu
> >                                             ArrayRef<llvm::Function *>
> Decls,
> >                                             llvm::GlobalVariable *Guard)
> {
> >    {
> > -    ArtificialLocation AL(*this, Builder);
> > +    ApplyDebugLocation NL(*this);
> >      StartFunction(GlobalDecl(), getContext().VoidTy, Fn,
> >                    getTypes().arrangeNullaryFunction(),
> FunctionArgList());
> >      // Emit an artificial location for this function.
> > -    AL.Emit();
> > +    ArtificialLocation AL(*this);
> >
> >      llvm::BasicBlock *ExitBlock = nullptr;
> >      if (Guard) {
> > @@ -525,11 +525,11 @@ void CodeGenFunction::GenerateCXXGlobalD
> >                    const std::vector<std::pair<llvm::WeakVH,
> llvm::Constant*> >
> >                                                  &DtorsAndObjects) {
> >    {
> > -    ArtificialLocation AL(*this, Builder);
> > +    ApplyDebugLocation NL(*this);
> >      StartFunction(GlobalDecl(), getContext().VoidTy, Fn,
> >                    getTypes().arrangeNullaryFunction(),
> FunctionArgList());
> >      // Emit an artificial location for this function.
> > -    AL.Emit();
> > +    ArtificialLocation AL(*this);
> >
> >      // Emit the dtors, in reverse order from construction.
> >      for (unsigned i = 0, e = DtorsAndObjects.size(); i != e; ++i) {
> >
> > Modified: cfe/trunk/lib/CodeGen/CGException.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGException.cpp?rev=225000&r1=224999&r2=225000&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/lib/CodeGen/CGException.cpp (original)
> > +++ cfe/trunk/lib/CodeGen/CGException.cpp Tue Dec 30 13:39:33 2014
> > @@ -734,9 +734,7 @@ llvm::BasicBlock *CodeGenFunction::EmitL
> >
> >    // Save the current IR generation state.
> >    CGBuilderTy::InsertPoint savedIP = Builder.saveAndClearIP();
> > -  SaveAndRestoreLocation AutoRestoreLocation(*this, Builder);
> > -  if (CGDebugInfo *DI = getDebugInfo())
> > -    DI->EmitLocation(Builder, CurEHLocation);
> > +  ApplyDebugLocation AutoRestoreLocation(*this, CurEHLocation);
> >
> >    const EHPersonality &personality = EHPersonality::get(CGM);
> >
> >
> > Modified: cfe/trunk/lib/CodeGen/CGExpr.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExpr.cpp?rev=225000&r1=224999&r2=225000&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/lib/CodeGen/CGExpr.cpp (original)
> > +++ cfe/trunk/lib/CodeGen/CGExpr.cpp Tue Dec 30 13:39:33 2014
> > @@ -1438,11 +1438,7 @@ RValue CodeGenFunction::EmitLoadOfGlobal
> >  /// lvalue, where both are guaranteed to the have the same type, and
> that type
> >  /// is 'Ty'.
> >  void CodeGenFunction::EmitStoreThroughLValue(RValue Src, LValue Dst,
> > -                                             bool isInit,
> > -                                             SourceLocation DbgLoc) {
> > -  if (auto *DI = getDebugInfo())
> > -    DI->EmitLocation(Builder, DbgLoc);
> > -
> > +                                             bool isInit) {
> >    if (!Dst.isSimple()) {
> >      if (Dst.isVectorElt()) {
> >        // Read/modify/write the vector, inserting the new element.
> > @@ -2408,9 +2404,6 @@ LValue CodeGenFunction::EmitArraySubscri
> >      // The element count here is the total number of non-VLA elements.
> >      llvm::Value *numElements = getVLASize(vla).first;
> >
> > -    if (auto *DI = getDebugInfo())
> > -      DI->EmitLocation(Builder, E->getLocStart());
> > -
> >      // Effectively, the multiply by the VLA size is part of the GEP.
> >      // GEP indexes are signed, and scaling an index isn't permitted to
> >      // signed-overflow, so we use the same semantics for our explicit
> > @@ -2456,9 +2449,6 @@ LValue CodeGenFunction::EmitArraySubscri
> >      // Propagate the alignment from the array itself to the result.
> >      ArrayAlignment = ArrayLV.getAlignment();
> >
> > -    if (auto *DI = getDebugInfo())
> > -      DI->EmitLocation(Builder, E->getLocStart());
> > -
> >      if (getLangOpts().isSignedOverflowDefined())
> >        Address = Builder.CreateGEP(ArrayPtr, Args, "arrayidx");
> >      else
> > @@ -2466,8 +2456,6 @@ LValue CodeGenFunction::EmitArraySubscri
> >    } else {
> >      // The base must be a pointer, which is not an aggregate.  Emit it.
> >      llvm::Value *Base = EmitScalarExpr(E->getBase());
> > -    if (auto *DI = getDebugInfo())
> > -      DI->EmitLocation(Builder, E->getLocStart());
> >      if (getLangOpts().isSignedOverflowDefined())
> >        Address = Builder.CreateGEP(Base, Idx, "arrayidx");
> >      else
> > @@ -3024,18 +3012,15 @@ RValue CodeGenFunction::EmitRValueForFie
> >
> >  RValue CodeGenFunction::EmitCallExpr(const CallExpr *E,
> >                                       ReturnValueSlot ReturnValue) {
> > -  if (CGDebugInfo *DI = getDebugInfo()) {
> > -    SourceLocation Loc = E->getLocStart();
> > -    // Force column info to be generated so we can differentiate
> > -    // multiple call sites on the same line in the debug info.
> > -    // FIXME: This is insufficient. Two calls coming from the same macro
> > -    // expansion will still get the same line/column and break debug
> info. It's
> > -    // possible that LLVM can be fixed to not rely on this uniqueness,
> at which
> > -    // point this workaround can be removed.
> > -    const FunctionDecl* Callee = E->getDirectCallee();
> > -    bool ForceColumnInfo = Callee && Callee->isInlineSpecified();
> > -    DI->EmitLocation(Builder, Loc, ForceColumnInfo);
> > -  }
> > +  // Force column info to be generated so we can differentiate
> > +  // multiple call sites on the same line in the debug info.
> > +  // FIXME: This is insufficient. Two calls coming from the same macro
> > +  // expansion will still get the same line/column and break debug
> info. It's
> > +  // possible that LLVM can be fixed to not rely on this uniqueness, at
> which
> > +  // point this workaround can be removed.
> > +  ApplyDebugLocation DL(*this, E->getLocStart(),
> > +                        E->getDirectCallee() &&
> > +                            E->getDirectCallee()->isInlineSpecified());
> >
> >    // Builtins never have block type.
> >    if (E->getCallee()->getType()->isBlockPointerType())
> > @@ -3151,8 +3136,6 @@ LValue CodeGenFunction::EmitBinaryOperat
> >
> >      RValue RV = EmitAnyExpr(E->getRHS());
> >      LValue LV = EmitCheckedLValue(E->getLHS(), TCK_Store);
> > -    if (CGDebugInfo *DI = getDebugInfo())
> > -      DI->EmitLocation(Builder, E->getLocStart());
> >      EmitStoreThroughLValue(RV, LV);
> >      return LV;
> >    }
> >
> > Modified: cfe/trunk/lib/CodeGen/CGExprCXX.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExprCXX.cpp?rev=225000&r1=224999&r2=225000&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/lib/CodeGen/CGExprCXX.cpp (original)
> > +++ cfe/trunk/lib/CodeGen/CGExprCXX.cpp Tue Dec 30 13:39:33 2014
> > @@ -187,8 +187,6 @@ RValue CodeGenFunction::EmitCXXMemberOrO
> >          unsigned ArgsToSkip = isa<CXXOperatorCallExpr>(CE) ? 1 : 0;
> >          llvm::Value *RHS =
> >              EmitLValue(*(CE->arg_begin() + ArgsToSkip)).getAddress();
> > -        if (auto *DI = getDebugInfo())
> > -          DI->EmitLocation(Builder, CE->getLocStart());
> >          EmitAggregateAssign(This, RHS, CE->getType());
> >          return RValue::get(This);
> >        }
> > @@ -754,15 +752,13 @@ static llvm::Value *EmitCXXNewAllocSize(
> >  }
> >
> >  static void StoreAnyExprIntoOneUnit(CodeGenFunction &CGF, const Expr
> *Init,
> > -                                    QualType AllocType, llvm::Value
> *NewPtr,
> > -                                    SourceLocation DbgLoc =
> SourceLocation()) {
> > +                                    QualType AllocType, llvm::Value
> *NewPtr) {
> >    // FIXME: Refactor with EmitExprAsInit.
> >    CharUnits Alignment = CGF.getContext().getTypeAlignInChars(AllocType);
> >    switch (CGF.getEvaluationKind(AllocType)) {
> >    case TEK_Scalar:
> >      CGF.EmitScalarInit(Init, nullptr,
> > -                       CGF.MakeAddrLValue(NewPtr, AllocType,
> Alignment), false,
> > -                       DbgLoc);
> > +                       CGF.MakeAddrLValue(NewPtr, AllocType,
> Alignment), false);
> >      return;
> >    case TEK_Complex:
> >      CGF.EmitComplexExprIntoLValue(Init, CGF.MakeAddrLValue(NewPtr,
> AllocType,
> > @@ -1020,12 +1016,12 @@ static void EmitNewInitializer(CodeGenFu
> >                                 llvm::Value *NewPtr,
> >                                 llvm::Value *NumElements,
> >                                 llvm::Value *AllocSizeWithoutCookie) {
> > +  ApplyDebugLocation DL(CGF, E->getStartLoc());
> >    if (E->isArray())
> >      CGF.EmitNewArrayInitializer(E, ElementType, NewPtr, NumElements,
> >                                  AllocSizeWithoutCookie);
> >    else if (const Expr *Init = E->getInitializer())
> > -    StoreAnyExprIntoOneUnit(CGF, Init, E->getAllocatedType(), NewPtr,
> > -                            E->getStartLoc());
> > +    StoreAnyExprIntoOneUnit(CGF, Init, E->getAllocatedType(), NewPtr);
> >  }
> >
> >  /// Emit a call to an operator new or operator delete function, as
> implicitly
> > @@ -1269,9 +1265,6 @@ llvm::Value *CodeGenFunction::EmitCXXNew
> >                 E->placement_arg_end(), /* CalleeDecl */ nullptr,
> >                 /*ParamsToSkip*/ 1);
> >
> > -  if (auto *DI = getDebugInfo())
> > -    DI->EmitLocation(Builder, E->getLocStart());
> > -
> >    // Emit the allocation call.  If the allocator is a global placement
> >    // operator, just "inline" it directly.
> >    RValue RV;
> >
> > Modified: cfe/trunk/lib/CodeGen/CGExprComplex.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExprComplex.cpp?rev=225000&r1=224999&r2=225000&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/lib/CodeGen/CGExprComplex.cpp (original)
> > +++ cfe/trunk/lib/CodeGen/CGExprComplex.cpp Tue Dec 30 13:39:33 2014
> > @@ -81,8 +81,7 @@ public:
> >
> >    /// EmitStoreOfComplex - Store the specified real/imag parts into the
> >    /// specified value pointer.
> > -  void EmitStoreOfComplex(ComplexPairTy Val, LValue LV, bool isInit,
> > -                          SourceLocation DbgLoc);
> > +  void EmitStoreOfComplex(ComplexPairTy Val, LValue LV, bool isInit);
> >
> >    /// EmitComplexToComplexCast - Emit a cast from complex value Val to
> DestType.
> >    ComplexPairTy EmitComplexToComplexCast(ComplexPairTy Val, QualType
> SrcType,
> > @@ -335,11 +334,7 @@ ComplexPairTy ComplexExprEmitter::EmitLo
> >  /// EmitStoreOfComplex - Store the specified real/imag parts into the
> >  /// specified value pointer.
> >  void ComplexExprEmitter::EmitStoreOfComplex(ComplexPairTy Val, LValue
> lvalue,
> > -                                            bool isInit,
> > -                                            SourceLocation DbgLoc) {
> > -  if (auto *DI = CGF.getDebugInfo())
> > -    DI->EmitLocation(CGF.Builder, DbgLoc);
> > -
> > +                                            bool isInit) {
> >    if (lvalue.getType()->isAtomicType())
> >      return CGF.EmitAtomicStore(RValue::getComplex(Val), lvalue, isInit);
> >
> > @@ -869,7 +864,7 @@ EmitCompoundAssignLValue(const CompoundA
> >    // Truncate the result and store it into the LHS lvalue.
> >    if (LHSTy->isAnyComplexType()) {
> >      ComplexPairTy ResVal = EmitComplexToComplexCast(Result, OpInfo.Ty,
> LHSTy);
> > -    EmitStoreOfComplex(ResVal, LHS, /*isInit*/ false, E->getLocStart());
> > +    EmitStoreOfComplex(ResVal, LHS, /*isInit*/ false);
> >      Val = RValue::getComplex(ResVal);
> >    } else {
> >      llvm::Value *ResVal =
> > @@ -914,7 +909,7 @@ LValue ComplexExprEmitter::EmitBinAssign
> >    LValue LHS = CGF.EmitLValue(E->getLHS());
> >
> >    // Store the result value into the LHS lvalue.
> > -  EmitStoreOfComplex(Val, LHS, /*isInit*/ false, E->getLocStart());
> > +  EmitStoreOfComplex(Val, LHS, /*isInit*/ false);
> >
> >    return LHS;
> >  }
> > @@ -1042,19 +1037,18 @@ ComplexPairTy CodeGenFunction::EmitCompl
> >  }
> >
> >  void CodeGenFunction::EmitComplexExprIntoLValue(const Expr *E, LValue
> dest,
> > -                                                bool isInit,
> > -                                                SourceLocation DbgLoc) {
> > +                                                bool isInit) {
> >    assert(E && getComplexType(E->getType()) &&
> >           "Invalid complex expression to emit");
> >    ComplexExprEmitter Emitter(*this);
> >    ComplexPairTy Val = Emitter.Visit(const_cast<Expr*>(E));
> > -  Emitter.EmitStoreOfComplex(Val, dest, isInit, DbgLoc);
> > +  Emitter.EmitStoreOfComplex(Val, dest, isInit);
> >  }
> >
> >  /// EmitStoreOfComplex - Store a complex number into the specified
> l-value.
> >  void CodeGenFunction::EmitStoreOfComplex(ComplexPairTy V, LValue dest,
> > -                                         bool isInit, SourceLocation
> DbgLoc) {
> > -  ComplexExprEmitter(*this).EmitStoreOfComplex(V, dest, isInit, DbgLoc);
> > +                                         bool isInit) {
> > +  ComplexExprEmitter(*this).EmitStoreOfComplex(V, dest, isInit);
> >  }
> >
> >  /// EmitLoadOfComplex - Load a complex number from the specified
> address.
> >
> > Modified: cfe/trunk/lib/CodeGen/CGExprScalar.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExprScalar.cpp?rev=225000&r1=224999&r2=225000&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/lib/CodeGen/CGExprScalar.cpp (original)
> > +++ cfe/trunk/lib/CodeGen/CGExprScalar.cpp Tue Dec 30 13:39:33 2014
> > @@ -196,6 +196,7 @@ public:
> >
> //===--------------------------------------------------------------------===//
> >
> >    Value *Visit(Expr *E) {
> > +    ApplyDebugLocation DL(CGF, E->getLocStart());
> >      return StmtVisitor<ScalarExprEmitter, Value*>::Visit(E);
> >    }
> >
> > @@ -3042,7 +3043,7 @@ Value *ScalarExprEmitter::VisitBinLAnd(c
> >    // Emit an unconditional branch from this block to ContBlock.
> >    {
> >      // There is no need to emit line number for unconditional branch.
> > -    SuppressDebugLocation S(Builder);
> > +    ApplyDebugLocation DL(CGF);
> >      CGF.EmitBlock(ContBlock);
> >    }
> >    // Insert an entry into the phi node for the edge with the value of
> RHSCond.
> >
> > Modified: cfe/trunk/lib/CodeGen/CGStmt.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGStmt.cpp?rev=225000&r1=224999&r2=225000&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/lib/CodeGen/CGStmt.cpp (original)
> > +++ cfe/trunk/lib/CodeGen/CGStmt.cpp Tue Dec 30 13:39:33 2014
> > @@ -565,7 +565,7 @@ void CodeGenFunction::EmitIfStmt(const I
> >    if (const Stmt *Else = S.getElse()) {
> >      {
> >        // There is no need to emit line number for unconditional branch.
> > -      SuppressDebugLocation S(Builder);
> > +      ApplyDebugLocation DL(*this);
> >        EmitBlock(ElseBlock);
> >      }
> >      {
> > @@ -574,7 +574,7 @@ void CodeGenFunction::EmitIfStmt(const I
> >      }
> >      {
> >        // There is no need to emit line number for unconditional branch.
> > -      SuppressDebugLocation S(Builder);
> > +      ApplyDebugLocation DL(*this);
> >        EmitBranch(ContBlock);
> >      }
> >    }
> >
> > Modified: cfe/trunk/lib/CodeGen/CGStmtOpenMP.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGStmtOpenMP.cpp?rev=225000&r1=224999&r2=225000&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/lib/CodeGen/CGStmtOpenMP.cpp (original)
> > +++ cfe/trunk/lib/CodeGen/CGStmtOpenMP.cpp Tue Dec 30 13:39:33 2014
> > @@ -86,13 +86,13 @@ static void EmitOMPIfClause(CodeGenFunct
> >    // Emit the 'else' code if present.
> >    {
> >      // There is no need to emit line number for unconditional branch.
> > -    SuppressDebugLocation SDL(CGF.Builder);
> > +    ApplyDebugLocation DL(CGF);
> >      CGF.EmitBlock(ElseBlock);
> >    }
> >    CodeGen(/*ThenBlock*/ false);
> >    {
> >      // There is no need to emit line number for unconditional branch.
> > -    SuppressDebugLocation SDL(CGF.Builder);
> > +    ApplyDebugLocation DL(CGF);
> >      CGF.EmitBranch(ContBlock);
> >    }
> >    // Emit the continuation block for code after the if.
> >
> > Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.h
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.h?rev=225000&r1=224999&r2=225000&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/lib/CodeGen/CodeGenFunction.h (original)
> > +++ cfe/trunk/lib/CodeGen/CodeGenFunction.h Tue Dec 30 13:39:33 2014
> > @@ -93,19 +93,6 @@ 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 {
> > @@ -1300,8 +1287,7 @@ public:
> >                          FunctionArgList &Args);
> >
> >    void EmitInitializerForField(FieldDecl *Field, LValue LHS, Expr *Init,
> > -                               ArrayRef<VarDecl *> ArrayIndexes,
> > -                               SourceLocation DbgLoc =
> SourceLocation());
> > +                               ArrayRef<VarDecl *> ArrayIndexes);
> >
> >    /// InitializeVTablePointer - Initialize the vtable pointer of the
> given
> >    /// subobject.
> > @@ -1546,7 +1532,7 @@ public:
> >    /// EmitExprAsInit - Emits the code necessary to initialize a
> >    /// location in memory with the given initializer.
> >    void EmitExprAsInit(const Expr *init, const ValueDecl *D, LValue
> lvalue,
> > -                      bool capturedByInit, SourceLocation DbgLoc);
> > +                      bool capturedByInit);
> >
> >    /// hasVolatileMember - returns true if aggregate type has a volatile
> >    /// member.
> > @@ -1833,8 +1819,7 @@ public:
> >    void EmitVarDecl(const VarDecl &D);
> >
> >    void EmitScalarInit(const Expr *init, const ValueDecl *D, LValue
> lvalue,
> > -                      bool capturedByInit,
> > -                      SourceLocation DbgLoc = SourceLocation());
> > +                      bool capturedByInit);
> >    void EmitScalarInit(llvm::Value *init, LValue lvalue);
> >
> >    typedef void SpecialInitFn(CodeGenFunction &Init, const VarDecl &D,
> > @@ -2164,8 +2149,7 @@ public:
> >    /// EmitStoreThroughLValue - Store the specified rvalue into the
> specified
> >    /// lvalue, where both are guaranteed to the have the same type, and
> that type
> >    /// is 'Ty'.
> > -  void EmitStoreThroughLValue(RValue Src, LValue Dst, bool isInit =
> false,
> > -                              SourceLocation DbgLoc = SourceLocation());
> > +  void EmitStoreThroughLValue(RValue Src, LValue Dst, bool isInit =
> false);
> >    void EmitStoreThroughExtVectorComponentLValue(RValue Src, LValue Dst);
> >    void EmitStoreThroughGlobalRegLValue(RValue Src, LValue Dst);
> >
> > @@ -2537,12 +2521,10 @@ public:
> >
> >    /// EmitComplexExprIntoLValue - Emit the given expression of complex
> >    /// type and place its result into the specified l-value.
> > -  void EmitComplexExprIntoLValue(const Expr *E, LValue dest, bool
> isInit,
> > -                                 SourceLocation DbgLoc =
> SourceLocation());
> > +  void EmitComplexExprIntoLValue(const Expr *E, LValue dest, bool
> isInit);
> >
> >    /// EmitStoreOfComplex - Store a complex number into the specified
> l-value.
> > -  void EmitStoreOfComplex(ComplexPairTy V, LValue dest, bool isInit,
> > -                          SourceLocation DbgLoc = SourceLocation());
> > +  void EmitStoreOfComplex(ComplexPairTy V, LValue dest, bool isInit);
> >
> >    /// EmitLoadOfComplex - Load a complex number from the specified
> l-value.
> >    ComplexPairTy EmitLoadOfComplex(LValue src, SourceLocation loc);
> >
> > Modified: cfe/trunk/test/CodeGenCXX/PR20038.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/PR20038.cpp?rev=225000&r1=224999&r2=225000&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/test/CodeGenCXX/PR20038.cpp (original)
> > +++ cfe/trunk/test/CodeGenCXX/PR20038.cpp Tue Dec 30 13:39:33 2014
> > @@ -1,4 +1,4 @@
> > -// RUN: %clang_cc1 -triple %itanium_abi_triple -g -emit-llvm  %s -o - |
> FileCheck %s
> > +// RUN: %clang_cc1 -triple %itanium_abi_triple -g -mllvm
> -no-discriminators -emit-llvm  %s -o - | FileCheck %s
> >
> >  struct C {
> >    ~C();
> > @@ -8,9 +8,7 @@ extern bool b;
> >  // 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]] = !{i32 [[@LINE+2]], i32 0,
> [[FUN1_BLOCK:.*]], null}
> > -// CHECK: [[FUN1_BLOCK]] = !{!"0xb{{[^,]*}}", {{[^,]*}}, [[FUN1]]}
> > +// CHECK: [[DTOR_CALL1_LOC]] = !{i32 [[@LINE+1]], i32 0, [[FUN1]], null}
> >  void fun1() { b && (C(), 1); }
> > -// CHECK: [[DTOR_CALL2_LOC]] = !{i32 [[@LINE+2]], i32 0,
> [[FUN2_BLOCK1:.*]], null}
> > -// CHECK: [[FUN2_BLOCK1]] = !{!"0xb{{[^,]*}}", {{[^,]*}}, [[FUN2]]}
> > +// CHECK: [[DTOR_CALL2_LOC]] = !{i32 [[@LINE+1]], i32 0, [[FUN2]], null}
> >  bool fun2() { return (C(), b) && 0; }
> >
> > Modified: cfe/trunk/test/CodeGenCXX/debug-info-line.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-line.cpp?rev=225000&r1=224999&r2=225000&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/test/CodeGenCXX/debug-info-line.cpp (original)
> > +++ cfe/trunk/test/CodeGenCXX/debug-info-line.cpp Tue Dec 30 13:39:33
> 2014
> > @@ -1,4 +1,5 @@
> >  // RUN: %clang_cc1 -g -std=c++11 -S -emit-llvm %s -o - | FileCheck %s
> > +// RUN: %clang_cc1 -triple i686-linux-gnu -g -std=c++11 -S -emit-llvm
> %s -o - | FileCheck %s
> >
> >  int &src();
> >  int *sink();
> > @@ -110,6 +111,23 @@ void f10() {
> >        new (void_src()) int(src()));
> >  }
> >
> > +// CHECK-LABEL: define
> > +__complex double f11() {
> > +  __complex double f;
> > +// CHECK: store {{.*}} !dbg [[DBG_F11:!.*]]
> > +#line 1200
> > +  return f;
> > +}
> > +
> > +// CHECK-LABEL: define
> > +void f12() {
> > +  int f12_1();
> > +  void f12_2(int = f12_1());
> > +// CHECK: call i32 {{.*}} !dbg [[DBG_F12:!.*]]
> > +#line 1300
> > +  f12_2();
> > +}
> > +
> >  // CHECK: [[DBG_F1]] = !{i32 100,
> >  // CHECK: [[DBG_FOO_VALUE]] = !{i32 200,
> >  // CHECK: [[DBG_FOO_REF]] = !{i32 202,
> > @@ -124,3 +142,5 @@ void f10() {
> >  // CHECK: [[DBG_F9]] = !{i32 1000,
> >  // CHECK: [[DBG_F10_ICMP]] = !{i32 1100,
> >  // CHECK: [[DBG_F10_STORE]] = !{i32 1100,
> > +// CHECK: [[DBG_F11]] = !{i32 1200,
> > +// CHECK: [[DBG_F12]] = !{i32 1300,
> >
> > Modified: cfe/trunk/test/CodeGenCXX/debug-info-scope.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-scope.cpp?rev=225000&r1=224999&r2=225000&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/test/CodeGenCXX/debug-info-scope.cpp (original)
> > +++ cfe/trunk/test/CodeGenCXX/debug-info-scope.cpp Tue Dec 30 13:39:33
> 2014
> > @@ -36,12 +36,12 @@ void func() {
> >    // CHECK: = !{!"0x100\00{{.*}}", [[FOR:![0-9]*]], {{.*}} ; [
> DW_TAG_auto_variable ] [i] [line [[@LINE+2]]]
> >    // CHECK: [[FOR]] = !{!"0xb\00[[@LINE+1]]\00{{.*}}", !{{.*}}} ; [
> DW_TAG_lexical_block ]
> >    for (int i = 0; i != 10; ++i) {
> > -  // FIXME: Do not include scopes that have only other scopes (and no
> variables
> > -  // or using declarations) as direct children, they just waste
> > -  // space/relocations/etc.
> > -  // CHECK: = !{!"0x100\00{{.*}}", [[FOR_COMPOUND:![0-9]*]], {{.*}} ; [
> DW_TAG_auto_variable ] [b] [line [[@LINE+3]]]
> > -  // CHECK: [[FOR_COMPOUND]] = !{!"0xb\00[[@LINE-5]]\00{{.*}}",
> !{{[0-9]+}}, [[FOR_BODY:![0-9]+]]} ; [ DW_TAG_lexical_block ]
> > -  // CHECK: [[FOR_BODY]] = !{!"0xb\00[[@LINE-6]]\00{{.*}}",
> !{{[0-9]+}}, [[FOR]]} ; [ DW_TAG_lexical_block ]
> > +    // FIXME: Do not include scopes that have only other scopes (and no
> variables
> > +    // or using declarations) as direct children, they just waste
> > +    // space/relocations/etc.
> > +    // CHECK: [[FOR_LOOP_INCLUDING_COND:!.*]] =
> !{!"0xb\00[[@LINE-4]]\00{{.*}}", !{{[0-9]+}}, [[FOR]]} ; [
> DW_TAG_lexical_block ]
> > +    // CHECK: = !{!"0x100\00{{.*}}", [[FOR_COMPOUND:![0-9]*]], {{.*}} ;
> [ DW_TAG_auto_variable ] [b] [line [[@LINE+2]]]
> > +    // CHECK: [[FOR_COMPOUND]] = !{!"0xb\00[[@LINE-6]]\00{{.*}}",
> !{{[0-9]+}}, [[FOR_LOOP_INCLUDING_COND]]} ; [ DW_TAG_lexical_block ]
> >      bool b = i % 2;
> >    }
> >
> >
> >
> > _______________________________________________
> > cfe-commits mailing list
> > cfe-commits at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20141230/4e1928bd/attachment.html>


More information about the cfe-commits mailing list