## This test checks how we handle the --elf-cg-profile option. # RUN: yaml2obj %s -o %t.o # RUN: llvm-readobj %t.o --cg-profile | FileCheck %s --check-prefix=LLVM # RUN: llvm-readelf %t.o --cg-profile | FileCheck %s --check-prefix=GNU # RUN: llvm-readobj %t.o --elf-cg-profile | FileCheck %s --check-prefix=LLVM # RUN: llvm-readelf %t.o --elf-cg-profile | FileCheck %s --check-prefix=GNU # LLVM: CGProfile [ # LLVM-NEXT: CGProfileEntry { # LLVM-NEXT: From: foo (1) # LLVM-NEXT: To: bar (2) # LLVM-NEXT: Weight: 89 # LLVM-NEXT: } # LLVM-NEXT: CGProfileEntry { # LLVM-NEXT: From: bar (2) # LLVM-NEXT: To: foo (1) # LLVM-NEXT: Weight: 98 # LLVM-NEXT: } # LLVM-NEXT: ] # GNU: GNUStyle::printCGProfile not implemented --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_DYN Machine: EM_X86_64 Sections: - Name: .llvm.call-graph-profile Type: SHT_LLVM_CALL_GRAPH_PROFILE Entries: - Weight: 89 - Weight: 98 EntSize: [[ENTSIZE=<none>]] - Name: .rel.llvm.call-graph-profile Type: SHT_REL Info: .llvm.call-graph-profile Relocations: - Symbol: foo Type: R_X86_64_NONE - Offset: 0x0 Symbol: bar Type: R_X86_64_NONE - Offset: 0x8 Symbol: bar Type: R_X86_64_NONE - Offset: 0x8 Symbol: foo Type: R_X86_64_NONE Symbols: - Name: foo - Name: bar ## Check we report a warning when unable to get the content of the SHT_LLVM_CALL_GRAPH_PROFILE section. # RUN: yaml2obj %s -DENTSIZE=0xF -o %t2.o # RUN: llvm-readobj %t2.o --cg-profile 2>&1 | FileCheck %s -DFILE=%t2.o --check-prefix=LLVM-ERR # RUN: llvm-readelf %t2.o --cg-profile | FileCheck %s --check-prefix=GNU # LLVM-ERR: warning: '[[FILE]]': unable to load the SHT_LLVM_CALL_GRAPH_PROFILE section: section [index 1] has invalid sh_entsize: expected 8, but got 15 ## Check we report a warning when unable to dump a name of a symbol. # RUN: yaml2obj %s --docnum=2 -o %t3.o # RUN: llvm-readobj %t3.o --cg-profile 2>&1 | FileCheck %s -DFILE=%t3.o --check-prefix=LLVM-BROKEN-SYM # RUN: llvm-readelf %t3.o --cg-profile | FileCheck %s --check-prefix=GNU # LLVM-BROKEN-SYM: CGProfile [ # LLVM-BROKEN-SYM-NEXT: CGProfileEntry { # LLVM-BROKEN-SYM-NEXT: From: A (1) # LLVM-BROKEN-SYM-NEXT: warning: '[[FILE]]': unable to read the name of symbol with index 2: st_name (0xff) is past the end of the string table of size 0x5 # LLVM-BROKEN-SYM-NEXT: To: <?> (2) # LLVM-BROKEN-SYM-NEXT: Weight: 10 # LLVM-BROKEN-SYM-NEXT: } # LLVM-BROKEN-SYM-NEXT: CGProfileEntry { # LLVM-BROKEN-SYM-NEXT: From: <?> (2) # LLVM-BROKEN-SYM-NEXT: To: B (3) # LLVM-BROKEN-SYM-NEXT: Weight: 20 # LLVM-BROKEN-SYM-NEXT: } # LLVM-BROKEN-SYM-NEXT: CGProfileEntry { # LLVM-BROKEN-SYM-NEXT: From: (0) # LLVM-BROKEN-SYM-NEXT: warning: '[[FILE]]': unable to read the name of symbol with index 4: unable to get symbol from section [index 4]: invalid symbol index (4) # LLVM-BROKEN-SYM-NEXT: To: <?> (4) # LLVM-BROKEN-SYM-NEXT: Weight: 20 # LLVM-BROKEN-SYM-NEXT: } # LLVM-BROKEN-SYM-NEXT: ] --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_DYN Machine: EM_X86_64 Sections: - Name: .llvm.call-graph-profile Type: SHT_LLVM_CALL_GRAPH_PROFILE Entries: - Weight: 10 - Weight: 20 - Weight: 20 - Name: .rel.llvm.call-graph-profile Type: SHT_REL Info: .llvm.call-graph-profile Relocations: - Symbol: 1 Type: R_X86_64_NONE - Offset: 0x0 Symbol: 2 Type: R_X86_64_NONE - Offset: 0x8 Symbol: 2 Type: R_X86_64_NONE - Offset: 0x8 Symbol: 3 Type: R_X86_64_NONE - Offset: 0x10 Symbol: 0x0 ## Null symbol. Type: R_X86_64_NONE - Offset: 0x10 Symbol: 0x4 ## This index goes past the end of the symbol table. Type: R_X86_64_NONE - Name: .strtab Type: SHT_STRTAB Content: "0041004200" ## '\0', 'A', '\0', 'B', '\0' Symbols: - StName: 1 ## 'A' - StName: 0xFF ## An arbitrary currupted index in the string table. - StName: 3 ## 'B' ## Check we report a warning when a relocation section is not present. # RUN: yaml2obj %s --docnum=3 -o %t4.o # RUN: llvm-readobj %t4.o --cg-profile 2>&1 | FileCheck %s -DFILE=%t4.o --check-prefix=LLVM-NO-RELOC # RUN: llvm-readobj %t4.o --elf-cg-profile 2>&1 | FileCheck %s -DFILE=%t4.o --check-prefix=LLVM-NO-RELOC # LLVM-NO-RELOC: warning: '[[FILE]]': relocation section for a call graph section doesn't exist # LLVM-NO-RELOC-NEXT: CGProfile [ # LLVM-NO-RELOC-NEXT: CGProfileEntry { # LLVM-NO-RELOC-NEXT: Weight: 89 # LLVM-NO-RELOC-NEXT: } # LLVM-NO-RELOC-NEXT: CGProfileEntry { # LLVM-NO-RELOC-NEXT: Weight: 98 # LLVM-NO-RELOC-NEXT: } # LLVM-NO-RELOC-NEXT: ] --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB 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 we report a warning when the number of relocation section entries does not match the number of call graph entries. # RUN: yaml2obj %s --docnum=4 -o %t5.o # RUN: llvm-readobj %t5.o --cg-profile 2>&1 | FileCheck %s -DFILE=%t5.o --check-prefix=LLVM-RELOC-GRAPH-NOT-MATCH # RUN: llvm-readobj %t5.o --elf-cg-profile 2>&1 | FileCheck %s -DFILE=%t5.o --check-prefix=LLVM-RELOC-GRAPH-NOT-MATCH # LLVM-RELOC-GRAPH-NOT-MATCH: warning: '[[FILE]]': number of from/to pairs does not match number of frequencies # LLVM-RELOC-GRAPH-NOT-MATCH-NEXT: CGProfile [ # LLVM-RELOC-GRAPH-NOT-MATCH-NEXT: CGProfileEntry { # LLVM-RELOC-GRAPH-NOT-MATCH-NEXT: Weight: 89 # LLVM-RELOC-GRAPH-NOT-MATCH-NEXT: } # LLVM-RELOC-GRAPH-NOT-MATCH-NEXT: CGProfileEntry { # LLVM-RELOC-GRAPH-NOT-MATCH-NEXT: Weight: 98 # LLVM-RELOC-GRAPH-NOT-MATCH-NEXT: } # LLVM-RELOC-GRAPH-NOT-MATCH-NEXT: ] --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_DYN Machine: EM_X86_64 Sections: - Name: .llvm.call-graph-profile Type: SHT_LLVM_CALL_GRAPH_PROFILE Entries: - Weight: 89 - Weight: 98 - Name: .rel.llvm.call-graph-profile Type: SHT_REL Info: .llvm.call-graph-profile Relocations: - Symbol: foo Type: R_X86_64_NONE - Offset: 0x0 Symbol: bar Type: R_X86_64_NONE - Offset: 0x8 Symbol: bar Type: R_X86_64_NONE - Offset: 0x8 Symbol: foo Type: R_X86_64_NONE - Offset: 0x10 Symbol: foo Type: R_X86_64_NONE Symbols: - Name: foo - Name: bar ## Check we report a warning when a REL relocation section can't be loaded. # RUN: yaml2obj %s --docnum=5 -o %t6.o # RUN: llvm-readobj %t6.o --cg-profile 2>&1 | FileCheck %s -DFILE=%t6.o --check-prefix=LLVM-RELOC-WRONG-SIZE # RUN: llvm-readobj %t6.o --elf-cg-profile 2>&1 | FileCheck %s -DFILE=%t6.o --check-prefix=LLVM-RELOC-WRONG-SIZE # LLVM-RELOC-WRONG-SIZE: warning: '[[FILE]]': unable to load relocations for SHT_LLVM_CALL_GRAPH_PROFILE section: section [index 2] has invalid sh_entsize: expected 16, but got 24 # LLVM-RELOC-WRONG-SIZE-NEXT: CGProfile [ # LLVM-RELOC-WRONG-SIZE-NEXT: CGProfileEntry { # LLVM-RELOC-WRONG-SIZE-NEXT: Weight: 89 # LLVM-RELOC-WRONG-SIZE-NEXT: } # LLVM-RELOC-WRONG-SIZE-NEXT: CGProfileEntry { # LLVM-RELOC-WRONG-SIZE-NEXT: Weight: 98 # LLVM-RELOC-WRONG-SIZE-NEXT: } # LLVM-RELOC-WRONG-SIZE-NEXT: ] --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_DYN Machine: EM_X86_64 Sections: - Name: .llvm.call-graph-profile Type: SHT_LLVM_CALL_GRAPH_PROFILE Entries: - Weight: 89 - Weight: 98 - Name: .rel.llvm.call-graph-profile Type: SHT_REL Info: .llvm.call-graph-profile Relocations: - Symbol: foo Type: R_X86_64_NONE - Offset: 0x0 Symbol: bar Type: R_X86_64_NONE - Offset: 0x8 Symbol: bar Type: R_X86_64_NONE - Offset: 0x8 Symbol: foo Type: R_X86_64_NONE EntSize: 24 Symbols: - Name: foo - Name: bar ## GNU strip may convert SHT_REL to SHT_RELA. Test we can handle SHT_RELA. # RUN: yaml2obj %s --docnum=6 -o %t7.o # RUN: llvm-readobj %t7.o --cg-profile | FileCheck %s --check-prefix=LLVM-RELA # RUN: llvm-readelf %t7.o --cg-profile | FileCheck %s --check-prefix=GNU-RELA # LLVM-RELA: CGProfile [ # LLVM-RELA-NEXT: CGProfileEntry { # LLVM-RELA-NEXT: From: foo (1) # LLVM-RELA-NEXT: To: bar (2) # LLVM-RELA-NEXT: Weight: 89 # LLVM-RELA-NEXT: } # LLVM-RELA-NEXT: CGProfileEntry { # LLVM-RELA-NEXT: From: bar (2) # LLVM-RELA-NEXT: To: foo (1) # LLVM-RELA-NEXT: Weight: 98 # LLVM-RELA-NEXT: } # LLVM-RELA-NEXT: ] # GNU-RELA: GNUStyle::printCGProfile not implemented --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_DYN Machine: EM_X86_64 Sections: - Name: .llvm.call-graph-profile Type: SHT_LLVM_CALL_GRAPH_PROFILE Entries: - Weight: 89 - Weight: 98 - Name: .rela.llvm.call-graph-profile Type: SHT_RELA Info: .llvm.call-graph-profile Relocations: - Symbol: foo Type: R_X86_64_NONE - Offset: 0x0 Symbol: bar Type: R_X86_64_NONE - Offset: 0x8 Symbol: bar Type: R_X86_64_NONE - Offset: 0x8 Symbol: foo Type: R_X86_64_NONE Symbols: - Name: foo - Name: bar ## Check we report a warning when a RELA relocation section can't be loaded. # RUN: yaml2obj %s --docnum=7 -o %t8.o # RUN: llvm-readobj %t8.o --cg-profile 2>&1 | FileCheck %s -DFILE=%t8.o --check-prefix=LLVM-RELOC-WRONG-SIZE-RELA # RUN: llvm-readobj %t8.o --elf-cg-profile 2>&1 | FileCheck %s -DFILE=%t8.o --check-prefix=LLVM-RELOC-WRONG-SIZE-RELA # LLVM-RELOC-WRONG-SIZE-RELA: warning: '[[FILE]]': unable to load relocations for SHT_LLVM_CALL_GRAPH_PROFILE section: section [index 2] has invalid sh_entsize: expected 24, but got 16 # LLVM-RELOC-WRONG-SIZE-RELA-NEXT: CGProfile [ # LLVM-RELOC-WRONG-SIZE-RELA-NEXT: CGProfileEntry { # LLVM-RELOC-WRONG-SIZE-RELA-NEXT: Weight: 89 # LLVM-RELOC-WRONG-SIZE-RELA-NEXT: } # LLVM-RELOC-WRONG-SIZE-RELA-NEXT: CGProfileEntry { # LLVM-RELOC-WRONG-SIZE-RELA-NEXT: Weight: 98 # LLVM-RELOC-WRONG-SIZE-RELA-NEXT: } # LLVM-RELOC-WRONG-SIZE-RELA-NEXT: ] --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_DYN Machine: EM_X86_64 Sections: - Name: .llvm.call-graph-profile Type: SHT_LLVM_CALL_GRAPH_PROFILE Entries: - Weight: 89 - Weight: 98 - Name: .rela.llvm.call-graph-profile Type: SHT_RELA Info: .llvm.call-graph-profile Relocations: - Symbol: foo Type: R_X86_64_NONE - Offset: 0x0 Symbol: bar Type: R_X86_64_NONE - Offset: 0x8 Symbol: bar Type: R_X86_64_NONE - Offset: 0x8 Symbol: foo Type: R_X86_64_NONE EntSize: 16 Symbols: - Name: foo - Name: bar