[llvm] r322905 - [CodeView] Add line numbers for inlined call sites
Hans Wennborg via llvm-commits
llvm-commits at lists.llvm.org
Mon Jan 22 06:17:20 PST 2018
Merged to 6.0 in r323117.
On Thu, Jan 18, 2018 at 11:55 PM, Reid Kleckner via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
> Author: rnk
> Date: Thu Jan 18 14:55:43 2018
> New Revision: 322905
>
> URL: http://llvm.org/viewvc/llvm-project?rev=322905&view=rev
> Log:
> [CodeView] Add line numbers for inlined call sites
>
> We did this for inline call site line tables, but we hadn't done it for
> regular function line tables yet. This patch copies that logic from
> encodeInlineLineTable.
>
> Modified:
> llvm/trunk/lib/MC/MCCodeView.cpp
> llvm/trunk/test/MC/COFF/cv-inline-linetable.s
>
> Modified: llvm/trunk/lib/MC/MCCodeView.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCCodeView.cpp?rev=322905&r1=322904&r2=322905&view=diff
> ==============================================================================
> --- llvm/trunk/lib/MC/MCCodeView.cpp (original)
> +++ llvm/trunk/lib/MC/MCCodeView.cpp Thu Jan 18 14:55:43 2018
> @@ -268,11 +268,35 @@ std::vector<MCCVLineEntry>
> CodeViewContext::getFunctionLineEntries(unsigned FuncId) {
> std::vector<MCCVLineEntry> FilteredLines;
> auto I = MCCVLineStartStop.find(FuncId);
> - if (I != MCCVLineStartStop.end())
> + if (I != MCCVLineStartStop.end()) {
> + MCCVFunctionInfo *SiteInfo = getCVFunctionInfo(FuncId);
> for (size_t Idx = I->second.first, End = I->second.second; Idx != End;
> - ++Idx)
> - if (MCCVLines[Idx].getFunctionId() == FuncId)
> + ++Idx) {
> + unsigned LocationFuncId = MCCVLines[Idx].getFunctionId();
> + if (LocationFuncId == FuncId) {
> + // This was a .cv_loc directly for FuncId, so record it.
> FilteredLines.push_back(MCCVLines[Idx]);
> + } else {
> + // Check if the current location is inlined in this function. If it is,
> + // synthesize a statement .cv_loc at the original inlined call site.
> + auto I = SiteInfo->InlinedAtMap.find(LocationFuncId);
> + if (I != SiteInfo->InlinedAtMap.end()) {
> + MCCVFunctionInfo::LineInfo &IA = I->second;
> + // Only add the location if it differs from the previous location.
> + // Large inlined calls will have many .cv_loc entries and we only need
> + // one line table entry in the parent function.
> + if (FilteredLines.empty() ||
> + FilteredLines.back().getFileNum() != IA.File ||
> + FilteredLines.back().getLine() != IA.Line ||
> + FilteredLines.back().getColumn() != IA.Col) {
> + FilteredLines.push_back(MCCVLineEntry(
> + MCCVLines[Idx].getLabel(),
> + MCCVLoc(FuncId, IA.File, IA.Line, IA.Col, false, false)));
> + }
> + }
> + }
> + }
> + }
> return FilteredLines;
> }
>
>
> Modified: llvm/trunk/test/MC/COFF/cv-inline-linetable.s
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/COFF/cv-inline-linetable.s?rev=322905&r1=322904&r2=322905&view=diff
> ==============================================================================
> --- llvm/trunk/test/MC/COFF/cv-inline-linetable.s (original)
> +++ llvm/trunk/test/MC/COFF/cv-inline-linetable.s Thu Jan 18 14:55:43 2018
> @@ -135,3 +135,29 @@ Ltmp1:
> .cv_filechecksums # File index to string table offset subsection
> .cv_stringtable # String table
>
> +# CHECK-LABEL: FunctionLineTable [
> +# CHECK: LinkageName: ?baz@@YAXXZ
> +# CHECK: Flags: 0x1
> +# CHECK: CodeSize: 0x3D
> +# CHECK: FilenameSegment [
> +# CHECK: Filename: D:\src\llvm\build\t.cpp (0x0)
> +# CHECK: +0x0 [
> +# CHECK: LineNumberStart: 13
> +# CHECK: ]
> +# CHECK: +0x1 [
> +# CHECK: LineNumberStart: 14
> +# CHECK: ]
> +# CHECK: +0x8 [
> +# CHECK: LineNumberStart: 15
> +# CHECK: ]
> +# There shouldn't be any other line number entries because all the other
> +# .cv_locs are on line 15 where the top-level inline call site is.
> +# CHECK-NOT: LineNumberStart
> +# CHECK: +0x34 [
> +# CHECK: LineNumberStart: 16
> +# CHECK: ]
> +# CHECK: +0x3B [
> +# CHECK: LineNumberStart: 17
> +# CHECK: ]
> +# CHECK: ]
> +# CHECK: ]
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list