## Test all members of 64-bit load config.
# RUN: yaml2obj --docnum=1 %s -o %t
# RUN: llvm-readobj --coff-load-config %t | FileCheck %s --check-prefix=ALL

# ALL:      Format: COFF-x86-64
# ALL-NEXT: Arch: x86_64
# ALL-NEXT: AddressSize: 64bit
# ALL-NEXT: LoadConfig [
# ALL-NEXT:   Size: 0x150
# ALL-NEXT:   TimeDateStamp: 1970-01-01 00:00:01 (0x1)
# ALL-NEXT:   MajorVersion: 0x2
# ALL-NEXT:   MinorVersion: 0x3
# ALL-NEXT:   GlobalFlagsClear: 0x4
# ALL-NEXT:   GlobalFlagsSet: 0x5
# ALL-NEXT:   CriticalSectionDefaultTimeout: 0x6
# ALL-NEXT:   DeCommitFreeBlockThreshold: 0x7
# ALL-NEXT:   DeCommitTotalFreeThreshold: 0x8
# ALL-NEXT:   LockPrefixTable: 0x9
# ALL-NEXT:   MaximumAllocationSize: 0x100000
# ALL-NEXT:   VirtualMemoryThreshold: 0x2000000
# ALL-NEXT:   ProcessHeapFlags: 0x2
# ALL-NEXT:   ProcessAffinityMask: 0x1
# ALL-NEXT:   CSDVersion: 0x3
# ALL-NEXT:   DependentLoadFlags: 0x4
# ALL-NEXT:   EditList: 0x5
# ALL-NEXT:   SecurityCookie: 0x6
# ALL-NEXT:   SEHandlerTable: 0x0
# ALL-NEXT:   SEHandlerCount: 0
# ALL-NEXT:   GuardCFCheckFunction: 0x9
# ALL-NEXT:   GuardCFCheckDispatch: 0x1
# ALL-NEXT:   GuardCFFunctionTable: 0x0
# ALL-NEXT:   GuardCFFunctionCount: 0
# ALL-NEXT:   GuardFlags [ (0x4)
# ALL-NEXT:   ]
# ALL-NEXT:   GuardAddressTakenIatEntryTable: 0x0
# ALL-NEXT:   GuardAddressTakenIatEntryCount: 0
# ALL-NEXT:   GuardLongJumpTargetTable: 0x0
# ALL-NEXT:   GuardLongJumpTargetCount: 0
# ALL-NEXT:   DynamicValueRelocTable: 0x2
# ALL-NEXT:   CHPEMetadataPointer: 0x0
# ALL-NEXT:   GuardRFFailureRoutine: 0x4
# ALL-NEXT:   GuardRFFailureRoutineFunctionPointer: 0x5
# ALL-NEXT:   DynamicValueRelocTableOffset: 0x6
# ALL-NEXT:   DynamicValueRelocTableSection: 7
# ALL-NEXT:   GuardRFVerifyStackPointerFunctionPointer: 0x8
# ALL-NEXT:   HotPatchTableOffset: 0x9
# ALL-NEXT:   EnclaveConfigurationPointer: 0x1
# ALL-NEXT:   VolatileMetadataPointer: 0x2
# ALL-NEXT:   GuardEHContinuationTable: 0x0
# ALL-NEXT:   GuardEHContinuationCount: 0
# ALL-NEXT: ]

--- !COFF
OptionalHeader:
  ImageBase:        0x180000000
  SectionAlignment: 4096
  FileAlignment:    512
  DLLCharacteristics: [ ]
  LoadConfigTable:
    RelativeVirtualAddress: 0x1000
    Size:            320
header:
  Machine:         IMAGE_FILE_MACHINE_AMD64
  Characteristics: [ IMAGE_FILE_EXECUTABLE_IMAGE, IMAGE_FILE_LARGE_ADDRESS_AWARE, IMAGE_FILE_DLL ]
