## Check that obj2yaml can parse auxiliary symbols for XCOFF object file correctly.

## 32-bit
# RUN: yaml2obj %s --docnum=1 -o %t32
# RUN: obj2yaml %t32 | FileCheck %s --check-prefix=CHECK32

# CHECK32:      --- !XCOFF
# CHECK32-NEXT: FileHeader:
# CHECK32-NEXT:   MagicNumber:     0x1DF
# CHECK32-NEXT:   NumberOfSections: 0
# CHECK32-NEXT:   CreationTime:    0
# CHECK32-NEXT:   OffsetToSymbolTable: 0x14
# CHECK32-NEXT:   EntriesInSymbolTable: 13
# CHECK32-NEXT:   AuxiliaryHeaderSize: 0
# CHECK32-NEXT:   Flags:           0x0
# CHECK32-NEXT: Symbols:
# CHECK32-NEXT:   - Name:            ''
# CHECK32-NEXT:     Value:           0x0
# CHECK32-NEXT:     Section:         N_UNDEF
# CHECK32-NEXT:     Type:            0x0
# CHECK32-NEXT:     StorageClass:    C_FILE
# CHECK32-NEXT:     NumberOfAuxEntries: 1
# CHECK32-NEXT:     AuxEntries:
# CHECK32-NEXT:       - Type:            AUX_FILE
# CHECK32-NEXT:         FileNameOrString: FileName
# CHECK32-NEXT:         FileStringType:  XFT_CD
# CHECK32-NEXT:   - Name:            ''
# CHECK32-NEXT:     Value:           0x0
# CHECK32-NEXT:     Section:         N_UNDEF
# CHECK32-NEXT:     Type:            0x0
# CHECK32-NEXT:     StorageClass:    C_HIDEXT
# CHECK32-NEXT:     NumberOfAuxEntries: 1
# CHECK32-NEXT:     AuxEntries:
# CHECK32-NEXT:       - Type:            AUX_CSECT
# CHECK32-NEXT:         ParameterHashIndex: 1
# CHECK32-NEXT:         TypeChkSectNum:  2
# CHECK32-NEXT:         SymbolType: XTY_SD
# CHECK32-NEXT:         SymbolAlignment: 5
# CHECK32-NEXT:         StorageMappingClass: XMC_PR
# CHECK32-NEXT:         SectionOrLength: 3
# CHECK32-NEXT:         StabInfoIndex:   4
# CHECK32-NEXT:         StabSectNum:     5
# CHECK32-NEXT:   - Name:            ''
# CHECK32-NEXT:     Value:           0x0
# CHECK32-NEXT:     Section:         N_UNDEF
# CHECK32-NEXT:     Type:            0x0
# CHECK32-NEXT:     StorageClass:    C_EXT
# CHECK32-NEXT:     NumberOfAuxEntries: 2
# CHECK32-NEXT:     AuxEntries:
# CHECK32-NEXT:       - Type:            AUX_FCN
# CHECK32-NEXT:         OffsetToExceptionTbl: 1
# CHECK32-NEXT:         SizeOfFunction:  2
# CHECK32-NEXT:         SymIdxOfNextBeyond: 3
# CHECK32-NEXT:         PtrToLineNum:    4
# CHECK32-NEXT:       - Type:            AUX_CSECT
# CHECK32-NEXT:         ParameterHashIndex: 1
# CHECK32-NEXT:         TypeChkSectNum:  2
# CHECK32-NEXT:         SymbolType: XTY_SD
# CHECK32-NEXT:         SymbolAlignment: 2
# CHECK32-NEXT:         StorageMappingClass: XMC_PR
# CHECK32-NEXT:         SectionOrLength: 4
# CHECK32-NEXT:         StabInfoIndex:   5
# CHECK32-NEXT:         StabSectNum:     6
# CHECK32-NEXT:   - Name:            ''
# CHECK32-NEXT:     Value:           0x0
# CHECK32-NEXT:     Section:         N_UNDEF
# CHECK32-NEXT:     Type:            0x0
# CHECK32-NEXT:     StorageClass:    C_DWARF
# CHECK32-NEXT:     NumberOfAuxEntries: 1
# CHECK32-NEXT:     AuxEntries:
# CHECK32-NEXT:       - Type:            AUX_SECT
# CHECK32-NEXT:         LengthOfSectionPortion: 44
# CHECK32-NEXT:         NumberOfRelocEnt: 1
# CHECK32-NEXT:   - Name:            ''
# CHECK32-NEXT:     Value:           0x0
# CHECK32-NEXT:     Section:         N_UNDEF
# CHECK32-NEXT:     Type:            0x0
# CHECK32-NEXT:     StorageClass:    C_STAT
# CHECK32-NEXT:     NumberOfAuxEntries: 1
# CHECK32-NEXT:     AuxEntries:
# CHECK32-NEXT:       - Type:            AUX_STAT
# CHECK32-NEXT:         SectionLength:   1
# CHECK32-NEXT:         NumberOfRelocEnt: 2
# CHECK32-NEXT:         NumberOfLineNum: 3
# CHECK32-NEXT:   - Name:            ''
# CHECK32-NEXT:     Value:           0x0
# CHECK32-NEXT:     Section:         N_UNDEF
# CHECK32-NEXT:     Type:            0x0
# CHECK32-NEXT:     StorageClass:    C_BLOCK
# CHECK32-NEXT:     NumberOfAuxEntries: 1
# CHECK32-NEXT:     AuxEntries:
# CHECK32-NEXT:       - Type:            AUX_SYM
# CHECK32-NEXT:         LineNumHi:       1
# CHECK32-NEXT:         LineNumLo:       2

