# 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 -globals %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-LABEL:                  Global Symbols
# CHECK-NEXT:  ============================================================
# CHECK-NEXT:   Records
# CHECK-NEXT:       48 | S_PROCREF [size = 20] `main`
# CHECK-NEXT:             module = 1, sum name = 0, offset = 116
# CHECK-NEXT:       68 | S_GDATA32 [size = 28] `global_foo`
# CHECK-NEXT:             type = 0x1004 (Foo), addr = 0001:0000

# CHECK:                           Symbols
# CHECK: ============================================================
# CHECK-LABEL:   Mod 0000 | `{{.*}}pdb-symbol-types.yaml.tmp.obj`:
# CHECK:     4 | S_OBJNAME [size = 52] sig=0, `C:\src\llvm-project\build\symbol-types.obj`
# CHECK:    56 | 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:   116 | S_GPROC32 [size = 44] `main`
# CHECK:         parent = 0, end = 192, addr = 0002:0000, code size = 7
# CHECK:         debug start = 0, debug end = 6, flags = none
# CHECK:   160 | 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:   192 | S_END [size = 4]
# CHECK:   196 | S_BUILDINFO [size = 8] BuildId = `0x100A`
# CHECK-LABEL:   Mod 0001 | `* Linker *`:

--- !COFF
header:
  Machine:         IMAGE_FILE_MACHINE_AMD64
  Characteristics: [  ]
