On Mon, Dec 29, 2014 at 12:59 PM, Alexey Samsonov <[email protected]> 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 <[email protected]> > 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 >> [email protected] >> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >> > > > > -- > Alexey Samsonov > [email protected] >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