--- !XCOFF
FileHeader:
  MagicNumber: 0x01DF
Symbols:
  - StorageClass:    C_FILE
    AuxEntries:
      - Type:             AUX_FILE
        FileNameOrString: FileName
        FileStringType:   XFT_CD
  - StorageClass:    C_HIDEXT
    AuxEntries:
      - Type:               AUX_CSECT
        ParameterHashIndex: 1
        TypeChkSectNum:     2
        SymbolAlignmentAndType: 41
        SectionOrLength:    3
        StabInfoIndex:      4
        StabSectNum:        5
  - StorageClass:    C_EXT
    AuxEntries:
      - Type:                 AUX_FCN
        OffsetToExceptionTbl: 1
        SizeOfFunction:       2
        SymIdxOfNextBeyond:   3
        PtrToLineNum:         4
      - Type:               AUX_CSECT
        ParameterHashIndex: 1
        TypeChkSectNum:     2
        SymbolAlignmentAndType: 17
        SectionOrLength:    4
        StabInfoIndex:      5
        StabSectNum:        6
  - StorageClass:    C_DWARF
    AuxEntries:
      - Type:                   AUX_SECT
        LengthOfSectionPortion: 44
        NumberOfRelocEnt:       1
  - StorageClass:    C_STAT
    AuxEntries:
      - Type:             AUX_STAT
        SectionLength:    1
        NumberOfRelocEnt: 2
        NumberOfLineNum:  3
  - StorageClass:    C_BLOCK
    AuxEntries:
      - Type:            AUX_SYM
        LineNumHi:       1
        LineNumLo:       2

## 64-bit
# RUN: yaml2obj %s --docnum=2 -o %t64
# RUN: obj2yaml %t64 | FileCheck %s --check-prefix=CHECK64

