Index: lld/COFF/PDB.cpp =================================================================== --- lld/COFF/PDB.cpp +++ lld/COFF/PDB.cpp @@ -176,6 +176,64 @@ return NewData; } +/// Return true if this symbol opens a scope. This implies that the symbol has +/// "parent" and "end" fields, which contain the offset of the S_END or +/// S_INLINESITE_END record. +static bool symbolOpensScope(SymbolKind Kind) { + switch (Kind) { + case SymbolKind::S_GPROC32: + case SymbolKind::S_LPROC32: + case SymbolKind::S_LPROC32_ID: + case SymbolKind::S_GPROC32_ID: + case SymbolKind::S_BLOCK32: + case SymbolKind::S_WITH32: + case SymbolKind::S_THUNK32: + case SymbolKind::S_INLINESITE: + return true; + default: + break; + } + return false; +} + +static bool symbolEndsScope(SymbolKind Kind) { + switch (Kind) { + case SymbolKind::S_END: + case SymbolKind::S_PROC_ID_END: + case SymbolKind::S_INLINESITE_END: + return true; + default: + break; + } + return false; +} + +struct ScopeRecord { + ulittle32_t PtrParent; + ulittle32_t PtrEnd; +}; + +struct SymbolScope { + ScopeRecord *Rec; + uint32_t ScopeOffset; +}; + +static void scopeStackOpen(SmallVectorImpl &Stack, + uint32_t CurOffset, + MutableArrayRef Contents) { + SymbolScope S; + S.ScopeOffset = CurOffset; + S.Rec = reinterpret_cast(Contents.data()); + S.Rec->PtrParent = Stack.empty() ? 0 : Stack.back().ScopeOffset; + Stack.push_back(S); +} + +static void scopeStackClose(SmallVectorImpl &Stack, + uint32_t CurOffset) { + SymbolScope S = Stack.pop_back_val(); + S.Rec->PtrEnd = CurOffset; +} + static void mergeSymbolRecords(BumpPtrAllocator &Alloc, ObjectFile *File, ArrayRef TypeIndexMap, BinaryStreamRef SymData) { @@ -184,6 +242,7 @@ CVSymbolArray Syms; BinaryStreamReader Reader(SymData); ExitOnErr(Reader.readArray(Syms, Reader.getLength())); + SmallVector Scopes; for (const CVSymbol &Sym : Syms) { // Discover type index references in the record. Skip it if we don't know // where they are. @@ -202,8 +261,11 @@ if (!remapTypesInSymbolRecord(File, Contents, TypeIndexMap, TypeRefs)) continue; - // FIXME: Fill in "Parent" and "End" fields by maintaining a stack of - // scopes. + // Fill in "Parent" and "End" fields by maintaining a stack of scopes. + if (symbolOpensScope(Sym.kind())) + scopeStackOpen(Scopes, File->ModuleDBI->getNextSymbolOffset(), Contents); + else if (symbolEndsScope(Sym.kind()) && !Scopes.empty()) + scopeStackClose(Scopes, File->ModuleDBI->getNextSymbolOffset()); // Add the symbol to the module. File->ModuleDBI->addSymbol(CVSymbol(Sym.kind(), NewData)); Index: lld/test/COFF/Inputs/pdb-scopes-a.yaml =================================================================== --- lld/test/COFF/Inputs/pdb-scopes-a.yaml +++ lld/test/COFF/Inputs/pdb-scopes-a.yaml @@ -1,43 +1,3 @@ -# RUN: yaml2obj %s -o %t.obj -# RUN: lld-link %t.obj -nodefaultlib -entry:main -debug -out:%t.exe -pdb:%t.pdb -# RUN: llvm-pdbutil dump -symbols %t.pdb | FileCheck %s - -# To regenerate the object file: -# $ cat symbol-types.c -# struct Foo { int x; }; -# typedef struct Foo UDT_Foo; -# UDT_Foo global_foo = {42}; -# int main() { return global_foo.x; } -# $ cl -c -Z7 symbol-types.c - -# Note that the type of 'global' goes from 0x1005 in the object file to 0x1004 -# in the PDB because the LF_FUNC_ID is moved to the id stream. - -# CHECK: Symbols -# CHECK: ============================================================ -# CHECK-LABEL: Mod 0000 | `{{.*}}pdb-symbol-types.yaml.tmp.obj`: -# CHECK: - S_OBJNAME [size = 52] sig=0, `C:\src\llvm-project\build\symbol-types.obj` -# CHECK: - S_COMPILE3 [size = 60] -# CHECK: machine = intel x86-x64, Ver = Microsoft (R) Optimizing Compiler, language = c -# CHECK: frontend = 19.0.24215.1, backend = 19.0.24215.1 -# CHECK: flags = security checks | hot patchable -# CHECK: - S_GPROC32_ID [size = 44] `main` -# CHECK: parent = 0, addr = 0002:0000, code size = 7, end = 0 -# CHECK: debug start = 0, debug end = 6, flags = none -# CHECK: - S_FRAMEPROC [size = 32] -# CHECK: size = 0, padding size = 0, offset to padding = 0 -# CHECK: bytes of callee saved registers = 0, exception handler addr = 0000:0000 -# CHECK: flags = has async eh | opt speed -# CHECK: - S_END [size = 4] -# CHECK: - S_GDATA32 [size = 28] `global_foo` -# CHECK: type = 0x1004 (Foo), addr = 0001:0000 -# CHECK: - S_UDT [size = 16] `UDT_Foo` -# CHECK: original type = 0x1004 -# CHECK: - S_UDT [size = 12] `Foo` -# CHECK: original type = 0x1004 -# CHECK: - S_BUILDINFO [size = 8] BuildId = `4106` -# CHECK-LABEL: Mod 0001 | `* Linker *`: - --- !COFF header: Machine: IMAGE_FILE_MACHINE_AMD64 @@ -56,7 +16,7 @@ - Kind: S_OBJNAME ObjNameSym: Signature: 0 - ObjectName: 'C:\src\llvm-project\build\symbol-types.obj' + ObjectName: 'C:\src\llvm-project\build\a.obj' - Kind: S_COMPILE3 Compile3Sym: Flags: [ SecurityChecks, HotPatch ] @@ -74,12 +34,12 @@ Records: - Kind: S_GPROC32_ID ProcSym: - CodeSize: 7 - DbgStart: 0 - DbgEnd: 6 - FunctionType: 4098 + CodeSize: 5 + DbgStart: 4 + DbgEnd: 4 + FunctionType: 4099 Flags: [ ] - DisplayName: main + DisplayName: g - Kind: S_FRAMEPROC FrameProcSym: TotalFrameBytes: 0 @@ -89,74 +49,170 @@ OffsetOfExceptionHandler: 0 SectionIdOfExceptionHandler: 0 Flags: [ AsynchronousExceptionHandling, OptimizedForSpeed ] + - Kind: S_REGREL32 + RegRelativeSym: + Offset: 8 + Type: 116 + Register: RSP + VarName: x - Kind: S_PROC_ID_END ScopeEndSym: - !Lines - CodeSize: 7 + CodeSize: 5 Flags: [ ] RelocOffset: 0 RelocSegment: 0 Blocks: - - FileName: 'c:\src\llvm-project\build\symbol-types.c' + - FileName: 'c:\src\llvm-project\build\a.c' Lines: - Offset: 0 - LineStart: 4 + LineStart: 1 IsStatement: true EndDelta: 0 + Columns: + - !Symbols + Records: + - Kind: S_GPROC32_ID + ProcSym: + CodeSize: 58 + DbgStart: 8 + DbgEnd: 53 + FunctionType: 4101 + Flags: [ ] + DisplayName: main + - Kind: S_FRAMEPROC + FrameProcSym: + TotalFrameBytes: 56 + PaddingFrameBytes: 0 + OffsetToPadding: 0 + BytesOfCalleeSavedRegisters: 0 + OffsetOfExceptionHandler: 0 + SectionIdOfExceptionHandler: 0 + Flags: [ AsynchronousExceptionHandling, OptimizedForSpeed ] + - Kind: S_REGREL32 + RegRelativeSym: + Offset: 64 + Type: 116 + Register: RSP + VarName: argc + - Kind: S_BLOCK32 + BlockSym: + CodeSize: 17 + Offset: 15 + BlockName: '' + - Kind: S_REGREL32 + RegRelativeSym: + Offset: 32 + Type: 116 + Register: RSP + VarName: x + - Kind: S_END + ScopeEndSym: + - Kind: S_BLOCK32 + BlockSym: + CodeSize: 17 + Offset: 34 + BlockName: '' + - Kind: S_REGREL32 + RegRelativeSym: + Offset: 36 + Type: 116 + Register: RSP + VarName: y + - Kind: S_END + ScopeEndSym: + - Kind: S_PROC_ID_END + ScopeEndSym: + - !Lines + CodeSize: 58 + Flags: [ ] + RelocOffset: 0 + RelocSegment: 0 + Blocks: + - FileName: 'c:\src\llvm-project\build\a.c' + Lines: - Offset: 0 + LineStart: 3 + IsStatement: true + EndDelta: 0 + - Offset: 8 + LineStart: 4 + IsStatement: true + EndDelta: 0 + - Offset: 15 LineStart: 5 IsStatement: true EndDelta: 0 - - Offset: 6 + - Offset: 23 LineStart: 6 IsStatement: true EndDelta: 0 + - Offset: 32 + LineStart: 7 + IsStatement: true + EndDelta: 0 + - Offset: 34 + LineStart: 8 + IsStatement: true + EndDelta: 0 + - Offset: 42 + LineStart: 9 + IsStatement: true + EndDelta: 0 + - Offset: 51 + LineStart: 11 + IsStatement: true + EndDelta: 0 Columns: - - !Symbols - Records: - - Kind: S_GDATA32 - DataSym: - Type: 4101 - DisplayName: global_foo - - Kind: S_UDT - UDTSym: - Type: 4101 - UDTName: UDT_Foo - - Kind: S_UDT - UDTSym: - Type: 4101 - UDTName: Foo - !FileChecksums Checksums: - - FileName: 'c:\src\llvm-project\build\symbol-types.c' + - FileName: 'c:\src\llvm-project\build\a.c' Kind: MD5 - Checksum: F833E1A4909FF6FEC5689A664F3BE725 + Checksum: 7FA72225C3F5630316383BD8BCC3EF72 - !StringTable Strings: - - 'c:\src\llvm-project\build\symbol-types.c' + - 'c:\src\llvm-project\build\a.c' - !Symbols Records: - Kind: S_BUILDINFO BuildInfoSym: - BuildId: 4111 + BuildId: 4110 Relocations: - - VirtualAddress: 164 + - VirtualAddress: 152 + SymbolName: g + Type: IMAGE_REL_AMD64_SECREL + - VirtualAddress: 156 + SymbolName: g + Type: IMAGE_REL_AMD64_SECTION + - VirtualAddress: 220 + SymbolName: g + Type: IMAGE_REL_AMD64_SECREL + - VirtualAddress: 224 + SymbolName: g + Type: IMAGE_REL_AMD64_SECTION + - VirtualAddress: 292 SymbolName: main Type: IMAGE_REL_AMD64_SECREL - - VirtualAddress: 168 + - VirtualAddress: 296 SymbolName: main Type: IMAGE_REL_AMD64_SECTION - - VirtualAddress: 220 + - VirtualAddress: 369 SymbolName: main Type: IMAGE_REL_AMD64_SECREL - - VirtualAddress: 224 + - VirtualAddress: 373 SymbolName: main Type: IMAGE_REL_AMD64_SECTION - - VirtualAddress: 284 - SymbolName: global_foo + - VirtualAddress: 412 + SymbolName: main Type: IMAGE_REL_AMD64_SECREL - - VirtualAddress: 288 - SymbolName: global_foo + - VirtualAddress: 416 + SymbolName: main + Type: IMAGE_REL_AMD64_SECTION + - VirtualAddress: 452 + SymbolName: main + Type: IMAGE_REL_AMD64_SECREL + - VirtualAddress: 456 + SymbolName: main Type: IMAGE_REL_AMD64_SECTION - Name: '.debug$T' Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ] @@ -164,56 +220,40 @@ Types: - Kind: LF_ARGLIST ArgList: - ArgIndices: [ 0 ] + ArgIndices: [ 116 ] - Kind: LF_PROCEDURE Procedure: - ReturnType: 116 + ReturnType: 3 CallConv: NearC Options: [ None ] - ParameterCount: 0 + ParameterCount: 1 ArgumentList: 4096 + - Kind: LF_POINTER + Pointer: + ReferentType: 4097 + Attrs: 65548 - Kind: LF_FUNC_ID FuncId: ParentScope: 0 FunctionType: 4097 + Name: g + - Kind: LF_PROCEDURE + Procedure: + ReturnType: 116 + CallConv: NearC + Options: [ None ] + ParameterCount: 1 + ArgumentList: 4096 + - Kind: LF_FUNC_ID + FuncId: + ParentScope: 0 + FunctionType: 4100 Name: main - - Kind: LF_STRUCTURE - Class: - MemberCount: 0 - Options: [ None, ForwardReference, HasUniqueName ] - FieldList: 0 - Name: Foo - UniqueName: '.?AUFoo@@' - DerivationList: 0 - VTableShape: 0 - Size: 0 - - Kind: LF_FIELDLIST - FieldList: - - Kind: LF_MEMBER - DataMember: - Attrs: 3 - Type: 116 - FieldOffset: 0 - Name: x - - Kind: LF_STRUCTURE - Class: - MemberCount: 1 - Options: [ None, HasUniqueName ] - FieldList: 4100 - Name: Foo - UniqueName: '.?AUFoo@@' - DerivationList: 0 - VTableShape: 0 - Size: 4 - - Kind: LF_STRING_ID - StringId: - Id: 0 - String: 'c:\src\llvm-project\build\symbol-types.c' - - Kind: LF_UDT_SRC_LINE - UdtSourceLine: - UDT: 4101 - SourceFile: 4102 - LineNumber: 1 + - Kind: LF_FUNC_ID + FuncId: + ParentScope: 0 + FunctionType: 4097 + Name: f - Kind: LF_STRING_ID StringId: Id: 0 @@ -228,47 +268,52 @@ String: '-c -Z7 -MT -IC:\PROGRA~2\MICROS~1.0\VC\include -IC:\PROGRA~2\MICROS~1.0\VC\atlmfc\include -IC:\PROGRA~2\WI3CF2~1\10\include\10.0.14393.0\ucrt -IC:\PROGRA~2\WI3CF2~1\10\include\10.0.14393.0\shared -IC:\PROGRA~2\WI3CF2~1\10\include\10.0.14393.0\um' - Kind: LF_SUBSTR_LIST StringList: - StringIndices: [ 4106 ] + StringIndices: [ 4105 ] - Kind: LF_STRING_ID StringId: - Id: 4107 + Id: 4106 String: ' -IC:\PROGRA~2\WI3CF2~1\10\include\10.0.14393.0\winrt -TC -X' - Kind: LF_STRING_ID StringId: Id: 0 - String: symbol-types.c + String: a.c - Kind: LF_STRING_ID StringId: Id: 0 String: 'C:\src\llvm-project\build\vc140.pdb' - Kind: LF_BUILDINFO BuildInfo: - ArgIndices: [ 4104, 4105, 4109, 4110, 4108 ] - - Name: .data - Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_WRITE ] - Alignment: 4 - SectionData: 2A000000 + ArgIndices: [ 4103, 4104, 4108, 4109, 4107 ] - Name: '.text$mn' Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ] Alignment: 16 - SectionData: 8B0500000000C3 + SectionData: 894C2408C3CCCCCCCCCCCCCCCCCCCCCC894C24084883EC38837C2440007413C74424202A0000008B4C2420E800000000EB11C74424240D0000008B4C2424E80000000033C04883C438C3 Relocations: - - VirtualAddress: 2 - SymbolName: global_foo + - VirtualAddress: 44 + SymbolName: f + Type: IMAGE_REL_AMD64_REL32 + - VirtualAddress: 63 + SymbolName: f Type: IMAGE_REL_AMD64_REL32 + - Name: .xdata + Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ] + Alignment: 4 + SectionData: '0108010008620000' + - Name: .pdata + Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ] + Alignment: 4 + SectionData: 000000003A00000000000000 + Relocations: + - VirtualAddress: 0 + SymbolName: '$LN5' + Type: IMAGE_REL_AMD64_ADDR32NB + - VirtualAddress: 4 + SymbolName: '$LN5' + Type: IMAGE_REL_AMD64_ADDR32NB + - VirtualAddress: 8 + SymbolName: '$unwind$main' + Type: IMAGE_REL_AMD64_ADDR32NB symbols: - - Name: '@comp.id' - Value: 17063575 - SectionNumber: -1 - SimpleType: IMAGE_SYM_TYPE_NULL - ComplexType: IMAGE_SYM_DTYPE_NULL - StorageClass: IMAGE_SYM_CLASS_STATIC - - Name: '@feat.00' - Value: 2147484048 - SectionNumber: -1 - SimpleType: IMAGE_SYM_TYPE_NULL - ComplexType: IMAGE_SYM_DTYPE_NULL - StorageClass: IMAGE_SYM_CLASS_STATIC - Name: .drectve Value: 0 SectionNumber: 1 @@ -288,8 +333,8 @@ ComplexType: IMAGE_SYM_DTYPE_NULL StorageClass: IMAGE_SYM_CLASS_STATIC SectionDefinition: - Length: 432 - NumberOfRelocations: 6 + Length: 628 + NumberOfRelocations: 12 NumberOfLinenumbers: 0 CheckSum: 0 Number: 0 @@ -300,45 +345,81 @@ ComplexType: IMAGE_SYM_DTYPE_NULL StorageClass: IMAGE_SYM_CLASS_STATIC SectionDefinition: - Length: 732 + Length: 624 NumberOfRelocations: 0 NumberOfLinenumbers: 0 CheckSum: 0 Number: 0 - - Name: .data + - Name: '.text$mn' Value: 0 SectionNumber: 4 SimpleType: IMAGE_SYM_TYPE_NULL ComplexType: IMAGE_SYM_DTYPE_NULL StorageClass: IMAGE_SYM_CLASS_STATIC SectionDefinition: - Length: 4 - NumberOfRelocations: 0 + Length: 74 + NumberOfRelocations: 2 NumberOfLinenumbers: 0 - CheckSum: 3482275674 + CheckSum: 2120072435 Number: 0 - - Name: global_foo + - Name: g Value: 0 SectionNumber: 4 SimpleType: IMAGE_SYM_TYPE_NULL - ComplexType: IMAGE_SYM_DTYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_FUNCTION StorageClass: IMAGE_SYM_CLASS_EXTERNAL - - Name: '.text$mn' + - Name: f + Value: 0 + SectionNumber: 0 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_FUNCTION + StorageClass: IMAGE_SYM_CLASS_EXTERNAL + - Name: main + Value: 16 + SectionNumber: 4 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_FUNCTION + StorageClass: IMAGE_SYM_CLASS_EXTERNAL + - Name: '$LN5' + Value: 16 + SectionNumber: 4 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_LABEL + - Name: .xdata Value: 0 SectionNumber: 5 SimpleType: IMAGE_SYM_TYPE_NULL ComplexType: IMAGE_SYM_DTYPE_NULL StorageClass: IMAGE_SYM_CLASS_STATIC SectionDefinition: - Length: 7 - NumberOfRelocations: 1 + Length: 8 + NumberOfRelocations: 0 NumberOfLinenumbers: 0 - CheckSum: 3635526833 + CheckSum: 3137252093 Number: 0 - - Name: main + - Name: '$unwind$main' Value: 0 SectionNumber: 5 SimpleType: IMAGE_SYM_TYPE_NULL - ComplexType: IMAGE_SYM_DTYPE_FUNCTION - StorageClass: IMAGE_SYM_CLASS_EXTERNAL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_STATIC + - Name: .pdata + Value: 0 + SectionNumber: 6 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_STATIC + SectionDefinition: + Length: 12 + NumberOfRelocations: 3 + NumberOfLinenumbers: 0 + CheckSum: 336416693 + Number: 0 + - Name: '$pdata$main' + Value: 0 + SectionNumber: 6 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_STATIC ... Index: lld/test/COFF/Inputs/pdb-scopes-b.yaml =================================================================== --- lld/test/COFF/Inputs/pdb-scopes-b.yaml +++ lld/test/COFF/Inputs/pdb-scopes-b.yaml @@ -1,43 +1,3 @@ -# RUN: yaml2obj %s -o %t.obj -# RUN: lld-link %t.obj -nodefaultlib -entry:main -debug -out:%t.exe -pdb:%t.pdb -# RUN: llvm-pdbutil dump -symbols %t.pdb | FileCheck %s - -# To regenerate the object file: -# $ cat symbol-types.c -# struct Foo { int x; }; -# typedef struct Foo UDT_Foo; -# UDT_Foo global_foo = {42}; -# int main() { return global_foo.x; } -# $ cl -c -Z7 symbol-types.c - -# Note that the type of 'global' goes from 0x1005 in the object file to 0x1004 -# in the PDB because the LF_FUNC_ID is moved to the id stream. - -# CHECK: Symbols -# CHECK: ============================================================ -# CHECK-LABEL: Mod 0000 | `{{.*}}pdb-symbol-types.yaml.tmp.obj`: -# CHECK: - S_OBJNAME [size = 52] sig=0, `C:\src\llvm-project\build\symbol-types.obj` -# CHECK: - S_COMPILE3 [size = 60] -# CHECK: machine = intel x86-x64, Ver = Microsoft (R) Optimizing Compiler, language = c -# CHECK: frontend = 19.0.24215.1, backend = 19.0.24215.1 -# CHECK: flags = security checks | hot patchable -# CHECK: - S_GPROC32_ID [size = 44] `main` -# CHECK: parent = 0, addr = 0002:0000, code size = 7, end = 0 -# CHECK: debug start = 0, debug end = 6, flags = none -# CHECK: - S_FRAMEPROC [size = 32] -# CHECK: size = 0, padding size = 0, offset to padding = 0 -# CHECK: bytes of callee saved registers = 0, exception handler addr = 0000:0000 -# CHECK: flags = has async eh | opt speed -# CHECK: - S_END [size = 4] -# CHECK: - S_GDATA32 [size = 28] `global_foo` -# CHECK: type = 0x1004 (Foo), addr = 0001:0000 -# CHECK: - S_UDT [size = 16] `UDT_Foo` -# CHECK: original type = 0x1004 -# CHECK: - S_UDT [size = 12] `Foo` -# CHECK: original type = 0x1004 -# CHECK: - S_BUILDINFO [size = 8] BuildId = `4106` -# CHECK-LABEL: Mod 0001 | `* Linker *`: - --- !COFF header: Machine: IMAGE_FILE_MACHINE_AMD64 @@ -56,7 +16,7 @@ - Kind: S_OBJNAME ObjNameSym: Signature: 0 - ObjectName: 'C:\src\llvm-project\build\symbol-types.obj' + ObjectName: 'C:\src\llvm-project\build\b.obj' - Kind: S_COMPILE3 Compile3Sym: Flags: [ SecurityChecks, HotPatch ] @@ -74,89 +34,133 @@ Records: - Kind: S_GPROC32_ID ProcSym: - CodeSize: 7 - DbgStart: 0 - DbgEnd: 6 - FunctionType: 4098 + CodeSize: 62 + DbgStart: 8 + DbgEnd: 57 + FunctionType: 4101 Flags: [ ] - DisplayName: main + DisplayName: f - Kind: S_FRAMEPROC FrameProcSym: - TotalFrameBytes: 0 + TotalFrameBytes: 56 PaddingFrameBytes: 0 OffsetToPadding: 0 BytesOfCalleeSavedRegisters: 0 OffsetOfExceptionHandler: 0 SectionIdOfExceptionHandler: 0 Flags: [ AsynchronousExceptionHandling, OptimizedForSpeed ] + - Kind: S_REGREL32 + RegRelativeSym: + Offset: 64 + Type: 116 + Register: RSP + VarName: x + - Kind: S_BLOCK32 + BlockSym: + CodeSize: 20 + Offset: 15 + BlockName: '' + - Kind: S_REGREL32 + RegRelativeSym: + Offset: 32 + Type: 116 + Register: RSP + VarName: y + - Kind: S_END + ScopeEndSym: + - Kind: S_BLOCK32 + BlockSym: + CodeSize: 20 + Offset: 37 + BlockName: '' + - Kind: S_REGREL32 + RegRelativeSym: + Offset: 36 + Type: 116 + Register: RSP + VarName: w + - Kind: S_END + ScopeEndSym: - Kind: S_PROC_ID_END ScopeEndSym: - !Lines - CodeSize: 7 + CodeSize: 62 Flags: [ ] RelocOffset: 0 RelocSegment: 0 Blocks: - - FileName: 'c:\src\llvm-project\build\symbol-types.c' + - FileName: 'c:\src\llvm-project\build\b.c' Lines: - Offset: 0 + LineStart: 2 + IsStatement: true + EndDelta: 0 + - Offset: 8 + LineStart: 3 + IsStatement: true + EndDelta: 0 + - Offset: 15 LineStart: 4 IsStatement: true EndDelta: 0 - - Offset: 0 + - Offset: 26 LineStart: 5 IsStatement: true EndDelta: 0 - - Offset: 6 + - Offset: 35 LineStart: 6 IsStatement: true EndDelta: 0 + - Offset: 37 + LineStart: 7 + IsStatement: true + EndDelta: 0 + - Offset: 48 + LineStart: 8 + IsStatement: true + EndDelta: 0 + - Offset: 57 + LineStart: 10 + IsStatement: true + EndDelta: 0 Columns: - - !Symbols - Records: - - Kind: S_GDATA32 - DataSym: - Type: 4101 - DisplayName: global_foo - - Kind: S_UDT - UDTSym: - Type: 4101 - UDTName: UDT_Foo - - Kind: S_UDT - UDTSym: - Type: 4101 - UDTName: Foo - !FileChecksums Checksums: - - FileName: 'c:\src\llvm-project\build\symbol-types.c' + - FileName: 'c:\src\llvm-project\build\b.c' Kind: MD5 - Checksum: F833E1A4909FF6FEC5689A664F3BE725 + Checksum: 8E8C92DB46478902EBEAEBFCFF15A6E0 - !StringTable Strings: - - 'c:\src\llvm-project\build\symbol-types.c' + - 'c:\src\llvm-project\build\b.c' - !Symbols Records: - Kind: S_BUILDINFO BuildInfoSym: - BuildId: 4111 + BuildId: 4110 Relocations: - - VirtualAddress: 164 - SymbolName: main + - VirtualAddress: 152 + SymbolName: f Type: IMAGE_REL_AMD64_SECREL - - VirtualAddress: 168 - SymbolName: main + - VirtualAddress: 156 + SymbolName: f Type: IMAGE_REL_AMD64_SECTION - - VirtualAddress: 220 - SymbolName: main + - VirtualAddress: 223 + SymbolName: f Type: IMAGE_REL_AMD64_SECREL - - VirtualAddress: 224 - SymbolName: main + - VirtualAddress: 227 + SymbolName: f Type: IMAGE_REL_AMD64_SECTION - - VirtualAddress: 284 - SymbolName: global_foo + - VirtualAddress: 266 + SymbolName: f Type: IMAGE_REL_AMD64_SECREL - - VirtualAddress: 288 - SymbolName: global_foo + - VirtualAddress: 270 + SymbolName: f + Type: IMAGE_REL_AMD64_SECTION + - VirtualAddress: 308 + SymbolName: f + Type: IMAGE_REL_AMD64_SECREL + - VirtualAddress: 312 + SymbolName: f Type: IMAGE_REL_AMD64_SECTION - Name: '.debug$T' Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ] @@ -167,53 +171,35 @@ ArgIndices: [ 0 ] - Kind: LF_PROCEDURE Procedure: - ReturnType: 116 + ReturnType: 3 CallConv: NearC Options: [ None ] ParameterCount: 0 ArgumentList: 4096 + - Kind: LF_POINTER + Pointer: + ReferentType: 4097 + Attrs: 65548 + - Kind: LF_ARGLIST + ArgList: + ArgIndices: [ 116 ] + - Kind: LF_PROCEDURE + Procedure: + ReturnType: 3 + CallConv: NearC + Options: [ None ] + ParameterCount: 1 + ArgumentList: 4099 + - Kind: LF_FUNC_ID + FuncId: + ParentScope: 0 + FunctionType: 4100 + Name: f - Kind: LF_FUNC_ID FuncId: ParentScope: 0 FunctionType: 4097 - Name: main - - Kind: LF_STRUCTURE - Class: - MemberCount: 0 - Options: [ None, ForwardReference, HasUniqueName ] - FieldList: 0 - Name: Foo - UniqueName: '.?AUFoo@@' - DerivationList: 0 - VTableShape: 0 - Size: 0 - - Kind: LF_FIELDLIST - FieldList: - - Kind: LF_MEMBER - DataMember: - Attrs: 3 - Type: 116 - FieldOffset: 0 - Name: x - - Kind: LF_STRUCTURE - Class: - MemberCount: 1 - Options: [ None, HasUniqueName ] - FieldList: 4100 - Name: Foo - UniqueName: '.?AUFoo@@' - DerivationList: 0 - VTableShape: 0 - Size: 4 - - Kind: LF_STRING_ID - StringId: - Id: 0 - String: 'c:\src\llvm-project\build\symbol-types.c' - - Kind: LF_UDT_SRC_LINE - UdtSourceLine: - UDT: 4101 - SourceFile: 4102 - LineNumber: 1 + Name: g - Kind: LF_STRING_ID StringId: Id: 0 @@ -228,47 +214,52 @@ String: '-c -Z7 -MT -IC:\PROGRA~2\MICROS~1.0\VC\include -IC:\PROGRA~2\MICROS~1.0\VC\atlmfc\include -IC:\PROGRA~2\WI3CF2~1\10\include\10.0.14393.0\ucrt -IC:\PROGRA~2\WI3CF2~1\10\include\10.0.14393.0\shared -IC:\PROGRA~2\WI3CF2~1\10\include\10.0.14393.0\um' - Kind: LF_SUBSTR_LIST StringList: - StringIndices: [ 4106 ] + StringIndices: [ 4105 ] - Kind: LF_STRING_ID StringId: - Id: 4107 + Id: 4106 String: ' -IC:\PROGRA~2\WI3CF2~1\10\include\10.0.14393.0\winrt -TC -X' - Kind: LF_STRING_ID StringId: Id: 0 - String: symbol-types.c + String: b.c - Kind: LF_STRING_ID StringId: Id: 0 String: 'C:\src\llvm-project\build\vc140.pdb' - Kind: LF_BUILDINFO BuildInfo: - ArgIndices: [ 4104, 4105, 4109, 4110, 4108 ] - - Name: .data - Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_WRITE ] - Alignment: 4 - SectionData: 2A000000 + ArgIndices: [ 4103, 4104, 4108, 4109, 4107 ] - Name: '.text$mn' Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ] Alignment: 16 - SectionData: 8B0500000000C3 + SectionData: 894C24084883EC38837C24400074168B44244083C003894424208B4C2420E800000000EB148B44244083C004894424248B4C2424E8000000004883C438C3 Relocations: - - VirtualAddress: 2 - SymbolName: global_foo + - VirtualAddress: 31 + SymbolName: g + Type: IMAGE_REL_AMD64_REL32 + - VirtualAddress: 53 + SymbolName: g Type: IMAGE_REL_AMD64_REL32 + - Name: .xdata + Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ] + Alignment: 4 + SectionData: '0108010008620000' + - Name: .pdata + Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ] + Alignment: 4 + SectionData: '000000003E00000000000000' + Relocations: + - VirtualAddress: 0 + SymbolName: '$LN5' + Type: IMAGE_REL_AMD64_ADDR32NB + - VirtualAddress: 4 + SymbolName: '$LN5' + Type: IMAGE_REL_AMD64_ADDR32NB + - VirtualAddress: 8 + SymbolName: '$unwind$f' + Type: IMAGE_REL_AMD64_ADDR32NB symbols: - - Name: '@comp.id' - Value: 17063575 - SectionNumber: -1 - SimpleType: IMAGE_SYM_TYPE_NULL - ComplexType: IMAGE_SYM_DTYPE_NULL - StorageClass: IMAGE_SYM_CLASS_STATIC - - Name: '@feat.00' - Value: 2147484048 - SectionNumber: -1 - SimpleType: IMAGE_SYM_TYPE_NULL - ComplexType: IMAGE_SYM_DTYPE_NULL - StorageClass: IMAGE_SYM_CLASS_STATIC - Name: .drectve Value: 0 SectionNumber: 1 @@ -288,8 +279,8 @@ ComplexType: IMAGE_SYM_DTYPE_NULL StorageClass: IMAGE_SYM_CLASS_STATIC SectionDefinition: - Length: 432 - NumberOfRelocations: 6 + Length: 484 + NumberOfRelocations: 8 NumberOfLinenumbers: 0 CheckSum: 0 Number: 0 @@ -300,45 +291,75 @@ ComplexType: IMAGE_SYM_DTYPE_NULL StorageClass: IMAGE_SYM_CLASS_STATIC SectionDefinition: - Length: 732 + Length: 616 NumberOfRelocations: 0 NumberOfLinenumbers: 0 CheckSum: 0 Number: 0 - - Name: .data + - Name: '.text$mn' Value: 0 SectionNumber: 4 SimpleType: IMAGE_SYM_TYPE_NULL ComplexType: IMAGE_SYM_DTYPE_NULL StorageClass: IMAGE_SYM_CLASS_STATIC SectionDefinition: - Length: 4 - NumberOfRelocations: 0 + Length: 62 + NumberOfRelocations: 2 NumberOfLinenumbers: 0 - CheckSum: 3482275674 + CheckSum: 3841032836 Number: 0 - - Name: global_foo + - Name: g + Value: 0 + SectionNumber: 0 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_FUNCTION + StorageClass: IMAGE_SYM_CLASS_EXTERNAL + - Name: f Value: 0 SectionNumber: 4 SimpleType: IMAGE_SYM_TYPE_NULL - ComplexType: IMAGE_SYM_DTYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_FUNCTION StorageClass: IMAGE_SYM_CLASS_EXTERNAL - - Name: '.text$mn' + - Name: '$LN5' + Value: 0 + SectionNumber: 4 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_LABEL + - Name: .xdata Value: 0 SectionNumber: 5 SimpleType: IMAGE_SYM_TYPE_NULL ComplexType: IMAGE_SYM_DTYPE_NULL StorageClass: IMAGE_SYM_CLASS_STATIC SectionDefinition: - Length: 7 - NumberOfRelocations: 1 + Length: 8 + NumberOfRelocations: 0 NumberOfLinenumbers: 0 - CheckSum: 3635526833 + CheckSum: 3137252093 Number: 0 - - Name: main + - Name: '$unwind$f' Value: 0 SectionNumber: 5 SimpleType: IMAGE_SYM_TYPE_NULL - ComplexType: IMAGE_SYM_DTYPE_FUNCTION - StorageClass: IMAGE_SYM_CLASS_EXTERNAL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_STATIC + - Name: .pdata + Value: 0 + SectionNumber: 6 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_STATIC + SectionDefinition: + Length: 12 + NumberOfRelocations: 3 + NumberOfLinenumbers: 0 + CheckSum: 2420588879 + Number: 0 + - Name: '$pdata$f' + Value: 0 + SectionNumber: 6 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_STATIC ... Index: lld/test/COFF/pdb-comdat.test =================================================================== --- lld/test/COFF/pdb-comdat.test +++ lld/test/COFF/pdb-comdat.test @@ -48,7 +48,7 @@ CHECK: flags = security checks | hot patchable CHECK: - S_GPROC32_ID [size = 44] `main` FIXME: We need to fill in "end". -CHECK: parent = 0, addr = 0002:0000, code size = 24, end = 0 +CHECK: parent = 0, addr = 0002:0000, code size = 24, end = 196 CHECK: debug start = 4, debug end = 19, flags = none CHECK: - S_FRAMEPROC [size = 32] CHECK: size = 40, padding size = 0, offset to padding = 0 @@ -59,7 +59,7 @@ CHECK: type = 0x0074 (int), addr = 0000:0000 CHECK: - S_BUILDINFO [size = 8] BuildId = `4106` CHECK: - S_GPROC32_ID [size = 44] `foo` -CHECK: parent = 0, addr = 0002:0032, code size = 15, end = 0 +CHECK: parent = 0, addr = 0002:0032, code size = 15, end = 308 CHECK: debug start = 0, debug end = 14, flags = none CHECK: - S_FRAMEPROC [size = 32] CHECK: size = 0, padding size = 0, offset to padding = 0 @@ -73,7 +73,7 @@ CHECK: frontend = 19.0.24215.1, backend = 19.0.24215.1 CHECK: flags = security checks | hot patchable CHECK: - S_GPROC32_ID [size = 44] `bar` -CHECK: parent = 0, addr = 0002:0048, code size = 14, end = 0 +CHECK: parent = 0, addr = 0002:0048, code size = 14, end = 196 CHECK: debug start = 4, debug end = 9, flags = none CHECK: - S_FRAMEPROC [size = 32] CHECK: size = 40, padding size = 0, offset to padding = 0 Index: lld/test/COFF/pdb-scopes.test =================================================================== --- /dev/null +++ lld/test/COFF/pdb-scopes.test @@ -0,0 +1,92 @@ +Consider this program: + +$ cat a.c +void g(int x) {} +void f(int x); +int main(int argc) { + if (argc) { + int x = 42; + f(x); + } else { + int y = 13; + f(y); + } +} + +$ cat b.c +extern void g(); +void f(int x) { + if (x) { + int y = x + 3; + g(y); + } else { + int w = x + 4; + g(w); + } +} + +This program is interesting because there are two TUs, and each TU has nested +scopes. Make sure we get the right parent and end offsets. + +RUN: yaml2obj %S/Inputs/pdb-scopes-a.yaml -o %t-a.obj +RUN: yaml2obj %S/Inputs/pdb-scopes-b.yaml -o %t-b.obj +RUN: lld-link %t-a.obj %t-b.obj -debug -entry:main -nodefaultlib -out:%t.exe -pdb:%t.pdb +RUN: llvm-pdbutil dump -symbols %t.pdb | FileCheck %s + +CHECK-LABEL: Mod 0000 | `C:\src\llvm-project\build\tools\lld\test\COFF\Output\pdb-scopes.test.tmp-a.obj`: +CHECK: - S_GPROC32_ID [size = 44] `g` +CHECK: parent = 0, addr = 0002:0000, code size = 5, end = 196 +CHECK: debug start = 4, debug end = 4, flags = none +CHECK: - S_FRAMEPROC [size = 32] +CHECK: - S_REGREL32 [size = 16] `x` +CHECK: type = 0x0074 (int), register = rsp, offset = 8 +CHECK: - S_END [size = 4] +CHECK: - S_GPROC32_ID [size = 44] `main` +CHECK: parent = 0, addr = 0002:0016, code size = 58, end = 384 +CHECK: debug start = 8, debug end = 53, flags = none +CHECK: - S_FRAMEPROC [size = 32] +CHECK: - S_REGREL32 [size = 20] `argc` +CHECK: type = 0x0074 (int), register = rsp, offset = 64 +CHECK: - S_BLOCK32 [size = 24] `` +CHECK: parent = 200, addr = 0002:0031 +CHECK: code size = 17, end = 336 +CHECK: - S_REGREL32 [size = 16] `x` +CHECK: type = 0x0074 (int), register = rsp, offset = 32 +CHECK: - S_END [size = 4] +CHECK: - S_BLOCK32 [size = 24] `` +CHECK: parent = 200, addr = 0002:0050 +CHECK: code size = 17, end = 380 +CHECK: - S_REGREL32 [size = 16] `y` +CHECK: type = 0x0074 (int), register = rsp, offset = 36 +CHECK: - S_END [size = 4] +CHECK: - S_END [size = 4] +CHECK: - S_BUILDINFO [size = 8] BuildId = `4106` + +CHECK-LABEL: Mod 0001 | `C:\src\llvm-project\build\tools\lld\test\COFF\Output\pdb-scopes.test.tmp-b.obj`: +CHECK: - S_OBJNAME [size = 40] sig=0, `C:\src\llvm-project\build\b.obj` +CHECK: - S_COMPILE3 [size = 60] +CHECK: machine = intel x86-x64, Ver = Microsoft (R) Optimizing Compiler, language = c +CHECK: frontend = 19.0.24215.1, backend = 19.0.24215.1 +CHECK: flags = security checks | hot patchable +CHECK: - S_GPROC32_ID [size = 44] `f` +CHECK: parent = 0, addr = 0002:0080, code size = 62, end = 284 +CHECK: debug start = 8, debug end = 57, flags = none +CHECK: - S_FRAMEPROC [size = 32] +CHECK: - S_REGREL32 [size = 16] `x` +CHECK: type = 0x0074 (int), register = rsp, offset = 64 +CHECK: - S_BLOCK32 [size = 24] `` +CHECK: parent = 104, addr = 0002:0095 +CHECK: code size = 20, end = 236 +CHECK: - S_REGREL32 [size = 16] `y` +CHECK: type = 0x0074 (int), register = rsp, offset = 32 +CHECK: - S_END [size = 4] +CHECK: - S_BLOCK32 [size = 24] `` +CHECK: parent = 104, addr = 0002:0117 +CHECK: code size = 20, end = 280 +CHECK: - S_REGREL32 [size = 16] `w` +CHECK: type = 0x0074 (int), register = rsp, offset = 36 +CHECK: - S_END [size = 4] +CHECK: - S_END [size = 4] +CHECK: - S_BUILDINFO [size = 8] BuildId = `4109` + +CHECK-LABEL: Mod 0002 | `* Linker *`: Index: lld/test/COFF/pdb-symbol-types.yaml =================================================================== --- lld/test/COFF/pdb-symbol-types.yaml +++ lld/test/COFF/pdb-symbol-types.yaml @@ -22,7 +22,7 @@ # CHECK: frontend = 19.0.24215.1, backend = 19.0.24215.1 # CHECK: flags = security checks | hot patchable # CHECK: - S_GPROC32_ID [size = 44] `main` -# CHECK: parent = 0, addr = 0002:0000, code size = 7, end = 0 +# CHECK: parent = 0, addr = 0002:0000, code size = 7, end = 192 # CHECK: debug start = 0, debug end = 6, flags = none # CHECK: - S_FRAMEPROC [size = 32] # CHECK: size = 0, padding size = 0, offset to padding = 0 Index: llvm/include/llvm/DebugInfo/PDB/Native/DbiModuleDescriptorBuilder.h =================================================================== --- llvm/include/llvm/DebugInfo/PDB/Native/DbiModuleDescriptorBuilder.h +++ llvm/include/llvm/DebugInfo/PDB/Native/DbiModuleDescriptorBuilder.h @@ -68,6 +68,10 @@ uint32_t calculateSerializedLength() const; + /// Return the offset within the module symbol stream of the next symbol + /// record passed to addSymbol. Add four to account for the signature. + uint32_t getNextSymbolOffset() const { return SymbolByteSize + 4; } + void finalize(); Error finalizeMsfLayout();