## Test how we dump SHT_LLVM_CALL_GRAPH_PROFILE sections for 32 and 64-bit targets.

## Test we use the "Entries" property when it is possible to dump values correctly.

# RUN: yaml2obj -D BITS=64 -D ENCODE=LSB %s -o %t.le64
# RUN: obj2yaml %t.le64 | FileCheck %s --check-prefix=BASIC
# RUN: yaml2obj -D BITS=64 -D ENCODE=MSB %s -o %t.be64
# RUN: obj2yaml %t.be64 | FileCheck %s --check-prefix=BASIC
# RUN: yaml2obj -D BITS=32 -D ENCODE=LSB %s -o %t.le32
# RUN: obj2yaml %t.le32 | FileCheck %s --check-prefix=BASIC
# RUN: yaml2obj -D BITS=32 -D ENCODE=MSB %s -o %t.be32
# RUN: obj2yaml %t.be32 | FileCheck %s --check-prefix=BASIC

# BASIC:      Sections:
# BASIC-NEXT:   - Name: .llvm.call-graph-profile
# BASIC-NEXT:     Type: SHT_LLVM_CALL_GRAPH_PROFILE
# BASIC-NEXT:     Link: .symtab
# BASIC-NEXT:     Entries:
# BASIC-NEXT:       - Weight: 89
# BASIC-NEXT:       - Weight: 98
# BASIC-NEXT: Symbols:

--- !ELF
FileHeader:
  Class: ELFCLASS[[BITS]]
  Data:  ELFDATA2[[ENCODE]]
  Type:  ET_DYN
Sections:
  - Name: .llvm.call-graph-profile
    Type: SHT_LLVM_CALL_GRAPH_PROFILE
    Entries:
      - Weight: 89
      - Weight: 98
Symbols:
  - Name: foo
  - Name: bar

## Check how we handle broken cases.

# RUN: yaml2obj --docnum=2 %s -o %t.invalid
# RUN: obj2yaml %t.invalid | FileCheck %s --check-prefix=INVALID

# INVALID:      --- !ELF
# INVALID-NEXT: FileHeader:
# INVALID-NEXT:   Class: ELFCLASS32
# INVALID-NEXT:   Data:  ELFDATA2MSB
# INVALID-NEXT:   Type:  ET_DYN
# INVALID-NEXT: Sections:
# INVALID-NEXT:   - Name: .empty
# INVALID-NEXT:     Type: SHT_LLVM_CALL_GRAPH_PROFILE
# INVALID-NEXT:     Link: .symtab
# INVALID-NEXT:   - Name: .multiple.8.valid
# INVALID-NEXT:     Type: SHT_LLVM_CALL_GRAPH_PROFILE
# INVALID-NEXT:     Link: .symtab
# INVALID-NEXT:     Entries:
# INVALID-NEXT:         Weight: 3
# INVALID-NEXT:   - Name: .non.multiple.8
# INVALID-NEXT:     Type: SHT_LLVM_CALL_GRAPH_PROFILE
# INVALID-NEXT:     Link: .symtab
# INVALID-NEXT:     Content: '000000000000000300'
# INVALID-NEXT:   - Name: .multiple.8.invalid
# INVALID-NEXT:     Type: SHT_LLVM_CALL_GRAPH_PROFILE
# INVALID-NEXT:     Link: .symtab
# INVALID-NEXT:     Content: 008899AABBCCDDEEFF
# INVALID-NEXT:   - Name: .link.to.symtable
# INVALID-NEXT:     Type: SHT_LLVM_CALL_GRAPH_PROFILE
# INVALID-NEXT:     Link: .symtab
# INVALID-NEXT:     Entries:
# INVALID-NEXT:       - Weight: 0
# INVALID-NEXT:   - Name: .link.to.non.symtable.1
# INVALID-NEXT:     Type: SHT_LLVM_CALL_GRAPH_PROFILE
# INVALID-NEXT:     Entries:
# INVALID-NEXT:           - Weight: 0
# INVALID-NEXT:   - Name: .link.to.non.symtable.2
# INVALID-NEXT:     Type: SHT_LLVM_CALL_GRAPH_PROFILE
# INVALID-NEXT:     Link: .empty
# INVALID-NEXT:     Entries:
# INVALID-NEXT:      - Weight: 0
# INVALID-NEXT:   - Name:    .zero.entry.size
# INVALID-NEXT:     Type:    SHT_LLVM_CALL_GRAPH_PROFILE
# INVALID-NEXT:     Link:    .symtab
# INVALID-NEXT:     EntSize: 0x0
# INVALID-NEXT:     Entries:
# INVALID-NEXT:       - Weight: 0
# INVALID-NEXT:   - Name: .invalid.entry.size
# INVALID-NEXT:     Type: SHT_LLVM_CALL_GRAPH_PROFILE
# INVALID-NEXT:     Link: .symtab
# INVALID-NEXT:     EntSize: 0x1
# INVALID-NEXT:     Entries:
# INVALID-NEXT:       - Weight: 0
# INVALID-NEXT: Symbols:
# INVALID-NEXT:   - Name: foo
# INVALID-NEXT:   - Name: bar

--- !ELF
FileHeader:
  Class: ELFCLASS32
  Data:  ELFDATA2MSB
  Type:  ET_DYN
Sections:
## Case 1: Content is empty.
  - Name: .empty
    Type: SHT_LLVM_CALL_GRAPH_PROFILE
## Case 2: Check that we use the "Entries" property to dump the data when it
##         has a size that is a multiple of 16 and is valid (it is possible to match
##         symbol indexes to symbols), but fallback to dumping the whole section
##         using the "Content" property otherwise.
## TODO: Teach yaml2obj to accept 'Size' key for SHT_LLVM_CALL_GRAPH_PROFILE
##       sections and use Entries for cases below.
  - Name: .multiple.8.valid
    Type: SHT_LLVM_CALL_GRAPH_PROFILE
    Content: "0000000000000003"
  - Name: .non.multiple.8
    Type: SHT_LLVM_CALL_GRAPH_PROFILE
    Content: "000000000000000300"
  - Name: .multiple.8.invalid
    Type: SHT_LLVM_CALL_GRAPH_PROFILE
    Content: "008899AABBCCDDEEFF"
## Case 4: Check we use the "Content" property when a linked section
##         is not a symbol table.
  - Name: .link.to.symtable
    Type: SHT_LLVM_CALL_GRAPH_PROFILE
    Entries:
      - Weight: 0
  - Name: .link.to.non.symtable.1
    Type: SHT_LLVM_CALL_GRAPH_PROFILE
    Link: 0
    Entries:
      - Weight: 0
  - Name: .link.to.non.symtable.2
    Type: SHT_LLVM_CALL_GRAPH_PROFILE
    Link: 1
    Entries:
      - Weight: 0
## Case 5: Check we can dump a section that has a sh_entsize that is not a multiple of 16.
##         Check that in these cases we print the "EntSize" key.
  - Name: .zero.entry.size
    Type: SHT_LLVM_CALL_GRAPH_PROFILE
    EntSize: 0
    Entries:
      - Weight: 0
  - Name: .invalid.entry.size
    Type: SHT_LLVM_CALL_GRAPH_PROFILE
    EntSize: 1
    Entries:
      - Weight: 0
Symbols:
  - Name: foo
  - Name: bar