sections:
  - Name:            .drectve
    Characteristics: [ IMAGE_SCN_LNK_INFO, IMAGE_SCN_LNK_REMOVE ]
    Alignment:       1
    SectionData:     2020202F44454641554C544C49423A224C4942434D5422202F44454641554C544C49423A224F4C444E414D45532220
  - Name:            '.debug$S'
    Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]
    Alignment:       1
    Subsections:
      - !Symbols
        Records:
          - Kind:            S_OBJNAME
            ObjNameSym:
              Signature:       0
              ObjectName:      'C:\src\llvm-project\build\symbol-types.obj'
          - Kind:            S_COMPILE3
            Compile3Sym:
              Flags:           [ SecurityChecks, HotPatch ]
              Machine:         X64
              FrontendMajor:   19
              FrontendMinor:   0
              FrontendBuild:   24215
              FrontendQFE:     1
              BackendMajor:    19
              BackendMinor:    0
              BackendBuild:    24215
              BackendQFE:      1
              Version:         'Microsoft (R) Optimizing Compiler'
      - !Symbols
        Records:
          - Kind:            S_GPROC32_ID
            ProcSym:
              CodeSize:        7
              DbgStart:        0
              DbgEnd:          6
              FunctionType:    4098
              Flags:           [  ]
              DisplayName:     main
          - Kind:            S_FRAMEPROC
            FrameProcSym:
              TotalFrameBytes: 0
              PaddingFrameBytes: 0
              OffsetToPadding: 0
              BytesOfCalleeSavedRegisters: 0
              OffsetOfExceptionHandler: 0
              SectionIdOfExceptionHandler: 0
              Flags:           [ AsynchronousExceptionHandling, OptimizedForSpeed ]
          - Kind:            S_PROC_ID_END
            ScopeEndSym:
      - !Lines
        CodeSize:        7
        Flags:           [  ]
        RelocOffset:     0
        RelocSegment:    0
        Blocks:
          - FileName:        'c:\src\llvm-project\build\symbol-types.c'
            Lines:
              - Offset:          0
                LineStart:       4
                IsStatement:     true
                EndDelta:        0
              - Offset:          0
                LineStart:       5
                IsStatement:     true
                EndDelta:        0
              - Offset:          6
                LineStart:       6
                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'
            Kind:            MD5
            Checksum:        F833E1A4909FF6FEC5689A664F3BE725
      - !StringTable
        Strings:
          - 'c:\src\llvm-project\build\symbol-types.c'
      - !Symbols
        Records:
          - Kind:            S_BUILDINFO
            BuildInfoSym:
              BuildId:         4111
    Relocations:
      - VirtualAddress:  164
        SymbolName:      main
        Type:            IMAGE_REL_AMD64_SECREL
      - VirtualAddress:  168
        SymbolName:      main
        Type:            IMAGE_REL_AMD64_SECTION
      - VirtualAddress:  220
        SymbolName:      main
        Type:            IMAGE_REL_AMD64_SECREL
      - VirtualAddress:  224
        SymbolName:      main
        Type:            IMAGE_REL_AMD64_SECTION
      - VirtualAddress:  284
        SymbolName:      global_foo
        Type:            IMAGE_REL_AMD64_SECREL
      - VirtualAddress:  288
        SymbolName:      global_foo
        Type:            IMAGE_REL_AMD64_SECTION
  - Name:            '.debug$T'
    Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]
    Alignment:       1
    Types:
      - Kind:            LF_ARGLIST
        ArgList:
          ArgIndices:      [ 0 ]
      - Kind:            LF_PROCEDURE
        Procedure:
          ReturnType:      116
          CallConv:        NearC
          Options:         [ None ]
          ParameterCount:  0
          ArgumentList:    4096
      - 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
      - Kind:            LF_STRING_ID
        StringId:
          Id:              0
          String:          'C:\src\llvm-project\build'
      - Kind:            LF_STRING_ID
        StringId:
          Id:              0
          String:          'C:\PROGRA~2\MICROS~1.0\VC\Bin\amd64\cl.exe'
      - Kind:            LF_STRING_ID
        StringId:
          Id:              0
          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 ]
      - Kind:            LF_STRING_ID
        StringId:
          Id:              4107
          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
      - 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
  - Name:            '.text$mn'
    Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]
    Alignment:       16
    SectionData:     8B0500000000C3
    Relocations:
      - VirtualAddress:  2
        SymbolName:      global_foo
        Type:            IMAGE_REL_AMD64_REL32
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
    SimpleType:      IMAGE_SYM_TYPE_NULL
    ComplexType:     IMAGE_SYM_DTYPE_NULL
    StorageClass:    IMAGE_SYM_CLASS_STATIC
    SectionDefinition:
      Length:          47
      NumberOfRelocations: 0
      NumberOfLinenumbers: 0
      CheckSum:        0
      Number:          0
  - Name:            '.debug$S'
    Value:           0
    SectionNumber:   2
    SimpleType:      IMAGE_SYM_TYPE_NULL
    ComplexType:     IMAGE_SYM_DTYPE_NULL
    StorageClass:    IMAGE_SYM_CLASS_STATIC
    SectionDefinition:
      Length:          432
      NumberOfRelocations: 6
      NumberOfLinenumbers: 0
      CheckSum:        0
      Number:          0
  - Name:            '.debug$T'
    Value:           0
    SectionNumber:   3
    SimpleType:      IMAGE_SYM_TYPE_NULL
    ComplexType:     IMAGE_SYM_DTYPE_NULL
    StorageClass:    IMAGE_SYM_CLASS_STATIC
    SectionDefinition:
      Length:          732
      NumberOfRelocations: 0
      NumberOfLinenumbers: 0
      CheckSum:        0
      Number:          0
  - Name:            .data
    Value:           0
    SectionNumber:   4
    SimpleType:      IMAGE_SYM_TYPE_NULL
    ComplexType:     IMAGE_SYM_DTYPE_NULL
    StorageClass:    IMAGE_SYM_CLASS_STATIC
    SectionDefinition:
      Length:          4
      NumberOfRelocations: 0
      NumberOfLinenumbers: 0
      CheckSum:        3482275674
      Number:          0
  - Name:            global_foo
    Value:           0
    SectionNumber:   4
    SimpleType:      IMAGE_SYM_TYPE_NULL
    ComplexType:     IMAGE_SYM_DTYPE_NULL
    StorageClass:    IMAGE_SYM_CLASS_EXTERNAL
  - Name:            '.text$mn'
    Value:           0
    SectionNumber:   5
    SimpleType:      IMAGE_SYM_TYPE_NULL
    ComplexType:     IMAGE_SYM_DTYPE_NULL
    StorageClass:    IMAGE_SYM_CLASS_STATIC
    SectionDefinition:
      Length:          7
      NumberOfRelocations: 1
      NumberOfLinenumbers: 0
      CheckSum:        3635526833
      Number:          0
  - Name:            main
    Value:           0
    SectionNumber:   5
    SimpleType:      IMAGE_SYM_TYPE_NULL
    ComplexType:     IMAGE_SYM_DTYPE_FUNCTION
    StorageClass:    IMAGE_SYM_CLASS_EXTERNAL
...
