r225000 - Reapply "DebugInfo: Generalize debug info location handling"
Nico Weber
thakis at chromium.org
Mon Jan 5 21:57:55 PST 2015
On Mon, Jan 5, 2015 at 9:07 PM, Jiangning Liu <liujiangning1 at gmail.com>
wrote:
> Hi David,
>
> This commit introduced a regression for one of my benchmarks, and the
> failure is an assertion failure.
>
> The failure point is at
>
> LexicalScope *LexicalScopes::getOrCreateRegularScope(MDNode *Scope) {
> ......
> if (!Parent) {
> assert(DIDescriptor(Scope).isSubprogram());
> assert(DISubprogram(Scope).describes(MF->getFunction())); //
> Assertion failure here!
>
That looks like something I debugged earlier today. This is
http://llvm.org/PR22096 , which already has a reduction.
> assert(!CurrentFnLexicalScope);
> CurrentFnLexicalScope = &I->second;
> }
>
> return &I->second;
> }
>
> And the call stack is like,
>
> 8 libLLVMCodeGen.so 0x00007fc17123eb31
> llvm::LexicalScopes::getOrCreateRegularScope(llvm::MDNode*) + 305
> 9 libLLVMCodeGen.so 0x00007fc17123e986
> llvm::LexicalScopes::getOrCreateInlinedScope(llvm::MDNode*, llvm::MDNode*)
> + 326
> 10 libLLVMCodeGen.so 0x00007fc17123e979
> llvm::LexicalScopes::getOrCreateInlinedScope(llvm::MDNode*, llvm::MDNode*)
> + 313
> 11 libLLVMCodeGen.so 0x00007fc17123e95a
> llvm::LexicalScopes::getOrCreateInlinedScope(llvm::MDNode*, llvm::MDNode*)
> + 282
> 12 libLLVMCodeGen.so 0x00007fc17123e979
> llvm::LexicalScopes::getOrCreateInlinedScope(llvm::MDNode*, llvm::MDNode*)
> + 313
> 13 libLLVMCodeGen.so 0x00007fc17123de78
> llvm::LexicalScopes::extractLexicalScopes(llvm::SmallVectorImpl<std::pair<llvm::MachineInstr
> const*, llvm::MachineInstr const*> >&, llvm::DenseMap<llvm::MachineInstr
> const*, llvm::LexicalScope*, llvm::DenseMapInfo<llvm::MachineInstr const*>,
> llvm::detail::DenseMapPair<llvm::MachineInstr const*, llvm::LexicalScope*>
> >&) + 1064
> 14 libLLVMCodeGen.so 0x00007fc17123d9ee
> llvm::LexicalScopes::initialize(llvm::MachineFunction const&) + 78
> 15 libLLVMCodeGen.so 0x00007fc171240815
> llvm::LiveDebugVariables::runOnMachineFunction(llvm::MachineFunction&) + 933
> 16 libLLVMCodeGen.so 0x00007fc1712a327c
> llvm::MachineFunctionPass::runOnFunction(llvm::Function&) + 124
> 17 libLLVMCore.so 0x00007fc17105ac7a
> llvm::FPPassManager::runOnFunction(llvm::Function&) + 362
> 18 libLLVMCore.so 0x00007fc17105af0b
> llvm::FPPassManager::runOnModule(llvm::Module&) + 43
> 19 libLLVMCore.so 0x00007fc17105b4a7
> llvm::legacy::PassManagerImpl::run(llvm::Module&) + 999
> 20 libclangCodeGen.so 0x00007fc16fe12c4d
> clang::EmitBackendOutput(clang::DiagnosticsEngine&, clang::CodeGenOptions
> const&, clang::TargetOptions const&, clang::LangOptions const&,
> llvm::StringRef, llvm::Module*, clang::BackendAction, llvm::raw_ostream*) +
> 7741
> 21 libclangCodeGen.so 0x00007fc16ff60e85
> 22 libclangParse.so 0x00007fc16f847da3
> clang::ParseAST(clang::Sema&, bool, bool) + 467
> 23 libclangCodeGen.so 0x00007fc16ff5fbbc
> clang::CodeGenAction::ExecuteAction() + 204
> 24 libclangFrontend.so 0x00007fc17047f21e
> clang::FrontendAction::Execute() + 62
> 25 libclangFrontend.so 0x00007fc17044e97c
> clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) + 892
> 26 libclangFrontendTool.so 0x00007fc1703d603a
> clang::ExecuteCompilerInvocation(clang::CompilerInstance*) + 3050
> 27 clang-3.6 0x000000000040cb71 cc1_main(llvm::ArrayRef<char
> const*>, char const*, void*) + 577
> 28 clang-3.6 0x000000000040ba64 main + 12276
> 29 libc.so.6 0x00007fc16cf91de5 __libc_start_main + 245
> 30 clang-3.6 0x0000000000408961
>
> ....
> 1. <eof> parser at end of file
> 2. Code generation
> 3. Running pass 'Function Pass Manager' on module 'x.i.cc'.
> 4. Running pass 'Debug Variable Analysis' on function
> '@__cxx_global_var_init9'
> clang-3.6: error: unable to execute command: Aborted (core dumped)
> clang-3.6: error: clang frontend command failed due to signal (use -v to
> see invocation)
>
> Since the test case is huge, I'm trying to narrow down to a small test
> case. But before I can work out that, I want to let you know first, in case
> you know something about that, and can get it fixed without a test case.
>
> Thanks,
> -Jiangning
>
>
> 2015-01-03 3:55 GMT+08:00 Jeroen Ketema <j.ketema at imperial.ac.uk>:
>
>>
>> On 02 Jan 2015, at 20:08, David Blaikie <dblaikie at gmail.com> wrote:
>>
>>
>>
>> On Wed, Dec 31, 2014 at 2:52 AM, Jeroen Ketema <j.ketema at imperial.ac.uk>
>> wrote:
>>
>>> Hi David ,
>>>
>>> This commit is giving me some problems with the code below when compiled
>>> with
>>>
>>> clang -Wall -g -gcolumn-info -emit-llvm -c foo.c
>>>
>>> For the first loop the debug information attached to the srem
>>> instruction generated for “j % 16” refers to line 10, which is correct.
>>> However, for the second loop the debug information refers to line 17 and
>>> not to the expected line 18; only the call to __f on line 18 has line 18
>>> attached to it, while the call to __i, the srem instruction, etc. have line
>>> 17 attached to it.
>>>
>>> void __i(int);
>>> void __f(void);
>>>
>>> #define __fi(X) __f(),__i(X)
>>>
>>> void foo()
>>> {
>>> for(int j = 0;
>>> __f(), __i(0 <= j),
>>> __f(), __i((j % 16) == 0), // line 10
>>> j < 1600;
>>> j += 16)
>>> {
>>> }
>>>
>>> for(int j = 0;
>>> __fi(0 <= j), // line 17
>>> __fi((j % 16) == 0), // line 18
>>> j < 1600;
>>> j += 16)
>>> {
>>> }
>>> }
>>>
>>>
>> Thanks for the report/example/etc. This should be fixed in r225083. Let
>> me know if it isn't or you see any other line info quality issues going
>> forward.
>>
>>
>> Thanks. This indeed fixes things for me.
>>
>> ---
>> Jeroen
>>
>>
>> - David
>>
>>
>>> ---
>>> Regards,
>>>
>>> Jeroen
>>>
>>> > On 30 Dec 2014, at 20: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
>>
>>
>
> _______________________________________________
> 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/20150105/810bf3d2/attachment.html>
More information about the cfe-commits
mailing list