## 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 Sections: - Name: .llvm.call-graph-profile Type: SHT_LLVM_CALL_GRAPH_PROFILE Entries: - From: foo To: bar Weight: 89 - From: bar To: foo Weight: 98 EntSize: [[ENTSIZE=]] 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: CGProfile [ # LLVM-ERR-NEXT: warning: '[[FILE]]': unable to dump the SHT_LLVM_CALL_GRAPH_PROFILE section: section [index 1] has an invalid sh_entsize: 15 # LLVM-ERR-NEXT: ] ## 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 3]: 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 Sections: - Name: .llvm.call-graph-profile Type: SHT_LLVM_CALL_GRAPH_PROFILE Entries: - From: 1 To: 2 Weight: 10 - From: 2 To: 3 Weight: 20 - From: 0x0 ## Null symbol. To: 0x4 ## This index goes past the end of the symbol table. Weight: 20 - 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'