[lld] r362429 - [PDB] Copy inlinee lines records into the PDB
Reid Kleckner via llvm-commits
llvm-commits at lists.llvm.org
Mon Jun 3 11:15:39 PDT 2019
Author: rnk
Date: Mon Jun 3 11:15:38 2019
New Revision: 362429
URL: http://llvm.org/viewvc/llvm-project?rev=362429&view=rev
Log:
[PDB] Copy inlinee lines records into the PDB
Summary:
- Fixes inline call frame line table display in windbg.
- Improve llvm-pdbutil to dump extra file ids.
- Warn on unknown subsections so we don't have this kind of bug in the
future.
Reviewers: inglorion, akhuang, aganea
Subscribers: eraman, zturner, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D62701
Added:
lld/trunk/test/COFF/pdb-inlinees-extrafiles.s
lld/trunk/test/COFF/pdb-inlinees.s
lld/trunk/test/COFF/pdb-unknown-subsection.s
Modified:
lld/trunk/COFF/PDB.cpp
Modified: lld/trunk/COFF/PDB.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/PDB.cpp?rev=362429&r1=362428&r2=362429&view=diff
==============================================================================
--- lld/trunk/COFF/PDB.cpp (original)
+++ lld/trunk/COFF/PDB.cpp Mon Jun 3 11:15:38 2019
@@ -211,6 +211,10 @@ class DebugSHandler {
/// PDB.
DebugChecksumsSubsectionRef Checksums;
+ /// The DEBUG_S_INLINEELINES subsection. There can be only one of these per
+ /// object file.
+ DebugInlineeLinesSubsectionRef InlineeLines;
+
/// The DEBUG_S_FRAMEDATA subsection(s). There can be more than one of
/// these and they need not appear in any specific order. However, they
/// contain string table references which need to be re-written, so we
@@ -231,6 +235,10 @@ public:
: Linker(Linker), File(File), IndexMap(IndexMap) {}
void handleDebugS(lld::coff::SectionChunk &DebugS);
+
+ std::shared_ptr<DebugInlineeLinesSubsection>
+ mergeInlineeLines(DebugChecksumsSubsection *NewChecksums);
+
void finish();
};
}
@@ -1004,6 +1012,11 @@ void DebugSHandler::handleDebugS(lld::co
// modification because the file checksum offsets will stay the same.
File.ModuleDBI->addDebugSubsection(SS);
break;
+ case DebugSubsectionKind::InlineeLines:
+ assert(!InlineeLines.valid() &&
+ "Encountered multiple inlinee lines subsections!");
+ ExitOnErr(InlineeLines.initialize(SS.getRecordData()));
+ break;
case DebugSubsectionKind::FrameData: {
// We need to re-write string table indices here, so save off all
// frame data subsections until we've processed the entire list of
@@ -1018,13 +1031,77 @@ void DebugSHandler::handleDebugS(lld::co
SS.getRecordData());
break;
}
+
+ case DebugSubsectionKind::CrossScopeImports:
+ case DebugSubsectionKind::CrossScopeExports:
+ // These appear to relate to cross-module optimization, so we might use
+ // these for ThinLTO.
+ break;
+
+ case DebugSubsectionKind::ILLines:
+ case DebugSubsectionKind::FuncMDTokenMap:
+ case DebugSubsectionKind::TypeMDTokenMap:
+ case DebugSubsectionKind::MergedAssemblyInput:
+ // These appear to relate to .Net assembly info.
+ break;
+
+ case DebugSubsectionKind::CoffSymbolRVA:
+ // Unclear what this is for.
+ break;
+
default:
- // FIXME: Process the rest of the subsections.
+ warn("ignoring unknown debug$S subsection kind 0x" +
+ utohexstr(uint32_t(SS.kind())));
break;
}
}
}
+static Expected<StringRef>
+getFileName(const DebugStringTableSubsectionRef &Strings,
+ const DebugChecksumsSubsectionRef &Checksums, uint32_t FileID) {
+ auto Iter = Checksums.getArray().at(FileID);
+ if (Iter == Checksums.getArray().end())
+ return make_error<CodeViewError>(cv_error_code::no_records);
+ uint32_t Offset = Iter->FileNameOffset;
+ return Strings.getString(Offset);
+}
+
+std::shared_ptr<DebugInlineeLinesSubsection>
+DebugSHandler::mergeInlineeLines(DebugChecksumsSubsection *NewChecksums) {
+ auto NewInlineeLines = std::make_shared<DebugInlineeLinesSubsection>(
+ *NewChecksums, InlineeLines.hasExtraFiles());
+
+ for (const InlineeSourceLine &Line : InlineeLines) {
+ TypeIndex Inlinee = Line.Header->Inlinee;
+ uint32_t FileID = Line.Header->FileID;
+ uint32_t SourceLine = Line.Header->SourceLineNum;
+
+ ArrayRef<TypeIndex> TypeOrItemMap =
+ IndexMap.IsTypeServerMap ? IndexMap.IPIMap : IndexMap.TPIMap;
+ if (!remapTypeIndex(Inlinee, TypeOrItemMap)) {
+ log("ignoring inlinee line record in " + File.getName() +
+ " with bad inlinee index 0x" + utohexstr(Inlinee.getIndex()));
+ continue;
+ }
+
+ SmallString<128> Filename =
+ ExitOnErr(getFileName(CVStrTab, Checksums, FileID));
+ pdbMakeAbsolute(Filename);
+ NewInlineeLines->addInlineSite(Inlinee, Filename, SourceLine);
+
+ if (InlineeLines.hasExtraFiles()) {
+ for (uint32_t ExtraFileId : Line.ExtraFiles) {
+ Filename = ExitOnErr(getFileName(CVStrTab, Checksums, ExtraFileId));
+ pdbMakeAbsolute(Filename);
+ NewInlineeLines->addExtraFile(Filename);
+ }
+ }
+ }
+
+ return NewInlineeLines;
+}
+
void DebugSHandler::finish() {
pdb::DbiStreamBuilder &DbiBuilder = Linker.Builder.getDbiBuilder();
@@ -1063,13 +1140,17 @@ void DebugSHandler::finish() {
// subsections.
auto NewChecksums = make_unique<DebugChecksumsSubsection>(Linker.PDBStrTab);
for (FileChecksumEntry &FC : Checksums) {
- SmallString<128> FileName =
+ SmallString<128> Filename =
ExitOnErr(CVStrTab.getString(FC.FileNameOffset));
- pdbMakeAbsolute(FileName);
- ExitOnErr(Linker.Builder.getDbiBuilder().addModuleSourceFile(
- *File.ModuleDBI, FileName));
- NewChecksums->addChecksum(FileName, FC.Kind, FC.Checksum);
+ pdbMakeAbsolute(Filename);
+ ExitOnErr(DbiBuilder.addModuleSourceFile(*File.ModuleDBI, Filename));
+ NewChecksums->addChecksum(Filename, FC.Kind, FC.Checksum);
}
+
+ // Rewrite inlinee item indices if present.
+ if (InlineeLines.valid())
+ File.ModuleDBI->addDebugSubsection(mergeInlineeLines(NewChecksums.get()));
+
File.ModuleDBI->addDebugSubsection(std::move(NewChecksums));
}
@@ -1604,16 +1685,6 @@ void PDBLinker::commit(codeview::GUID *G
ExitOnErr(Builder.commit(Config->PDBPath, Guid));
}
-static Expected<StringRef>
-getFileName(const DebugStringTableSubsectionRef &Strings,
- const DebugChecksumsSubsectionRef &Checksums, uint32_t FileID) {
- auto Iter = Checksums.getArray().at(FileID);
- if (Iter == Checksums.getArray().end())
- return make_error<CodeViewError>(cv_error_code::no_records);
- uint32_t Offset = Iter->FileNameOffset;
- return Strings.getString(Offset);
-}
-
static uint32_t getSecrelReloc() {
switch (Config->Machine) {
case AMD64:
Added: lld/trunk/test/COFF/pdb-inlinees-extrafiles.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/pdb-inlinees-extrafiles.s?rev=362429&view=auto
==============================================================================
--- lld/trunk/test/COFF/pdb-inlinees-extrafiles.s (added)
+++ lld/trunk/test/COFF/pdb-inlinees-extrafiles.s Mon Jun 3 11:15:38 2019
@@ -0,0 +1,334 @@
+# REQUIRES: x86
+# RUN: llvm-mc -filetype=obj %s -o %t.obj -triple x86_64-windows-msvc
+# RUN: lld-link -entry:main -nodefaultlib %t.obj -out:%t.exe -pdb:%t.pdb -debug
+# RUN: llvm-pdbutil dump -il %t.pdb | FileCheck %s
+
+# The assembly was hand written to model the following C code. As of this
+# writing, clang does not emit extra files for inlinees, so it had to be hand
+# written.
+
+# // t1.h:
+# ++x;
+# #include "t2.h"
+# ++x;
+
+# // t2.h:
+# ++x;
+# __debugbreak();
+# ++x;
+
+# // t.c:
+# volatile int x;
+# static __forceinline void inlinee_1(void) {
+# ++x;
+# #include "t1.inc"
+# ++x;
+# }
+# int main() {
+# ++x;
+# inlinee_1();
+# ++x;
+# return x;
+# }
+
+# CHECK: Inlinee Lines
+# CHECK: Mod 0000 | `{{.*}}pdb-inlinees-extrafiles.s.tmp.obj`:
+# CHECK-NEXT: Inlinee | Line | Source File
+# CHECK-NEXT: 0x1000 | 7 | C:\src\llvm-project\build\t.c (MD5: A79D837C976E9F0463A474D74E2EE9E7)
+# CHECK-NEXT: C:\src\llvm-project\build\t1.h (MD5: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)
+# CHECK-NEXT: C:\src\llvm-project\build\t2.h (MD5: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)
+
+ .text
+ .def @feat.00;
+ .scl 3;
+ .type 0;
+ .endef
+ .globl @feat.00
+.set @feat.00, 0
+ .intel_syntax noprefix
+ .file "t.c"
+ .def main;
+ .scl 2;
+ .type 32;
+ .endef
+ .section .text,"xr",one_only,main
+ .globl main # -- Begin function main
+main: # @main
+.Lfunc_begin0:
+ .cv_func_id 0
+# %bb.0: # %entry
+ .cv_file 1 "C:\\src\\llvm-project\\build\\t.c" "A79D837C976E9F0463A474D74E2EE9E7" 1
+ .cv_file 2 "C:\\src\\llvm-project\\build\\t1.h" "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" 1
+ .cv_file 3 "C:\\src\\llvm-project\\build\\t2.h" "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" 1
+ .cv_loc 0 1 13 0 # t.c:13:0
+ inc dword ptr [rip + x]
+.Ltmp0:
+ .cv_inline_site_id 1 within 0 inlined_at 1 14 0
+ .cv_loc 1 1 3 0 # t.c:3:0
+ inc dword ptr [rip + x]
+.Ltmp1:
+ .cv_loc 1 2 1 0 # t1.h:1:0
+ inc dword ptr [rip + x]
+ .cv_loc 1 3 1 0 # t2.h:1:0
+ inc dword ptr [rip + x]
+ .cv_loc 1 3 2 0 # t2.h:2:0
+ int3
+ .cv_loc 1 3 3 0 # t2.h:3:0
+ inc dword ptr [rip + x]
+ .cv_loc 1 2 3 0 # t1.h:3:0
+ inc dword ptr [rip + x]
+.Ltmp2:
+ .cv_loc 1 1 5 0 # t.c:5:0
+ inc dword ptr [rip + x]
+.Ltmp3:
+ .cv_loc 0 1 15 0 # t.c:15:0
+ inc dword ptr [rip + x]
+ .cv_loc 0 1 16 0 # t.c:16:0
+ mov eax, dword ptr [rip + x]
+ ret
+.Ltmp4:
+.Lfunc_end0:
+ # -- End function
+ .comm x,4,2 # @x
+ .section .debug$S,"dr"
+ .p2align 2
+ .long 4 # Debug section magic
+ .long 241
+ .long .Ltmp6-.Ltmp5 # Subsection size
+.Ltmp5:
+ .short .Ltmp8-.Ltmp7 # Record length
+.Ltmp7:
+ .short 4412 # Record kind: S_COMPILE3
+ .long 0 # Flags and language
+ .short 208 # CPUType
+ .short 9 # Frontend version
+ .short 0
+ .short 0
+ .short 0
+ .short 9000 # Backend version
+ .short 0
+ .short 0
+ .short 0
+ .asciz "clang version 9.0.0 (git at github.com:llvm/llvm-project.git aa762a56caf3ef2b0b41c501e66d3ef32903a2d0)" # Null-terminated compiler version string
+ .p2align 2
+.Ltmp8:
+.Ltmp6:
+ .p2align 2
+ .long 246 # Inlinee lines subsection
+ .long .Ltmp10-.Ltmp9 # Subsection size
+.Ltmp9:
+ .long 1 # Inlinee lines signature, extra files
+
+ # Inlined function inlinee_1 starts at t.c:7
+ .long 4098 # Type index of inlined function
+ .cv_filechecksumoffset 1 # Offset into filechecksum table
+ .long 7 # Starting line number
+ .long 2
+ .cv_filechecksumoffset 2 # Offset into filechecksum table
+ .cv_filechecksumoffset 3 # Offset into filechecksum table
+
+.Ltmp10:
+ .p2align 2
+ .section .debug$S,"dr",associative,main
+ .p2align 2
+ .long 4 # Debug section magic
+ .long 241 # Symbol subsection for main
+ .long .Ltmp12-.Ltmp11 # Subsection size
+.Ltmp11:
+ .short .Ltmp14-.Ltmp13 # Record length
+.Ltmp13:
+ .short 4423 # Record kind: S_GPROC32_ID
+ .long 0 # PtrParent
+ .long 0 # PtrEnd
+ .long 0 # PtrNext
+ .long .Lfunc_end0-main # Code size
+ .long 0 # Offset after prologue
+ .long 0 # Offset before epilogue
+ .long 4101 # Function type index
+ .secrel32 main # Function section relative address
+ .secidx main # Function section index
+ .byte 0 # Flags
+ .asciz "main" # Function name
+ .p2align 2
+.Ltmp14:
+ .short .Ltmp16-.Ltmp15 # Record length
+.Ltmp15:
+ .short 4114 # Record kind: S_FRAMEPROC
+ .long 0 # FrameSize
+ .long 0 # Padding
+ .long 0 # Offset of padding
+ .long 0 # Bytes of callee saved registers
+ .long 0 # Exception handler offset
+ .short 0 # Exception handler section
+ .long 0 # Flags (defines frame register)
+ .p2align 2
+.Ltmp16:
+ .short .Ltmp18-.Ltmp17 # Record length
+.Ltmp17:
+ .short 4429 # Record kind: S_INLINESITE
+ .long 0 # PtrParent
+ .long 0 # PtrEnd
+ .long 4098 # Inlinee type index
+ .cv_inline_linetable 1 1 7 .Lfunc_begin0 .Lfunc_end0
+ .p2align 2
+.Ltmp18:
+ .short 2 # Record length
+ .short 4430 # Record kind: S_INLINESITE_END
+ .short 2 # Record length
+ .short 4431 # Record kind: S_PROC_ID_END
+.Ltmp12:
+ .p2align 2
+ .cv_linetable 0, main, .Lfunc_end0
+ .section .debug$S,"dr"
+ .long 241 # Symbol subsection for globals
+ .long .Ltmp22-.Ltmp21 # Subsection size
+.Ltmp21:
+ .short .Ltmp24-.Ltmp23 # Record length
+.Ltmp23:
+ .short 4365 # Record kind: S_GDATA32
+ .long 4102 # Type
+ .secrel32 x # DataOffset
+ .secidx x # Segment
+ .asciz "x" # Name
+ .p2align 2
+.Ltmp24:
+.Ltmp22:
+ .p2align 2
+ .cv_filechecksums # File index to string table offset subsection
+ .cv_stringtable # String table
+ .long 241
+ .long .Ltmp26-.Ltmp25 # Subsection size
+.Ltmp25:
+ .short .Ltmp28-.Ltmp27 # Record length
+.Ltmp27:
+ .short 4428 # Record kind: S_BUILDINFO
+ .long 4105 # LF_BUILDINFO index
+ .p2align 2
+.Ltmp28:
+.Ltmp26:
+ .p2align 2
+ .section .debug$T,"dr"
+ .p2align 2
+ .long 4 # Debug section magic
+ # ArgList (0x1000) {
+ # TypeLeafKind: LF_ARGLIST (0x1201)
+ # NumArgs: 0
+ # Arguments [
+ # ]
+ # }
+ .byte 0x06, 0x00, 0x01, 0x12
+ .byte 0x00, 0x00, 0x00, 0x00
+ # Procedure (0x1001) {
+ # TypeLeafKind: LF_PROCEDURE (0x1008)
+ # ReturnType: void (0x3)
+ # CallingConvention: NearC (0x0)
+ # FunctionOptions [ (0x0)
+ # ]
+ # NumParameters: 0
+ # ArgListType: () (0x1000)
+ # }
+ .byte 0x0e, 0x00, 0x08, 0x10
+ .byte 0x03, 0x00, 0x00, 0x00
+ .byte 0x00, 0x00, 0x00, 0x00
+ .byte 0x00, 0x10, 0x00, 0x00
+ # FuncId (0x1002) {
+ # TypeLeafKind: LF_FUNC_ID (0x1601)
+ # ParentScope: 0x0
+ # FunctionType: void () (0x1001)
+ # Name: inlinee_1
+ # }
+ .byte 0x16, 0x00, 0x01, 0x16
+ .byte 0x00, 0x00, 0x00, 0x00
+ .byte 0x01, 0x10, 0x00, 0x00
+ .byte 0x69, 0x6e, 0x6c, 0x69
+ .byte 0x6e, 0x65, 0x65, 0x5f
+ .byte 0x31, 0x00, 0xf2, 0xf1
+ # FuncId (0x1003) {
+ # TypeLeafKind: LF_FUNC_ID (0x1601)
+ # ParentScope: 0x0
+ # FunctionType: void () (0x1001)
+ # Name: inlinee_2
+ # }
+ .byte 0x16, 0x00, 0x01, 0x16
+ .byte 0x00, 0x00, 0x00, 0x00
+ .byte 0x01, 0x10, 0x00, 0x00
+ .byte 0x69, 0x6e, 0x6c, 0x69
+ .byte 0x6e, 0x65, 0x65, 0x5f
+ .byte 0x32, 0x00, 0xf2, 0xf1
+ # Procedure (0x1004) {
+ # TypeLeafKind: LF_PROCEDURE (0x1008)
+ # ReturnType: int (0x74)
+ # CallingConvention: NearC (0x0)
+ # FunctionOptions [ (0x0)
+ # ]
+ # NumParameters: 0
+ # ArgListType: () (0x1000)
+ # }
+ .byte 0x0e, 0x00, 0x08, 0x10
+ .byte 0x74, 0x00, 0x00, 0x00
+ .byte 0x00, 0x00, 0x00, 0x00
+ .byte 0x00, 0x10, 0x00, 0x00
+ # FuncId (0x1005) {
+ # TypeLeafKind: LF_FUNC_ID (0x1601)
+ # ParentScope: 0x0
+ # FunctionType: int () (0x1004)
+ # Name: main
+ # }
+ .byte 0x12, 0x00, 0x01, 0x16
+ .byte 0x00, 0x00, 0x00, 0x00
+ .byte 0x04, 0x10, 0x00, 0x00
+ .byte 0x6d, 0x61, 0x69, 0x6e
+ .byte 0x00, 0xf3, 0xf2, 0xf1
+ # Modifier (0x1006) {
+ # TypeLeafKind: LF_MODIFIER (0x1001)
+ # ModifiedType: int (0x74)
+ # Modifiers [ (0x2)
+ # Volatile (0x2)
+ # ]
+ # }
+ .byte 0x0a, 0x00, 0x01, 0x10
+ .byte 0x74, 0x00, 0x00, 0x00
+ .byte 0x02, 0x00, 0xf2, 0xf1
+ # StringId (0x1007) {
+ # TypeLeafKind: LF_STRING_ID (0x1605)
+ # Id: 0x0
+ # StringData: C:\src\llvm-project\build
+ # }
+ .byte 0x22, 0x00, 0x05, 0x16
+ .byte 0x00, 0x00, 0x00, 0x00
+ .byte 0x43, 0x3a, 0x5c, 0x73
+ .byte 0x72, 0x63, 0x5c, 0x6c
+ .byte 0x6c, 0x76, 0x6d, 0x2d
+ .byte 0x70, 0x72, 0x6f, 0x6a
+ .byte 0x65, 0x63, 0x74, 0x5c
+ .byte 0x62, 0x75, 0x69, 0x6c
+ .byte 0x64, 0x00, 0xf2, 0xf1
+ # StringId (0x1008) {
+ # TypeLeafKind: LF_STRING_ID (0x1605)
+ # Id: 0x0
+ # StringData: t.c
+ # }
+ .byte 0x0a, 0x00, 0x05, 0x16
+ .byte 0x00, 0x00, 0x00, 0x00
+ .byte 0x74, 0x2e, 0x63, 0x00
+ # BuildInfo (0x1009) {
+ # TypeLeafKind: LF_BUILDINFO (0x1603)
+ # NumArgs: 5
+ # Arguments [
+ # ArgType: C:\src\llvm-project\build (0x1007)
+ # ArgType: 0x0
+ # ArgType: t.c (0x1008)
+ # ArgType: 0x0
+ # ArgType: 0x0
+ # ]
+ # }
+ .byte 0x1a, 0x00, 0x03, 0x16
+ .byte 0x05, 0x00, 0x07, 0x10
+ .byte 0x00, 0x00, 0x00, 0x00
+ .byte 0x00, 0x00, 0x08, 0x10
+ .byte 0x00, 0x00, 0x00, 0x00
+ .byte 0x00, 0x00, 0x00, 0x00
+ .byte 0x00, 0x00, 0xf2, 0xf1
+
+ .addrsig
+ .addrsig_sym x
Added: lld/trunk/test/COFF/pdb-inlinees.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/pdb-inlinees.s?rev=362429&view=auto
==============================================================================
--- lld/trunk/test/COFF/pdb-inlinees.s (added)
+++ lld/trunk/test/COFF/pdb-inlinees.s Mon Jun 3 11:15:38 2019
@@ -0,0 +1,332 @@
+# REQUIRES: x86
+# RUN: llvm-mc -filetype=obj %s -o %t.obj -triple x86_64-windows-msvc
+# RUN: lld-link -entry:main -nodefaultlib %t.obj -out:%t.exe -pdb:%t.pdb -debug
+# RUN: llvm-pdbutil dump -il %t.pdb | FileCheck %s
+
+# Compiled from this C code, with modifications to test multiple file checksums:
+# volatile int x;
+# static __forceinline void inlinee_2(void) {
+# ++x;
+# __debugbreak();
+# ++x;
+# }
+# static __forceinline void inlinee_1(void) {
+# ++x;
+# inlinee_2();
+# ++x;
+# }
+# int main() {
+# ++x;
+# inlinee_1();
+# ++x;
+# return x;
+# }
+
+# CHECK: Inlinee Lines
+# CHECK: Mod 0000 | `{{.*}}pdb-inlinees.s.tmp.obj`:
+# CHECK-NEXT: Inlinee | Line | Source File
+# CHECK-NEXT: 0x1000 | 7 | C:\src\llvm-project\build\t.c (MD5: A79D837C976E9F0463A474D74E2EE9E7)
+# CHECK-NEXT: 0x1001 | 2 | C:\src\llvm-project\build\file2.h (MD5: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)
+
+ .text
+ .def @feat.00;
+ .scl 3;
+ .type 0;
+ .endef
+ .globl @feat.00
+.set @feat.00, 0
+ .intel_syntax noprefix
+ .file "t.c"
+ .def main;
+ .scl 2;
+ .type 32;
+ .endef
+ .section .text,"xr",one_only,main
+ .globl main # -- Begin function main
+main: # @main
+.Lfunc_begin0:
+ .cv_func_id 0
+# %bb.0: # %entry
+ .cv_file 1 "C:\\src\\llvm-project\\build\\t.c" "A79D837C976E9F0463A474D74E2EE9E7" 1
+ .cv_file 2 "C:\\src\\llvm-project\\build\\file2.h" "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" 1
+ .cv_loc 0 1 13 0 # t.c:13:0
+ inc dword ptr [rip + x]
+.Ltmp0:
+ .cv_inline_site_id 1 within 0 inlined_at 1 14 0
+ .cv_loc 1 1 8 0 # t.c:8:0
+ inc dword ptr [rip + x]
+.Ltmp1:
+ .cv_inline_site_id 2 within 1 inlined_at 1 9 0
+ .cv_loc 2 2 3 0 # file2.h:3:0
+ inc dword ptr [rip + x]
+ .cv_loc 2 2 4 0 # file2.h:4:0
+ int3
+ .cv_loc 2 2 5 0 # file2.h:5:0
+ inc dword ptr [rip + x]
+.Ltmp2:
+ .cv_loc 1 1 10 0 # t.c:10:0
+ inc dword ptr [rip + x]
+.Ltmp3:
+ .cv_loc 0 1 15 0 # t.c:15:0
+ inc dword ptr [rip + x]
+ .cv_loc 0 1 16 0 # t.c:16:0
+ mov eax, dword ptr [rip + x]
+ ret
+.Ltmp4:
+.Lfunc_end0:
+ # -- End function
+ .comm x,4,2 # @x
+ .section .debug$S,"dr"
+ .p2align 2
+ .long 4 # Debug section magic
+ .long 241
+ .long .Ltmp6-.Ltmp5 # Subsection size
+.Ltmp5:
+ .short .Ltmp8-.Ltmp7 # Record length
+.Ltmp7:
+ .short 4412 # Record kind: S_COMPILE3
+ .long 0 # Flags and language
+ .short 208 # CPUType
+ .short 9 # Frontend version
+ .short 0
+ .short 0
+ .short 0
+ .short 9000 # Backend version
+ .short 0
+ .short 0
+ .short 0
+ .asciz "clang version 9.0.0 (git at github.com:llvm/llvm-project.git aa762a56caf3ef2b0b41c501e66d3ef32903a2d0)" # Null-terminated compiler version string
+ .p2align 2
+.Ltmp8:
+.Ltmp6:
+ .p2align 2
+ .long 246 # Inlinee lines subsection
+ .long .Ltmp10-.Ltmp9 # Subsection size
+.Ltmp9:
+ .long 0 # Inlinee lines signature
+
+ # Inlined function inlinee_1 starts at t.c:7
+ .long 4098 # Type index of inlined function
+ .cv_filechecksumoffset 1 # Offset into filechecksum table
+ .long 7 # Starting line number
+
+ # Inlined function inlinee_2 starts at file2.h:2
+ .long 4099 # Type index of inlined function
+ .cv_filechecksumoffset 2 # Offset into filechecksum table
+ .long 2 # Starting line number
+.Ltmp10:
+ .p2align 2
+ .section .debug$S,"dr",associative,main
+ .p2align 2
+ .long 4 # Debug section magic
+ .long 241 # Symbol subsection for main
+ .long .Ltmp12-.Ltmp11 # Subsection size
+.Ltmp11:
+ .short .Ltmp14-.Ltmp13 # Record length
+.Ltmp13:
+ .short 4423 # Record kind: S_GPROC32_ID
+ .long 0 # PtrParent
+ .long 0 # PtrEnd
+ .long 0 # PtrNext
+ .long .Lfunc_end0-main # Code size
+ .long 0 # Offset after prologue
+ .long 0 # Offset before epilogue
+ .long 4101 # Function type index
+ .secrel32 main # Function section relative address
+ .secidx main # Function section index
+ .byte 0 # Flags
+ .asciz "main" # Function name
+ .p2align 2
+.Ltmp14:
+ .short .Ltmp16-.Ltmp15 # Record length
+.Ltmp15:
+ .short 4114 # Record kind: S_FRAMEPROC
+ .long 0 # FrameSize
+ .long 0 # Padding
+ .long 0 # Offset of padding
+ .long 0 # Bytes of callee saved registers
+ .long 0 # Exception handler offset
+ .short 0 # Exception handler section
+ .long 0 # Flags (defines frame register)
+ .p2align 2
+.Ltmp16:
+ .short .Ltmp18-.Ltmp17 # Record length
+.Ltmp17:
+ .short 4429 # Record kind: S_INLINESITE
+ .long 0 # PtrParent
+ .long 0 # PtrEnd
+ .long 4098 # Inlinee type index
+ .cv_inline_linetable 1 1 7 .Lfunc_begin0 .Lfunc_end0
+ .p2align 2
+.Ltmp18:
+ .short .Ltmp20-.Ltmp19 # Record length
+.Ltmp19:
+ .short 4429 # Record kind: S_INLINESITE
+ .long 0 # PtrParent
+ .long 0 # PtrEnd
+ .long 4099 # Inlinee type index
+ .cv_inline_linetable 2 2 2 .Lfunc_begin0 .Lfunc_end0
+ .p2align 2
+.Ltmp20:
+ .short 2 # Record length
+ .short 4430 # Record kind: S_INLINESITE_END
+ .short 2 # Record length
+ .short 4430 # Record kind: S_INLINESITE_END
+ .short 2 # Record length
+ .short 4431 # Record kind: S_PROC_ID_END
+.Ltmp12:
+ .p2align 2
+ .cv_linetable 0, main, .Lfunc_end0
+ .section .debug$S,"dr"
+ .long 241 # Symbol subsection for globals
+ .long .Ltmp22-.Ltmp21 # Subsection size
+.Ltmp21:
+ .short .Ltmp24-.Ltmp23 # Record length
+.Ltmp23:
+ .short 4365 # Record kind: S_GDATA32
+ .long 4102 # Type
+ .secrel32 x # DataOffset
+ .secidx x # Segment
+ .asciz "x" # Name
+ .p2align 2
+.Ltmp24:
+.Ltmp22:
+ .p2align 2
+ .cv_filechecksums # File index to string table offset subsection
+ .cv_stringtable # String table
+ .long 241
+ .long .Ltmp26-.Ltmp25 # Subsection size
+.Ltmp25:
+ .short .Ltmp28-.Ltmp27 # Record length
+.Ltmp27:
+ .short 4428 # Record kind: S_BUILDINFO
+ .long 4105 # LF_BUILDINFO index
+ .p2align 2
+.Ltmp28:
+.Ltmp26:
+ .p2align 2
+ .section .debug$T,"dr"
+ .p2align 2
+ .long 4 # Debug section magic
+ # ArgList (0x1000) {
+ # TypeLeafKind: LF_ARGLIST (0x1201)
+ # NumArgs: 0
+ # Arguments [
+ # ]
+ # }
+ .byte 0x06, 0x00, 0x01, 0x12
+ .byte 0x00, 0x00, 0x00, 0x00
+ # Procedure (0x1001) {
+ # TypeLeafKind: LF_PROCEDURE (0x1008)
+ # ReturnType: void (0x3)
+ # CallingConvention: NearC (0x0)
+ # FunctionOptions [ (0x0)
+ # ]
+ # NumParameters: 0
+ # ArgListType: () (0x1000)
+ # }
+ .byte 0x0e, 0x00, 0x08, 0x10
+ .byte 0x03, 0x00, 0x00, 0x00
+ .byte 0x00, 0x00, 0x00, 0x00
+ .byte 0x00, 0x10, 0x00, 0x00
+ # FuncId (0x1002) {
+ # TypeLeafKind: LF_FUNC_ID (0x1601)
+ # ParentScope: 0x0
+ # FunctionType: void () (0x1001)
+ # Name: inlinee_1
+ # }
+ .byte 0x16, 0x00, 0x01, 0x16
+ .byte 0x00, 0x00, 0x00, 0x00
+ .byte 0x01, 0x10, 0x00, 0x00
+ .byte 0x69, 0x6e, 0x6c, 0x69
+ .byte 0x6e, 0x65, 0x65, 0x5f
+ .byte 0x31, 0x00, 0xf2, 0xf1
+ # FuncId (0x1003) {
+ # TypeLeafKind: LF_FUNC_ID (0x1601)
+ # ParentScope: 0x0
+ # FunctionType: void () (0x1001)
+ # Name: inlinee_2
+ # }
+ .byte 0x16, 0x00, 0x01, 0x16
+ .byte 0x00, 0x00, 0x00, 0x00
+ .byte 0x01, 0x10, 0x00, 0x00
+ .byte 0x69, 0x6e, 0x6c, 0x69
+ .byte 0x6e, 0x65, 0x65, 0x5f
+ .byte 0x32, 0x00, 0xf2, 0xf1
+ # Procedure (0x1004) {
+ # TypeLeafKind: LF_PROCEDURE (0x1008)
+ # ReturnType: int (0x74)
+ # CallingConvention: NearC (0x0)
+ # FunctionOptions [ (0x0)
+ # ]
+ # NumParameters: 0
+ # ArgListType: () (0x1000)
+ # }
+ .byte 0x0e, 0x00, 0x08, 0x10
+ .byte 0x74, 0x00, 0x00, 0x00
+ .byte 0x00, 0x00, 0x00, 0x00
+ .byte 0x00, 0x10, 0x00, 0x00
+ # FuncId (0x1005) {
+ # TypeLeafKind: LF_FUNC_ID (0x1601)
+ # ParentScope: 0x0
+ # FunctionType: int () (0x1004)
+ # Name: main
+ # }
+ .byte 0x12, 0x00, 0x01, 0x16
+ .byte 0x00, 0x00, 0x00, 0x00
+ .byte 0x04, 0x10, 0x00, 0x00
+ .byte 0x6d, 0x61, 0x69, 0x6e
+ .byte 0x00, 0xf3, 0xf2, 0xf1
+ # Modifier (0x1006) {
+ # TypeLeafKind: LF_MODIFIER (0x1001)
+ # ModifiedType: int (0x74)
+ # Modifiers [ (0x2)
+ # Volatile (0x2)
+ # ]
+ # }
+ .byte 0x0a, 0x00, 0x01, 0x10
+ .byte 0x74, 0x00, 0x00, 0x00
+ .byte 0x02, 0x00, 0xf2, 0xf1
+ # StringId (0x1007) {
+ # TypeLeafKind: LF_STRING_ID (0x1605)
+ # Id: 0x0
+ # StringData: C:\src\llvm-project\build
+ # }
+ .byte 0x22, 0x00, 0x05, 0x16
+ .byte 0x00, 0x00, 0x00, 0x00
+ .byte 0x43, 0x3a, 0x5c, 0x73
+ .byte 0x72, 0x63, 0x5c, 0x6c
+ .byte 0x6c, 0x76, 0x6d, 0x2d
+ .byte 0x70, 0x72, 0x6f, 0x6a
+ .byte 0x65, 0x63, 0x74, 0x5c
+ .byte 0x62, 0x75, 0x69, 0x6c
+ .byte 0x64, 0x00, 0xf2, 0xf1
+ # StringId (0x1008) {
+ # TypeLeafKind: LF_STRING_ID (0x1605)
+ # Id: 0x0
+ # StringData: t.c
+ # }
+ .byte 0x0a, 0x00, 0x05, 0x16
+ .byte 0x00, 0x00, 0x00, 0x00
+ .byte 0x74, 0x2e, 0x63, 0x00
+ # BuildInfo (0x1009) {
+ # TypeLeafKind: LF_BUILDINFO (0x1603)
+ # NumArgs: 5
+ # Arguments [
+ # ArgType: C:\src\llvm-project\build (0x1007)
+ # ArgType: 0x0
+ # ArgType: t.c (0x1008)
+ # ArgType: 0x0
+ # ArgType: 0x0
+ # ]
+ # }
+ .byte 0x1a, 0x00, 0x03, 0x16
+ .byte 0x05, 0x00, 0x07, 0x10
+ .byte 0x00, 0x00, 0x00, 0x00
+ .byte 0x00, 0x00, 0x08, 0x10
+ .byte 0x00, 0x00, 0x00, 0x00
+ .byte 0x00, 0x00, 0x00, 0x00
+ .byte 0x00, 0x00, 0xf2, 0xf1
+
+ .addrsig
+ .addrsig_sym x
Added: lld/trunk/test/COFF/pdb-unknown-subsection.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/pdb-unknown-subsection.s?rev=362429&view=auto
==============================================================================
--- lld/trunk/test/COFF/pdb-unknown-subsection.s (added)
+++ lld/trunk/test/COFF/pdb-unknown-subsection.s Mon Jun 3 11:15:38 2019
@@ -0,0 +1,46 @@
+# Check that unknown symbol subsections are ignored with a warning, and a PDB
+# is produced anyway.
+
+# REQUIRES: x86
+# RUN: llvm-mc -triple=i386-pc-win32 -filetype=obj -o %t.obj %s
+# RUN: lld-link -subsystem:console -debug -nodefaultlib -entry:foo -out:%t.exe -pdb:%t.pdb %t.obj 2>&1 | FileCheck %s --check-prefix=WARNING
+# RUN: llvm-pdbutil dump -symbols %t.pdb | FileCheck %s
+
+# WARNING: ignoring unknown debug$S subsection kind 0xFF
+
+# CHECK: Symbols
+# CHECK: 4 | S_COMPILE3 [size = 52]
+# CHECK: machine = intel x86-x64, Ver = clang version SENTINEL, language = c
+
+.text
+_foo:
+ret
+
+.global _foo
+
+.section .debug$S,"dr"
+ .p2align 2
+ .long 4 # Debug section magic
+ .long 0xF1 # Symbol subsection
+ .long .Ltmp6-.Ltmp5 # Subsection size
+.Ltmp5:
+ .short .Ltmp8-.Ltmp7 # Record length
+.Ltmp7:
+ .short 4412 # Record kind: S_COMPILE3
+ .long 0 # Flags and language
+ .short 208 # CPUType
+ .short 9 # Frontend version
+ .short 0
+ .short 0
+ .short 0
+ .short 9000 # Backend version
+ .short 0
+ .short 0
+ .short 0
+ .asciz "clang version SENTINEL" # Null-terminated compiler version string
+ .p2align 2
+.Ltmp8:
+.Ltmp6:
+ .long 0xFF # Unknown subsection kind
+ .long 4 # Subsection size
+ .long 0
More information about the llvm-commits
mailing list