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

David Blaikie dblaikie at gmail.com
Mon Dec 29 15:50:30 PST 2014


On Mon, Dec 29, 2014 at 12:59 PM, Alexey Samsonov <vonosmas at gmail.com>
wrote:

> Hi David!
>
> Could you take a look at
> http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux/builds/14935/steps/run%20sanitizer%20tests%20in%20gcc%20build/logs/stdio
> ?
> This happens for "make check-tsan" if GCC is used as a host compiler for
> Clang.
>

Thanks for the tip (GCC host compiler) - I can reproduce this under those
conditions. Reverted in r224970 while I investigate.

 - David


>
> On Mon, Dec 29, 2014 at 10:18 AM, David Blaikie <dblaikie at gmail.com>
> wrote:
>
>> Author: dblaikie
>> Date: Mon Dec 29 12:18:45 2014
>> New Revision: 224941
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=224941&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).
>>
>> 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=224941&r1=224940&r2=224941&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/CGBlocks.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/CGBlocks.cpp Mon Dec 29 12:18:45 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=224941&r1=224940&r2=224941&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/CGClass.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/CGClass.cpp Mon Dec 29 12:18:45 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=224941&r1=224940&r2=224941&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/CGCleanup.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/CGCleanup.cpp Mon Dec 29 12:18:45 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=224941&r1=224940&r2=224941&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Mon Dec 29 12:18:45 2014
>> @@ -52,54 +52,35 @@ 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() {
>> +  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=224941&r1=224940&r2=224941&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/CGDebugInfo.h (original)
>> +++ cfe/trunk/lib/CodeGen/CGDebugInfo.h Mon Dec 29 12:18:45 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=224941&r1=224940&r2=224941&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/CGDecl.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/CGDecl.cpp Mon Dec 29 12:18:45 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=224941&r1=224940&r2=224941&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/CGDeclCXX.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/CGDeclCXX.cpp Mon Dec 29 12:18:45 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=224941&r1=224940&r2=224941&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/CGException.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/CGException.cpp Mon Dec 29 12:18:45 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=224941&r1=224940&r2=224941&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/CGExpr.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/CGExpr.cpp Mon Dec 29 12:18:45 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=224941&r1=224940&r2=224941&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/CGExprCXX.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/CGExprCXX.cpp Mon Dec 29 12:18:45 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=224941&r1=224940&r2=224941&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/CGExprComplex.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/CGExprComplex.cpp Mon Dec 29 12:18:45 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=224941&r1=224940&r2=224941&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/CGExprScalar.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/CGExprScalar.cpp Mon Dec 29 12:18:45 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=224941&r1=224940&r2=224941&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/CGStmt.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/CGStmt.cpp Mon Dec 29 12:18:45 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=224941&r1=224940&r2=224941&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/CGStmtOpenMP.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/CGStmtOpenMP.cpp Mon Dec 29 12:18:45 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=224941&r1=224940&r2=224941&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/CodeGenFunction.h (original)
>> +++ cfe/trunk/lib/CodeGen/CodeGenFunction.h Mon Dec 29 12:18:45 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=224941&r1=224940&r2=224941&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/test/CodeGenCXX/PR20038.cpp (original)
>> +++ cfe/trunk/test/CodeGenCXX/PR20038.cpp Mon Dec 29 12:18:45 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=224941&r1=224940&r2=224941&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/test/CodeGenCXX/debug-info-line.cpp (original)
>> +++ cfe/trunk/test/CodeGenCXX/debug-info-line.cpp Mon Dec 29 12:18:45 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,13 @@ void f10() {
>>        new (void_src()) int(src()));
>>  }
>>
>> +__complex double f11() {
>> +  __complex double f;
>> +  // CHECK: store {{.*}} !dbg [[DBG_F11:!.*]]
>> +#line 1200
>> +  return f;
>> +}
>> +
>>  // CHECK: [[DBG_F1]] = !{i32 100,
>>  // CHECK: [[DBG_FOO_VALUE]] = !{i32 200,
>>  // CHECK: [[DBG_FOO_REF]] = !{i32 202,
>> @@ -124,3 +132,4 @@ void f10() {
>>  // CHECK: [[DBG_F9]] = !{i32 1000,
>>  // CHECK: [[DBG_F10_ICMP]] = !{i32 1100,
>>  // CHECK: [[DBG_F10_STORE]] = !{i32 1100,
>> +// CHECK: [[DBG_F11]] = !{i32 1200,
>>
>> 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=224941&r1=224940&r2=224941&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/test/CodeGenCXX/debug-info-scope.cpp (original)
>> +++ cfe/trunk/test/CodeGenCXX/debug-info-scope.cpp Mon Dec 29 12:18:45
>> 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
>>
>
>
>
> --
> Alexey Samsonov
> vonosmas at gmail.com
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20141229/62e7ebec/attachment.html>


More information about the cfe-commits mailing list