# CHECK64:      --- !XCOFF
# CHECK64-NEXT: FileHeader:
# CHECK64-NEXT:   MagicNumber:     0x1F7
# CHECK64-NEXT:   NumberOfSections: 0
# CHECK64-NEXT:   CreationTime:    0
# CHECK64-NEXT:   OffsetToSymbolTable: 0x18
# CHECK64-NEXT:   EntriesInSymbolTable: 12
# CHECK64-NEXT:   AuxiliaryHeaderSize: 0
# CHECK64-NEXT:   Flags:           0x0
# CHECK64-NEXT: Symbols:
# CHECK64-NEXT:   - Name:            ''
# CHECK64-NEXT:     Value:           0x0
# CHECK64-NEXT:     Section:         N_UNDEF
# CHECK64-NEXT:     Type:            0x0
# CHECK64-NEXT:     StorageClass:    C_FILE
# CHECK64-NEXT:     NumberOfAuxEntries: 1
# CHECK64-NEXT:     AuxEntries:
# CHECK64-NEXT:       - Type:            AUX_FILE
# CHECK64-NEXT:         FileNameOrString: FileName
# CHECK64-NEXT:         FileStringType:  XFT_CD
# CHECK64-NEXT:   - Name:            ''
# CHECK64-NEXT:     Value:           0x0
# CHECK64-NEXT:     Section:         N_UNDEF
# CHECK64-NEXT:     Type:            0x0
# CHECK64-NEXT:     StorageClass:    C_HIDEXT
# CHECK64-NEXT:     NumberOfAuxEntries: 1
# CHECK64-NEXT:     AuxEntries:
# CHECK64-NEXT:       - Type:            AUX_CSECT
# CHECK64-NEXT:         ParameterHashIndex: 1
# CHECK64-NEXT:         TypeChkSectNum:  2
# CHECK64-NEXT:         SymbolType: XTY_SD
# CHECK64-NEXT:         SymbolAlignment: 5
# CHECK64-NEXT:         StorageMappingClass: XMC_PR
# CHECK64-NEXT:         SectionOrLengthLo: 3
# CHECK64-NEXT:         SectionOrLengthHi: 4
# CHECK64-NEXT:   - Name:            ''
# CHECK64-NEXT:     Value:           0x0
# CHECK64-NEXT:     Section:         N_UNDEF
# CHECK64-NEXT:     Type:            0x0
# CHECK64-NEXT:     StorageClass:    C_EXT
# CHECK64-NEXT:     NumberOfAuxEntries: 3
# CHECK64-NEXT:     AuxEntries:
# CHECK64-NEXT:       - Type:            AUX_FCN
# CHECK64-NEXT:         SizeOfFunction:  3
# CHECK64-NEXT:         SymIdxOfNextBeyond: 2
# CHECK64-NEXT:         PtrToLineNum:    1
# CHECK64-NEXT:       - Type:            AUX_EXCEPT
# CHECK64-NEXT:         OffsetToExceptionTbl: 1
# CHECK64-NEXT:         SizeOfFunction:  2
# CHECK64-NEXT:         SymIdxOfNextBeyond: 3
# CHECK64-NEXT:       - Type:            AUX_CSECT
# CHECK64-NEXT:         ParameterHashIndex: 1
# CHECK64-NEXT:         TypeChkSectNum:  2
# CHECK64-NEXT:         SymbolType: XTY_SD
# CHECK64-NEXT:         SymbolAlignment: 2
# CHECK64-NEXT:         StorageMappingClass: XMC_PR
# CHECK64-NEXT:         SectionOrLengthLo: 3
# CHECK64-NEXT:         SectionOrLengthHi: 4
# CHECK64-NEXT:   - Name:            ''
# CHECK64-NEXT:     Value:           0x0
# CHECK64-NEXT:     Section:         N_UNDEF
# CHECK64-NEXT:     Type:            0x0
# CHECK64-NEXT:     StorageClass:    C_DWARF
# CHECK64-NEXT:     NumberOfAuxEntries: 1
# CHECK64-NEXT:     AuxEntries:
# CHECK64-NEXT:       - Type:            AUX_SECT
# CHECK64-NEXT:         LengthOfSectionPortion: 44
# CHECK64-NEXT:         NumberOfRelocEnt: 1
# CHECK64-NEXT:   - Name:            ''
# CHECK64-NEXT:     Value:           0x0
# CHECK64-NEXT:     Section:         N_UNDEF
# CHECK64-NEXT:     Type:            0x0
# CHECK64-NEXT:     StorageClass:    C_BLOCK
# CHECK64-NEXT:     NumberOfAuxEntries: 1
# CHECK64-NEXT:     AuxEntries:
# CHECK64-NEXT:       - Type:            AUX_SYM
# CHECK64-NEXT:         LineNum:         1