sections:
  - Name:            .rdata
    Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ]
    VirtualAddress:  0x1000
    VirtualSize:     320
    StructuredData:
      - LoadConfig:
          Size: 0x150
          TimeDateStamp: 1
          MajorVersion: 2
          MinorVersion: 3
          GlobalFlagsClear: 4
          GlobalFlagsSet: 5
          CriticalSectionDefaultTimeout: 6
          DeCommitFreeBlockThreshold: 7
          DeCommitTotalFreeThreshold: 8
          LockPrefixTable: 9
          MaximumAllocationSize: 0x100000
          VirtualMemoryThreshold: 0x2000000
          ProcessAffinityMask: 1
          ProcessHeapFlags: 2
          CSDVersion: 3
          DependentLoadFlags: 4
          EditList: 5
          SecurityCookie: 6
          SEHandlerTable: 0
          SEHandlerCount: 0
          GuardCFCheckFunction: 9
          GuardCFCheckDispatch: 1
          GuardCFFunctionTable: 0
          GuardCFFunctionCount: 0
          GuardFlags: 4
          CodeIntegrity:
            Flags: 0x100
            Catalog: 5
            CatalogOffset: 6
          GuardAddressTakenIatEntryTable: 0
          GuardAddressTakenIatEntryCount: 0
          GuardLongJumpTargetTable: 0
          GuardLongJumpTargetCount: 0
          DynamicValueRelocTable: 2
          CHPEMetadataPointer: 0
          GuardRFFailureRoutine: 4
          GuardRFFailureRoutineFunctionPointer: 5
          DynamicValueRelocTableOffset: 6
          DynamicValueRelocTableSection: 7
          GuardRFVerifyStackPointerFunctionPointer: 8
          HotPatchTableOffset: 9
          EnclaveConfigurationPointer: 1
          VolatileMetadataPointer: 2
          GuardEHContinuationTable: 0
          GuardEHContinuationCount: 0
          GuardXFGCheckFunctionPointer: 5
          GuardXFGDispatchFunctionPointer: 6
          GuardXFGTableDispatchFunctionPointer: 7
          CastGuardOsDeterminedFailureMode: 8
symbols: []
...

## Simple 32-bit load config.
# RUN: yaml2obj --docnum=2 %s -o %t
# RUN: llvm-readobj --coff-load-config %t | FileCheck %s --check-prefix=LOADCFG32

# LOADCFG32: LoadConfig [
# LOADCFG32:   MaximumAllocationSize: 0x100000
# LOADCFG32:   VirtualMemoryThreshold: 0x2000000
# LOADCFG32:   CHPEMetadataPointer: 0

--- !COFF
OptionalHeader:
  ImageBase:        0x180000000
  SectionAlignment: 4096
  FileAlignment:    512
  DLLCharacteristics: [ ]
  LoadConfigTable:
    RelativeVirtualAddress: 0x1000
    Size:            320
header:
  Machine:         IMAGE_FILE_MACHINE_I386
  Characteristics: [ IMAGE_FILE_EXECUTABLE_IMAGE, IMAGE_FILE_LARGE_ADDRESS_AWARE, IMAGE_FILE_DLL ]
sections:
  - Name:            .rdata
    Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ]
    VirtualAddress:  0x1000
    VirtualSize:     320
    StructuredData:
      - LoadConfig:
          MaximumAllocationSize: 0x100000
          VirtualMemoryThreshold: 0x2000000
symbols: []
...

## Create load config with all fields using default values.
# RUN: yaml2obj --docnum=3 %s -o %t
# RUN: llvm-readobj --coff-load-config %t | FileCheck %s --check-prefix=DEF

# DEF: Format: COFF-x86-64
# DEF: Arch: x86_64
# DEF: AddressSize: 64bit
# DEF: LoadConfig [
# DEF:   Size: 0x138
# DEF:   MajorVersion: 0x0
# DEF:   MinorVersion: 0x0
# DEF:   GuardEHContinuationCount: 0
# DEF: ]

--- !COFF
OptionalHeader:
  ImageBase:        0x180000000
  SectionAlignment: 4096
  FileAlignment:    512
  DLLCharacteristics: [ ]
  LoadConfigTable:
    RelativeVirtualAddress: 0x1000
    Size:            320
header:
  Machine:         IMAGE_FILE_MACHINE_AMD64
  Characteristics: [ IMAGE_FILE_EXECUTABLE_IMAGE, IMAGE_FILE_LARGE_ADDRESS_AWARE, IMAGE_FILE_DLL ]
sections:
  - Name:            .rdata
    Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ]
    VirtualAddress:  0x1000
    VirtualSize:     320
    StructuredData:
      - LoadConfig:
symbols: []
...

## Create load config larger than coff_load_configuration32 struct.
# RUN: yaml2obj --docnum=4 %s -o %t
# RUN: llvm-readobj --hex-dump=.rdata %t | FileCheck %s --check-prefix=LARGE

