[llvm-commits] [llvm] r103135 - /llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp

Dan Gohman gohman at apple.com
Wed May 5 17:32:26 PDT 2010


On May 5, 2010, at 5:12 PM, Devang Patel wrote:

> Dan,
> 
> This does not make sense. See below...
> 
> On May 5, 2010, at 4:41 PM, Dan Gohman wrote:
> 
>> Author: djg
>> Date: Wed May  5 18:41:32 2010
>> New Revision: 103135
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=103135&view=rev
>> Log:
>> Emit debug info for MachineInstrs with unknown debug locations, instead
>> of just letting them inherit the debug locations of adjacent instructions.
>> 
>> Debug info should aim to be either accurate or absent.
>> 
>> Modified:
>>    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
>> 
>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=103135&r1=103134&r2=103135&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Wed May  5 18:41:32 2010
>> @@ -2150,8 +2150,20 @@
>> void DwarfDebug::beginScope(const MachineInstr *MI) {
>>   // Check location.
>>   DebugLoc DL = MI->getDebugLoc();
>> -  if (DL.isUnknown())
>> +  if (DL.isUnknown()) {
>> +    // This instruction has no debug location. If the preceding instruction
>> +    // did, emit debug location information to indicate that the debug
>> +    // location is now unknown.
>> +    MCSymbol *Label = NULL;
>> +    if (DL == PrevInstLoc)
>> +      Label = PrevLabel;
> 
> Here, Label is not used afterwords.

Oops. This is fixed now.

> 
>> +    else {
>> +      Label = recordSourceLine(DL.getLine(), DL.getCol(), 0);
> 
> If DL is unknown then DL.getLine(), DL.getCol() are not useful to record source location.

That's intentional. I could change this to recordSourceLine(0, 0, 0)
if you think that's more clear.

>> +      PrevInstLoc = DL;
>> +      PrevLabel = Label;
> 
>  And here PrevInstLoc and PrevLable were updated when a label for valid location was emitted. Instead you're overriding valid PrevInstLoc with Unknown debug location.

That's also intentional. PrevInstLoc will then stay unknown
until an instruction with a known location is visited.


> 
>> +    }
>>     return;
>> +  }
> 
> 
>>   MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
>> 
>> @@ -2564,23 +2576,28 @@
>>   StringRef Dir;
>>   StringRef Fn;
>> 
>> -  DIDescriptor Scope(S);
>> -  if (Scope.isCompileUnit()) {
>> -    DICompileUnit CU(S);
>> -    Dir = CU.getDirectory();
>> -    Fn = CU.getFilename();
>> -  } else if (Scope.isSubprogram()) {
>> -    DISubprogram SP(S);
>> -    Dir = SP.getDirectory();
>> -    Fn = SP.getFilename();
>> -  } else if (Scope.isLexicalBlock()) {
>> -    DILexicalBlock DB(S);
>> -    Dir = DB.getDirectory();
>> -    Fn = DB.getFilename();
>> -  } else
>> -    assert(0 && "Unexpected scope info");
>> +  unsigned Src = 1;
>> +  if (S) {
>> +    DIDescriptor Scope(S);
>> +
>> +    if (Scope.isCompileUnit()) {
>> +      DICompileUnit CU(S);
>> +      Dir = CU.getDirectory();
>> +      Fn = CU.getFilename();
>> +    } else if (Scope.isSubprogram()) {
>> +      DISubprogram SP(S);
>> +      Dir = SP.getDirectory();
>> +      Fn = SP.getFilename();
>> +    } else if (Scope.isLexicalBlock()) {
>> +      DILexicalBlock DB(S);
>> +      Dir = DB.getDirectory();
>> +      Fn = DB.getFilename();
>> +    } else
>> +      assert(0 && "Unexpected scope info");
>> +
>> +    Src = GetOrCreateSourceID(Dir, Fn);
>> +  }
> 
> I am not sure what exactly this part achieves other then increasing indentation.

When S is null, Src should be set to 1.

>> 
>> -  unsigned Src = GetOrCreateSourceID(Dir, Fn);
>>   MCSymbol *Label = MMI->getContext().CreateTempSymbol();
>>   Lines.push_back(SrcLineInfo(Line, Col, Src, Label));
>> 
>> @@ -2967,8 +2984,6 @@
>>       MCSymbol *Label = LineInfo.getLabel();
>>       if (!Label->isDefined()) continue; // Not emitted, in dead code.
>> 
>> -      if (LineInfo.getLine() == 0) continue;
>> -
>>       if (Asm->isVerbose()) {
>>         std::pair<unsigned, unsigned> SrcID =
>>           getSourceDirectoryAndFileIds(LineInfo.getSourceID());
> 
> Can you send me small test case where this patch improves debug info ?

I took a simple program and compiled it with -g -emit-llvm. I edited
the output and deleted the !dbg parts from some of the instructions in
the middle. I then ran CodeGen and produced an object file, and then
checked that the debug info for those instructions was in fact set
to "unknown".

I don't know how to write a test for this.

Dan





More information about the llvm-commits mailing list