llvm / llvm-project

The LLVM Project is a collection of modular and reusable compiler and toolchain technologies.
http://llvm.org
Other
28.22k stars 11.65k forks source link

[BOLT][AArch64] Running perf2bolt with '--debug' causes an segfault fault. #84012

Open kaadam opened 6 months ago

kaadam commented 6 months ago

Hi Everyone,

When I ran perf2bolt with '--debug' I've got segmentation fault when 'MCInst.dump()' is called in 'computeLocalUDChain' function.

Perf2bolt cmd:

perf2bolt -p perf.data -o perf.fdata bubble_sort_clang_arm64 -nl --debug

Issue:

Dumping Bcc 

Now updating for:
 <MCInst 1865 <MCOperand Imm:0> <MCOperand Expr:(.Ltmp119)> <MCOperand Inst:(<MCInst 
#0 0x0000aaaac3492b90 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /home/kadam/llvm-project/llvm/lib/Support/Unix/Signals.inc:723:22
 #1 0x0000aaaac3492f48 PrintStackTraceSignalHandler(void*) /home/kadam/llvm-project/llvm/lib/Support/Unix/Signals.inc:798:1
 #2 0x0000aaaac34906c8 llvm::sys::RunSignalHandlers() /home/kadam/llvm-project/llvm/lib/Support/Signals.cpp:105:20
 #3 0x0000aaaac3492388 SignalHandler(int) /home/kadam/llvm-project/llvm/lib/Support/Unix/Signals.inc:413:1
 #4 0x0000ffffa50a18f8 (linux-vdso.so.1+0x8f8)
 #5 0x0000aaaac25642b8 llvm::MCInst::getOpcode() const /home/kadam/llvm-project/llvm/include/llvm/MC/MCInst.h:198:39
 #6 0x0000aaaac30b3f40 llvm::MCInst::print(llvm::raw_ostream&, llvm::MCRegisterInfo const*) const /home/kadam/llvm-project/llvm/lib/MC/MCInst.cpp:74:33
 #7 0x0000aaaac30b3d84 llvm::MCOperand::print(llvm::raw_ostream&, llvm::MCRegisterInfo const*) const /home/kadam/llvm-project/llvm/lib/MC/MCInst.cpp:42:11
 #8 0x0000aaaac30b3f88 llvm::MCInst::print(llvm::raw_ostream&, llvm::MCRegisterInfo const*) const /home/kadam/llvm-project/llvm/lib/MC/MCInst.cpp:75:3
 #9 0x0000aaaac30b418c llvm::MCInst::dump() const /home/kadam/llvm-project/llvm/lib/MC/MCInst.cpp:108:7
#10 0x0000aaaac3f64b5c (anonymous namespace)::AArch64MCPlusBuilder::computeLocalUDChain(llvm::MCInst const*, llvm::bolt::MCPlusBuilder::InstructionIterator, llvm::bolt::MCPlusBuilder::InstructionIterator) const /home/kadam/llvm-project/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp:828:23
#11 0x0000aaaac3f64e0c (anonymous namespace)::AArch64MCPlusBuilder::analyzeIndirectBranch(llvm::MCInst&, llvm::bolt::MCPlusBuilder::InstructionIterator, llvm::bolt::MCPlusBuilder::InstructionIterator, unsigned int, llvm::MCInst*&, unsigned int&, unsigned int&, long&, llvm::MCExpr const*&, llvm::MCInst*&) const /home/kadam/llvm-project/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp:872:53
#12 0x0000aaaac3fff160 llvm::bolt::BinaryFunction::processIndirectBranch(llvm::MCInst&, unsigned int, unsigned long, unsigned long&) /home/kadam/llvm-project/bolt/lib/Core/BinaryFunction.cpp:810:64
#13 0x0000aaaac400084c llvm::bolt::BinaryFunction::handleIndirectBranch(llvm::MCInst&, unsigned long, unsigned long) /home/kadam/llvm-project/bolt/lib/Core/BinaryFunction.cpp:1111:28
#14 0x0000aaaac4001c80 llvm::bolt::BinaryFunction::disassemble() /home/kadam/llvm-project/bolt/lib/Core/BinaryFunction.cpp:1338:13
#15 0x0000aaaac358f130 llvm::bolt::RewriteInstance::disassembleFunctions() /home/kadam/llvm-project/bolt/lib/Rewrite/RewriteInstance.cpp:3179:20
#16 0x0000aaaac3581d0c llvm::bolt::RewriteInstance::run() /home/kadam/llvm-project/bolt/lib/Rewrite/RewriteInstance.cpp:745:24
#17 0x0000aaaac253a9a0 main /home/kadam/llvm-project/bolt/tools/driver/llvm-bolt.cpp:267:29
#18 0x0000ffffa4a773fc (/lib/aarch64-linux-gnu/libc.so.6+0x273fc)
#19 0x0000ffffa4a774cc __libc_start_main (/lib/aarch64-linux-gnu/libc.so.6+0x274cc)
#20 0x0000aaaac2539830 _start (./llvm-project/build-bolt/bin/perf2bolt+0x349830)
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Dumping CBZX

Now updating for:
 <MCInst 1897 <MCOperand Reg:236> <MCOperand Expr:(.Ltmp119)> <MCOperand Inst:(<MCInst 
#0 0x0000aaaae6fe2b90 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /home/kadam/llvm-project/llvm/lib/Support/Unix/Signals.inc:723:22
 #1 0x0000aaaae6fe2f48 PrintStackTraceSignalHandler(void*) /home/kadam/llvm-project/llvm/lib/Support/Unix/Signals.inc:798:1
 #2 0x0000aaaae6fe06c8 llvm::sys::RunSignalHandlers() /home/kadam/llvm-project/llvm/lib/Support/Signals.cpp:105:20
 #3 0x0000aaaae6fe2388 SignalHandler(int) /home/kadam/llvm-project/llvm/lib/Support/Unix/Signals.inc:413:1
 #4 0x0000ffff9b4ca8f8 (linux-vdso.so.1+0x8f8)
 #5 0x0000aaaae60b42b8 llvm::MCInst::getOpcode() const /home/kadam/llvm-project/llvm/include/llvm/MC/MCInst.h:198:39
 #6 0x0000aaaae6c03f40 llvm::MCInst::print(llvm::raw_ostream&, llvm::MCRegisterInfo const*) const /home/kadam/llvm-project/llvm/lib/MC/MCInst.cpp:74:33
 #7 0x0000aaaae6c03d84 llvm::MCOperand::print(llvm::raw_ostream&, llvm::MCRegisterInfo const*) const /home/kadam/llvm-project/llvm/lib/MC/MCInst.cpp:42:11
 #8 0x0000aaaae6c03f88 llvm::MCInst::print(llvm::raw_ostream&, llvm::MCRegisterInfo const*) const /home/kadam/llvm-project/llvm/lib/MC/MCInst.cpp:75:3
 #9 0x0000aaaae6c0418c llvm::MCInst::dump() const /home/kadam/llvm-project/llvm/lib/MC/MCInst.cpp:108:7
#10 0x0000aaaae7ab4bd4 (anonymous namespace)::AArch64MCPlusBuilder::computeLocalUDChain(llvm::MCInst const*, llvm::bolt::MCPlusBuilder::InstructionIterator, llvm::bolt::MCPlusBuilder::InstructionIterator) const /home/kadam/llvm-project/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp:832:23
#11 0x0000aaaae7ab4e84 (anonymous namespace)::AArch64MCPlusBuilder::analyzeIndirectBranch(llvm::MCInst&, llvm::bolt::MCPlusBuilder::InstructionIterator, llvm::bolt::MCPlusBuilder::InstructionIterator, unsigned int, llvm::MCInst*&, unsigned int&, unsigned int&, long&, llvm::MCExpr const*&, llvm::MCInst*&) const /home/kadam/llvm-project/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp:876:53
#12 0x0000aaaae7b4f1d8 llvm::bolt::BinaryFunction::processIndirectBranch(llvm::MCInst&, unsigned int, unsigned long, unsigned long&) /home/kadam/llvm-project/bolt/lib/Core/BinaryFunction.cpp:810:64
#13 0x0000aaaae7b508c4 llvm::bolt::BinaryFunction::handleIndirectBranch(llvm::MCInst&, unsigned long, unsigned long) /home/kadam/llvm-project/bolt/lib/Core/BinaryFunction.cpp:1111:28
#14 0x0000aaaae7b51cf8 llvm::bolt::BinaryFunction::disassemble() /home/kadam/llvm-project/bolt/lib/Core/BinaryFunction.cpp:1338:13
#15 0x0000aaaae70df130 llvm::bolt::RewriteInstance::disassembleFunctions() /home/kadam/llvm-project/bolt/lib/Rewrite/RewriteInstance.cpp:3179:20
#16 0x0000aaaae70d1d0c llvm::bolt::RewriteInstance::run() /home/kadam/llvm-project/bolt/lib/Rewrite/RewriteInstance.cpp:745:24
#17 0x0000aaaae608a9a0 main /home/kadam/llvm-project/bolt/tools/driver/llvm-bolt.cpp:267:29
#18 0x0000ffff9aea73fc (/lib/aarch64-linux-gnu/libc.so.6+0x273fc)
#19 0x0000ffff9aea74cc __libc_start_main (/lib/aarch64-linux-gnu/libc.so.6+0x274cc)
#20 0x0000aaaae6089830 _start (./llvm-project/build-bolt/bin/perf2bolt+0x349830)
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Dumping CBNZX: 

Now updating for:
 <MCInst 1895 <MCOperand Reg:248> <MCOperand Expr:(.Ltmp544)> <MCOperand Inst:(<MCInst 
#0 0x0000aaaace082b90 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /home/kadam/llvm-project/llvm/lib/Support/Unix/Signals.inc:723:22
 #1 0x0000aaaace082f48 PrintStackTraceSignalHandler(void*) /home/kadam/llvm-project/llvm/lib/Support/Unix/Signals.inc:798:1
 #2 0x0000aaaace0806c8 llvm::sys::RunSignalHandlers() /home/kadam/llvm-project/llvm/lib/Support/Signals.cpp:105:20
 #3 0x0000aaaace082388 SignalHandler(int) /home/kadam/llvm-project/llvm/lib/Support/Unix/Signals.inc:413:1
 #4 0x0000ffff984728f8 (linux-vdso.so.1+0x8f8)
 #5 0x0000aaaacd1542b8 llvm::MCInst::getOpcode() const /home/kadam/llvm-project/llvm/include/llvm/MC/MCInst.h:198:39
 #6 0x0000aaaacdca3f40 llvm::MCInst::print(llvm::raw_ostream&, llvm::MCRegisterInfo const*) const /home/kadam/llvm-project/llvm/lib/MC/MCInst.cpp:74:33
 #7 0x0000aaaacdca3d84 llvm::MCOperand::print(llvm::raw_ostream&, llvm::MCRegisterInfo const*) const /home/kadam/llvm-project/llvm/lib/MC/MCInst.cpp:42:11
 #8 0x0000aaaacdca3f88 llvm::MCInst::print(llvm::raw_ostream&, llvm::MCRegisterInfo const*) const /home/kadam/llvm-project/llvm/lib/MC/MCInst.cpp:75:3
 #9 0x0000aaaacdca418c llvm::MCInst::dump() const /home/kadam/llvm-project/llvm/lib/MC/MCInst.cpp:108:7
#10 0x0000aaaaceb54bec (anonymous namespace)::AArch64MCPlusBuilder::computeLocalUDChain(llvm::MCInst const*, llvm::bolt::MCPlusBuilder::InstructionIterator, llvm::bolt::MCPlusBuilder::InstructionIterator) const /home/kadam/llvm-project/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp:832:23
#11 0x0000aaaaceb54e9c (anonymous namespace)::AArch64MCPlusBuilder::analyzeIndirectBranch(llvm::MCInst&, llvm::bolt::MCPlusBuilder::InstructionIterator, llvm::bolt::MCPlusBuilder::InstructionIterator, unsigned int, llvm::MCInst*&, unsigned int&, unsigned int&, long&, llvm::MCExpr const*&, llvm::MCInst*&) const /home/kadam/llvm-project/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp:876:53
#12 0x0000aaaacebef1f0 llvm::bolt::BinaryFunction::processIndirectBranch(llvm::MCInst&, unsigned int, unsigned long, unsigned long&) /home/kadam/llvm-project/bolt/lib/Core/BinaryFunction.cpp:810:64
#13 0x0000aaaacebf08dc llvm::bolt::BinaryFunction::handleIndirectBranch(llvm::MCInst&, unsigned long, unsigned long) /home/kadam/llvm-project/bolt/lib/Core/BinaryFunction.cpp:1111:28
#14 0x0000aaaacebf1d10 llvm::bolt::BinaryFunction::disassemble() /home/kadam/llvm-project/bolt/lib/Core/BinaryFunction.cpp:1338:13
#15 0x0000aaaace17f130 llvm::bolt::RewriteInstance::disassembleFunctions() /home/kadam/llvm-project/bolt/lib/Rewrite/RewriteInstance.cpp:3179:20
#16 0x0000aaaace171d0c llvm::bolt::RewriteInstance::run() /home/kadam/llvm-project/bolt/lib/Rewrite/RewriteInstance.cpp:745:24
#17 0x0000aaaacd12a9a0 main /home/kadam/llvm-project/bolt/tools/driver/llvm-bolt.cpp:267:29
#18 0x0000ffff97e473fc (/lib/aarch64-linux-gnu/libc.so.6+0x273fc)
#19 0x0000ffff97e474cc __libc_start_main (/lib/aarch64-linux-gnu/libc.so.6+0x274cc)
#20 0x0000aaaacd129830 _start (./llvm-project/build-bolt/bin/perf2bolt+0x349830)
Dumping TBNZW

Now updating for:
 <MCInst 7060 <MCOperand Reg:204> <MCOperand Imm:0> <MCOperand Expr:(.Ltmp542)> <MCOperand Inst:(<MCInst 
#0 0x0000aaaab3ca2b90 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /home/kadam/llvm-project/llvm/lib/Support/Unix/Signals.inc:723:22
 #1 0x0000aaaab3ca2f48 PrintStackTraceSignalHandler(void*) /home/kadam/llvm-project/llvm/lib/Support/Unix/Signals.inc:798:1
 #2 0x0000aaaab3ca06c8 llvm::sys::RunSignalHandlers() /home/kadam/llvm-project/llvm/lib/Support/Signals.cpp:105:20
 #3 0x0000aaaab3ca2388 SignalHandler(int) /home/kadam/llvm-project/llvm/lib/Support/Unix/Signals.inc:413:1
 #4 0x0000ffff9b7e48f8 (linux-vdso.so.1+0x8f8)
 #5 0x0000aaaab2d742b8 llvm::MCInst::getOpcode() const /home/kadam/llvm-project/llvm/include/llvm/MC/MCInst.h:198:39
 #6 0x0000aaaab38c3f40 llvm::MCInst::print(llvm::raw_ostream&, llvm::MCRegisterInfo const*) const /home/kadam/llvm-project/llvm/lib/MC/MCInst.cpp:74:33
 #7 0x0000aaaab38c3d84 llvm::MCOperand::print(llvm::raw_ostream&, llvm::MCRegisterInfo const*) const /home/kadam/llvm-project/llvm/lib/MC/MCInst.cpp:42:11
 #8 0x0000aaaab38c3f88 llvm::MCInst::print(llvm::raw_ostream&, llvm::MCRegisterInfo const*) const /home/kadam/llvm-project/llvm/lib/MC/MCInst.cpp:75:3
 #9 0x0000aaaab38c418c llvm::MCInst::dump() const /home/kadam/llvm-project/llvm/lib/MC/MCInst.cpp:108:7
#10 0x0000aaaab4774bfc (anonymous namespace)::AArch64MCPlusBuilder::computeLocalUDChain(llvm::MCInst const*, llvm::bolt::MCPlusBuilder::InstructionIterator, llvm::bolt::MCPlusBuilder::InstructionIterator) const /home/kadam/llvm-project/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp:833:23
#11 0x0000aaaab4774eac (anonymous namespace)::AArch64MCPlusBuilder::analyzeIndirectBranch(llvm::MCInst&, llvm::bolt::MCPlusBuilder::InstructionIterator, llvm::bolt::MCPlusBuilder::InstructionIterator, unsigned int, llvm::MCInst*&, unsigned int&, unsigned int&, long&, llvm::MCExpr const*&, llvm::MCInst*&) const /home/kadam/llvm-project/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp:877:53
#12 0x0000aaaab48111fc llvm::bolt::BinaryFunction::processIndirectBranch(llvm::MCInst&, unsigned int, unsigned long, unsigned long&) /home/kadam/llvm-project/bolt/lib/Core/BinaryFunction.cpp:810:64
#13 0x0000aaaab48128e8 llvm::bolt::BinaryFunction::handleIndirectBranch(llvm::MCInst&, unsigned long, unsigned long) /home/kadam/llvm-project/bolt/lib/Core/BinaryFunction.cpp:1111:28
#14 0x0000aaaab4813d1c llvm::bolt::BinaryFunction::disassemble() /home/kadam/llvm-project/bolt/lib/Core/BinaryFunction.cpp:1338:13
#15 0x0000aaaab3d9f130 llvm::bolt::RewriteInstance::disassembleFunctions() /home/kadam/llvm-project/bolt/lib/Rewrite/RewriteInstance.cpp:3179:20
#16 0x0000aaaab3d91d0c llvm::bolt::RewriteInstance::run() /home/kadam/llvm-project/bolt/lib/Rewrite/RewriteInstance.cpp:745:24
#17 0x0000aaaab2d4a9a0 main /home/kadam/llvm-project/bolt/tools/driver/llvm-bolt.cpp:267:29
#18 0x0000ffff9b1c73fc (/lib/aarch64-linux-gnu/libc.so.6+0x273fc)
#19 0x0000ffff9b1c74cc __libc_start_main (/lib/aarch64-linux-gnu/libc.so.6+0x274cc)
#20 0x0000aaaab2d49830 _start (./llvm-project/build-bolt/bin/perf2bolt+0x349830)

Example:

clang bubblesort.c -o bubble_sort_clang_arm64 --target=aarch64-linux -fuse-ld=lld -flto=thin -O2 -static -Wl,--emit-relocs
perf record -e cycles:u -- bubble_sort_clang_arm64
#include <stdio.h>
#include <stdlib.h>

void swap(int* xp, int* yp)
{
        int temp = *xp;
        *xp = *yp;
        *yp = temp;
}

void bubbleSort(int arr[], int n)
{
        int i, j;
        for (i = 0; i < n - 1; i++)

                for (j = 0; j < n - i - 1; j++)
                        if (arr[j] > arr[j + 1])
                                swap(&arr[j], &arr[j + 1]);
}

void printArray(int arr[], int size)
{
        int i;
        for (i = 0; i < size; i++)
                printf("%d ", arr[i]);
        printf("\n");
}

void fillUp(int* array , int size)
{
   for (int i=0; i < size; ++i) {
     *(array+i) = rand() % 1000000;
   }
}

int main()
{
        int arr_new[100000];
        srand((unsigned) 41);
        fillUp(&arr_new[0], 100000);
        bubbleSort(arr_new, 100000);
        return 0;
}
yota9 commented 6 months ago

Hello. Please provide archive with binary and perf file.

kaadam commented 6 months ago

Hi @yota9, yes, I forgot to enclose the example, sorry. example.tar.gz