[llvm] r184592 - Improve the time it takes to generating dwarf for assembly source files

Kevin Enderby enderby at apple.com
Fri Jun 21 14:03:19 PDT 2013


On Jun 21, 2013, at 1:59 PM, Eric Christopher <echristo at gmail.com> wrote:

>> comment.  And the current code calls SrcMgr.FindLineNumber()
>> twice to do this causing its cache not to work and results in very
>> slow compile times:
>> 
>> % time /Volumes/SandBox/build-llvm/Debug+Asserts/bin/llvm-mc -triple thumbv7-apple-ios -filetype=obj -o /tmp/x.o mscorlib.dll.E -g
>> 672.542u 0.299s 11:13.15 99.9%  0+0k 0+2io 2106pf+0w
>> 
>> So we save the info from the last parsed cpp hash file line comment
>> to avoid making the second call to SrcMgr.FindLineNumber() most times
>> and end up with compile times like:
>> 
>> % time /Volumes/SandBox/build-llvm/Debug+Asserts/bin/llvm-mc -triple thumbv7-apple-ios -filetype=obj -o /tmp/x.o mscorlib.dll.E -g
>> 3.404u 0.104s 0:03.80 92.1%     0+0k 0+3io 2105pf+0w
>> 
> 
> *blink* 11 minutes to 3 seconds? Nice work :)

It is a big machine generated assembly file:

% wc mscorlib.dll.E 
  221672  403313 7088742 mscorlib.dll.E

> 
> -eric
> 
>> rdar://14156934
>> 
>> Modified:
>>    llvm/trunk/lib/MC/MCParser/AsmParser.cpp
>> 
>> Modified: llvm/trunk/lib/MC/MCParser/AsmParser.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCParser/AsmParser.cpp?rev=184592&r1=184591&r2=184592&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/MC/MCParser/AsmParser.cpp (original)
>> +++ llvm/trunk/lib/MC/MCParser/AsmParser.cpp Fri Jun 21 15:51:39 2013
>> @@ -160,6 +160,13 @@ private:
>>   int64_t CppHashLineNumber;
>>   SMLoc CppHashLoc;
>>   int CppHashBuf;
>> +  /// When generating dwarf for assembly source files we need to calculate the
>> +  /// logical line number based on the last parsed cpp hash file line comment
>> +  /// and current line. Since this is slow and messes up the SourceMgr's
>> +  /// cache we save the last info we queried with SrcMgr.FindLineNumber().
>> +  SMLoc LastQueryIDLoc;
>> +  int LastQueryBuffer;
>> +  unsigned LastQueryLine;
>> 
>>   /// AssemblerDialect. ~OU means unset value and use value provided by MAI.
>>   unsigned AssemblerDialect;
>> @@ -1519,7 +1526,18 @@ bool AsmParser::ParseStatement(ParseStat
>>         getStreamer().EmitDwarfFileDirective(
>>           getContext().nextGenDwarfFileNumber(), StringRef(), CppHashFilename);
>> 
>> -       unsigned CppHashLocLineNo = SrcMgr.FindLineNumber(CppHashLoc,CppHashBuf);
>> +       // Since SrcMgr.FindLineNumber() is slow and messes up the SourceMgr's
>> +       // cache with the different Loc from the call above we save the last
>> +       // info we queried here with SrcMgr.FindLineNumber().
>> +       unsigned CppHashLocLineNo;
>> +       if (LastQueryIDLoc == CppHashLoc && LastQueryBuffer == CppHashBuf)
>> +         CppHashLocLineNo = LastQueryLine;
>> +       else {
>> +         CppHashLocLineNo = SrcMgr.FindLineNumber(CppHashLoc, CppHashBuf);
>> +         LastQueryLine = CppHashLocLineNo;
>> +         LastQueryIDLoc = CppHashLoc;
>> +         LastQueryBuffer = CppHashBuf;
>> +       }
>>        Line = CppHashLineNumber - 1 + (Line - CppHashLocLineNo);
>>     }
>> 
>> 
>> 
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list