r225000 - Reapply "DebugInfo: Generalize debug info location handling"
David Blaikie
dblaikie at gmail.com
Fri Jan 9 13:22:02 PST 2015
On Fri, Jan 9, 2015 at 1:04 PM, Adrian Prantl <aprantl at apple.com> wrote:
>
> On Jan 9, 2015, at 12:20 PM, David Blaikie <dblaikie at gmail.com> wrote:
>
>
>
> On Fri, Jan 9, 2015 at 11:52 AM, Adrian Prantl <aprantl at apple.com> wrote:
>
>> FYI: I’m hitting this assertion on today’s ToT with the following program:
>>
>> @protocol NSObject
>> @end
>> @interface NSObject <NSObject>
>> @end
>> int printf(const char * __restrict, ...);
>> struct Foo
>> {
>> int mId;
>> ~Foo(){
>> printf("~Foo(%d)\n", mId);
>> };
>> };
>> @interface TNSObject : NSObject
>> {
>> Foo _cppObjectNonAtomic;
>> }
>> @property (assign, readwrite, nonatomic) const Foo& cppObjectNonAtomic;
>> @end
>> @implementation TNSObject
>> - (id)init
>> {
>> Foo cppObject;
>> self.cppObjectNonAtomic = cppObject;
>> }
>> @end
>>
>> $ clang "-cc1" "-triple" "x86_64-apple-macosx10.10.0" "-emit-obj"
>> "-gdwarf-2" "-stdlib=libc++" "-Os" "-fexceptions" "-x" "objective-c++"
>> test1.mm
>>
>> Looks like ~Foo() is getting inlined into [TNSObject init] without the
>> scope being updated with an InlinedAt location. I’ll keep digging.
>>
>
> I'll be reverting this shortly - there's a bunch of regressions of a
> similar flavor recorded on the relevant bug, but any reduced test cases
> will be handy when trying to ensure everything's covered before I recommit.
>
> The 'root cause' in (almost?) all of these should be something like this:
>
> 1) a function with debug info (a function appearing in the CU's subprogram
> list) calls
> 2) another function with debug info through
> 3) a call instruction with no debugloc
>
>
> In the particular case I posted above, the problem appears to be with the
> call to ~Foo from within the landingpad:
>
> lpad: ; preds = %entry
> %4 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)*
> @__gxx_personality_v0 to i8*)
> cleanup
> %5 = extractvalue { i8*, i32 } %4, 0
> store i8* %5, i8** %exn.slot
> %6 = extractvalue { i8*, i32 } %4, 1
> store i32 %6, i32* %ehselector.slot
> invoke void @_ZN3FooD1Ev(%struct.Foo* %cppObject)
> to label %invoke.cont1 unwind label %terminate.lpad ; Note that
> none of the insns in the landingpad have a DebugLoc
>
> which after inlining turns into
>
> lpad: ; preds = %entry
> %3 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)*
> @__gxx_personality_v0 to i8*)
> cleanup
> call void @llvm.dbg.value(metadata %struct.Foo* %cppObject, i64 0,
> metadata !64, metadata !76), !dbg !93
> call void @llvm.dbg.value(metadata %struct.Foo* %cppObject, i64 0,
> metadata !94, metadata !76), !dbg !96
> %mId.i.i3 = getelementptr inbounds %struct.Foo* %cppObject, i64 0, i32
> 0, !dbg !97
> %4 = load i32* %mId.i.i3, align 4, !dbg !97, !tbaa !88
> %call.i.i45 = invoke i32 (i8*, ...)* @_Z6printfPKcz(i8* getelementptr
> inbounds ([10 x i8]* @.str, i64 0, i64 0), i32 %4) #6
> to label %eh.resume unwind label %terminate.lpad, !dbg !97
>
> !97 = !{i32 10, i32 0, !87, !95}
> !95 = !{i32 9, i32 0, !62, null} <-- wrong. Should be _ZN3FooD2Ev inlined
> into _ZN3FooD1Ev
>
> One one hand this is a bug in InlineFunction.cpp:fixupLineNumbers(),
>
What should fixupLineNumbers do instead? (but yes, we could put an assert
in there to fail sooner rather than creating weird debug info like this &
asserting on it later)
> but we could also attach DebugLocs to those instructions in CFE in the
> first place.
>
My preference is to keep these assertions in as long as possible, because
they find good bugs - the patch that added them took me months to commit
due to all the bugs I found each time I tried to commit it, so it seems to
have high value.
- David
>
> -- adrian
>
>
>
>
>
> When that situation is created and inlining can occur through that call,
> the debug info doesn't get updated with inlinedAt info and everything else
> is bad from there on.
>
> If you can produce any short test cases that demonstrate this commit
> causing such a call (3) to go from having a debugloc to not having a
> debugloc, that would be great to have.
>
> - David
>
>
>>
>> -- adrian
>>
>>
>> On Jan 7, 2015, at 10:30 AM, Nico Weber <thakis at chromium.org> wrote:
>>
>> On Mon, Jan 5, 2015 at 9:57 PM, Nico Weber <thakis at chromium.org> wrote:
>>
>>> 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.
>>>
>>
>> For me, the problem went away when I reverted r225085 (I landed the
>> revert in r225361), and they were unrelated to this change. Jinangning,
>> does trunk work for you? Are you sure that your problem was caused by this
>> change (r225000)?
>>
>>
>>>
>>>
>>>> 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
>>>>
>>>>
>>>
>> _______________________________________________
>> 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/20150109/81a9194f/attachment.html>
More information about the cfe-commits
mailing list