| ## 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: - From: foo |
| # BASIC-NEXT: To: bar |
| # BASIC-NEXT: Weight: 89 |
| # BASIC-NEXT: - From: bar |
| # BASIC-NEXT: To: foo |
| # 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: |
| - From: 1 |
| To: 2 |
| Weight: 89 |
| - From: 2 |
| To: 1 |
| 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.16.valid |
| # INVALID-NEXT: Type: SHT_LLVM_CALL_GRAPH_PROFILE |
| # INVALID-NEXT: Link: .symtab |
| # INVALID-NEXT: Entries: |
| # INVALID-NEXT: - From: foo |
| # INVALID-NEXT: To: bar |
| # INVALID-NEXT: Weight: 3 |
| # INVALID-NEXT: - Name: .non.multiple.16 |
| # INVALID-NEXT: Type: SHT_LLVM_CALL_GRAPH_PROFILE |
| # INVALID-NEXT: Link: .symtab |
| # INVALID-NEXT: Content: '0000000100000002000000000000000300' |
| # INVALID-NEXT: - Name: .multiple.16.invalid |
| # INVALID-NEXT: Type: SHT_LLVM_CALL_GRAPH_PROFILE |
| # INVALID-NEXT: Link: .symtab |
| # INVALID-NEXT: Content: 00112233445566778899AABBCCDDEEFF |
| # INVALID-NEXT: - Name: .unknown.symbol.1 |
| # INVALID-NEXT: Type: SHT_LLVM_CALL_GRAPH_PROFILE |
| # INVALID-NEXT: Link: .symtab |
| # INVALID-NEXT: Content: 000000FF000000020000000000000003 |
| # INVALID-NEXT: - Name: .unknown.symbol.2 |
| # INVALID-NEXT: Type: SHT_LLVM_CALL_GRAPH_PROFILE |
| # INVALID-NEXT: Link: .symtab |
| # INVALID-NEXT: Content: 00000001000000FF0000000000000003 |
| # INVALID-NEXT: - Name: .link.to.symtable |
| # INVALID-NEXT: Type: SHT_LLVM_CALL_GRAPH_PROFILE |
| # INVALID-NEXT: Link: .symtab |
| # INVALID-NEXT: Entries: |
| # INVALID-NEXT: - From: foo |
| # INVALID-NEXT: To: bar |
| # INVALID-NEXT: Weight: 0 |
| # INVALID-NEXT: - Name: .link.to.non.symtable.1 |
| # INVALID-NEXT: Type: SHT_LLVM_CALL_GRAPH_PROFILE |
| # INVALID-NEXT: Content: '00000001000000020000000000000000' |
| # INVALID-NEXT: - Name: .link.to.non.symtable.2 |
| # INVALID-NEXT: Type: SHT_LLVM_CALL_GRAPH_PROFILE |
| # INVALID-NEXT: Link: .empty |
| # INVALID-NEXT: Content: '00000001000000020000000000000000' |
| # 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: - From: foo |
| # INVALID-NEXT: To: bar |
| # 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: - From: foo |
| # INVALID-NEXT: To: bar |
| # 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.16.valid |
| Type: SHT_LLVM_CALL_GRAPH_PROFILE |
| Content: "00000001000000020000000000000003" |
| - Name: .non.multiple.16 |
| Type: SHT_LLVM_CALL_GRAPH_PROFILE |
| Content: "0000000100000002000000000000000300" |
| - Name: .multiple.16.invalid |
| Type: SHT_LLVM_CALL_GRAPH_PROFILE |
| Content: "00112233445566778899AABBCCDDEEFF" |
| ## Case 3: Check we use the "Content" property when unable to match a |
| ## symbol index to a symbol. |
| - Name: .unknown.symbol.1 |
| Type: SHT_LLVM_CALL_GRAPH_PROFILE |
| Entries: |
| - From: 0xff |
| To: 2 |
| Weight: 3 |
| - Name: .unknown.symbol.2 |
| Type: SHT_LLVM_CALL_GRAPH_PROFILE |
| Entries: |
| - From: 1 |
| To: 0xff |
| Weight: 3 |
| ## 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: |
| - From: 1 |
| To: 2 |
| Weight: 0 |
| - Name: .link.to.non.symtable.1 |
| Type: SHT_LLVM_CALL_GRAPH_PROFILE |
| Link: 0 |
| Entries: |
| - From: 1 |
| To: 2 |
| Weight: 0 |
| - Name: .link.to.non.symtable.2 |
| Type: SHT_LLVM_CALL_GRAPH_PROFILE |
| Link: 1 |
| Entries: |
| - From: 1 |
| To: 2 |
| 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: |
| - From: 1 |
| To: 2 |
| Weight: 0 |
| - Name: .invalid.entry.size |
| Type: SHT_LLVM_CALL_GRAPH_PROFILE |
| EntSize: 1 |
| Entries: |
| - From: 1 |
| To: 2 |
| Weight: 0 |
| Symbols: |
| - Name: foo |
| - Name: bar |