# LARGE:      0x00401000 d0000000 00000000 00000000 00000000 ................
# LARGE-NEXT: 0x00401010 00000000 00000000 00000000 00000000 ................
# LARGE-NEXT: 0x00401020 00000000 00000000 00000000 00000000 ................
# LARGE-NEXT: 0x00401030 00000000 00000000 00000000 00000000 ................
# LARGE-NEXT: 0x00401040 00000000 00000000 00000000 00000000 ................
# LARGE-NEXT: 0x00401050 00000000 00000000 00000000 00000000 ................
# LARGE-NEXT: 0x00401060 00000000 00000000 00000000 00000000 ................
# LARGE-NEXT: 0x00401070 00000000 00000000 00000000 00000000 ................
# LARGE-NEXT: 0x00401080 00000000 00000000 00000000 00000000 ................
# LARGE-NEXT: 0x00401090 00000000 00000000 00000000 00000000 ................
# LARGE-NEXT: 0x004010a0 00000000 00000000 00000000 00000000 ................
# LARGE-NEXT: 0x004010b0 00000000 00000000 ff000000 00000000 ................
# LARGE-NEXT: 0x004010c0 00000000 00000000 00000000 00000000 ................
# LARGE-NEXT: 0x004010d0 aabbccdd                            ....

--- !COFF
OptionalHeader:
  ImageBase:        0x400000
  SectionAlignment: 4096
  FileAlignment:    512
  DLLCharacteristics: [ ]
  LoadConfigTable:
    RelativeVirtualAddress: 0x1000
    Size:            320
header:
  Machine:         IMAGE_FILE_MACHINE_I386
  Characteristics: [ IMAGE_FILE_EXECUTABLE_IMAGE, IMAGE_FILE_LARGE_ADDRESS_AWARE, IMAGE_FILE_DLL ]
sections:
  - Name:            .rdata
    Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ]
    VirtualAddress:  0x1000
    VirtualSize:     0xd4
    StructuredData:
      - LoadConfig:
          Size: 0xd0
          CastGuardOsDeterminedFailureMode: 0xff
      - UInt32: 0xddccbbaa
symbols: []
...

## Try to specify load config field that barely fits the specified size.
# RUN: yaml2obj --docnum=5 %s -o %t
# RUN: llvm-readobj --hex-dump=.rdata %t | FileCheck %s --check-prefix=SMALL
# SMALL: 0x180001000 09000000 00000000 aaffffff ff

--- !COFF
OptionalHeader:
  ImageBase:        0x180000000
  SectionAlignment: 4096
  FileAlignment:    512
  DLLCharacteristics: [ ]
  LoadConfigTable:
    RelativeVirtualAddress: 0x1000
    Size:            320
header:
  Machine:         IMAGE_FILE_MACHINE_AMD64
  Characteristics: [ IMAGE_FILE_EXECUTABLE_IMAGE, IMAGE_FILE_LARGE_ADDRESS_AWARE, IMAGE_FILE_DLL ]
sections:
  - Name:            .rdata
    Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ]
    VirtualAddress:  0x1000
    VirtualSize:     13
    StructuredData:
      - LoadConfig:
          Size: 9
          MajorVersion: 0xbbaa
      - UInt32: 0xffffffff
symbols: []
...

## Try to specify load config field that does not fit specified size.
# RUN: not yaml2obj --docnum=6 %s -o %t 2>&1 | FileCheck %s --check-prefix=TOOSMALL
# TOOSMALL: error: unknown key 'MajorVersion'

--- !COFF
OptionalHeader:
  ImageBase:        0x180000000
  SectionAlignment: 4096
  FileAlignment:    512
  DLLCharacteristics: [ ]
  LoadConfigTable:
    RelativeVirtualAddress: 0x1000
    Size:            320
header:
  Machine:         IMAGE_FILE_MACHINE_AMD64
  Characteristics: [ IMAGE_FILE_EXECUTABLE_IMAGE, IMAGE_FILE_LARGE_ADDRESS_AWARE, IMAGE_FILE_DLL ]
sections:
  - Name:            .rdata
    Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ]
    VirtualAddress:  0x1000
    VirtualSize:     320
    StructuredData:
      - LoadConfig:
          Size: 8
          MajorVersion: 10
symbols: []
...

## Set load config size to 0.
# RUN: not yaml2obj --docnum=7 %s -o %t 2>&1 | FileCheck %s --check-prefix=ZERO
# ZERO: error: Size must be at least 4

--- !COFF
OptionalHeader:
  ImageBase:        0x180000000
  SectionAlignment: 4096
  FileAlignment:    512
  DLLCharacteristics: [ ]
  LoadConfigTable:
    RelativeVirtualAddress: 0x1000
    Size:            320
header:
  Machine:         IMAGE_FILE_MACHINE_AMD64
  Characteristics: [ IMAGE_FILE_EXECUTABLE_IMAGE, IMAGE_FILE_LARGE_ADDRESS_AWARE, IMAGE_FILE_DLL ]
sections:
  - Name:            .rdata
    Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ]
    VirtualAddress:  0x1000
    VirtualSize:     320
    StructuredData:
      - LoadConfig:
          Size: 0
symbols: []
...