--- !XCOFF
FileHeader:
  MagicNumber:     0x1F7
Symbols:
  - StorageClass:    C_FILE
    AuxEntries:
      - Type:             AUX_FILE
        FileNameOrString: FileName
        FileStringType:   XFT_CD
  - StorageClass:    C_HIDEXT
    AuxEntries:
      - Type:               AUX_CSECT
        ParameterHashIndex: 1
        TypeChkSectNum:     2
        SymbolAlignmentAndType: 41
        SectionOrLengthLo:  3
        SectionOrLengthHi:  4
  - StorageClass:    C_EXT
    AuxEntries:
      - Type:               AUX_FCN
        SizeOfFunction:     3
        SymIdxOfNextBeyond: 2
        PtrToLineNum:       1
      - Type:                 AUX_EXCEPT
        OffsetToExceptionTbl: 1
        SizeOfFunction:       2
        SymIdxOfNextBeyond:   3
      - Type:               AUX_CSECT
        ParameterHashIndex: 1
        TypeChkSectNum:     2
        SymbolAlignmentAndType: 17
        SectionOrLengthLo:  3
        SectionOrLengthHi:  4
  - StorageClass:    C_DWARF
    AuxEntries:
      - Type:                   AUX_SECT
        LengthOfSectionPortion: 44
        NumberOfRelocEnt:       1
  - StorageClass:    C_BLOCK
    AuxEntries:
      - Type:            AUX_SYM
        LineNum:         1

## Check that error messages are reported appropriately.

# RUN: yaml2obj %s --docnum=3 -o - | not obj2yaml 2>&1 | FileCheck %s --check-prefix=ERROR1
# ERROR1: failed to parse symbol "SYM_STAT" with index of 1: expected 1 aux symbol for C_STAT, while got 2

--- !XCOFF
FileHeader:
  MagicNumber: 0x1DF
Symbols:
  - Name:               SYM
  - Name:               SYM_STAT
    StorageClass:       C_STAT
    NumberOfAuxEntries: 2
    AuxEntries:
      - Type: AUX_STAT
      - Type: AUX_STAT

# RUN: yaml2obj %s --docnum=4 -o - | not obj2yaml 2>&1 | FileCheck %s --check-prefix=ERROR2
# ERROR2: failed to parse symbol "SYM_BLOCK" with index of 0: expected 1 aux symbol for C_BLOCK or C_FCN, while got 2

--- !XCOFF
FileHeader:
  MagicNumber: 0x1DF
Symbols:
  - Name:               SYM_BLOCK
    StorageClass:       C_BLOCK
    NumberOfAuxEntries: 2
    AuxEntries:
      - Type: AUX_SYM
      - Type: AUX_SYM

# RUN: yaml2obj %s --docnum=5 -o - | not obj2yaml 2>&1 | FileCheck %s --check-prefix=ERROR3
# ERROR3: failed to parse symbol "SYM_DWARF" with index of 0: expected 1 aux symbol for C_DWARF, while got 2

--- !XCOFF
FileHeader:
  MagicNumber: 0x1DF
Symbols:
  - Name:               SYM_DWARF
    StorageClass:       C_DWARF
    NumberOfAuxEntries: 2
    AuxEntries:
      - Type: AUX_SECT
      - Type: AUX_SECT

# RUN: yaml2obj %s --docnum=6 -o - | not obj2yaml 2>&1 | FileCheck %s --check-prefix=ERROR4
# ERROR4: failed to parse symbol "SYM_EXT" with index of 0: invalid auxiliary symbol type: 252

--- !XCOFF
FileHeader:
  MagicNumber: 0x1F7
Symbols:
  - Name:         SYM_EXT
    StorageClass: C_EXT
    AuxEntries:
      - Type: AUX_FILE
      - Type: AUX_CSECT
